ASP.NET Core 部署到Linux上用Nginx反向代理

准备工作

准备一个ASP.NET Core MVC 项目(用于简单测试部署,初始项目即可)

修改Startup.cs增加转接头中间件 Microsoft.AspNetCore.HttpOverrides此中间件使用 X-Forwarded-Proto 标头来更新 Request.Scheme,使重定向 URI 和其他安全策略能够正常工作。转接头中间件应在其他中间件之前运行。此顺序可确保依赖于转接头信息的中间件可以使用标头值进行处理。 

我只修改了以下两个文件:( 取消了HTTPS通信,增加了转发头信息中间件。)

using System.Net;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpOverrides;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace MVCSite
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<ForwardedHeadersOptions>(options =>
            {
                options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;

                //Choose Your Address
                options.KnownProxies.Add(IPAddress.Parse("192.168.xxx.xxx"));
            });
            services.AddControllersWithViews();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseForwardedHeaders();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                app.UseForwardedHeaders();

                //若启用Hsts服务放在此中间件之前 不然可能会环形转发
                //app.UseHsts();
            }

            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });
        }
    }
}
Startup.cs
{
  "profiles": {
    "MVCSite": {
      "commandName": "Project",
      "dotnetRunMessages": "true",
      "launchBrowser": true,
      "applicationUrl": "http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}
launchSettings.json

然后将该项目发布,考虑到我们等等在Linux系统中会安装 .NET SDK,运行时 等框架依赖。我们选择 ”依赖框架“,目标运行时选择 ”Linux-x64“。发布到我们选择的文件路径即可。之后使用xftp传输到Linux虚拟机中即可。

发布后的文件:

 接下来是Linux系统的安装,我是在VMWare中安装了Ubuntu LTS,Centos 7这两个虚拟机。安装步骤就不赘诉了,直接进入正题。


Ubuntu:

首先当然是安装 .NET SDK, 运行时 依赖,在安装.NET 之前,请运行以下命令,将 Microsoft 包签名密钥添加到受信任密钥列表,并添加包存储库。

打开终端并运行以下命令:

wget https://packages.microsoft.com/config/ubuntu/20.10/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb

.NET SDK 使你可以通过 .NET 开发应用。 如果安装 .NET SDK,则无需安装相应的运行时。 若要安装 .NET SDK,请运行以下命令:

sudo apt-get update; 
sudo apt-get install -y apt-transport-https && 
sudo apt-get update && 
sudo apt-get install -y dotnet-sdk-5.0

如果已安装 SDK 或运行时,请使用 dotnet --list-sdks 和 dotnet --list-runtimes 命令查看安装了哪些版本。

接下来安装Nginx:最好是按照以下网站上的 Ubuntu 安装说明操作:Nginx:官方 Debian/Ubuntu 包

我这里简化步骤直接用apt获取了

sudo apt-get update
sudo apt-get install nginx

因为是首次安装 Nginx,通过运行以下命令显式启动:

#启动nginx
sudo service nginx start

#查看nginx状态
sudo service nginx status

如图Nginx已正常运行了

确认浏览器显示 Nginx 的默认登陆页。 可在 http://<server_IP_address>/index.nginx-debian.html 访问登陆页面。若访问成功,则Nginx已正常接管。

接下来配置Nigix将 Nginx 配置为反向代理以将 HTTP 请求转发到 ASP.NET Core 应用程序。修改/etc/nginx/sites-available/default。 使用vim打开修改(若未获取vim工具使用apt获取),并将内容替换为以下代码片段:

server {   
    listen        80;
    server_name   example.com *.example.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;
    }
}

 这个server节配置意思是将本机的5000端口的应用交于80端口代理,用户访问的是localhost:80,但此请求转发到localhost:5000 到 ASP.NET Core 程序处理并返回响应。代理完成后我们获取该虚拟机的ip地址访问即可(可使用ifconfig或直接设置里查看)

 这个时候我们在访问该虚拟机的 80 端口出现:

原因是因为我们的应用程序还没有运行呢,我把打包后的文件传到了Public文件中。使用dotnet命令运行

 回想起来是该方法没有指定具体的ip地址,于是修改后重新发布上传(把这段代码注释即可,如果你有除本机之外其他需要受信任的ip再填上)。

 修改后运行成功:

访问该虚拟机ip,nginx转发成功了


 

Centos:

1、安装各种依赖

#gcc安装,nginx源码编译需要
yum install gcc-c++

#PCRE pcre-devel 安装,nginx 的 http 模块使用 pcre 来解析正则表达式
yum install -y pcre pcre-devel

#zlib安装,nginx 使用zlib对http包的内容进行gzip
yum install -y zlib zlib-devel

#OpenSSL 安装,强大的安全套接字层密码库,nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http)
yum install -y openssl openssl-devel

2、下载

(1)直接官网下载 官网链接

 当前的稳定版本为1.20.0

(2)使用wget命令下载(推荐)

#下载版本号可根据目前官网最新稳定版自行调整
wget -c https://nginx.org/download/nginx-1.20.0.tar.gz

3、安装

#根目录使用ls命令可以看到下载的nginx压缩包,然后解压
tar -zxvf nginx-1.20.0.tar.gz

#解压后进入目录
cd nginx-1.20.0

#使用默认配置
./configure

#编译安装
make
make install

#查找安装路径,默认都是这个路径
$ whereis nginx
nginx: /usr/local/nginx

#启动、停止nginx
cd /usr/local/nginx/sbin/
./nginx     #启动
./nginx -s stop  #停止,直接查找nginx进程id再使用kill命令强制杀掉进程
./nginx -s quit  #退出停止,等待nginx进程处理完任务再进行停止
./nginx -s reload  #重新加载配置文件,修改nginx.conf后使用该命令,新配置即可生效

#重启nginx,建议先停止,再启动
./nginx -s stop
./nginx

#查看nginx进程,如下返回,即为成功
# ps aux|grep nginx
root      5984  0.0  0.0 112708   976 pts/1    R+   14:41   0:00 grep --color=auto nginx
root     18198  0.0  0.0  20552   612 ?        Ss   11:28   0:00 nginx: master process ./nginx
nobody   18199  0.0  0.0  23088  1632 ?        S    11:28   0:00 nginx: worker process

4、开机自启动

#在rc.local增加启动代码即可
vi /etc/rc.local
#增加一行 /usr/local/nginx/sbin/nginx,增加后保存
#设置执行权限
cd /etc
chmod 755 rc.local

 这样Nginx的安装就基本成功了,这时候访问服务器ip地址,可能你会看到这个界面。

并没有显示Nginx的传统欢迎页面,但是我们输入一个不存在的路径。

说明其实Nginx已经代理成功了,但是首页可能和Centos有什么交易吧。。。。

5、配置域名映射

#进入nginx配置文件目录,找到nginx的配置文件nginx.conf
cd /usr/local/nginx/conf/

#直接修改
vi nginx.conf

还是将 server 节修改一下即可。

server {
    listen        80;
    server_name   example.com *.example.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;
    }
}

修改完成后,检测配置文件是否正确,再重新加载配置文件即可。

cd /usr/local/nginx/sbin/
#检查
./nginx -t
#重载
./nginx -s reload

6、运行应用程序

同样将应用程序上传到你虚拟机的某个目录运行即可。

 使用浏览器访问该ip。

 转发成功了。

原文地址:https://www.cnblogs.com/Xieyiincuit/p/14791889.html