Docker容器8080端口应用连接Ubuntu VPS的Nginx服务问题
问题分析与解决步骤
核心问题定位
你的Nginx配置存在两个关键错误,导致lol.com/api/v10/无法正常访问:
- 第二个
server块的location /api中,return 301指令会直接强制跳转请求到ihemyi.com:8080,完全跳过了proxy_pass代理逻辑,这是最直接的故障原因。 try_files与proxy_pass的组合逻辑错误,try_files会优先在本地/var/www/html目录查找文件,找不到就直接返回404,不会触发代理转发。
修正后的Nginx配置
针对lol.com的HTTPS服务器块,修改如下:
server { root /var/www/html; index index.html index.htm; server_name lol.com; location /api { # 移除强制跳转的return指令 # 末尾添加/,确保请求路径正确转发到Go应用的根路径(若Go应用的/api接口基于根路径开发) proxy_pass http://localhost:8080/; # 添加代理头,保证Go应用能获取正确的客户端请求信息 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/ihemyi.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/ihemyi.com/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot } # 可选:将80端口的HTTP请求重定向到HTTPS server { listen 80; listen [::]:80; server_name lol.com; return 301 https://$host$request_uri; } # 默认80端口服务器块(若不需要代理所有根路径请求,可按需调整) server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; index index.html index.htm; server_name _; # 若要代理所有根路径请求到Go应用,移除try_files或调整逻辑 location / { proxy_pass http://localhost:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
额外验证步骤
确认Docker容器状态:
执行docker ps查看Go应用容器是否正常运行,端口映射0.0.0.0:8080->8080/tcp是否存在;在VPS本地执行curl localhost:8080/api/v10/,确认容器服务可正常响应。重载Nginx配置:
修改配置后,执行sudo nginx -t验证配置语法正确,再执行sudo systemctl reload nginx使配置生效。网络连通性优化(若容器名称/IP访问无效):
- 若Nginx是宿主机安装,
localhost:8080应可正常访问(已做-p 8080:8080端口映射); - 若要使用容器名称访问,需创建自定义Docker网络:
docker network create app-network # 重启Go容器并加入该网络 docker run --network app-network --name go-app -p 8080:8080 your-go-image # 宿主机Nginx需用容器IP访问,执行`docker inspect go-app | grep "IPAddress"`获取IP后替换proxy_pass中的localhost # 若Nginx也在Docker中,直接用容器名称`http://go-app:8080/`即可
- 若Nginx是宿主机安装,
内容的提问来源于stack exchange,提问作者pythonGo
相关产品推荐
相关产品推荐

