nginx + gunicorn + pyramid:从 headers 获取实际域名

nginx + gunicorn + pyramid: Get actual domain name from headers

我刚刚设置了 nginx + gunicorn 来提供金字塔网络应用程序。我的应用程序依赖于获取子域,每个客户端都不同。我以前不知道这一点,但是在通过 gunicorn 时,似乎我唯一能从域中获得的是我在用于配置 Gunicorn - localhost 的 INI 文件中的内容。

我想知道是否有办法获取发出请求的实际完整域名?它不能是任何硬编码的,因为每个请求的子域可能不同。有没有人知道如何实现这一点?

更新 我按照 Fuero 的要求进行了更改,更改了

的值
proxy_set_header        Host $http_host;

proxy_set_header        Host $host;

不幸的是,那没有做到。我仍然在环境中看到 127.0.0.1:6500 作为远程地址、主机等。唯一向我显示实际客户端请求域的是引荐来源网址。我在下面包含了我的配置文件,希望有一些东西能脱颖而出。

user www-data;
worker_processes 4;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
    # multi_accept on;
}

http {

    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

#    sendfile on;
    gzip  on;
    gzip_http_version 1.1;
    gzip_vary on;
    gzip_comp_level 6;
    gzip_proxied any;
    gzip_types text/plain text/html text/css 
       application/json application/x-javascript 
       text/xml application/xml application/xml+rss 
       text/javascript application/javascript text/x-js;
    gzip_buffers 16 8k;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";    
    ##
    # Virtual Host Configs
    ##


    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
    upstream myapp-site {
        server 127.0.0.1:6500;
    }

    server {

        access_log  /var/www/tmsenv/logs/access.log;

        location / {
            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;

            client_max_body_size    10m;
            client_body_buffer_size 128k;
            proxy_connect_timeout   60s;
            proxy_send_timeout      90s;
            proxy_read_timeout      90s;
            proxy_buffering         off;
            proxy_temp_file_write_size 64k;
            proxy_pass http://myapp-site;
            proxy_redirect          off;
        }
    }
}

由于您使用的是 WSGI,因此您可以在 environ['HTTP_HOST'] 中找到主机名。有关更多详细信息和您可以检索的其他信息,请参阅 PEP 333

将此添加到您的配置中:

proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header        Host            $host;

这会在 Host: header 中保留在浏览器中输入的服务器名称,并在 X-Forwarded-For: 中添加客户端的 IP 地址。

通过 environ['HTTP_HOST']environ['HTTP_X_FORWARDED_FOR'] 访问它们。尽管在设置 REMOTE_IP.

时,WSGI 可能足够聪明以尊重 X-Forwarded-For:

我终于让这个工作正常了,修复是一些愚蠢的东西,就像典型的那样。在寻找答案时,我注意到我的配置没有我首先使用 nginx 的根目录或静态目录位置。我问了设置它的人,他们指出它在另一个配置文件中,该文件通过 include 使用。

include /etc/nginx/sites-enabled/*;

我转到那个文件并添加了建议的 headers,它起作用了。

proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header        Host            $host;