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?}"); }); } } }
{ "profiles": { "MVCSite": { "commandName": "Project", "dotnetRunMessages": "true", "launchBrowser": true, "applicationUrl": "http://localhost:5000", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } } } }
然后将该项目发布,考虑到我们等等在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。
转发成功了。