nginx - 使用proxy_pass根据headers转发http请求
问题描述
我正在使用 ip6tables 和 nginx 的组合来处理来自客户端的 http 请求。nginx 服务器侦听 8081 端口,并且必须在检查标头后转发请求。
客户端可以发送两种类型的请求:
- 没有标题的 GET/POST。这些应重定向到https://jaguar.mydomain.com
- GET/POST 带有特定的标头elb-jaguar.mydomain.com。这些应重定向到https://elb-jaguar.mydomain.com
运行 as 时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 文档和您对 IPv6 的需求,它说(我的重点):
ipv6only=开|关
此参数 (0.7.42) 确定(通过 IPV6_V6ONLY 套接字选项)侦听通配符地址 [::] 的 IPv6 套接字是仅接受 IPv6 连接还是同时接受 IPv6 和 IPv4 连接。该参数默认开启。它只能在启动时设置一次。
因为错误消息抱怨“重复侦听选项”,而不是“已经在该端口上侦听”或类似内容,所以它表明它在抱怨尝试设置ipv6only
第二次(即使是相同的值)。
此外,它确实说此参数默认打开,因此您可以轻松地将其完全删除,如果只是尝试一下。
推荐阅读
- kubernetes - Kubernetes LoadBalancer 最佳实践:避免 NodePort?
- c# - 为什么 StreamWriter.Flush() 在这里给出 ObjectDisposedExeption?
- reactjs - 从 firestore 检索数据时遇到问题“TypeError:this.store 未定义”
- go - 如何初始化特定的结构格式
- verilog - 在 Verilog 中为输出添加延迟
- node.js - 使用 node.js 安装 mysql 模块时出现问题
- java - 返回 json 格式响应
- android - 使用 Post Not Get 的分页库 - 未填充适配器
- javascript - NativeScript 和串口?
- android - 在 firebase 中返回对象的属性返回 null