在Linux上使用Systemd来部署和管理.NET应用程序是一个常见且推荐的做法。Systemd不仅可以确保你的应用在系统启动时自动运行,还可以处理自动重启、日志记录等功能。以下是详细的步骤说明,指导你如何设置一个Systemd服务来管理你的.NET应用程序。
Systemd用于启动、停止、重启和监控.NET应用程序。它是一个系统和服务管理器,能够确保你的应用在服务器启动时自动运行,并且在崩溃或异常终止后能自动重启。实际应用中可以搭配nginx一起使用。本文只是一个简单的例子。
搭建环境
首先需要搭建一个linux的环境,本文使用的是Ubuntu 22.04.5 LTS。
然后我们打开一个shell输入一下代码:
# 切换到root用户,并以root权限打开一个shell。
sudo -i
# 切换目录到根目录(/)
cd /
# 列出当前目录中的所有文件和目录。
ls
# 创建一个名为coreapi的新目录。
mkdir coreapi
# 递归地更改coreapi目录及其内容的权限,使所有人具有读取、写入和执行权限
chmod -R 777 coreapi/
这样已经成功的在指定目录创建了一个文件夹,接下来我们发布程序。然后我们把发布的代码放进去就好了。
发布程序
本文使用的是visual studio 2022。
新建项目,创建一个DemoApi的webapi项目。然后右键项目发布,按照图片进行配置。
我们把打包的文件放在刚才的目录,然后直接运行试一下。如果提示权限不足,就是因为少执行了一句命令。
# 给DemoApi文件添加执行权限,适用于文件所有者、所属组及其他用户。
chmod +x DemoApi
# 执行位于当前目录中的名为DemoApi的可执行文件。
./DemoApi
运行完毕后,我们打开网页看一下是没问题的。
创建和启动服务
linux运行.net的项目是可以了,但是如果关闭shell的话,程序就不能用了。所以我们需要把项目部署再linux的服务了。就是本文说的systemd。
systemd通常会在/etc/systemd/system/目录下创建一个.service文件,例如myapp.service。那么我们按照这个目录创建一个coreapi.service的文件。
继续执行一下代码:
# 切换到指定目录
cd /etc/systemd/system
# 启动vim编辑器打开或创建一个coreapi.service 的Systemd服务配置文件。
vim coreapi.service
我们把下面的内容通过vim编辑器粘贴再coreapi.service中。其中的参数
[Unit]
Description=My .NET Application Service
# 确保网络目标已启动后再启动此服务,确保网络接口可用。
After=network.target
[Service]
# 设置工作目录为应用程序所在的路径。
WorkingDirectory=/var/coreapi
# 指定启动应用程序的命令。确保路径正确指向你的可执行文件或dotnet运行时与dll文件。
# ExecStart=/usr/bin/dotnet /var/coreapi/DemoApi.dll
ExecStart=/var/coreapi/DemoApi
# 当服务停止后总是尝试重启它。
Restart=always
# 如果服务崩溃,在10秒后自动重启。
RestartSec=10
# 为日志条目指定一个标识符,方便识别。
SyslogIdentifier=myapp
# 设置环境变量,指示应用程序当前处于生产环境。
Environment=ASPNETCORE_ENVIRONMENT=Production
# 指定运行服务的用户。使用非特权用户提高安全性。
User=www-data
# 可选:设置应用程序监听的URL(如果需要自定义)。
# Environment=ASPNETCORE_URLS=http://localhost:5000
# 可选:禁用.NET Core遥测消息。
# Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
# 可选:设置应用程序日志级别(例如,仅记录错误)。
# Environment=ASPNETCORE_LOGGING__LOGLEVEL=Error
[Install]
# 定义服务在多用户模式下被启用。
WantedBy=multi-user.target
然后我们设置启用和启动命令。
# 启用 coreapi.service 服务,使其在系统启动时自动运行
systemctl enable coreapi.service
# 启动 coreapi.service 服务。
systemctl start coreapi.service
其他
我们还可以status和stop命令查看服务的状态或者关闭服务
# 查看 coreapi.service 服务的状态
systemctl status coreapi.service
# 停止 coreapi.service 服务。
systemctl stop coreapi.service