如何在 nginx 中以有条件的方式将 proxy_protocol 设置为“on”?

Jar*_*vis 5 nginx nginx-location nginx-reverse-proxy nginx-config

有人熟悉 nginx 吗?我试图在流块中以有条件的方式启用 proxy_protocol,即对于某些端点,我希望添加代理协议标头。对于其他人我不想添加它。查看文档,proxy_protocol 无法获取变量(尝试了 map 指令) 关于如何实现此目的有什么建议吗?在这里添加了我的 nginx 配置。 http://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_protocol

这是有问题的部分proxy_protocol $proxy_state;

   map $ssl_preread_server_name $proxy_state{
        default on;
        facebook.com off;
    }
    server {
        listen 8443 ;
        resolver 8.8.8.8 ipv6=off;        
        proxy_pass $server;
        proxy_protocol $proxy_state;
        ssl_preread on;

    }
Run Code Online (Sandbox Code Playgroud)

以下是完整的配置

error_log logs/error.log;

events {
}


stream {

    map $ssl_preread_server_name $server { 
        # default 127.0.0.1:8080;
        default unix:/var/run/nginx.sock;
        include /home/user/allow_url_list;

    } 
    map $ssl_preread_server_name $proxy_state{
        default on;
        facebook.com off;
    }
    server {
        listen 8443 ;
        resolver 8.8.8.8 ipv6=off;        
        proxy_pass $server;
        proxy_protocol $proxy_state;
        ssl_preread on;
        
    }
}

http {
    server {
        listen 8080 ssl;
        listen 80;
        listen unix:/var/run/nginx.sock ssl proxy_protocol;
        set_real_ip_from unix:;
        real_ip_header proxy_protocol;
        ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
        ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
        include /home/conf/ssl-params.conf;
        location / {
            resolver 8.8.8.8;
            proxy_pass https://$host$request_uri;
        }
       
    }
    
}
Run Code Online (Sandbox Code Playgroud)

小智 -1

您可以将其拆分为 2 个服务器。你可以尝试一下是否有效。代理协议可能会导致问题。

map $ssl_preread_server_name $internalport {
     facebook.com 10443;
     default 8443;
  }

server {
       listen 8443 ;
       resolver 8.8.8.8 ipv6=off;        
       proxy_pass $server;
       proxy_protocol on;
       ssl_preread on;
   }

server {
       listen 10443 ;
       resolver 8.8.8.8 ipv6=off;        
       proxy_pass $server;
       proxy_protocol off;
       ssl_preread on;

   }
Run Code Online (Sandbox Code Playgroud)