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

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

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

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

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

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

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

配置安全组和实例端口

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

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

安装连接Linux工具

常见的好几种:putty、SSHSecureShellClient、RealVNCMobaXtem

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

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 

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

dotnet --list-sdks 


完成!

2、安装Node 和 npm/cnpm

https://nodejs.org/en/download

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

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

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/ 

刷新配置文件:

source /etc/profile 

测试结果:

npm -v 
node -v 

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

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

3、安装Git 源代码管理

sudo yum -y install git 

测试结果:

git --version 

4、安装 PM2 进程守护

cnpm install -g pm2 

当然,你也可以用系统自带的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 

6、安装代理服务器 NGINX

sudo yum install nginx 

启用和启动服务:

sudo systemctl enable nginx 
sudo systemctl start nginx 

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的话,可能会报错:

这个问题这几天会修复。

执行后,发现已经成功了,那接下来就需要在公网上查看是否可行,这个时候就需要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 

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 

这一列,从图标上我们也可以看出来,这是重启次数,如果某一个项目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

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

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

到这里就守护好了进程:

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、等等其他

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309903.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统习题——第一章

操作系统习题——第一章 1.设计现代OS的主要目标是什么? 答:(1)有效性 ( 2)方便性 ( 3)可扩充性 ( 4)开放性 2. OS 的作用可表现在…

linux把svs文件分割,freeebsd,pkg_add,svsup,make改服务器的设定

第一大部分:几个服务器的设定pkg_add默认下载的服务器在哪改。在/etc/csh.cshrc加上setenv PACKAGESITE ftp://ftp.freebsd.org/pub/FreeBSD/ports/packages/All/如果是用PACKAGEROOT,则目录必须符合官方的规定cvsup默认的服务器cvsup -L 2 -h cvsup.freebsd.org /u…

[C++11]推荐使用auto的场景

推荐使用auto的场景&#xff1a; 1.用于STL的容器遍历。 代码如下: #include <string>#include <iostream> #include <map> using namespace std;int main() {map<int, string>mp;mp.insert(make_pair(1, "Tom"));mp.insert(make_pair(2,…

【壹刊】Azure AD 保护的 ASP.NET Core Web API (下)

一&#xff0c;引言上一节讲到如何在我们的项目中集成Azure AD 保护我们的API资源&#xff0c;以及在项目中集成Swagger&#xff0c;并且如何把Swagger作为一个客户端进行认证和授权去访问我们的WebApi资源的&#xff1f;本节就接着讲如何在我们的项目中集成 Azure AD 保护我们…

linux aspnet服务器,在Linux中安装ASPNET.Core3.0运行时的示例代码

摘要&#xff1a;# 以下示例适用于x64位runtime v3.0.0mkdir /runtimescd /runtimeswget https://... # 以下示例适用于x64位runtime v3.0.0mkdir /runtimescd /runtimeswget https://download.visualstudio.microsoft.com/download/pr/b0c44e05-b7a1-4221-94ec-a0c0d3a11eed/a…

And Then There Was One POJ - 3517(变形约瑟夫环+规律)

题意&#xff1a; 约瑟夫问题的变式。先指定第m个人必须死&#xff0c;然后每隔k个人死一个。求最后那个死的人的编号是什么。 题目 Let’s play a stone removing game. Initially, n stones are arranged on a circle and numbered 1, …, n clockwise (Figure 1). You a…

明明可以靠技术吃饭,现在却非要出来当编剧!

这是头哥侃码的第199篇原创前不久&#xff0c;有位读者深夜时在后台留言说&#xff1a;“我在某技术大会现场听过你的分享。”“说实话&#xff0c;第一次见你&#xff0c;真的很难想象一幅猛男外表的人竟然会有这样的经历和谈吐&#xff0c;这两点让我很钦佩。”这还不算完&am…

[C++11]decltype类型推导规则

在某些情况下&#xff0c;不需要或者不能定义变量&#xff0c;但是希望得到某种类型&#xff0c;这时候就可以用C11提供的decltype关键字了&#xff0c;它的作用是在编译器编译的时候推导出一个表达式的类型。 语法: decltype (表达式)decltype是"declare type “的缩写…

linux不能更改密码,Linux服务器无法更改密码的解决办法--passwd: User not known

上面仅是告知我&#xff0c;这些帐号并没有家目录&#xff0c;由于那些帐号绝大部分都是系统帐号&#xff0c; 确实也不需要家目录的&#xff0c;所以&#xff0c;那是‘正常的错误&#xff01;’,相对应的群组检查可以使用 grpck 这个指令。pwck 确保系统鉴认信息的完整性,pwc…

PowerBIDeskTop报表元数据批量更新(可用于翻译场景)

PowerBI在多国语言场景上有极大的缺陷&#xff0c;原有的Sqlserver的SSAS和Azure的AS模型层翻译功能&#xff0c;在Excel和PowerBIDeskTop客户端上均可完美适配。但到了PowerBI Pro的Service网页端时&#xff0c;竟然不支持。这个问题已经明确是官方给出的答复&#xff0c;起码…

操作系统习题——(习题二)

操作系统习题——第一章 1&#xff0e; OS 有哪几大特征&#xff1f;其最基本的特征是什么? 答&#xff1a;并发性、共享性、虚拟性和异步性四个基本特征&#xff1b;最基本的特征是并发性和共享性。 2.处理机管理有哪些主要功能&#xff1f; 答&#xff1a;处理机管理的主…

[C++11]decltype在泛型编程中的使用举例

关于decltype的应用多出现在泛型编程中&#xff0c;比如我们编写一个类模板&#xff0c;在里面添加遍历容器的函数&#xff0c;操作如下: 代码如下: #include <iostream> #include <list>using namespace std;template<typename T> class Container { publ…

追了多年的开发框架,你还认识指针吗?

一&#xff1a;背景1. 讲故事高级语言玩多了&#xff0c;可能很多人对指针或者汇编都淡忘了&#xff0c;本篇就和大家聊一聊指针&#xff0c;虽然C#中是不提倡使用的&#xff0c;但你能说指针在C#中不重要吗&#xff1f;你要知道FCL内库中大量的使用指针&#xff0c;如String,E…

linux apt-get 安装 根目录,技术|apt-get 和 apt-cache 命令实例展示

apt-get和apt-cache是Ubuntu Linux中的命令行下的包管理工具。 apt-get的GUI版本是Synaptic包管理器。本篇中我们会展示apt-get和apt-cache命令的15个不同例子。示例&#xff1a;1 列出所有可用包linuxtechilocalhost:~$ apt-cache pkgnamesaccount-plugin-yahoojpceph-fusedvd…

[PAT乙级]1031 查验身份证

一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下&#xff1a; 首先对前17位数字加权求和&#xff0c;权重分配为&#xff1a;{7&#xff0c;9&#xff0c;10&#xff0c;5&#xff0c;8&#xff0c;4&#xff0c;2&#xff0c;1&am…

Long Path CodeForces - 407B(动态规划+思维+公式推导)

题意&#xff1a; 起点为1&#xff0c;终点为n1&#xff0c;对应第i个各点&#xff0c;如果我奇数次到达i点&#xff0c;那么下一步走到a【i】的位子&#xff0c;如果是偶数次到达&#xff0c;那么下一步走到i1的位子。 问从1走到n1一共需要走多少步&#xff1f;结果对1e97取模…

[PAT乙级]1032 挖掘机技术哪家强

为了用事实说明挖掘机技术到底哪家强&#xff0c;PAT 组织了一场挖掘机技能大赛。现请你根据比赛结果统计出技术最强的那个学校。 输入格式&#xff1a; 输入在第 1 行给出不超过 10​5​​ 的正整数 N&#xff0c;即参赛人数。随后 N 行&#xff0c;每行给出一位参赛者的信息…

断!舍!离!

最近颈椎病很严重&#xff0c;各种寻医问药&#xff0c;找各路中西医专家治疗。无奈&#xff0c;一直不见好。每周我都会去一个中医大夫那里做推拿&#xff0c;有一次我抱怨&#xff0c;这个病怎么这么难弄好。大夫笑了笑&#xff0c;说&#xff1a;颈椎病其实是个哲学问题。我…

linux权限746,linux文件权限学习笔一

linux文件权限学习随笔一linux中&#xff0c;文件权限一直是困扰初学者的难题。但是还必须要把文件权限搞明白&#xff0c;否则你就很难进一步学习linux&#xff0c;因为你听不懂他的说什么&#xff0c;看不懂他的身份&#xff0c;不知道他要做什么。我已经习惯使用windows&…

Compound Words UVA - 10391(c++用法中substr函数用法+map实现)

题意&#xff1a; 给出字典中一堆单词&#xff0c;单词的输入方式是以字典序输入的。问&#xff1a;在这一堆单词中&#xff0c;有那些单词是通过其它两个单词组合而来的。按字典序升序输出这些单词。 题目&#xff1a; You are to find all the two-word compound words in…