You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Nginx反向代理无法连接上游服务器问题求助

Nginx反向代理无法连接上游服务器问题求助

嘿,我来帮你梳理排查这个问题!先从你的配置和核心需求入手,一步步解决:

一、先搞定上游连接失败的核心问题

  1. 先确认Spring应用本身的可用性
    先在服务器上用curl http://localhost:8080测试下,看看能不能正常访问你的Spring应用。如果本地curl都失败,那问题出在应用本身,先确保应用启动正常、端口没被其他进程占用。
  2. 查看Nginx错误日志找线索
    这是最直接的排查方式,去/var/log/nginx/error.log里看看,日志会明确写清楚连接上游失败的原因——比如是connection refused(应用没启动)还是timeout(网络或配置问题)。
  3. 完善反向代理的必要配置
    你的location /里只写了proxy_pass,缺少关键的请求头和超时配置,这可能导致上游应用无法正确处理请求,建议补上:
    location / {
        proxy_pass http://localhost:8080/;
        # 传递客户端真实IP和Host信息给上游应用
        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;
        # 配置超时时间,避免连接超时
        proxy_connect_timeout 30s;
        proxy_send_timeout 30s;
        proxy_read_timeout 30s;
    }
    

二、配置两个Spring应用的转发规则

你有两个应用在8080和8081,推荐两种常用的转发方案:

方案1:用子路径区分(无需额外DNS配置)

比如papaluz.com/app1转发到8080,papaluz.com/app2转发到8081,配置如下:

server {
    listen 443 ssl;
    server_name papaluz.com;

    ssl_certificate /etc/letsencrypt/live/papaluz.com/fullchain.pem; 
    ssl_certificate_key /etc/letsencrypt/live/papaluz.com/privkey.pem; 

    # 开启安全SSL配置(后面会解释)
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers off;
    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';

    # 转发到8080的应用
    location /app1/ {
        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;
    }

    # 转发到8081的应用
    location /app2/ {
        proxy_pass http://localhost:8081/;
        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;
    }

    # 默认访问8080的应用(可选)
    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;
    }
}

方案2:用子域名区分(需要先配置DNS解析)

比如app1.papaluz.com对应8080,app2.papaluz.com对应8081,配置两个server块即可:

# 8080应用的子域名配置
server {
    listen 443 ssl;
    server_name app1.papaluz.com;

    ssl_certificate /etc/letsencrypt/live/papaluz.com/fullchain.pem; 
    ssl_certificate_key /etc/letsencrypt/live/papaluz.com/privkey.pem; 

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers off;
    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';

    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;
    }
}

# 8081应用的子域名配置
server {
    listen 443 ssl;
    server_name app2.papaluz.com;

    ssl_certificate /etc/letsencrypt/live/papaluz.com/fullchain.pem; 
    ssl_certificate_key /etc/letsencrypt/live/papaluz.com/privkey.pem; 

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers off;
    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';

    location / {
        proxy_pass http://localhost:8081/;
        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;
    }
}

三、聊聊你注释掉的SSL配置

ChatGPT给你的这些配置是行业推荐的安全SSL配置,非常建议开启:

  • ssl_protocols TLSv1.2 TLSv1.3:禁用老旧不安全的TLS1.0/TLS1.1,只支持安全的新版本
  • ssl_prefer_server_ciphers off:让客户端选择自己支持的最优加密套件,提升兼容性
  • ssl_ciphers ...:指定一系列安全的加密套件,避免使用弱加密算法

开启这些配置能让你的HTTPS服务更安全,也能避免一些客户端兼容性问题。

最后,配置后的验证步骤

  1. 检查Nginx配置语法:sudo nginx -t
  2. 语法无误后重新加载配置:sudo systemctl reload nginx
  3. 测试HTTPS访问:用浏览器或curl https://papaluz.com测试转发是否正常
  4. 若仍有问题,再去/var/log/nginx/error.log找具体错误信息

备注:内容来源于stack exchange,提问作者milanHrabos

火山引擎 最新活动