nginx反向代理REST服务为同一uri替代200和404响应

nginx反向代理REST服务为同一uri替代200和404响应,rest,nginx,reverse-proxy,Rest,Nginx,Reverse Proxy,nginx.conf文件: server { listen 8080; } server { listen 80; server_name localhost; location / { root /test/public; index index.html index.htm; } location /api { proxy_pass http://loca

nginx.conf文件:

   server {
    listen 8080;
   }
   server {
    listen       80;
    server_name  localhost;

    location / {
        root   /test/public;
        index  index.html index.htm;
    }

    location /api {
        proxy_pass http://localhost:8080;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}
请求和响应头几乎是简单的,不涉及auth/session/cache参数

对于相同的uri,第一个请求将成功返回,而第二个请求将返回404,依此类推。
我已尝试禁用代理缓冲,但没有效果。

我99.99%确定您已启用IPv6。在这种情况下,
localhost
解析为两个IP地址
127.0.0.1
[::1]
,nginx在它们之间平衡请求

:

如果一个域名解析为多个地址,所有地址都将以循环方式使用

另一方面,你有
listen8080指令,倾向于只侦听IPv4地址(取决于操作系统、nginx版本和其他环境)

您可以通过以下几种方式解决问题:

  • 使用显式IPv4地址
    proxy\u passhttp://127.0.0.1:8080;
  • 使用显式IPv4和IPv6侦听
    listen[:]:8080 ipv6only=off

  • 我在docker环境中观察到同样的问题。但原因与nginx无关。我刚刚犯了一个愚蠢的复制粘贴错误

    设置:

    我通过几个docker compose文件部署了docker容器。因此,我有以下结构:

    • 基于nginx的API网关容器
    • 基于nginx和
    • 基于nginx的webserver2
    它们每个都有自己的docker和docker compose文件。因为Webserver1和Webserver2的组合文件的结构非常相似,所以我复制了它并替换了容器名和其他一些内容。到现在为止,一直都还不错。启动和停止集装箱没有问题,通过
    docker container ls
    观察集装箱没有显示异常。通过
    http://localhost:
    没有问题,但是通过api网关访问Webserver1会导致交替的200和404响应,而Webserver2运行良好

    经过几天的调试,我发现了问题:正如我提到的,我从Webserver1复制了docker compose文件,用于Webserver2,当我替换容器名称时,我忘记替换服务名称。我的docker compose文件开始时如下

    version: '3'
    
    services:  
      webserver1:
        image: 'nginx:latest'
       container_name: webserver2
    ...
    
    这个星座也导致了所描述的行为

    希望有人能通过阅读这篇文章节省一些时间;-)


    安德烈很好。就我而言,问题相当简单。发生的事情是,我有大约15个服务器块,我为nodejs proxy_pass设置的端口已经在隐藏在我的enabled servers目录中的一些旧服务器块上使用。所以nginx随机地将代理传递给旧服务器,该服务器没有运行,而我刚刚启动的服务器


    所以我只是在目录中搜索端口号,找到了2个实例。更改了我的端口号,问题得到了解决。

    仅尝试在IPv4上侦听,根本没有响应。尝试同时侦听这两个,nginx:[emerg]bind()to[::]:8080失败(10013:尝试以访问权限禁止的方式访问套接字)
    仅尝试在IPv4上侦听
    -如何?