我在一个标准的反向代理场景中使用nginx,将所有对/auth
的请求传递到另一个主机,但是我试图使用非标准端口。
我的最终目标是将X-Forwarded-Port
头设置为请求进入的端口。
下面是我在nginx.conf中的位置块:
location /auth/ {
proxy_pass http://otherhost:8090;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port <VAR>;
}
字符串
这个nginx运行在一个docker容器中,它被配置为将来自8085的请求转发到容器中的80,这样nginx进程就监听80:
0.0.0.0:8085->80/tcp
当我点击URL时:
http://localhost:8085/auth/
我被正确地重定向到http://otherhost:8090
,但X-Forwarded-Port
头丢失或错误。
在原始块中有<VAR>
的地方,我尝试了以下方法:
$server_port
-这是nginx监听的端口(80),而不是请求端口。$pass_port
-在我的设置中似乎是null,所以nginx删除了header。$http_port
-这是每个请求的随机端口。$remote_port
-这是每个请求的随机端口。
我可以在部署时修改我的配置,以硬编码到传入请求的已知端口,但理想情况下,我可以在不更改nginx配置的情况下更改前端端口。
我已经搜索了the nginx variable list,但找不到任何类似$request_port
的东西。有什么方法可以让我实现我的意图吗?
6条答案
按热度按时间p5cysglq1#
我发现的唯一解决方法是使用
map
规则从http_host
变量中获取端口,例如。字符串
k7fdbhmy2#
这是一个写Nginx conf的粗略想法,但我相信这可以帮助你重定向
字符串
欲了解更多细节,你可以看看这个项目
https://github.com/dupinder/NgnixDockerizedDevEnv
eqoofvh93#
从容器内部你不能访问外部配置。并且nginx不支持在大多数配置块中使用环境变量。
但是如果你使用poco,你可以在一个简单的env文件中定义你的端口,路径等。这些定义也被docker-compose配置或env变量使用。例如
yourconfig.env
字符串
poco.yml文件(主要配置到您的项目,定义计划)
型
在docker/dc-proxy.yml compose文件中(相关部分):
型
最后从/etc/nginx/conf.d/mysite.template中找到配置模板的相关部分
型
我使用下面的文件夹结构来组织文件。它不是强制性的,但对我来说很容易使用,因为我的每个项目结构都是一样的。
型
说明
在.env文件中定义一个键值对,poco用来创建docker-compose文件,用来在nginx容器中创建环境变量,然后用
envsubst
填写nginx配置模板,最后启动nginx服务pepwfjgg4#
这里是一个工作的解决方案,当你的nginx可以在反向代理后面(如果你不在反向代理后面,或者反向代理不添加X-Forwarded-* 头文件,也可以工作):
字符串
vmdwslir5#
我用这个:
字符串
所有的头部都是在nginx的变量中设置的,以http. I.e为前缀,如果你在头部中有origin = domain.com,你可以使用$http_origin来获得“domain.com”。所以我的代码将
$my_forwarded_port
设置为转发端口,如果它被设置,否则为$remote_portsy5wg1nm6#
奇怪的是,这个问题还没有答案,但答案是
字符串