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;
我刚刚设置了 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
.
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;