如何在Nginx服务器上运行多个使用127.0.0.1:5000的ASP.NET Core应用程序
首先得明确一个关键点:同一个端口(比如5000)不能被多个进程同时监听,所以我们的思路是让每个ASP.NET Core应用监听本地不同的端口(比如5001、5002),然后通过Nginx做反向代理,对外统一用127.0.0.1:5000,通过请求路径或子域名来转发到对应的应用。
第一步:给每个ASP.NET Core应用分配独立的本地端口
每个应用需要配置成监听127.0.0.1的不同端口,有几种简单的配置方式:
命令行启动时指定:
启动第一个应用时用:dotnet run --urls=http://127.0.0.1:5001第二个应用用:
dotnet run --urls=http://127.0.0.1:5002修改appsettings.json配置:
在每个应用的appsettings.json中添加Urls字段:{ "Urls": "http://127.0.0.1:5001" }第二个应用改成
5002即可。通过环境变量配置:
Linux/macOS下:ASPNETCORE_URLS=http://127.0.0.1:5001 dotnet runWindows命令行:
set ASPNETCORE_URLS=http://127.0.0.1:5001 && dotnet run
第二步:配置Nginx反向代理
这里提供两种常用的路由方式,你可以根据需求选择:
方式一:基于请求路径区分应用
比如访问http://127.0.0.1:5000/app1进入第一个应用,http://127.0.0.1:5000/app2进入第二个应用。
Nginx配置示例:
打开Nginx的配置文件(通常在/etc/nginx/nginx.conf或/etc/nginx/conf.d/下新建一个.conf文件),添加以下内容:server { listen 5000; server_name 127.0.0.1; # 转发到第一个ASP.NET Core应用 location /app1/ { proxy_pass http://127.0.0.1:5001/; # 注意末尾的斜杠,确保路径正确传递 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 $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; } # 转发到第二个ASP.NET Core应用 location /app2/ { proxy_pass http://127.0.0.1:5002/; 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 $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; } # 可选:默认路由,比如转发到第一个应用 location / { proxy_pass http://127.0.0.1:5001/; } }ASP.NET Core应用适配路径:
因为请求带了/app1前缀,需要让应用识别这个路径基。可以在Program.cs中配置:var builder = WebApplication.CreateBuilder(args); // 设置应用的路径基 builder.WebHost.UsePathBase("/app1"); var app = builder.Build(); // 其他中间件配置... app.Run();或者启动时通过命令行指定:
dotnet run --urls=http://127.0.0.1:5001 --path-base=/app1
方式二:基于子域名区分应用
如果想用app1.localhost:5000和app2.localhost:5000访问不同应用,步骤如下:
配置本地hosts文件:
在/etc/hosts(Linux/macOS)或C:\Windows\System32\drivers\etc\hosts(Windows)中添加:127.0.0.1 app1.localhost app2.localhostNginx配置示例:
添加两个server块,分别对应不同的子域名:# 第一个应用的子域名配置 server { listen 5000; server_name app1.localhost; location / { proxy_pass http://127.0.0.1:5001; 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 $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; } } # 第二个应用的子域名配置 server { listen 5000; server_name app2.localhost; location / { proxy_pass http://127.0.0.1:5002; 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 $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; } }这种方式不需要修改ASP.NET Core应用的路径基,因为请求路径是根路径,Nginx直接转发到对应端口的应用。
第三步:验证配置并重启Nginx
测试Nginx配置是否正确:
nginx -t如果输出
test is successful,说明配置没问题。重启Nginx使配置生效:
nginx -s reload测试访问:
打开浏览器或用curl访问对应的路径/子域名,确认能正常访问到对应的ASP.NET Core应用。
内容的提问来源于stack exchange,提问作者mrkemaltas

