本文主要介绍使用ASP.NET Core开发的网站,运行布署在Linux上的方法,包括.NET Core SDK找安装,项目的发布和网站运行及开机自动启动及Nginx相关配置方法 。

1、.NET Core SDK安装及项目代码发布

1).NET Core SDK安装

相关文档Linux Debian Fedora CentOS安装配置.NET Core2.1 dotnet-sdk-2.1

2)使用VS(Visual Studio)发布

在项目上点"右键"=》选择 "发布" 配置一下发布位置就可以了

3)使用dotnet命令发布

dotnet publish --configuration Release

4)测试运行应用

  • 在命令行中运行应用:dotnet <app_assembly>.dll
  • 在浏览器中,导航到 http://<serveraddress>:<port> 以确认应用在 Linux 本地正常运行。

2、 配置中间件以转接 X-Forwarded-For 和 X-Forwarded-Proto 标头

app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});
app.UseAuthentication();

如果没有为中间件指定 ForwardedHeadersOptions,则要转接的默认标头为 None。

受信任代理服务器配置:

services.Configure<ForwardedHeadersOptions>(options =>
{
options.KnownProxies.Add(IPAddress.Parse("10.0.0.100"));
});

3、Nginx的安装配置

备注:如果需要可选 Nginx 模块,则可能需要从源代码生成 Nginx。

1)Nginx的安装

相关文档https://www.nginx.com/resources/wiki/start/topics/tutorials/install/#official-debian-ubuntu-packages

2)配置 Nginx

若要将 Nginx 配置为反向代理以将请求转接到 ASP.NET Core 应用,请修改 /etc/nginx/sites-available/default。 在文本编辑器中打开它,并将内容替换为以下内容:

server {
    listen        80;
    server_name   example.com *.example.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;
    }
}
当没有匹配的 server_name 时,Nginx 使用默认服务器。 如果没有定义默认服务器,则配置文件中的第一台服务器是默认服务器。 作为最佳做法,添加指定默认服务器,它会在配置文件中返回状态代码 444。 默认的服务器配置示例是:
server { listen 80 default_server; # listen [::]:80 default_server deferred; return 444; }

4、配置ASP.NET Core程序启动命令服务

1)创建服务文件

sudo vi /etc/systemd/system/kestrel-helloapp.service

2)服务文件内容

[Unit]
Description=Example .NET Web API App running on Ubuntu
[Service]
WorkingDirectory=/var/www/helloapp
ExecStart=/usr/bin/dotnet /var/www/helloapp/helloapp.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-example
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target

如果配置未使用用户 www-data,则必须先创建此处定义的用户,并为该用户提供适当的文件所有权,也可以换成其它用户。

3)启用该服务(开机自动启动)

sudo systemctl enable kestrel-helloapp.service

4)启动服务及查看服务状态

sudo systemctl start kestrel-helloapp.service
sudo systemctl status kestrel-helloapp.service

5)查看日志

使用 Kestrel 的 Web 应用是通过 systemd 进行管理的,因此所有事件和进程都被记录到集中日志。 但是,此日志包含由 systemd 管理的所有服务和进程的全部条目。 若要查看特定于 kestrel-helloapp.service 的项,请使用以下命令:

sudo journalctl -fu kestrel-helloapp.service
sudo journalctl -fu kestrel-helloapp.service --since "2016-10-18" --until "2016-10-18 04:00"

5、配置ASP.NET Core监听所有IP(0.0.0.0)

1)程序代码中使用UseUrls配置

using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
namespace UesUrlsConsole
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }
        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseUrls("http://*:5000","https://*:5001")
                .UseStartup<Startup>();
    }
}

2)启动命令中手动指定绑定的端口

dotnet urls.dll --urls http://*:5000

参考文档https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-3.0