背景:
上一篇:ASP.Net Core on Linux (CentOS7) 共享第三方依赖库部署
下一篇:两篇文章带你走入.NET Core 世界:Kestrel+Nginx+Supervisor 部署上云服务器(二)
已经交待了背景,这篇就省下背景了。
折腾的过程分两步:
第一步是:本机跑虚拟机部署试一下;
第二步是:买了个云服务器部署了上去。
折腾完,感觉DotNetCore,虽然普及率不高,但整体还算是比较成熟了。
下面,就和大伙分享一下这两步的过程及遇到的坑吧,让大伙也方便进入NetCore的世界。
测试环境跑:ASPNETCore on Linux(CentOS7)步骤:
1:下载:虚拟机VMware、CentOS7系统
VMware 下载地址:https://www.cr173.com/soft/81088.html
CentOS7 下载地址:https://www.centos.org/download/
也可以在阿里云镜像下载系统:https://mirrors.aliyun.com/centos/
如CentOS8 Stream 的下载路径:https://mirrors.aliyun.com/centos/8-stream/isos/x86_64/?spm=a2c6h.25603864.0.0.5b8036ab034fiN
为什么选CentOS7?
主要是上各大云平台,看他们提供最多的Linux版本就是这个了,比较大众化。
地址里有两个版本:DVD ISO (全家桶版本)和 Min ISO(最小版本)
为了避免麻烦,下载了DVD版本。
2:安装:VMware Workstation
如果是第一次安装:应该没啥情况好说。
如果是二次安装,如我的情况比较坑:
以前装了好多年的,重新运行时,发现要重新输入注册码。
于是网上找了几个注册码重新输入,结果不管用哪个码,都无效,甚至下载了注册机,都过不去了。
最后,想到重新安装,却连重新安装都提示无法安装。
解决方法:把注册表里和WMware相关的项都删除了,再重新安装,安装过程输入注册码就可以了。
在“运行”输入:regedit 打开 HKEY_LOCAL_MACHINE 选择 SOFTWARE找到VMware的键。删除即可。
之后就可以重新安装了,再输入注册码就正常了。
3:安装:CentOS7系统
按着别人的教程,以为安装的没界面的版本,没想到装完也是带KDE界面的。
找了两篇:
https://www.cnblogs.com/wcwen1990/p/7630545.html
http://baijiahao.baidu.com/s?id=1599601257937774752&wfr=spider&for=pc
我遇到的坑是:安装完后,界面就黑屏了,一直进不去。
解决方法:是BIOS的设置虚拟化没开(笔记本开机时的BIOS曾经重置到默认过) https://blog.csdn.net/weixin_41196185/article/details/79574494
接下来,你需要熟悉一下Linux系统,先了解一下 Linux目录结构:
为了少点折腾,直接先用root账号玩吧,新创建的普通账号根本玩不来。
补充说明:yum 配置
如果安装的最小unix系统,有时候基础工具都是没有或不完整的,比如wget、vim这样简单的都木有。
而且首次通常都需要配置一下yum的镜像到国内,用vi命令编辑保存往往出问题,网上教程教你用wget,连发现连wget也木有,特麻烦。
因此最简单的方法是:直接下载repo,然后上传即可。
下载地址:https://mirrors.aliyun.com/repo/
上传目录:/etc/yum.repos.d/
执行:yum clean all 就完事了。
补充说明2:yum install Redis安装详情
如果安装提示找不到 Redis 源,则先安装epel
yum install epel-release
安装 Redis
yum install redis
如果发现通过ftp上找不到redis.conf文件。
最后的方法:
执行命令:
rpm -qa | grep redis
可以调出该安装包,如名称:redis-5.0.3-5.module_el8.4.0+955+7126e393.x86_64
(PS:该名称在安装时也可见)
然后执行:
rpm -ql redis-5.0.3-5.module_el8.4.0+955+7126e393.x86_64
即可查看所有安装路径,如:
从安装路径,就可以轻松找到自己要的文件,同理,该方法适用在其它软件上。
4:安装:NET Core SDK
跟着微软的教程走:在 CentOS Linux 上安装 .NET - .NET | Microsoft Learn
其中一条:sudo yum update 这条更新系统组件(可选,200M左右,看网络是否方便)
哥当时网络差,结果这一步卡了1个多小时,结果还失败了,后来直接跳过它了。
补充说明:事隔多年,本着想运行NET6,结果发现,官网默认不提供了6版本的。
通过7版本的手动改成6版本,安装后发现是rc版本,和开发环境版本不一致,于是开启手工安装版本:
这里以手工安装最新NET6、NET8 版本为示例:
1、下载NET6最新版本:https://dotnet.microsoft.com/zh-cn/download/dotnet/6.0
2、下载NET8最新版本:https://dotnet.microsoft.com/zh-cn/download/dotnet/8.0
更多版本下载:.NET 下载(Linux、macOS 和 Windows) (microsoft.com)
3、将下载文件上传到目录下,如:/usr/share/dotnet(可创建该目录)
4、执行解压命令:tar -xzvf 文件名 默认解压到当前目录下即可。
5、设置环境变量:把etc/profile文件下载到本地,记事本打开,末尾添加两个变量:
export PATH=$PATH:/usr/share/dotnet
export DOTNET_ROOT=/usr/share/dotnet
上传该文件复盖。
执行命令,让环境变量即时生效:source /etc/profile
手工安装的,可以需要安装其它引用库:
执行命令:yum install libicu
最后执行:dotnet --version (SDK版本)或 dotnet --info(Runtime版本)查看版本是否正常。
补充:.NET 8 可能会遇到如下异常:
该版本库版本过低引发的:
解决:
1、下载:libstdc库
2、 解压上面的库到 /usr/lib64/ 目录下,并执行以下代码:
sudo rm /usr/lib64/libstdc++.so.6 sudo ln -s /usr/lib64/libstdc++.so.6.0.26 /usr/lib64/libstdc++.so.6 sudo ldconfig
完事收工。
补充:关闭防火墙
如果不关闭,则除了常用端口,其它端口默认不是允许访问的,可能会导致外部无法。
命令如下:
在命令行中输入:systemctl stop firewalld.service
在命令行中输入:systemctl disable firewalld.service
即可永久关闭防火墙
5:发布部署并运行:Taurus.MVC 项目和 Aries 项目。
你可以在GitHub上下载 Taurus.MVC 的源码项目,运行:Taurus.MVC_NetCore.sln 然后右键发布。
由于当年VS2017装的比较早,发布的选项里是木有:部署模式 的。
现在在VS 2017 的 视图-通知 菜单里,升级了一下,才有这东西。
如果是运行自己的项目,注意发布前,需要提前设置好要监听的端口:
public class Program { public static void Main(string[] args) { BuildWebHost(args).Run(); } public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .UseUrls(GetUrl()) .Build(); public static string GetUrl() { string url = AppConfig.GetApp("Host", "[http|https]://*:8888");//这里弄成了可以配置的形式,不配置默认就是8888端口 return url; } }
我在/home/目录下创建了web目录,如:
/home/web/taurus/
/home/web/aries/
将发布后的目录下的所有东西,包括100多个Microsoft.XXXX.dll,都复制粘贴到taurus目录或aries目录下。
当然,你也可以参考上一篇文章,将第三方的dll移到单独的目录去。
在虚拟机中有界面可以直接复制粘贴,所以暂时也不用搞ssh的工具和ftp了。
这里你得会基本的linux命令,cd 切换目录总得会:
切到项目目录,如 cd /home/web/taurus/
然后运行:
dotnet Taurus.View.dll (program.cs所在的dll名称) PS:按Ctrl+C 可退出程序
现在可以用:http://ip:8888 访问了。
我这里遇到的坑:
提示找不到:libuv库 百度半年无所得,后来看到runtime目录,里面发现linux-64目录下有libuv.so,把它给copy到根目录,才运行起来。
PS:VS 2017 升级后,再发布时会自动把libuv.so给弄到根目录。
6:安装: Ngnix
默认 dotnet xxx.dll 运行的是 kestrel 服务器,不支持域名绑定,所以得弄一个支持域名绑定的来配合一下。
而这个支持负载均衡的反向代理服务器,简单又实用,大伙都爱用它。
网上有些很复杂的教程坑死人:
就是下载源码,然后运行编绎的那些教程,结果我照着运行编绎,结果报错了,然后一脸朦B。
在坑里转了半天,最后找到一个最简单的,就两行命令:
1、添加Nginx到YUM源,添加CentOS 7 Nginx yum资源库,打开终端,使用以下命令:
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
2、安装Nginx,在你的CentOS 7 服务器中使用yum命令从Nginx源服务器中获取来安装Nginx:
sudo yum install -y nginx
Nginx将完成安装在你的CentOS 7 服务器中。
3、启动Nginx,刚安装的Nginx不会自行启动。运行Nginx:
sudo systemctl start nginx.service
直接输入本机IP,默认80端口,即可访问,看到Welcome...。
参考:https://blog.csdn.net/u012486840/article/details/52610320
7、关闭Selinux
关闭本地IP自循环的这个限制,Ngnix才能指向Kestrel服务器,不然会报以下错:
502 Bad gateway错误
打开文件:/etc/selinux/config,把SELINUX=enforcing 改成如下的disabled
# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of three two values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted
改完保存,要重启才能生效,可是哥不想重启,找了半年也没找到可以有即时生效的命令,坑啊。
后来找到另一个方法,把Ngnix加入Selinux的白名单,就不用关它了。
运行以下三条命令就好了:
yum install policycoreutils-python cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M mynginx semodule -i mynginx.pp
8:Nginx配置网站:
nginx的配置文件在:/etc/nginx/nginx.conf,打开的话内容如下:
user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; }
不过这个文件可以不用动,因为它的服务配置include 指向了/etc/nginx/conf.d/*.conf。
所以,只要在conf.d目录下创建自己的网站配置文件即可,可以把default.conf 移除或改个后缀先:
然后新建:taurus.conf 的配置(这里少了三个基本的配置:Domain替换、负载均衡、动静分离,在下一篇介绍):
server { listen 80; server_name mvc.taurus.cyqdata.com;//绑定域名
location / { proxy_pass http://localhost:8888/;//跳转地址 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Cookie $http_cookie; } #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 /usr/share/nginx/html; } }
接着,刷新配置即可:
nginx -s reload
访问效果:
补充:设置开启自启动
输入命令,创建服务:vim /etc/systemd/system/netcore.service
[Unit] Description=netcore for auto start [Service] Type=simple # app的目录 WorkingDirectory=/home/web/regcenter # 启动命令 ExecStart=/usr/dotnet /home/web/regcenter/Taurus.View.dll Restart=always StandardOutput=journal StandardError=journal # Restart service after 10 seconds if the dotnet service crashes: RestartSec=10 KillSignal=SIGINT SyslogIdentifier=dotnet-example Environment=ASPNETCORE_ENVIRONMENT=Production Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false [Install] WantedBy=multi-user.target
这个只能用命令行创建(我在开发电脑手动本地创建文件,上传,搞了半天都没反应)。
服务创建好,启用一下即可:
启用: systemctl enable netcore.service 启动: systemctl start netcore.service 查看状态: systemctl status netcore.service 如果失败状态有错误,则需要vim重新编辑, 编辑正确后重新加载: systemctl daemon-reload 最后可以重启测试: reboot
补充:更改中国时区
如果服务器时区不对,可以进行更改:
执行tzselect命令-->选择Asia-->选择China-->选择east China - Beijing, ->然后输入1 再执行 ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
总结:
进入NetCore的世界:
1、NetCore的技术学习成本还算是比较低的:
因为Taurus和Aries在window和linux的开发方式和代码都是同一套,
根本不需要学习NetCore下的MVC、EF以及一大堆有的没的消费时间。
2、整体的学习成本,更多的还是熟悉Linux系统及命令行花的时间多。
Aries on CentOS7:mvc.aries.cyqdata.com
Taurus on CentOS7:mvc.taurus.cyqdata.com
下一篇,介绍正式往服务器上部署的过程。
版权声明:本文原创发表于 博客园,作者为 路过秋天 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。 |
个人微信公众号 |
Donation(扫码支持作者):支付宝: |
Donation(扫码支持作者):微信: |