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

时间:2016-04-12 05:11:53

标签: 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://localhost:8080;
    }

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

请求和响应标头几乎是普通的,不涉及auth / session / cache参数。

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

3 个答案:

答案 0 :(得分:1)

我99.99%确定您已启用IPv6。在这种情况下,if(exchange=='mo'){ $(#hopen.title).html("NEW WORD"); } 解析为两个IP地址localhost127.0.0.1以及它们之间的nginx平衡请求。

http://nginx.org/r/proxy_pass

  

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

另一方面,你有[::1]指令,它往往只倾听IPv4地址(取决于操作系统,nginx版本和其他环境)。

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

  1. 使用显式IPv4地址listen 8080;
  2. 使用显式IPv4和IPv6侦听proxy_pass http://127.0.0.1:8080;

答案 1 :(得分:0)

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

设置:

我通过多个docker-compose文件部署了docker容器。所以我有以下结构:

  • 基于nginx的API-网关-容器
  • 基于nginx的Web服务器1和
  • 基于nginx的Web服务器2

每个人都有自己的docker和docker-compose文件。因为Webserver1和Webserver2的撰写文件的结构非常相似,所以我将其复制并替换了容器名称和其他一些内容。到现在为止还挺好。启动和停止容器没问题,通过docker container ls观看它们不会显示异常。通过http://localhost:<Portnumber for server>访问Webserver1和Webserver2没问题,但是通过api网关访问Webserver1会导致200和404交替响应,而Webserver2则运行良好。

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

version: '3'

services:  
  webserver1:
    image: 'nginx:latest'
   container_name: webserver2
...

这个星座也导致了所描述的行为。

希望,有人可以通过阅读这篇文章来节省几天或几个小时;-)

安德烈

答案 2 :(得分:0)

好吧。就我而言,问题非常简单。发生的事情是,我大约有15个服务器块,并且为我的nodejs proxy_pass设置的端口已经在隐藏在启用的服务器目录中的某些旧服务器块上使用。因此,nginx随机地将代理传递给未运行的旧服务器,而这正是我刚刚启动的服务器。

因此,我只是在目录中寻找端口号,并发现了2个实例。更改了我的端口号,问题已解决。