39

又一篇Centos7下的asp.net core部署教程 - 菜工

 4 years ago
source link: https://www.cnblogs.com/caijt/p/10978324.html
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.

又一篇Centos7下的asp.net core部署教程

历程2个多月的学习,我终于从PHP转.Net开发了。

 从壹开始前后端分离【 .NETCore2.1 +Vue 2 +AOP+DI】框架

感谢老张的博客,我对asp.net core入门主要就是靠他的博客了,这里再说一次,微软的文档真的太难看了!

虽然网上已经有很多关于asp.net core在linux下的部署教程了,但我还是想写一篇,主要增强我自己的记忆,同时分享下我部署遇到的坑。

搭建的环境为Centos7 + .net core  + nginx + mysql5.7,我的网站是asp.net core后端,vue前端,数据据mysql;

第一次搭建时遇到不少的坑,我会在下面也说到

前提,你有一台可以联网,有root账号密码,有开通ssh的服务器(一般centos7安装默认都有开通了)

安装donet运行环境

用root登录服务器后,第一步就是安装dotnet运行库了

打开https://dotnet.microsoft.com/download,我写这篇博客时,还是net core2.2,3.0预览版也出了,不知到时会不会有什么变动。

648126-20190605104520738-1708104011.png

只运行,不开发,只需安装runtime运行库。

 选择Centos,然后运行以下红圈的命令,我没运行yum update,感觉没什么影响。

648126-20190605104839965-1633660677.png

 然后输入命令 dotnet --info,可看是否有运行库

 

648126-20190605105013207-44863207.png

恭喜你,已经安装成功了

然后把你的asp.net core发布后的文件上传到服务器上,我用的是WinSCP上传软件,用你的root账号密码登录,协议为SFTP

648126-20190605105328961-2138795549.png

我上传到/var/www/dotnet,建议上传到/var目录,一开始我上传到root目录,后面会出现一些访问权限的问题

648126-20190605105245139-1641480013.png

 然后在linux中切换到.net目录上,cd /var/www/dotnet,然后运行dotnet xxxx.dll

请注意,要需分大小写!要需分大小写!要需分大小写!一开始我没注意大小写,结果一直提示要装sdk,害我以为不能只装runtimes,害我查了好多资料

dotnet xxxx.dll //一定要注意大小写  
648126-20190605113616814-661424951.png

出现以上画面,你就成功了,如果有误,你先在你本地window下dotnet  xxx.dll看看有没有错误,一般在你本地上没问题,在服务器也是没问题的。

对了,第一次运行时还出现什么XML的提示,不太懂,第二次运行就没有了。

648126-20190605113700663-142051354.png

请注意,现在外网还不能访问你的5000端口的,为什么?

第一,看我上面的listening on http://localhost:5000,我这个dotnet默认只监听本地的5000端口,所以外网无法访问,解决方法就是在命令后面加上参数urls

dotnet xxxx.dll --urls http://*:5000 
648126-20190605114348069-195162760.png

第二 Centos的防火墙默认是开启的,所以端口还得把防火墙关了,或在防火墙里添加个端口

//以下操作二选一
systemctl status firewalld // 查看防火墙状态 systemctl stop firewalld //关闭防火墙 firewall-cmd --zone=public --add-port=5000/tcp --permanent // permanent参数是永远存在,不然的话,重启后就没有了
firewall-cmd --reload // 重启防火墙 ,添加端口后记得执行此命令

一般来说,现在就你可以通过外网地址加5000的端口访问你的网站了。

安装Nginx

https://www.cnblogs.com/songxingzhu/p/8568432.html 

我主要是参考这个博客,用的是yum安装,非常简单,网上有其它很多rpm的安装方法,比较麻烦,对于这个yum跟rpm的关系,我理解yum是网上应用商城,rpm是本地的软件管理系统。而yum如果找不到你需要的包的话,你可以通过给yum增加安装源(意思就是增加一个提供软件包的地址,让yum可以通过这个地址去获取软件包),下面第一条命令rpm xxxx的作用就是在/etc/yum/repo.d里面增加一个repo文件。

//以下第一句是给你的centos安装一个yum源,因为nginx没有yum的源,我的理解就是nginx没在yum的应用商城上发布
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm yum install -y nginx //这句才是真正的安装nginx
systemctl start nginx //启动nginx,就是这么简单
systemctl enable nginx //将nginx设为开机启动

 有没感觉这个跟安装net core运行库差不多,先rpm再yum。

现在用下你外网的地址访问下,nginx默认有开启一个80端口的服务了,如下图,(记得把防火墙关了或添加一个开放80的端口)

648126-20190605123513742-972959442.png

接下来把我的vue网站上传服务器上,我放在/var/www/vue 目录下,建议不要放在root下面,会涉及一些权限问题,还有SElinux记得关了(到/etc/selinux/config把SELINUX=enforcing改成SELINUX=disable,然后重启),不然很容易导致403错误,还有一些莫名奇妙的问题。

(如果你确实不想关SElinux的话,可以看我另一篇博客 Linux开启SELinux的情况下怎么解决nginx403跟502错误

648126-20190605124208848-952247659.png

然后在linux上切换到nginx的配置目录 

cd /etc/nginx
648126-20190605124539456-39264494.png

 如上图所示,nginx.conf是主配置文件,打开这个文件,下面有一句include /etc/nginx/conf.d*.conf,说明还有一些配置在conf.d目录里面,而我们主要要设置的都在conf.d里面

648126-20190605124657391-475875428.png

进到conf.d目录里,看到里面就一个default.conf文件

vi default.conf  //用vi编辑default.conf文件

如下图所示,主要把80端口改成1001端口,把 / 对应的网站目录改成vue的目录,匹配 /api 跟 /swagger 转发到 http://localhost:5000,就是我dotnet的网站

648126-20190605125209261-1085879400.png

保存后,记得nginx -t,检查一下,比如我上图中proxy_pass中有一个字符打错了,它就会提示

 648126-20190605125511886-1819573577.png

然后重启下nginx

nginx -s reload  //重启nginx

然后用外网加端口1001访问一下,发现弹出错误了,这个错误窗口是我vue前端页面里面弹出了,也说明了进行我的vue网站了,这个错误是后端接口没有开启。

648126-20190605125759740-916342594.png

 切换到dotnet 目录,dotnet xxx.dll 运行起来,再刷新一下,又弹出错误了,错误跟上次不同,说明成功访问我后端接口了,只是现在mysql还没装。

648126-20190605130018207-1968311823.png

安装Mysql

 安装的步骤跟安装nginx差不多,

到这里http://repo.mysql.com/找相关的rpm包,要用yum安装的话,找名称后面带noarch的,里面有好多rpm包,同个版本还分什么el、fc,这个我不太懂,但网上我看别人都是装el,那我就选个el7-11的,如下图

648126-20190605130515156-1302359769.png

先切换到家目录 cd ~,先下载上面的rpm包到本地

wget http://repo.mysql.com/mysql57-community-release-el7-10.noarch.rpm

648126-20190605130942114-2139163993.png

你可以看到已经下载到你的家目录了

然后步骤就跟安装net core运行库、nginx差不多了,先rpm,再yum

rpm -ivh mysql57-community-release-el7-10.noarch.rpm  
//我发现也可以用 yum install -y mysql57-community-release-el7-10.noarch.rpm,yum一样有安装功能
yum install -y mysql-server  //这句才是安装mysql,-y是全程yes,不用提示
systemctl start mysqld  //启动mysql服务,注意,是mysqld,有个d
systemctl enable mysql //将mysql设为开机启动
这样Mysql数据库就已经安装好了,接下来还得进行Mysql的配置
grep password /var/log/mysqld.log //先查看数据库的初始密码,记得复制下来
mysql -u root -p //然后登录mysql,输入刚才查看到的初始密码
set password for 'root'@'localhost' = password('newPassword!');//登录后,先重置密码,mysql默认的密码策略有点复杂,要大小写数字,还要8位以上

//可以先操作以下命令关闭密码复杂策略,再修改密码,
show variables like 'validate_password%'; //查看mysql关于密码的配置
set global validate_password_policy=0; //将密码策略改成低级,就只检查长度,不强制要求大小写
set global validate_password_length=1; //将密码长度改成1位

//创建一个远程登录用户,因为我要在外网用navicat for mysql软件连接
grant all privileges on 数据库名.表名 to 创建的用户名 @"%" identified by "密码"; // 数据库名.表名 如果写成*.*代表授权所有的数据库,%代表可以从任何地址登录

如 grant all privileges on *.* to caijt@"%" identified by "123456";

//记得你asp.net core程序里是用什么账号密码访问mysql的,就得设置成什么。
以下为mysql的一些相关配置文件路径:
配置文件:/etc/my.cnf
日志文件:/var/log//var/log/mysqld.log
服务启动脚本:/usr/lib/systemd/system/mysqld.service
socket文件:/var/run/mysqld/mysqld.pid

我顺便把mysql的默认字符集设置为utf8
648126-20190605141455631-1241810400.png

然后 systemctl restart mysqld重启一下mysql,登录mysql后用show variables like '%character%' 查看mysql的默认字符集

648126-20190605141715720-1543421170.png

然后我就可以在我的电脑上用navicat for Mysql进行连接了,对了,记得把防火墙关了,或者给防火墙加个3306的端口

 
648126-20190605141908422-145744172.png

然后在Navicat for Mysql把数据库进行恢复下,这些都很容易操作了。

数据库弄好后,到dotnet目录下dotnet  xxx.dll运行asp.net core 程序,然后再刷新一下外网地址,发现页面出来了,登录访问,一切正常

648126-20190605142919639-939543940.png

发现有些附件上传会出错,发现是附件大小超过1M就上传不了,那可以到nginx配置文件进行配置一下

648126-20190605143200531-1085620299.png

限制最大上传20m,然后重启下nginx

 

648126-20190605143656473-360569387.png

我本来一切都完美收厂时,我发现一个问题,我是用putty连接服务器,我把putty关了后,dotnet也就关了,其实在之前调试时,我也发觉这个dotnet得一直占用窗口很不方便,想用别的命令时,还得把ctrl+c停下来后再打命令,那么有什么办法能把dotnet也变成一个像mysql,nginx一样的后台服务呢。

 有两种方法可以解决

微软官方提供的https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-2.2#monitor-the-app,把dotnet创建成一个服务,就可以用systemctl来管理了

648126-20190605165028715-1039633156.png
[Unit]
Description=ItSysService

[Service]
WorkingDirectory=/var/www/dotnet
ExecStart=/usr/bin/dotnet /var/www/dotnet/ItSys.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-example
User=root
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

[Install]
WantedBy=multi-user.target

以上是我写的服务,保存在/etc/systemd/system/itsys.service,然后通过systemctl管理

systemctl enable itsys.service //设置为开机启动
systemctl start itsys.service //开启服务

第二种:

https://my.oschina.net/lichaoqiang/blog/1861791

参考以上博客,用Supervisor守护进程,这也是之前微软官方推荐的

然后把服务器相关的端口添加到防火墙,再启动防火墙。

好了。终于完美收工了。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK