如何解决nginx,flower,Django,proxy_pass和拒绝无效的HOST
我在AWS上有一台运行Nginx / uWsgi / Django的服务器,具有RabbitMQ,flower和Celery。
问题:使用Nginx代理flower而不打开新端口,并拒绝格式错误的请求,这些请求会导致Django中的无效HTTP_HOST标头错误。
我可以做任何一件事,但不能两者都做,因为我对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;
}
reject_hosts.conf
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由主管启动,如下所示:
command = python3 -m celery -A myproj flower --url_prefix=flower --port=5555
解决方法
您可以尝试通过服务器块过滤HTTP请求(如nginx教程中的suggested一样):
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
或我的芹菜正在请求的主机等等。因此,只需在下面添加行在settings.py中输入
ALLOWED_HOSTS=['*']
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。