使用proxy_pass转发基于标头的http请求

问题描述

我正在使用ip6tables和Nginx的组合来处理来自客户端的http请求。 Nginx服务器侦听端口8081,并且必须在检查标头之后转发请求。

客户端可以发送两种类型的请求:

  1. 没有标题的GET / POST。这些应该重定向 https://jaguar.mydomain.com
  2. 使用特定标题 elb-jaguar.mydomain.com 的GET / POST。这些应该重定向 https://elb-jaguar.mydomain.com

Nginx -c /home/build/v6-only.conf运行时,Nginx失败,因为一个server{}指令在端口listen上已经有8081

Nginx: [emerg] duplicate listen options for [::]:8081 in /etc/Nginx/v6/v6-only.conf:13

我的配置如下:

server {
    listen [::]:8081 ssl ipv6only=on;
    server_name elb-jaguar.mydomain.com;
    ssl_certificate /etc/ssl/elb.crt;
    ssl_certificate_key /etc/ssl/elb.key;

    location / {
        proxy_pass https://elb-jaguar.mydomain.com:443;
    }
}

server {
    listen [::]:8081 ssl ipv6only=on;
    ssl_certificate /etc/ssl/regular.crt;
    ssl_certificate_key /etc/ssl/regular.key;
    server_name jaguar.mydomain.com;

    location / {
        proxy_pass https://jaguar.mydomain.com:443;
    }
}

如何解决上述配置,以通过proxy_pass获得所需的转发?

解决方法

很难看到,因为该设置应该有效。

但是仔细观察NGINX docs和您仅对IPv6的需求,它说(我的重点):

ipv6only = on | off

此参数(0.7.42)(通过IPV6_V6ONLY套接字选项)确定侦听通配符地址[::]的IPv6套接字是仅接受IPv6连接还是接受IPv6和IPv4连接。默认情况下,此参数是打开的。 只能在启动时设置一次

因为错误消息抱怨“重复的监听选项”,而不是“已经在该端口上监听”或类似的信号,所以它表明它在抱怨试图第二次设置ipv6only(甚至设置为相同的值)

此外,它确实会说此参数默认情况下处于启用状态,因此,只要尝试一下,您就可以轻松地将其完全删除。