.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

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

相关推荐
小码编匠32 分钟前
WPF 多线程更新UI的两种实用方案
后端·c#·.net
✎﹏赤子·墨筱晗♪1 小时前
Nginx 配置 SSL/TLS 全指南:从安装到安全强化
nginx·安全·ssl
m0_464608261 小时前
Nginx SSL/TLS 配置
运维·nginx·ssl
一个帅气昵称啊2 小时前
C#,RabbitMQ从入门到精通,.NET8.0(路由/分布式/主题/消费重复问题 /延迟队列和死信队列/消息持久化 )/RabbitMQ集群模式
分布式·微服务·架构·rabbitmq·.net
伽蓝_游戏4 小时前
UGUI源码剖析(15):Slider的运行时逻辑与编辑器实现
游戏·ui·unity·性能优化·c#·游戏引擎·.net
Tiger_shl14 小时前
【.Net技术栈梳理】03-核心框架与运行时(异常处理)
开发语言·.net
荣光波比15 小时前
Nginx 实战系列(七)—— Nginx一键安装脚本详解
运维·nginx·自动化·云计算
Linux运维技术栈18 小时前
域名网页加载慢怎么解决:从测速到优化的全链路性能优化实战
运维·网络·nginx·性能优化·cloudflare
荣光波比20 小时前
Nginx 实战系列(六)—— Nginx 性能优化与防盗链配置指南
运维·nginx·性能优化·云计算