Django uWSGI NGINX 错误请求 400
Posted
技术标签:
【中文标题】Django uWSGI NGINX 错误请求 400【英文标题】:Django uWSGI NGINX Bad Request 400 【发布时间】:2014-08-03 05:50:51 【问题描述】:在尝试使用 django 开发服务器部署我开发的博客时收到 400 错误后,我开始了一个新的测试项目(使用 startproject 并且什么都不做 - 只是在这里和那里进行一些配置) - 尽可能少以使其尽可能简单。
当我执行“manage.py runserver”时,它会显示一个页面,说我看到了这个,因为我的设置中有“DEBUG = True”。
到目前为止一切顺利。没有错误。
但如果我使用 uWSGI 和 nginx,我会再次收到“错误请求 (400)”页面。
最初我遇到了一些导入错误,我不得不向 sys.path 添加一些路径。 但是现在我没有从 python、NGINX 或 uWSGI 得到任何错误,并且仍然以 400-Error-page 告终。
我尝试了以下方法:
调试 = 错误 TEMPLATE_DEBUG = 假 ALLOWED_HOSTS = ['*'] ALLOWED_HOSTS = '*' 从 MIDDLEWARE_CLASSES 中注释掉 'django.middleware.clickjacking.XFrameOptionsMiddleware' 将 NGINX 与 uWSGI 结合使用,而不是 Apache 与 mod_wsgi 结合使用(我坚持使用此设置,因为我喜欢它,但这并没有解决我的问题)我的设置: uWSGI、NGINX 和客户端(firefox)在我的笔记本(kubuntu 14.04)中运行。 虚拟主机/子域 (cefk_blawg.localhost),位于主机文件 (cefk_blawg.localhost 127.0.0.1) 中并在 NGINX 中正确配置(我知道,因为当我使用金字塔测试项目时,它实际上就像一个魅力)。 途中没有防火墙。 使用 virtualenv 并在其中安装了所有内容(django/uwsgi/pillow/mysql-python)。
我的 uwsgi.ini:
[uwsgi]
# Unix socket (full path)
socket = /tmp/cefk_blawg.sock
# Set socket permissions
chmod-socket = 666
# Master process
master = true
# Maximum number of worker processes
processes = 4
# Set timeout
harakiri = 60
harakiri-verbose = true
# Limit post-size
limit-post = 65536
# When to start buffering for post-vars
post-buffering = 1 ## none of these makes my problem go away
#post-buffering = 8192 ## none of these makes my problem go away
#post-buffering = 32768 ## none of these makes my problem go away
# Daemonize
daemonize = /home/cefk/Dokumente/cefk_blawg/uwsgi.log
pidfile = /home/cefk/Dokumente/cefk_blawg/uwsgi.pid
# Limit queue
listen = 64
max-requests = 1000
# Whatever this does .. it works for pyramid (got it from a tutorial)
reload-on-as = 128
reload-on-rss = 96
no-orphans = true
log-slow = true
# This is the full path to my virtualenv
virtualenv = /home/cefk/Dokumente/cefk_blawg/venv
# Django wsgi file
wsgi-file = /home/cefk/Dokumente/cefk_blawg/cefk_info/cefk_info/wsgi.py
# Settings file (this seems to do nothing)
# And it gets set in the wsgi.py-file
env = DJANGO_SETTINGS_MODULE=cefk_info.settings
# Set domain (this seems to do nothing)
#domain = cefk_blawg.localhost
# Django-project base directory (this seems to do nothing)
#chdir = /home/cefk/Dokumente/cefk_blawg/cefk_info
# This seems to do nothing
#pythonpath=/home/cefk/Dokumente/cefk_blawg/cefk_info/cefk_info/
# Set vhost (this seems to do nothing)
#vhost = true
# Clean up environment on exit
vacuum = true
#
我的 wsgi.py 文件:
import os
import pprint
import site
import sys
from django.core.wsgi import get_wsgi_application
base_parent = '/home/cefk/Dokumente/cefk_blawg/'
base = '/home/cefk/Dokumente/cefk_blawg/cefk_info/'
sys.path.append(base_parent)
sys.path.append(base)
site.addsitedir(
'/home/cefk/Dokumente/cefk_blawg/venv/local/lib/python2.7/site-packages'
)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "cefk_info.settings")
activate_env = '/home/cefk/Dokumente/cefk_blawg/venv/bin/activate_this.py'
execfile(activate_env, dict(__file__=activate_env))
# I stole this shamelessly from another ***-post - this is good to have
class LoggingMiddleware:
def __init__(self, application):
self.__application = application
def __call__(self, environ, start_response):
errors = environ['wsgi.errors']
pprint.pprint(('REQUEST', environ), stream=errors)
def _start_response(status, headers, *args):
pprint.pprint(('RESPONSE', status, headers), stream=errors)
return start_response(status, headers, *args)
return self.__application(environ, _start_response)
application = LoggingMiddleware(get_wsgi_application())
这是我的请求/响应,我从 wsgi.py 中的 LoggingMiddleware 获得:
(
'REQUEST',
'CONTENT_LENGTH': '',
'CONTENT_TYPE': '',
'DOCUMENT_ROOT': '/home/cefk/Dokumente/cefk_blawg/cefk_info/cefk_info',
'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'HTTP_ACCEPT_ENCODING': 'gzip, deflate',
'HTTP_ACCEPT_LANGUAGE': 'de,en-US;q=0.7,en;q=0.3',
'HTTP_CACHE_CONTROL': 'max-age=0',
'HTTP_CONNECTION': 'keep-alive',
'HTTP_DNT': '1',
'HTTP_HOST': 'cefk_blawg.localhost',
'HTTP_USER_AGENT': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:29.0) Gecko/20100101 Firefox/29.0',
'PATH_INFO': '/',
'QUERY_STRING': '',
'REMOTE_ADDR': '127.0.0.1',
'REMOTE_PORT': '42518',
'REQUEST_METHOD': 'GET',
'REQUEST_URI': '/',
'SERVER_NAME': 'cefk_blawg.localhost',
'SERVER_PORT': '80',
'SERVER_PROTOCOL': 'HTTP/1.1',
'UWSGI_SCHEME': 'http',
'uwsgi.node': 'lt',
'uwsgi.version': '2.0.5.1',
'wsgi.errors': <open file 'wsgi_errors', mode 'w' at 0x7ff4337110c0>,
'wsgi.file_wrapper': <built-in function uwsgi_sendfile>,
'wsgi.input': <uwsgi._Input object at 0x7ff437271e70>,
'wsgi.multiprocess': True,
'wsgi.multithread': False,
'wsgi.run_once': False,
'wsgi.url_scheme': 'http',
'wsgi.version': (1, 0)
)
('RESPONSE', '400 BAD REQUEST', [('Content-Type', 'text/html')])
[pid: 2652|app: 0|req: 1/1] 127.0.0.1 () 42 vars in 675 bytes [Thu Jun 12 17:16:59 2014] GET / => generated 26 bytes in 150 msecs (HTTP/1.1 400) 1 headers in 53 bytes (1 switches on core 0)
编辑: 这是我的 nginx-config(注意,文件夹名称可能在此期间发生了变化 - 请忽略它):
# Server configuration
server
# Make site accessible from http://cefk_blawg.localhost/
server_name cefk_blawg.localhost;
root /home/cefk/Dokumente/cefk_blawg_django;
# Set charset
charset utf-8;
client_max_body_size 100M;
location /static
autoindex on;
alias /home/cefk/Dokumente/cefk_blawg_django/static;
location /media
autoindex on;
alias /home/cefk/Dokumente/cefk_blawg_django/media;
################################
# Port-based (old) #
################################
#location /
# try_files $uri @application;
#
#location @application
# include /etc/nginx/uwsgi_params;
# uwsgi_pass 127.0.0.1:8000;
#
################################
# /Port-based (old) #
################################
location /
include /etc/nginx/uwsgi_params;
uwsgi_pass unix:///tmp/cefk_blawg.sock;
/编辑
我没有想法。
请帮忙。
【问题讨论】:
这个错误一般是指一个错误的ALLOWED_HOSTS。您确定每次尝试更改后都重新启动了uWSGI吗?并避免从 uWSGI 的博客文章中复制和粘贴,使用最少的选项(如官方文档中所述)并最终添加您的环境特别需要的内容(例如 96megs 的 rss 可能会导致不断重新加载您的 django 实例) 是的,我每次都重新加载。甚至重新启动了nginx。我尝试的第一件事是将 ALLOWED_HOSTS 更改为每个值,这甚至有可能有意义(localhost/.localhost/my.domain/.my.domain/* as list/* as string)。我坚持使用 ALLOWED_HOSTS = '*'。同样一开始,我没有使用 uwsgi.ini 并且在从命令行调用它时只提供了一些参数。之后,我使用了 django-docs 中的那个 .. 然后复制了我能找到的所有似乎合理或需要的东西。 最近有没有人让 django+uwsgi+nginx 工作?会不会是bug? 错误大多是由于错误的 ALLOWED_HOSTS 造成的。您能解释一下为什么要将 ALLOWED_HOSTS 从列表更改为字符串。即ALLOWED_HOSTS = ['*']
,然后到ALLOWED_HOSTS = '*'
我在 *** 上看到了这两个版本,但我可以向你保证,既不会给我错误,也不会让我的问题消失。
【参考方案1】:
您可以在您的服务器上设置DEBUG = True
,重新启动uwsgi
服务并在浏览器中查看django
的调试输出。您在django
的开发服务器上没有看到任何错误这一事实并不意味着该错误与nginx
或uwsgi
服务有关。
【讨论】:
感谢您的回答。我实际上在 2 年前就问过这个问题 .. 这样 django 就不再存在了。不过,我让它适用于当前版本。我还是不知道,旧的有什么问题。但由于它现在才有效,我不再关心 2 年前出了什么问题。【参考方案2】:在settings.py中
ALLOWED_HOSTS = ['*']
会解决的
【讨论】:
【参考方案3】:自从我在 5 年前提出这个问题以来,我可能错了。 但我现在会尽我所能回答这个问题,因为所有出现的答案似乎都与我的解决方案相去甚远。
我最近在几个项目中再次使用 Django 并遇到了类似的问题。
我做错了什么列表:
已在 virtualenv 以及系统全局安装了 uwsgi uwsgi-config 中的应用路径错误 uwsgi-config 中的 virtualenv 路径错误 用于连接 uwsgi 和 nginx 的套接字文件的权限设置不正确这就是我能想到的,我以前做错了什么。
我希望这对在设置过程中遇到困难的所有人有所帮助。
【讨论】:
【参考方案4】:好的,所以我遇到了同样的错误,但我终于弄明白了。 (至少对我来说)。我向上帝祈祷这对你有用,因为我浪费了一天的时间。
如果您像我一样使用:http://uwsgi-docs.readthedocs.org/en/latest/tutorials/Django_and_nginx.html 作为获取基本设置的教程。我让 uwsgi 在 http 上工作,它似乎在 tcp 套接字上工作。当我尝试连接 nginx 时,我不断收到 400 个错误。它特别说创建一个文件名 my_site.conf 并将其链接到启用站点。好吧,如果您检查启用了站点,您应该会看到一个名为 default 的文件。请注意,此文件未命名为 default.conf。尝试将 my_site.conf 重命名为 my_site 并确保重新链接。
TDLR:取消链接 my_site.conf。将 my_site.conf 重命名为 my_site。将 my_site 链接到已启用的站点
【讨论】:
对不起,我忘了提这个,但我已经做到了。同时我重写了整个项目(使用金字塔+uwsgi)。令人着迷的是,相同的 uwsgi-config 具有微小的变化(路径、目录名称和类似的东西)可以完美地与金字塔一起使用。 我使用了那些教程,首先.. 然后任何东西,我可以找到关于这件事的东西:docs.djangoproject.com/en/1.7/howto/deployment/wsgi/uwsgiuwsgi-docs.readthedocs.org/en/latest/tutorials/… 所以我最终把东西混合在一起,我想,可能会让它起作用- 但没有任何工作。经过数周的挫折后,我放弃了。 我最近尝试了 Django 1.8,它对我很有效。我想,一旦我完成了我的项目,我会在这里写一个教程并发布一个链接。 还没有教程吗? 嗯.. 我遇到了很多很棒的,所以我想,我不必再添加一个了。我个人最喜欢的(到目前为止):youtube.com/playlist?list=PLQVvvaa0QuDe9nqlirjacLkBYdgc2inh3希望这会有所帮助。以上是关于Django uWSGI NGINX 错误请求 400的主要内容,如果未能解决你的问题,请参考以下文章
Django + uWSGI + Nginx + SSL - 工作配置请求(强调 SSL)
Nginx+uWSGI+Django 在大请求正文和过期会话时返回 502
uWSGI + Django + Nginx - 运行时错误