ASP.NET Core WebAPI部署Ubuntu服务器遇ERR_CONNECTION_REFUSED问题
解决.NET Core WebAPI在Ubuntu+Nginx下的ERR_CONNECTION_REFUSED问题
从你的描述和提供的信息来看,核心问题是你的WebAPI应用并没有在Droplet上正常运行并监听5000/5001端口——从netstat -ntlp的输出里完全看不到dotnet进程的监听记录,这就导致Nginx无法连接到上游的应用服务,进而返回连接拒绝的错误。
下面是一步步的排查和解决步骤:
1. 先确保WebAPI应用能在Droplet本地正常启动
这是最基础的一步,先抛开Nginx,直接在Droplet上运行应用:
- 进入你的WebAPI项目目录(或者发布后的目录),执行
dotnet run(如果是未发布的源码)或者dotnet YourWebApi.dll(如果是发布后的文件)。 - 然后在Droplet本地执行
curl http://127.0.0.1:5000/api/values,看是否能拿到预期的JSON响应。- 如果这一步就失败,看控制台的错误输出——常见问题比如缺少依赖、配置错误(比如HTTPS证书问题),根据错误提示修复。
- 如果成功,说明应用本身没问题,接下来处理端口绑定和后台运行的问题。
2. 确保应用监听正确的端口(允许本地代理访问)
默认情况下,.NET Core模板的WebAPI会绑定localhost:5000和localhost:5001,虽然Nginx是本地代理理论上可以访问,但有时候可能因为环境变量或配置导致端口绑定异常。你可以:
- 启动时显式指定监听本地所有网卡的5000端口:
或者发布后运行:dotnet run --urls=http://0.0.0.0:5000dotnet YourWebApi.dll --urls=http://0.0.0.0:5000 - 也可以修改
appsettings.json或appsettings.Production.json,添加/修改Urls配置:{ "Urls": "http://0.0.0.0:5000", // 其他配置项... }
3. 让应用在后台持续运行
直接用dotnet run启动的话,关闭终端进程就会停止,所以需要用systemd来托管应用,确保它能持续运行并在崩溃后自动重启:
- 创建一个systemd服务文件,比如
/etc/systemd/system/webapi.service:
注意替换[Unit] Description=My .NET Core WebAPI Service After=network.target [Service] WorkingDirectory=/path/to/your/webapi/publish/folder ExecStart=/usr/bin/dotnet /path/to/your/webapi/publish/folder/YourWebApi.dll Restart=always RestartSec=10 SyslogIdentifier=dotnet-webapi User=www-data Environment=ASPNETCORE_ENVIRONMENT=Production Environment=ASPNETCORE_URLS=http://0.0.0.0:5000 [Install] WantedBy=multi-user.target/path/to/your/webapi/publish/folder和YourWebApi.dll为实际路径和文件名。 - 重新加载systemd配置并启动服务:
sudo systemctl daemon-reload sudo systemctl enable webapi.service sudo systemctl start webapi.service - 检查服务状态:
如果显示sudo systemctl status webapi.serviceactive (running),再用netstat -ntlp查看,应该能看到dotnet进程监听5000端口了。
4. 处理HTTPS重定向的问题
从你的curl结果看,应用返回了307重定向到HTTPS的5001端口,这是因为默认WebAPI模板启用了UseHttpsRedirection中间件。如果你的Nginx是用HTTP代理到5000,这会导致跳转失败:
- 如果你暂时不需要HTTPS(后续可以在Nginx层面配置Let's Encrypt证书),可以在
Startup.cs里注释掉app.UseHttpsRedirection();这一行,或者在生产环境配置里禁用它。 - 如果要保留HTTPS,需要确保应用有有效的证书(比如生成自签名证书,或者用Let's Encrypt),并修改Nginx配置代理到5001端口,同时配置SSL。
5. 重启Nginx并验证
完成以上步骤后,重启Nginx:
sudo systemctl restart nginx
然后再用curl或者浏览器访问你的Droplet IP,应该就能正常访问WebAPI接口了。
内容的提问来源于stack exchange,提问作者IdusOrtus
相关产品推荐
相关产品推荐

