使用proxy_pass转发基于headers的http请求
Using proxy_pass to forward http requests based on headers
我正在结合使用 ip6tables 和 nginx 来处理来自客户端的 http 请求。 nginx 服务器侦听端口 8081,必须在检查 header.
后转发请求
客户端可以发送两种类型的请求:
- GET/POST 没有 header。这些应该是 re-directed 到 https://jaguar.mydomain.com
- GET/POST 与特定 header elb-jaguar.mydomain.com。这些应该重定向到 https://elb-jaguar.mydomain.com
当 运行 为 nginx -c /home/build/v6-only.conf
时,nginx 失败,因为一个 server{}
指令在端口 8081
上已经有 listen
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
this parameter (0.7.42) determines (via the IPV6_V6ONLY socket option) whether an IPv6 socket listening on a wildcard address [::] will accept only IPv6 connections or both IPv6 and IPv4 connections. This parameter is turned on by default. It can only be set once on start.
因为错误消息抱怨 'duplicate listen options',而不是 'already listening on that port' 或类似的,这表明它正在抱怨试图第二次设置 ipv6only
(即使是相同的值) .
此外,它确实说 默认情况下启用此参数,因此您可以轻松地完全删除它,如果只是为了尝试的话。
我正在结合使用 ip6tables 和 nginx 来处理来自客户端的 http 请求。 nginx 服务器侦听端口 8081,必须在检查 header.
后转发请求客户端可以发送两种类型的请求:
- GET/POST 没有 header。这些应该是 re-directed 到 https://jaguar.mydomain.com
- GET/POST 与特定 header elb-jaguar.mydomain.com。这些应该重定向到 https://elb-jaguar.mydomain.com
当 运行 为 nginx -c /home/build/v6-only.conf
时,nginx 失败,因为一个 server{}
指令在端口 8081
listen
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
this parameter (0.7.42) determines (via the IPV6_V6ONLY socket option) whether an IPv6 socket listening on a wildcard address [::] will accept only IPv6 connections or both IPv6 and IPv4 connections. This parameter is turned on by default. It can only be set once on start.
因为错误消息抱怨 'duplicate listen options',而不是 'already listening on that port' 或类似的,这表明它正在抱怨试图第二次设置 ipv6only
(即使是相同的值) .
此外,它确实说 默认情况下启用此参数,因此您可以轻松地完全删除它,如果只是为了尝试的话。