nginx反向代理REST服务为同一uri替代200和404响应
nginx.conf文件: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
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上侦听
-如何?