.NET国产化改造探索(五)、结合Nginx并确保.NET应用程序自动启动

随着时代的发展以及近年来信创工作和…废话就不多说了,这个系列就是为.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/wwwlsdotnet 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/systemvim webapi.service

将下面的配置放到webapi.service中。

[Unit]Description=Example .NET Web API App running on Kylin Linux[Service]WorkingDirectory=/var/wwwExecStart=/root/dotnet/dotnet /var/www/WebAPI.dllRestart=alwaysRestartSec=10KillSignal=SIGINTSyslogIdentifier=dotnet-exampleUser=wwwEnvironment=ASPNETCORE_ENVIRONMENT=ProductionEnvironment=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

在这里插入图片描述
致此,操作系统层面的问题已经全部完成了。接下来的文章,透过构造一个完整权限管理系统,来进一步探索国产化。