[英]nginx, flower, Django, proxy_pass, and rejecting invalid HOSTs
我在 AWS 上有一台运行 nginx/uWSGI/Django 的服务器,带有 RabbitMQ、花和芹菜。
问题:使用 nginx 代理花而不打开新端口,并且还会拒绝格式错误的请求,这些请求会导致 Django 中的 Invalid HTTP_HOST Header 错误。
我可以做任何一个但不能两者都做,因为我对 nginx 不是很有经验。
我正在运行花 0.9.4,因为我知道 0.9.5 中的错误。
在下面的配置文件中,如果我注释掉“reject_hosts.conf”行,花可以工作,但我不再像我应该的那样拒绝主机。 如果我保留它,Web 浏览器会超时请求 /flower URL。
这是相关的配置文件:
nginx-app.conf
# the upstream component nginx needs to connect to
upstream django {
server unix:/home/app.sock; # uwsgi socket
}
include redirect_ssl.conf; #301 SSL redirects
# actual webserver. Note that https is handled by AWS so no listen on 443
server {
# default_server indicates that this server block is the block to use if no others match server_name
listen 8080 default_server;
listen [::]:8080 default_server;
charset utf-8;
# max upload size
client_max_body_size 3M; # adjust to taste
include django_aliases.conf; # media and static directories
include reject_hosts.conf; # return 444 if wrong HOSTs header
include flower.conf; # proxy flower
include django_root.conf; # django upstream
}
redirect_ssl.conf
## 301 redirect for HTTPS
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 301 https://$host$request_uri;
}
Flower.conf - 如果不包括 reject_hosts ,则此有效。 我尝试了大约一千种变体,以获得可以与 Flower 中的所有文件正常工作的变体。
location /flower/ {
rewrite ^/flower/(.*)$ /$1 break;
proxy_pass http://localhost:5555;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
}
拒绝主机配置文件
if ($host !~* ^(127.0.0.1|localhost|mydomain.com|myotherdomain.com|my.subdomain.com)$ ) {
return 444;
}
django_aliases.conf
# Django media
location /media {
alias media; # Media files, actual location removed for paranoia
}
location /static {
alias static; # Static files, actual location removed for paranoia
}
django_root.conf
location / {
uwsgi_pass django;
include uwsgi_params; # location removed for paranoia
uwsgi_read_timeout 600;
uwsgi_send_timeout 600;
uwsgi_connect_timeout 60;
uwsgi_ignore_client_abort on;
}
最后,Flower 由 supervisord 启动,如下所示:
command = python3 -m celery -A myproj flower --url_prefix=flower --port=5555
您可以尝试通过服务器块过滤 HTTP 请求(如 nginx 教程所建议的):
server {
listen 80;
listen [::]:80;
server_name 127.0.0.1 localhost mydomain.com myotherdomain.com my.subdomain.com;
return 301 https://$host$request_uri;
}
server {
# handle invalid requests with his one
listen 80 default_server;
listen [::]:80 default_server;
return 444;
}
server {
listen 8080;
listen [::]:8080;
server_name 127.0.0.1 localhost mydomain.com myotherdomain.com my.subdomain.com;
... # rest of the configuration
}
server {
# handle invalid requests with his one
listen 8080 default_server;
listen [::]:8080 default_server;
return 444;
}
这样你就不需要reject_hosts.conf
文件了。
不知道你有没有注意到。 你只处理有效的请求,不听无效的请求。
只需在 nginx 的服务器上下文中添加此属性:
server_name example.com mysite.example.com
同样,您必须在 django 的 settings.py 文件中输入这些主机。 我通常使用'*'
来创建该条目,这样我就不必担心在 nginx 中设置了什么主机名proxy_pass
或在我的 celery 请求的主机上等等。所以只需在 settings.py 中添加以下行
ALLOWED_HOSTS=['*']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.