24

[最全操作指南] 在线六个项目全部迁移Linux

 3 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzAwNTMxMzg1MA%3D%3D&%3Bmid=2654078280&%3Bidx=1&%3Bsn=4f5918ae2df1b02ac5a31abd000c8ab5
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

fIvymmU.png!web

(书山有路勤为径,学海无涯苦作舟)

开源也两年了,没想到自己在宣传.NetCore全栈的时候,也慢慢的做出了几个产品,毕竟也是一行一行的敲出来的,也是一天一夜的改出来的, 希望每个人都能在自己学习中培养自己的踏实,稳健,成熟的品性

这两年也是见证着跨平台和Docker容器化的迅速发展,恰逢这段时间打算找工作(有好的欢迎内推),看到NetCore、Linux、中间件、Docker、微服务的字样已经出现在了很多求职公司的要求里,我的第一批粉丝中也有很多小伙伴找到了自己的NetCore公司,所以说, 临渊羡鱼,不如退而结网,奥里给,现在还不晚

很多小伙伴也问我,什么时候带着讲一讲,玩一玩Docker,甚至是K8S,我只能说,先把基础打好,把设计模式+DDD+授权认证好好巩固。这段时间我慢慢的学了学Linux,以前虽然用过,但是用的着实不多,这次趁着Win服务器到期,还不给我优惠券的情况下,果断拾起来了以前的Linux服务器, 把上图中的六个项目都迁过去,正好也踩踩坑,下边是完整操作文档

1、购买服务器,安装工具

既然要迁移,肯定需要服务器,我这里使用的是去年双十一买的CentOS7.6x64位Linux服务器,配置是2C4G5M,当然如果你有钱,可以直接搞Azure,功能强大到飞起,如果是中等开销,就买个这个配置就行,一年大概1k,节假日有优惠,如果还不行,就新用户买个低配的吧,我是不建议, 因为到最后你肯定会再买再换高配,所以现在没必要买个低配的

NNrQF32.png!web

配置安全组和实例端口

如果是新买的服务器,端口实例还是要开放一些,特别是某里服务器。

我这里图简单,都开放了,你自己酌情处理。

e2I3ueN.png!web

安装连接Linux工具

常见的好几种: putty、 SSHSecureShellClient、 RealVNC MobaXtem

我使用的就是最后一种MobaXtem,挺方便:

nmaaqaU.png!web

2、安装所有环境依赖与服务组件

因为我的六个项目中,有前端和后端,有守护进程,代理和源代码管理等等,所以在整个迁移的过程中,需要安装的东西还是比较多的,【 如果你不需要安装的,可以自行跳过】

1、安装.NET Core SDK

https://docs.microsoft.com/zh-cn/dotnet/core/install/linux-package-manager-centos7

这是官网地址,在安装.NET之前,

  • 将 Microsoft     包签名密钥添加到受信任密钥列表。

  • 将此存储库添加到包管理器。

  • 安装必需的依赖项。

每台计算机只需要执行一次此操作。

sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
sudo yum install dotnet-sdk-3.1 

IjMNvab.png!web

安装成功,测试一下版本:

dotnet --list-sdks 

EZzy6vi.png!web

完成!

2、安装Node 和 npm/cnpm

https://nodejs.org/en/download

你可以本地下载好后,上传到服务器:

feMj6fa.png!web

当然,你也可以直接在服务器里下载,解压和安装:

cd 到 /home 路径(可自定义)

下载:

wget https://nodejs.org/dist/v12.16.3/node-v12.16.3-linux-x64.tar.xz

解压:

tar -xf node-v12.16.3-linux-x64.tar.xz 

设置全局变量:

vim /etc/profile

PATH=$PATH:/home/node-v12.16.3-linux-x64/bin/

En6bYn3.png!web

刷新配置文件:

source /etc/profile 

测试结果:

npm -v

node -v

6Bzym2F.png!web

当然,想要更快,可以使用淘宝的国内镜像cnpm:

npm install -g cnpm --registry=https://registry.npm.taobao.org

3、安装Git 源代码管理

sudo yum -y install git 

73uiyye.png!web

测试结果:

git --version 

ZVnUriB.png!web

4、安装 PM2 进程守护

cnpm install -g pm2 

m6RnYvb.png!web

当然,你也可以用系统自带的systemctl来操作,毕竟没有界面,而且也不用配置各种服务文件,而且后边在处理nuxt项目的时候,还是PM2可能更好些。

pm2常用命令记录

$ pm2 start app.js # 启动app.js应用程序

$ pm2 start app.js -i 4        # cluster mode 模式启动4个app.js的应用实例

# 4个应用程序会自动进行负载均衡

$ pm2 start app.js --name="api" # 启动应用程序并命名为 "api"

$ pm2 start app.js --watch      # 当文件变化时自动重启应用

$ pm2 start script.sh          # 启动 bash 脚本

$ pm2 list                      # 列表 PM2 启动的所有的应用程序

$ pm2 monit                    # 显示每个应用程序的CPU和内存占用情况

$ pm2 show [app-name]          # 显示应用程序的所有信息

$ pm2 logs                      # 显示所有应用程序的日志

$ pm2 logs [app-name]          # 显示指定应用程序的日志

$ pm2 flush                       # 清空所有日志文件

$ pm2 stop all                  # 停止所有的应用程序

$ pm2 stop 0                    # 停止 id为 0的指定应用程序

$ pm2 restart all              # 重启所有应用

$ pm2 reload all                # 重启 cluster mode下的所有应用

$ pm2 gracefulReload all        # Graceful reload all apps in cluster mode

$ pm2 delete all                # 关闭并删除所有应用

$ pm2 delete 0                  # 删除指定应用 id 0

$ pm2 scale api 10              # 把名字叫api的应用扩展到10个实例

$ pm2 reset [app-name]          # 重置重启数量

$ pm2 startup                  # 创建开机自启动命令

$ pm2 save                      # 保存当前应用列表

$ pm2 resurrect                # 重新加载保存的应用列表

$ pm2 update                    # Save processes, kill PM2 and restore processes

$ pm2 generate                  # Generate a sample json configuration file

5、安装文档打包组件 Vuepress

cnpm install -g vuepress 


测试:

vuepress --version 

Ff2e6vi.png!web

6、安装代理服务器 NGINX

sudo yum install nginx 

Vn2qeiz.png!web

启用和启动服务:

sudo systemctl enable nginx

sudo systemctl start nginx

nyAbYbA.png!web

http://118.25.251.113/usr/share/nginx/html

通过ip地址即可查看对应的欢迎页。

3、跑通NET Core的源代码

这里为了更新的更快些,我直接用的码云的地址(不要老问我是不是和GitHub同步的 )

1、git克隆源代码

下载好了六个项目,剩下的就是打包发布了,很简单,先说下三个后端项目:

这里就用Blog.Core举例子,其他的都一样:

在项目的根目录,有一个 `Blog.Core.Publish.Linux.sh` 文件,直接执行这个,就可以打包发布了,其他两个项目,DDD和Ids4也都有一个,我做这个的目的,就是以后使用Jenkins的时候,直接copy过去就行了(其实我讲的东西都是为了以后做铺垫的)。

只不过执行的时候,可能会提示权限不足,添加上777权限就行了。

chmod 777 Blog.Core.Publish.Linux.sh  

然后执行这个这个sh文件,就可以看到创建了一个 .PublishFiles 的文件夹,然后我们cd进去 /home/Blog.Core/.PublishFiles/ ,执行查看是否正常,注意是大小写的:

dotnet Blog.Core.dll 

,这里要说明下,如果使用Sqlite的话,可能会报错 :

NfmAJ3V.png!web

这个问题这几天会修复。

执行后,发现已经成功了,那接下来就需要在公网上查看是否可行,这个时候就需要Nginx代理了:

2、NGINX 服务代理

进入/etc/nginx/文件夹

修改nginx.conf文件,这里你可以使用 vim ,也可以下载到本地,修改,然后再提交上去,看自己的需要了,反正vim也很简单,就是那几个命令:

vim xxx

i

:wq!

如果看不懂,还是下载本地修改吧。

修改的内容如下:

###### apk begin #######

server {

listen 80;

server_name apk.neters.club;


location / {

root html;

proxy_pass http://localhost:8081;

proxy_http_version 1.1;

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection keep-alive;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_cache_bypass $http_upgrade;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;


index index.html index.htm;

}


location /.doc/ {

proxy_pass http://docs.neters.club/;

}

}


server {

listen 80;

server_name docs.neters.club;


location / {

root /home/Blog.Core/.docs/contents/.vuepress/dist;

index index.html index.htm;

}

}


###### apk end #######

接下来就是重启Nginx服务,首先可以检测语法错误:

nginx -t 

EBBnArN.png!web

nginx -s reload 

这个时候,如果没报错,那恭喜,项目启动成功了,当然你需要配置自己的域名。

我们返回上一步,启动Blog.Core.dll服务,就可以在公网查看效果了。

但是如果关闭窗口,那服务就停掉了,我们需要守护一下,上边我们说到了,官方的也可以,我更喜欢用PM2来进程守护。

3、PM2 进程守护

刚刚我们说到了,我们已经进去了/home/Blog.Core/.PublishFiles/文件夹,通过执行dotnet名利判断项目可以运行,那接下来我们换一种写法,守护一下这个进程:

pm2 start "dotnet Blog.Core.dll" --name apk.dll 

自动出现这个结果,表示我们已经守护成功了,当然我们也可以通过命令来查看,重启,删除等等,比如我们以后更新了代码,然后发布了结果,直接重启下PM2就行了,比如我们重启下上边刚刚创建id=3的进程:

pm2 restart 3 

nQjayyu.png!web

这一列,从图标上我们也可以看出来,这是重启次数,如果某一个项目error了,或者服务器重启了,pm2会帮助我们自动重启所有的项目服务,保证项目能正常运行,这个可方便多了。

这个时候,我们在外网访问下,一切正常了,很棒,这就是开放的整体流程:

pull 代码

publish批处理文件执行发布

dotnet xxx.dll测试发布是否正常

重启pm2

修改nginx(可选)

重启nginx(可选)

外网查看

剩下的DDD和Ids4两个项目,是一模一样的,不赘述。

4、如何用自带服务守护进程

这里我不使用这种方式,仅仅是作为内容的扩展和备份:

在/etc/systemd/system 下新建文件文件名以.service结尾,配置内容为:

[Unit]


Description=blog.core


[Service]

WorkingDirectory=/home/Blog.Core/.PublishFiles

ExecStart=/usr/bin/dotnet/home/Blog.Core/.PublishFiles/Blog.Core.dll

Restart=always

RestartSec=25

SyslogIdentifier=blog.core

User=root

Environment=ASPNETCORE_ENVIRONMENT=Production

[Install]

WantedBy=multi-user.target

2、写完配置文件后保存,输入指令确认服务:

systemctlenable blog.core.service

然后启动服务 systemctl start blog.core.service

然后查看一下服务状态: systemctlstatus blog.core

ayYvMvF.png!web

4、跑通Nuxt项目

我们都知道Nuxt.js是一个SSR渲染的Vue框架,所以我们必须要守护这个进程,也是很简单,和net core有相似之处。

1、下载并打包项目

cnpm i

cnpm run build

2、运行项目

如果是服务端渲染的话,需要我们start我们的服务,而不是通过generate的命令,生成dist静态文件的形式:

npm run start

这个时候,服务端进程就启动了,那我们也需要守护他。

3、守护进程

很简单,还是在当前文件目录下,执行

pm2 start npm --name "tibug" -- run start

是不是和上边的命令很像。

到这里就守护好了进程:

IRFZ73A.png!web

4、配置Nginx代理转发

###### tibug begin #######

upstream nodenuxt {

server 127.0.0.1:3089;

keepalive 64;

}

server {

listen 80;

server_name tibug.neters.club;


location / {

proxy_http_version 1.1;

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection "upgrade";

proxy_set_header Host $host;

proxy_set_header X-Nginx-Proxy true;

proxy_cache_bypass $http_upgrade;

proxy_pass http://nodenuxt;

}


error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;

}

}


###### tibug end #######

很简单,肯定都能看得懂,这里服务端的部署就告一段落了,剩下就是很简单的js前端的部署了。

5、部署Vue.js前端项目

这里就简单的不能再简单了,下载好代码后,

打包生成dist静态文件,

配置nginx服务代理转发,

搞定。



###### vueadmin begin #######


server {

listen 80;

server_name vueadmin.neters.club;


location / {

try_files $uri $uri/ /index.html;

root /home/Blog.Admin/dist;

index index.html index.htm;

}


location /api/ {

rewrite ^.+apb/?(.*)$ /$1 break;

include uwsgi_params;

proxy_pass http://localhost:8081;

proxy_http_version 1.1;

proxy_set_header Upgrade $http_upgrade;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}


location /api2/ {

rewrite ^.+apb/?(.*)$ /$1 break;

include uwsgi_params;

proxy_pass http://localhost:8081;

proxy_http_version 1.1;

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection "upgrade";

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}


location /images/ {

include uwsgi_params;

proxy_pass http://localhost:8081;

proxy_http_version 1.1;

proxy_set_header Upgrade $http_upgrade;

#proxy_set_header Connection "upgrade";

#proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

location /.doc/ {

proxy_pass http://docsadmin.neters.club/;

}


error_page 404 /404.html;


# redirect server error pages to the static page /50x.html

#

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;

}

}


server {

listen 80;

server_name docsadmin.neters.club;


location / {

root /home/Blog.Admin/.doc/contents/.vuepress/dist;

index index.html index.htm;

}

}

###### vueadmin end #######

重点的就是要进行反向代理,其他的就是简单的部署一个静态html页面而已。

6、难点与结论

其实通过上边的操作,一般四五个小时肯定能搞定,快的话三个小时就完全能搞定前后端发部署和发布,我几乎没有遇到太多的问题,可能得益于NETCore本身就是跨平台的,虽然以前都是在window服务器运行,但是也有Linux的影子,当然,可能有部分难点:

1、文件大小写和路径问题;

2、文件权限问题;

3、net core本地正常,服务器不行的问题(多半是少文件,看日志);

4、nginx代理失败问题(参考我的就行);

5、多项目联调问题(不好调,尽量本地没问题了再提交);

6、等等其他

最后,祝大家学有所成吧。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK