NGINX 双反向代理

Cha*_*oly 5 nginx reverse-proxy

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

我的设置如下所示: 设置

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

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

以下是配置:

gateway.my.domain.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;
     }
}
Run Code Online (Sandbox Code Playgroud)

srv1.my.domain.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;
    }
}
Run Code Online (Sandbox Code Playgroud)

iwa*_*rue 5

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

就我而言,我在一个节点上拥有所有内容,但是适应您的情况应该是创建类似块的简单问题

您还覆盖了 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 的主机标头 - 因此您的虚拟主机配置未被使用。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 的内部地址。