NGINX双反向代理

NGINX双反向代理

我的反向代理遇到了一些奇怪的问题。

我的设置如下: 设置

localhost:3000现在,我内部网络中的主机可以访问服务器上正在运行的应用程序srv1.my.domain.org,所以我知道配置正在运行。但是,当我尝试从网络外部(通过gateway.my.domain.org)访问该应用程序时,我只会看到 NGINX 测试页面。我不明白为什么,因为我已经为多个其他应用程序进行了此配置,并且它们正在运行。

注意:server_name与物理服务器的主机名相同。

配置如下:

网关.my.域名.org

小路:/etc/nginx/conf.d/app.my.domain.org.conf

upstream srv {
     server srv1.my.domain.org;
}

server {
     listen 443;
     server_name gateway.my.domain.org;

     ssl on;
     ssl_certificate /.../fullchain.pem;
     ssl_certificate_key  /.../privkey.pem;
     ssl_session_cache  builtin:1000  shared:SSL:10m;
     ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
     ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
     ssl_prefer_server_ciphers on;

     access_log            /var/log/nginx/gateway.access.log;
     error_log            /var/log/nginx/gateway.error.log;

     client_max_body_size 150M;

     location / {
         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_pass              http://srv;
         proxy_read_timeout      90;
     }
}

srv1.my.域名.org

小路:/etc/nginx/sites-enabled/app

server {
    listen 80;
    server_name srv1.my.domain.org;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_pass http://localhost:3000;
    }
}

答案1

我的类似设置的配置略有不同:

upstream app_backend {
  server 127.0.0.1:3000 ;
}
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name HOSTNAME;
    location / {
        try_files $uri $uri/ @app;
    }
    location @app {


        #proxy_cache general_cache; 
        proxy_pass http://app_backend;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_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 http;
        proxy_redirect off;
    }
}

在我的例子中,所有东西都在一个节点上,但适应你的情况应该很简单,只需创建类似的块即可

您还覆盖了 srv1.my.domain.org 上的 X-Real-IP,我不确定您是否想这么做。

已编辑以考虑评论中的更新:

对 - 我刚刚意识到我错过了一些东西(或者没有解释它),这有点与 X-Real-IP 有关。

我认为您可能遇到问题,部分原因是在 gateway.my.domain.org 上,您有:

proxy_set_header Host $host;

在 gateway.my.domain.org 上$host = gateway.my.domain.org

因此,您正在向 srv1.my.domain.org(从网关)发送请求,该请求具有 Gateway.my.domain.org 的 Host: 标头。srv1 上的虚拟主机配置为响应 srv1.my.domain.org 的 Host 标头 - 因此您的虚拟主机配置未被使用。404 很可能来自 srv1 的默认端口 80 服务器。

修复此问题的一种方法可能是:

proxy_set_header Host $proxy_host;

这也恰好是 Host 字段的默认值(每个https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header)。

这应该很容易测试:将 srv1.my.domain.org 的日志配置为转到默认 nginx 日志文件以外的其他目的地。然后检查您发出的下一个请求是否出现在您的“自定义”日志或默认日志中。

X-Real-IP 的问题在于,在 gateway.my.domain.org 上,$remote_addr 是有意义的,但在 srv1.my.domain.org 上,$remote_addr 是 gateway.my.domain.org 的内部地址。

相关内容