随着时代的发展以及近年来信创工作和…废话就不多说了,这个系列就是为.NET遇到国产化需求的一个闭坑系列。接下来,看操作。
上一篇介绍了如何在银河麒麟操作系统上安装Nginx,这篇文章详细介绍下在银河麒麟操作系统上,使用Nginx+.NET程序实现自启动。
回顾一下之前的文章,.NET程序运行,我们使用下面的命令:
dotnet WebAPI.dll
这时我们可以看到,程序的端口号是5000,上一篇文章也说到,Nginx默认端口是80,这时我们会将Nginx配置为反向代理,以便将端口80上发出的请求路由到侦听端口5000的ASP.NET Core应用程序。
接下来,我们切换到/usr/local/nginx/conf
目录,编辑nginx.conf
文件。
将下面的配置放到location /
配置中
proxy_pass http://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
保存退出编辑。
将下面的配置放到http
中
map $http_connection $connection_upgrade {
"~*Upgrade" $http_connection;
default keep-alive;
}
完成这些配置后,重启nginx
:
systemctl restart nginx
重启nginx
后,我们需要马不停蹄的回到.NET的目录中,应该是这样的:
cd /var/www
ls
dotnet WebAPI.dll
程序将会启动,如下图:
这时,打开浏览器,输入IP地址。一切正常。
这说明配置的反向代理生效了,接下来,就是如何使.NET程序自动启动了。
到目前为止,Nginx和.NET程序已经可以协同工作了,Nginx侦听80端口,并将请求路由到侦听端口为5000的.NET应用程序,但每次重启服务器或者是退出Shell客户端,都必须手动重启.NET应用程序,这不是实际的解决办法,因此,我们需要进一步配置,以便应用程序可以自动启动。
在Windows上,使用IIS作为代理来运行.NET应用,IIS相关模块会确保.NET程序会自动启动,在Linux上可以吗?也是可以的,我们可以通过 supervisor
来守护进程,也可以使用.service
服务文件来实现.NET程序自动启动。
我使用.service
服务文件实现程序自动启动。回想上一篇文章,在/etc/systemd/system
目录下,创建过一个nginx.service
来实现Nginx
自动启动,我们再回到这个目录,创建一个webapi.service
来实现.NET程序的自动启动,废话不多说,开干。
首先创建一个www
用户并设置一个密码
useradd www
passed www
注意:
www
账户只是一个服务账户,在系统中并没有太大意义,所以为了安全,防止该账户登录是有意义的。使用下面的命令禁止该账户通过SSH 以交互方式登录到系统。
sudo usermod -s /usr/sbin/nologin www
设置完成后,使用下面命令查看账户状态
cat /etc/passwd | grep www
可以看到,www
用户无法使用 SSH 以交互方式登录系统了。
接下来,使用下面的命令,创建webapi.service
cd /etc/systemd/system
vim webapi.service
将下面的配置放到webapi.service
中。
[Unit]
Description=Example .NET Web API App running on Kylin Linux
[Service]
WorkingDirectory=/var/www
ExecStart=/root/dotnet/dotnet /var/www/WebAPI.dll
Restart=always
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-example
User=www
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target
解释下参数:
WorkingDirectory
是发布应用程序的目录。
ExecStart
是启动应用程序的实际命令(必须使用绝对路径)。
Restart=always
如果由于某种原因(无论是手动还是由于崩溃)而停止,则自动启动。
RestartSec=10
进程停止后,10 秒后自动启动。
SyslogIdentifier
很重要。 它表示“系统日志标识符”。 有关守护程序的信息记录在此名称下的系统日志中。 还可以使用此标识符查找进程的 PID。
User 是管理服务的用户。 它应存在于系统中,并具有相应权限。
创建成功后,保存退出。
使用下面的命令,启动服务
systemctl start webapi.service
使用下面的命令查看下当前状态
systemctl status webapi.service
看到服务已经启动了。返回浏览器,访问下我们的WebAPI服务。
可以正常访问了。
到目前为止,服务正在运行但还未启用,通过下面的命令确保启动服务
systemctl enable webapi.service
致此,操作系统层面的问题已经全部完成了。接下来的文章,透过一个完整权限管理系统,来进一步探索国产化。