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

随着时代的发展以及近年来信创工作和...废话就不多说了,这个系列就是为.NET遇到国产化需求的一个闭坑系列。接下来,看操作。

上一篇介绍了如何在银河麒麟操作系统上安装Nginx,这篇文章详细介绍下在银河麒麟操作系统上,使用Nginx+.NET程序实现自启动。

回顾一下之前的文章,.NET程序运行,我们使用下面的命令:

bash 复制代码
dotnet WebAPI.dll

这时我们可以看到,程序的端口号是5000,上一篇文章也说到,Nginx默认端口是80,这时我们会将Nginx配置为反向代理,以便将端口80上发出的请求路由到侦听端口5000的ASP.NET Core应用程序。

接下来,我们切换到/usr/local/nginx/conf目录,编辑nginx.conf文件。

将下面的配置放到location /配置中

bash 复制代码
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

bash 复制代码
map $http_connection $connection_upgrade {
    "~*Upgrade" $http_connection;
    default keep-alive;
  }

完成这些配置后,重启nginx

bash 复制代码
systemctl restart nginx

重启nginx后,我们需要马不停蹄的回到.NET的目录中,应该是这样的:

bash 复制代码
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用户并设置一个密码

bash 复制代码
useradd www
passed www

注意:www账户只是一个服务账户,在系统中并没有太大意义,所以为了安全,防止该账户登录是有意义的。使用下面的命令禁止该账户通过SSH 以交互方式登录到系统。
sudo usermod -s /usr/sbin/nologin www

设置完成后,使用下面命令查看账户状态

bash 复制代码
cat /etc/passwd | grep www

可以看到,www用户无法使用 SSH 以交互方式登录系统了。

接下来,使用下面的命令,创建webapi.service

bash 复制代码
cd /etc/systemd/system
vim webapi.service

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

bash 复制代码
[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 是管理服务的用户。 它应存在于系统中,并具有相应权限。

创建成功后,保存退出。

使用下面的命令,启动服务

bash 复制代码
 systemctl start webapi.service

使用下面的命令查看下当前状态

bash 复制代码
 systemctl status webapi.service

看到服务已经启动了。返回浏览器,访问下我们的WebAPI服务。

可以正常访问了。

到目前为止,服务正在运行但还未启用,通过下面的命令确保启动服务

bash 复制代码
systemctl enable webapi.service

致此,操作系统层面的问题已经全部完成了。接下来的文章,透过一个完整权限管理系统,来进一步探索国产化。

相关推荐
Harvey90318 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
全栈工程师修炼指南1 天前
Nginx | stream content 阶段:UDP 协议四层反向代理浅析与实践
运维·网络·网络协议·nginx·udp
鹏北海1 天前
micro-app 微前端项目部署指南
前端·nginx·微服务
全栈工程师修炼指南1 天前
Nginx | stream content 阶段:TCP 协议四层反向代理浅析与实践
运维·网络·网络协议·tcp/ip·nginx
森焱森1 天前
详解 Spring Boot、Flask、Nginx、Redis、MySQL 的关系与协作
spring boot·redis·python·nginx·flask
考琪1 天前
Nginx打印变量到log方法
java·运维·nginx
消失的旧时光-19431 天前
Nginx 是什么?为什么它不写在代码里?——从 0 认识 Nginx
运维·服务器·nginx
不像程序员的程序媛2 天前
Nginx日志切分
服务器·前端·nginx
缺点内向2 天前
C#: 告别繁琐!轻松移除Word文档中的文本与图片水印
c#·自动化·word·.net
JoySSLLian2 天前
手把手教你安装免费SSL证书(附宝塔/Nginx/Apache配置教程)
网络·人工智能·网络协议·tcp/ip·nginx·apache·ssl