.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/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

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

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-10 15:46:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-10 15:46:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-10 15:46:03       87 阅读
  4. Python语言-面向对象

    2024-01-10 15:46:03       96 阅读

热门阅读

  1. C++ 字符串哈希 || 字符串前缀哈希法

    2024-01-10 15:46:03       47 阅读
  2. Android studio ListView应用设计

    2024-01-10 15:46:03       57 阅读
  3. Flutter GetX 之 状态管理

    2024-01-10 15:46:03       56 阅读
  4. 如何彻底卸除Microsoft Edge浏览器

    2024-01-10 15:46:03       67 阅读
  5. LeetCode每日一题 | 2707. 字符串中的额外字符

    2024-01-10 15:46:03       65 阅读
  6. nodejs 服务端token 高效缓存验证

    2024-01-10 15:46:03       57 阅读
  7. 一种快速对32位/64位整数取模的方法

    2024-01-10 15:46:03       65 阅读
  8. HTML实战演练之比心

    2024-01-10 15:46:03       52 阅读