Linux 上部署 .NET Core MVC 网站:全流程实战教程

为什么在 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 应用在同一服务器,可为每个应用设置不同端口,并在反向代理配置中用不同路径或子域名转发
  • 为后续扩展考虑负载均衡、健康检查、日志监控与自动重启机制

部署总结与流程回顾

  1. 在本地发布 MVC 应用
  2. 将发布文件上传至 Linux 服务器
  3. 为应用创建 systemd 服务并启动
  4. 配置反向代理服务器(Nginx / Apache)转发外部请求
  5. (可选)配置 HTTPS / SSL
  6. 调试检查并完善日志监控

通过上述流程,你就能让 .NET Core MVC 应用稳定、可维护地运行在 Linux 上。

评论 添加
暂无评论,来聊两句?