nginx proxy_pass 返回 502 Bad Gateway

nginx proxy_pass 返回 502 Bad Gateway

我正在使用 Spring 和 Docker 为 reverse_proxy 构建 nginx

这是我的配置。

nginx.conf

user  proxy;
worker_processes  auto;
error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;
pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  logs/access.log  main;
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include       mime.types;
    default_type  application/octet-stream;

    include /home/wertkey/nginx/conf/conf.d/*.conf;

    client_max_body_size 200M;
    client_header_buffer_size  48k;

    server {
        listen       7070 default_server;
        listen       [::]:7070 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        location / {
        }

        error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }
}

conf.d/default.conf

server {
    listen 7070;
    server_name something.com;

    proxy_connect_timeout   900s;
    proxy_send_timeout      900s;
    proxy_read_timeout      900s;
    send_timeout            900s;

    location ^~ /editor/ {
        proxy_pass http://localhost:8081;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;

        rewrite ^/editor/(/.*)$ $1 break;
    }
}

码头工人

CONTAINER ID        IMAGE        COMMAND                  CREATED             STATUS              PORTS                    NAMES
a6a6a98a25a9        editor       "/bin/sh -c /usr/l..."   8 minutes ago       Up 8 minutes        0.0.0.0:8081->8080/tcp   editor

我的spring服务器运行在7070端口,我想这样。

  1. 请求 something.com:7070/api
  2. nginx proxy_pass 到 8081
  3. docker 8081 -> 8080

但响应总是返回 502 Bad Gateway

我错过了什么?

+ 我目前在同一台服务器上运行两个 nginx。一个运行在 8080 端口,另一个运行在 7070 端口。8080 nginx 用于 Web 服务器,7070 nginx 用于代理。7070 nginx 中不显示日志,8080 nginx 中显示日志。我不知道为什么请求会转到 8080 nginx。我该如何将请求发送到 7070 nginx?

答案1

当 docker 内部的进程尝试连接时,localhost:8081该连接将被转换为“docker 容器上的端口 8081”,而不是“主机上的端口 8081”。

对于您的设置,我建议您尝试 docker-compose。使用 docker-compose,每个容器都可以通过其名称供其他容器访问(例如:如果您的容器名为backendnginx,则后者可以通过 访问前者backend:8081)。

如果您在开发过程中使用这些,这将特别方便,因为 docker-compose 让您快速启动所有容器并通过单一界面管理它们。

另一种选择是改变容器上的网络类型。

答案2

问题可能与 location 块中的 rewrite 指令有关。它所做的本质上是在客户端进行重定向。一个可能的解决方案是在 location 本身中使用正则表达式,而不是 rewrite:

    location ^~ /editor/(.*)$ {
        proxy_pass http://localhost:8081/$1;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
    }

相关内容