nginx:在反向代理配置中排除子位置

nginx:在反向代理配置中排除子位置

我想为 graylog 实例基于 nginx 构建一个 http 到 https 的反向代理,假设它的 url 是 graylog.domain.local。Graylog 不提供 SSL 加密连接,只提供端口 9000 上的标准 http。这其中的棘手之处在于 Graylog 会调用自身 urlhttp://graylog.domain.local:9000/api/

所以我想要实现的是:

这是我的配置。打开网页看起来不错。该网站现在是 SSL 安全的,可以正确加载。不幸的是,Graylog 向我发出错误信息,它无法访问http://10.32.0.109:9000/api/

server {
        listen 443 ssl default_server;
        listen [::]:443 ssl default_server;
        server_name graylog.domain.local;

        location / {
                proxy_pass http://localhost:9000/;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
        }

        ssl_certificate /etc/ssl/graylog.domain.local.crt;
        ssl_certificate_key /etc/ssl/graylog.domain.local.pem;
}

server {
        listen 80;
        listen [::]:80;
        server_name graylog.domain.local;

        location /api {
        }

        location / {
                return 301 https://$host$request_uri;
        }
}

如何排除位置 /api 被重定向到 https?

答案1

您的配置基本上是正确的,除了一件事 - 您忘记了proxy_pass将本地主机的 tcp/9000 端口连接到location /api {}

您可能还应该添加rewrite ^/api/(.*)$ /$1 break行。

答案2

我刚刚发现我的问题的解决方案隐藏在Graylog 文档。我已完全复制了 nginx 配置,并且只添加了 80->443 的重定向。它现在看起来像这样并且可以按预期工作:

server {
    listen      443 ssl;
    server_name graylog.domain.local;
    ssl_certificate /etc/ssl/graylog.domain.local.crt;
    ssl_certificate_key /etc/ssl/graylog.domain.local.pem;

    location /
    {
      proxy_set_header Host $http_host;
      proxy_set_header X-Forwarded-Host $host;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Graylog-Server-URL https://$server_name/api;
      proxy_pass       http://127.0.0.1:9000;
    }
}

server {
    listen 80;
    listen [::]:80;
    server_name graylog.domain.local;

    location / {
        return 301 https://$host$request_uri;
    }
}

相关内容