1. 环境准备搭建.NET8运行环境在Ubuntu 22.04上部署.NET8应用第一步就是要准备好运行环境。很多人第一次接触Linux部署时容易犯一个错误——直接去微软官网下载runtime安装包手动安装。其实微软官方已经为我们提供了更优雅的apt源安装方式。先来安装必要的依赖项。打开终端依次执行以下命令# 安装基础依赖 sudo apt-get update sudo apt-get install -y wget接下来添加微软官方APT源。这里有个小技巧使用wget下载时加上-O参数可以重命名文件避免文件名过长wget https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb rm packages-microsoft-prod.deb # 安装后记得删除临时文件安装运行时环境时根据你的需求选择如果只需要运行.NET8程序sudo apt-get install -y aspnetcore-runtime-8.0如果还需要编译代码比如需要运行dotnet buildsudo apt-get install -y dotnet-sdk-8.0验证安装是否成功有个实用技巧不仅检查dotnet --info还可以试试dotnet --list-sdks和dotnet --list-runtimes。我遇到过几次环境变量配置问题导致命令找不到的情况这时候可以检查下PATHecho $PATH | grep dotnet如果发现dotnet不在PATH中可以手动添加export PATH$PATH:/usr/share/dotnet2. 应用发布与部署环境准备好后就该部署我们的应用了。这里我分享几个实际项目中总结的经验。首先在开发机上发布应用时建议使用以下命令dotnet publish -c Release -r linux-x64 --self-contained false参数说明-c Release使用Release配置-r linux-x64指定目标运行时--self-contained false使用框架依赖模式文件更小发布完成后你会得到一个包含dll的文件夹。上传到服务器时我强烈建议使用rsync而不是简单的scprsync -avz ./publish/ useryourserver:/opt/yourapprsync的优势在于支持断点续传而且可以只同步变化的文件。文件权限设置是个容易踩坑的地方。除了给执行权限外还要注意sudo chown -R www-data:www-data /opt/yourapp # 根据你的运行用户调整 find /opt/yourapp -type d -exec chmod 755 {} \; find /opt/yourapp -type f -exec chmod 644 {} \; chmod x /opt/yourapp/your.app # 如果有可执行文件运行应用时生产环境建议使用nohup或screen保持会话nohup dotnet /opt/yourapp/your.app.dll /var/log/yourapp.log 21 不过这只是临时方案更专业的做法是使用systemd我们稍后会详细讲解。3. 使用systemd实现服务守护systemd是Linux的服务管理神器能让我们的.NET应用像系统服务一样稳定运行。下面手把手教你配置。首先创建服务文件注意最佳实践是放在/etc/systemd/system/而不是/usr/lib/systemd/system/sudo nano /etc/systemd/system/yourapp.service服务文件内容示例这是我优化过的生产级配置[Unit] DescriptionYour .NET8 Application Afternetwork.target [Service] Typenotify WorkingDirectory/opt/yourapp ExecStart/usr/bin/dotnet /opt/yourapp/your.app.dll Restartalways RestartSec10 KillSignalSIGTERM SyslogIdentifieryourapp Userwww-data Groupwww-data EnvironmentASPNETCORE_ENVIRONMENTProduction EnvironmentDOTNET_PRINT_TELEMETRY_MESSAGEfalse EnvironmentDOTNET_CLI_TELEMETRY_OPTOUT1 # 限制资源使用根据实际情况调整 MemoryLimit500M CPUQuota80% [Install] WantedBymulti-user.target几个关键配置说明Typenotify让.NET能通知systemd服务状态资源限制防止应用占用过多资源环境变量禁用遥测数据减少不必要的网络请求启用服务并设置开机启动sudo systemctl daemon-reload sudo systemctl enable yourapp.service sudo systemctl start yourapp.service查看服务状态时除了基本的status命令还可以用journalctl -u yourapp.service -f # 实时查看日志 systemctl show yourapp.service -p MemoryCurrent # 查看内存使用4. 高级配置与优化部署完成后还需要一些优化才能算真正的生产就绪。首先是日志管理建议使用Linux的logrotatesudo nano /etc/logrotate.d/yourapp内容示例/var/log/yourapp.log { daily rotate 7 missingok compress delaycompress notifempty create 640 www-data www-data sharedscripts postrotate systemctl kill -s HUP yourapp.service endscript }对于Web应用通常需要配置反向代理。以Nginx为例server { listen 80; server_name yourdomain.com; location / { proxy_pass http://localhost:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; 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; } }性能调优方面可以调整.NET的GC设置# 在服务文件的[Service]部分添加 EnvironmentDOTNET_GCServer1 EnvironmentDOTNET_GCHeapCount2监控也很重要可以安装prometheus的.NET客户端然后在systemd中暴露指标端口# 在服务文件的[Service]部分添加 EnvironmentASPNETCORE_URLShttp://localhost:5000 EnvironmentPROMETHEUS_METRICS_PORT9090最后提醒几个常见问题排查命令# 检查端口占用 sudo netstat -tulnp | grep dotnet # 检查依赖项 ldd $(which dotnet) # 查看系统资源限制 ulimit -a
Ubuntu 22.04 部署 .NET8 应用:从环境配置到服务守护
1. 环境准备搭建.NET8运行环境在Ubuntu 22.04上部署.NET8应用第一步就是要准备好运行环境。很多人第一次接触Linux部署时容易犯一个错误——直接去微软官网下载runtime安装包手动安装。其实微软官方已经为我们提供了更优雅的apt源安装方式。先来安装必要的依赖项。打开终端依次执行以下命令# 安装基础依赖 sudo apt-get update sudo apt-get install -y wget接下来添加微软官方APT源。这里有个小技巧使用wget下载时加上-O参数可以重命名文件避免文件名过长wget https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb rm packages-microsoft-prod.deb # 安装后记得删除临时文件安装运行时环境时根据你的需求选择如果只需要运行.NET8程序sudo apt-get install -y aspnetcore-runtime-8.0如果还需要编译代码比如需要运行dotnet buildsudo apt-get install -y dotnet-sdk-8.0验证安装是否成功有个实用技巧不仅检查dotnet --info还可以试试dotnet --list-sdks和dotnet --list-runtimes。我遇到过几次环境变量配置问题导致命令找不到的情况这时候可以检查下PATHecho $PATH | grep dotnet如果发现dotnet不在PATH中可以手动添加export PATH$PATH:/usr/share/dotnet2. 应用发布与部署环境准备好后就该部署我们的应用了。这里我分享几个实际项目中总结的经验。首先在开发机上发布应用时建议使用以下命令dotnet publish -c Release -r linux-x64 --self-contained false参数说明-c Release使用Release配置-r linux-x64指定目标运行时--self-contained false使用框架依赖模式文件更小发布完成后你会得到一个包含dll的文件夹。上传到服务器时我强烈建议使用rsync而不是简单的scprsync -avz ./publish/ useryourserver:/opt/yourapprsync的优势在于支持断点续传而且可以只同步变化的文件。文件权限设置是个容易踩坑的地方。除了给执行权限外还要注意sudo chown -R www-data:www-data /opt/yourapp # 根据你的运行用户调整 find /opt/yourapp -type d -exec chmod 755 {} \; find /opt/yourapp -type f -exec chmod 644 {} \; chmod x /opt/yourapp/your.app # 如果有可执行文件运行应用时生产环境建议使用nohup或screen保持会话nohup dotnet /opt/yourapp/your.app.dll /var/log/yourapp.log 21 不过这只是临时方案更专业的做法是使用systemd我们稍后会详细讲解。3. 使用systemd实现服务守护systemd是Linux的服务管理神器能让我们的.NET应用像系统服务一样稳定运行。下面手把手教你配置。首先创建服务文件注意最佳实践是放在/etc/systemd/system/而不是/usr/lib/systemd/system/sudo nano /etc/systemd/system/yourapp.service服务文件内容示例这是我优化过的生产级配置[Unit] DescriptionYour .NET8 Application Afternetwork.target [Service] Typenotify WorkingDirectory/opt/yourapp ExecStart/usr/bin/dotnet /opt/yourapp/your.app.dll Restartalways RestartSec10 KillSignalSIGTERM SyslogIdentifieryourapp Userwww-data Groupwww-data EnvironmentASPNETCORE_ENVIRONMENTProduction EnvironmentDOTNET_PRINT_TELEMETRY_MESSAGEfalse EnvironmentDOTNET_CLI_TELEMETRY_OPTOUT1 # 限制资源使用根据实际情况调整 MemoryLimit500M CPUQuota80% [Install] WantedBymulti-user.target几个关键配置说明Typenotify让.NET能通知systemd服务状态资源限制防止应用占用过多资源环境变量禁用遥测数据减少不必要的网络请求启用服务并设置开机启动sudo systemctl daemon-reload sudo systemctl enable yourapp.service sudo systemctl start yourapp.service查看服务状态时除了基本的status命令还可以用journalctl -u yourapp.service -f # 实时查看日志 systemctl show yourapp.service -p MemoryCurrent # 查看内存使用4. 高级配置与优化部署完成后还需要一些优化才能算真正的生产就绪。首先是日志管理建议使用Linux的logrotatesudo nano /etc/logrotate.d/yourapp内容示例/var/log/yourapp.log { daily rotate 7 missingok compress delaycompress notifempty create 640 www-data www-data sharedscripts postrotate systemctl kill -s HUP yourapp.service endscript }对于Web应用通常需要配置反向代理。以Nginx为例server { listen 80; server_name yourdomain.com; location / { proxy_pass http://localhost:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; 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; } }性能调优方面可以调整.NET的GC设置# 在服务文件的[Service]部分添加 EnvironmentDOTNET_GCServer1 EnvironmentDOTNET_GCHeapCount2监控也很重要可以安装prometheus的.NET客户端然后在systemd中暴露指标端口# 在服务文件的[Service]部分添加 EnvironmentASPNETCORE_URLShttp://localhost:5000 EnvironmentPROMETHEUS_METRICS_PORT9090最后提醒几个常见问题排查命令# 检查端口占用 sudo netstat -tulnp | grep dotnet # 检查依赖项 ldd $(which dotnet) # 查看系统资源限制 ulimit -a