为什么在 Linux 上部署 .NET Core MVC 合理
.NET Core / .NET (以后简称 .NET) 是跨平台的,可在 Linux、macOS 和 Windows 上运行。
Linux 主机价格/资源成本通常更低,生态成熟、稳定性高,适合生产环境部署。
使用反向代理服务器(如 Nginx 或 Apache)帮助处理静态内容、SSL 终端、负载转发等职责,使得 Kestrel 专注于业务逻辑。
准备工作:环境要求与先决条件
在正式部署之前,需要以下准备:
1. Linux 服务器(Ubuntu、Debian、CentOS 等)
拥有 root 或 sudo 权限。
2. 安装 .NET 运行时 / SDK
根据 Linux 发行版,从微软官方源或包管理器安装所需版本(运行时即可,除非你需要在服务器上编译)。
安装完成后,可通过 dotnet --version、dotnet --list-runtimes 等命令确认安装。
3. 已有的 .NET Core MVC 项目
在本地或开发环境中,该项目应已可运行、无重大错误。
4. 域名与 DNS(可选,若在公网访问)
若希望使用 www.yourdomain.com 访问网站,应提前将域名指向服务器 IP。
5. 防火墙 / 安全组设置
确保 HTTP(80)、HTTPS(443)端口、以及你部署的端口(例如 5000)在服务器防火墙中开放。
构建与发布 .NET Core MVC 应用
在本地开发环境(Windows 或 Linux 均可)完成以下步骤:
在项目目录执行发布命令:
dotnet publish -c Release -o ./publish
此命令会把所有运行时所需文件、依赖库、静态资源输出到 publish 文件夹。
选择部署方式:
- 框架依赖部署(Framework-Dependent Deployment):只部署你的应用,服务器需有对应版本的 .NET 运行时。
- 自包含部署(Self-Contained Deployment):包含应用所需的运行时,中间服务器无需再安装 .NET 运行时。
如果希望更加轻松在不同环境中运行,自包含部署是不错的选择,但会让包体积大一些。
将 publish 目录下内容通过 SCP / SFTP / rsync 等方式上传到 Linux 服务器某个目录,例如 /var/www/myapp。
在 Linux 服务器上准备运行环境
以 Ubuntu 为例,其它发行版操作类似:
1. 创建部署目录,并调整权限(假设部署目录为 /var/www/myapp):
sudo mkdir -p /var/www/myapp
sudo chown -R <youruser>:<youruser> /var/www/myapp
2. 将本地发布文件上传到该目录下。
3. 为 .NET 应用创建 systemd 服务文件,方便开机启动与进程管理。例如创建 /etc/systemd/system/myapp.service,内容如下:
[Unit]
Description=My .NET Core MVC App
After=network.target
[Service]
WorkingDirectory=/var/www/myapp
ExecStart=/usr/bin/dotnet /var/www/myapp/YourAppAssembly.dll
Restart=always
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-myapp
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
[Install]
WantedBy=multi-user.target
- 注意:
- User 可以设置为非 root 用户(推荐安全性更高)。
- Environment 可设置 ASPNETCORE_ENVIRONMENT=Production 或其他环境标识。
4. 启用并启动服务:
sudo systemctl daemon-reload
sudo systemctl enable myapp
sudo systemctl start myapp
可用 sudo systemctl status myapp 检查服务状态。
5. 如果你的应用直接监听端口(如 5000),可以先确认其能运行(通过 curl http://127.0.0.1:5000 查看响应)。
配置反向代理:Nginx 或 Apache
为了使应用在标准 HTTP/HTTPS 端口(80/443)对外可访问,并处理静态资源、SSL 终端、负载均衡等,推荐使用反向代理。
使用 Nginx 作为反向代理
1. 安装 Nginx:
sudo apt update
sudo apt install nginx
2. 在 /etc/nginx/sites-available/myapp(或 conf.d/myapp.conf)中添加如下配置:
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
location / {
proxy_pass http://127.0.0.1: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;
}
# 可选:处理静态资源缓存或其他规则
}
3. 启用站点并重启 Nginx:
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
使用 Apache 作为反向代理
如果你偏好 Apache,也可以用 mod_proxy 模块转发请求给 Kestrel:
在 Apache 配置(如 /etc/apache2/sites-available/myapp.conf)中:
<VirtualHost *:80>
ServerName yourdomain.com
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:5000/
ProxyPassReverse / http://127.0.0.1:5000/
# WebSocket 支持
RewriteEngine on
RewriteCond %{HTTP:UPGRADE} =WebSocket [NC]
RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
RewriteRule /(.*) ws://127.0.0.1:5000/$1 [P]
</VirtualHost>
然后启用相关模块与站点:
sudo a2enmod proxy proxy_http rewrite
sudo a2ensite myapp
sudo apachectl configtest
sudo systemctl reload apache2
SSL/HTTPS(可选但强烈推荐)
若需要 HTTPS,建议使用 Let’s Encrypt(Certbot)自动签发免费证书。大致步骤:
1. 安装 Certbot(针对 Nginx 或 Apache 插件)。
2. 执行 sudo certbot --nginx 或 sudo certbot --apache,按提示获取证书并修改配置。
3. Certbot 会自动配置 HTTPS 重定向等规则。
4. 验证证书续期是否正常(Certbot 会设定定时任务):
sudo certbot renew --dry-run
常见排错与优化建议
- 检查 systemd 服务日志:sudo journalctl -u myapp
- 检查 Nginx / Apache 错误日志文件是否有代理错误
- 若跨域、HTTPS 重定向、头部转发有问题,请在代理配置中设置合适的 X-Forwarded-* 头
- 若部署多个 MVC 应用在同一服务器,可为每个应用设置不同端口,并在反向代理配置中用不同路径或子域名转发
- 为后续扩展考虑负载均衡、健康检查、日志监控与自动重启机制
部署总结与流程回顾
- 在本地发布 MVC 应用
- 将发布文件上传至 Linux 服务器
- 为应用创建 systemd 服务并启动
- 配置反向代理服务器(Nginx / Apache)转发外部请求
- (可选)配置 HTTPS / SSL
- 调试检查并完善日志监控
通过上述流程,你就能让 .NET Core MVC 应用稳定、可维护地运行在 Linux 上。