.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

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

相关推荐
程序员秘密基地5 小时前
基于c#,asp.net webform, sql server数据库,在线档案管理系统
开发语言·sqlserver·asp.net·.net·源代码管理
码上飞扬6 小时前
Nginx功能全解析:你的高性能Web服务器解决方案
服务器·前端·nginx
资讯第一线11 小时前
Microsoft .NET Framework 3.5 离线安装包 下载
microsoft·.net
UFIT1 天前
Nginx 核心功能笔记
运维·笔记·nginx
后院那片海1 天前
Nginx核心功能
linux·服务器·nginx
Hello.Reader1 天前
Ubuntu 下 Nginx 1.28.0 源码编译安装与 systemd 管理全流程指南
linux·nginx·ubuntu
伤不起bb1 天前
Nginx 核心功能
linux·服务器·nginx
潘yi.2 天前
web技术与nginx网站环境部署
服务器·网络·nginx
Jtti2 天前
Jtti:nginx服务器如何限制访问频率
服务器·网络·nginx
chenglin0162 天前
.NET中,const和readonly区别
开发语言·.net