docker - 如何将Nginx X-Forwarded-Port配置为原始请求端口

标签 docker nginx reverse-proxy nginx-reverse-proxy x-forwarded-for

我在标准反向代理方案中使用nginx,将所有对/auth的请求传递到另一台主机,但是我试图使用非标准端口。

我的最终目标是将X-Forwarded-Port header 设置为发出请求的端口。

这是我在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



当我点击网址时:

http://localhost:8085/auth/



我已正确重定向到http://otherhost:8090,但是X-Forwarded-Port header 丢失或错误。

在原始块中有<VAR>的地方,我尝试了以下操作:
  • $server_port-这是nginx正在监听的端口(80),而不是
    请求端口。
  • $pass_port-在我的设置中似乎为空,因此nginx删除了
    header 。
  • $http_port-这是每个请求的随机端口。
  • $remote_port-这是每个请求的随机端口。

  • 我可以在部署时更改配置,以将代码硬编码到传入请求的已知端口,但是理想情况下,我可以更改前端端口,而无需更改nginx配置。

    我搜寻了the nginx variable list,但是找不到类似$request_port的东西。有什么办法可以实现我的意图?

    最佳答案

    这只是编写Nginx conf的粗略想法,但是我相信这可以帮助您进行重定向

    server {    
        listen 80;  
        server_name host.docker.internal;   
    
        # By default land on localhost:80 to root so in root we copied UI build to the ngnix html dir.
        # have a look to docker-compose uiapp service.
        location / {    
                root   /usr/share/nginx/html;   
                index  index.html index.htm;    
        }   
    
       # after location add filter, from which every endpoint starts with or comes in endpoint 
       # so that ngnix can capture the URL and reroute it.
       # like /backend/getUserInfo/<UserId> 
       # In above example /backend is that filter which will be captured by Ngnix and reroute the flow.
        location /backend { 
            proxy_set_header X-Forwarded-Host $host;    
            proxy_set_header X-Forwarded-Server $host;  
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            #proxy_pass http://<ContainerName>:<PortNumber>; 
            # In our case Container name is as we setup in docker-compose `beservice` and port 8080
            proxy_pass http://beservice:8080;   
        }   
    }
    
    有关更多详细信息,请查看此项目
    https://github.com/dupinder/NgnixDockerizedDevEnv

    关于docker - 如何将Nginx X-Forwarded-Port配置为原始请求端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60616564/

    相关文章:

    nginx - 如何在 CDN 后面创建反向代理(另一个反向代理)

    azure - 我们可以使用本地 SQL Server 作为 AzureWebJobsStorage 来运行容器化的 Azure Functions 吗?

    laravel - Laradock 不支持 mysql

    ssl - 如何让 node 和 django 在一个 SSL 服务器下运行?

    php - Dockerized Laravel 应用程序,总是 404 Assets

    nginx - 从 Docker 容器内部,如何连接到机器的本地主机?

    node.js - 配置 nginx 发送回 404 的 index.html

    docker - 在哪里可以查看 Docker 镜像的 Dockerfile?

    docker - 使用KinD创建本地集群,CPU保持高使用率

    nginx - 使用 nginx/php-fpm 设置 $_ENV (fka $HTTP_ENV_VARS)