Debian8.7 上使用 uwsgi / nginx 的 Django 的内部服务器错误
Internal Server Error for Django with uwsgi / nginx on Debian8.7
我是服务器技术的新手,我正在努力将 Django 应用程序部署到 Debian8 服务器。
我一直在关注:this tutorial but I couldn't start uWSGI service so I followed this recommendation 并切换到 systemd
。
然后我已经能够 运行 我的应用程序在端口 :8000
上处于开发模式但无法在浏览器中加载它。
日志说:no python application found, check your startup logs for errors
在日志中的这条注释上方,它抱怨无法加载 whitenoise
模块:
File "./testdjango/wsgi.py", line 35, in <module>
from whitenoise.django import DjangoWhiteNoise
这意味着(如果我没记错的话)它不会加载虚拟环境。
已更新
如果我 运行 uwsgi 终端命令,它就不再工作了
uwsgi --http :8000 --chdir /home/djangouser/testdjango --module testdjango.wsgi:application --env DJANGO_SETTINGS_MODULE=testdjango.settings --home /home/djangouser/Env/myapp_env
我不知道为什么会这样,非常感谢任何帮助或指导。
我在此处发布此问题之前进行了搜索,实际上在过去三天里我一直在尝试许多不同的解决方案,但均未成功。因此,我的文件现在看起来很乱。对此我深表歉意。
我使用 django 1.8、virtualenvvrapper、名为 djangouser 的 sudo 用户,服务器上的文件夹结构如下所示:
-home
|
|--djangouser
|
|--Env
| |--myapp_env
|
|--testdjango
|
|-- app
|-- testdjango
| |
| |-- wsgi.py
| |-- settings.py
|
|-- uwsgi.ini
|-- manage.py
/etc/uwsgi/sites/testdjango.ini
文件:
[uwsgi]
project = testdjango
base = /home/djangouser
chdir = %(base)/%(project)
home = %(base)/Env/myapp_env
module = %(project).wsgi:application
env = DJANGO_SETTINGS_MODULE=%(project).settings
master = true
processes = 5
socket = %(base)/%(project)/%(project).sock
chmod-socket = 666
vacuum = true
/etc/systemd/system/uwsgi.service
文件:
[Unit]
Description=uWSGI Emperor service
After=syslog.target
[Service]
ExecStart=/usr/local/bin/uwsgi --emperor /etc/uwsgi/sites
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all
[Install]
WantedBy=multi-user.target
/etc/nginx/sites-available/testdjango
文件:
server {
listen 80;
server_name xx.xx.xx.xx myapp.com www.myapp.com;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/djangouser/testdjango/static/;
}
location /media {
root /home/djangouser/testdjango/media/;
}
location / {
include uwsgi_params;
uwsgi_pass unix:/home/djangouser/testdjango/testdjango.sock;
}
}
wsgi.py
文件:
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "testdjango.settings")
from django.core.wsgi import get_wsgi_application
from whitenoise.django import DjangoWhiteNoise
application = DjangoWhiteNoise(get_wsgi_application())
更新 2
uwsgi --http :8000 --chdir /home/djangouser/testdjango --module testdjango.wsgi:application --env DJANGO_SETTINGS_MODULE=testdjango.settings --home /home/djangouser/Env/myapp_env
*** Starting uWSGI 2.0.15 (64bit) on [Wed Apr 5 14:48:34 2017] ***
compiled with version: 4.9.2 on 04 April 2017 17:12:38
os: Linux-4.9.7-x86_64-linode80 #2 SMP Thu Feb 2 15:43:55 EST 2017
nodename: xxonexx
machine: x86_64
clock source: unix
detected number of CPU cores: 1
current working directory: /home/djangouser/Env/myapp_env/lib/python2.7/site-packages
detected binary path: /usr/local/bin/uwsgi
!!! no internal routing support, rebuild with pcre support !!!
chdir() to /home/djangouser/testdjango
*** WARNING: you are running uWSGI without its master process manager ***
your processes number limit is 3934
your memory page size is 4096 bytes
detected max file descriptor number: 65536
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uWSGI http bound on :8000 fd 4
spawned uWSGI http 1 (pid: 5293)
uwsgi socket 0 bound to TCP address 127.0.0.1:36933 (port auto-assigned) fd 3
Python version: 2.7.9 (default, Jun 29 2016, 13:11:10) [GCC 4.9.2]
Set PythonHome to /home/djangouser/Env/myapp_env
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0x12036b0
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 72760 bytes (71 KB) for 1 cores
*** Operational MODE: single process ***
HI!
Djangomode is:
None
Traceback (most recent call last):
File "./testdjango/wsgi.py", line 38, in <module>
from whitenoise.django import DjangoWhiteNoise
File "/home/djangouser/Env/myapp_env/local/lib/python2.7/site-packages/whitenoise/django.py", line 8, in <module>
from django.contrib.staticfiles.storage import staticfiles_storage
File "/home/djangouser/Env/myapp_env/local/lib/python2.7/site-packages/django/contrib/staticfiles/storage.py", line 12, in <module>
from django.core.cache import (
File "/home/djangouser/Env/myapp_env/local/lib/python2.7/site-packages/django/core/cache/__init__.py", line 34, in <module>
if DEFAULT_CACHE_ALIAS not in settings.CACHES:
File "/home/djangouser/Env/myapp_env/local/lib/python2.7/site-packages/django/conf/__init__.py", line 48, in __getattr__
self._setup(name)
File "/home/djangouser/Env/myapp_env/local/lib/python2.7/site-packages/django/conf/__init__.py", line 44, in _setup
self._wrapped = Settings(settings_module)
File "/home/djangouser/Env/myapp_env/local/lib/python2.7/site-packages/django/conf/__init__.py", line 92, in __init__
mod = importlib.import_module(self.SETTINGS_MODULE)
File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "./testdjango/settings.py", line 59, in <module>
ALLOWED_HOSTS = os.getenv('ALLOWED_HOSTS').split(',')
AttributeError: 'NoneType' object has no attribute 'split'
unable to load app 0 (mountpoint='') (callable not found or import error)
*** no app loaded. going in full dynamic mode ***
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI worker 1 (and the only) (pid: 5292, cores: 1)
在生产中,您需要在 settings.py 中编辑 ALLOWED_HOSTS
。
The official docs 显示以下示例:
ALLOWED_HOSTS = [
'.example.com', # Allow domain and subdomains
'.example.com.', # Also allow FQDN and subdomains
]
您可能应该遵循 /etc/nginx/sites-available/testdjango
文件开头的任何内容。
您在开发中看不到这一点的原因是因为该设置会自动填充 'localhost',因此它永远不会为空。
好了,折腾了四天终于找到问题所在了。
在第三次重新开始这个问题并检查服务器上的错误消息后,我发现我应该将我的环境变量导入到 uwsgi ini 文件中。
这样做之后,uwsgi.log 中的错误消失了,应用开始按预期运行。
我真的希望这个答案能在将来节省一些人的时间。
我是服务器技术的新手,我正在努力将 Django 应用程序部署到 Debian8 服务器。
我一直在关注:this tutorial but I couldn't start uWSGI service so I followed this recommendation 并切换到 systemd
。
然后我已经能够 运行 我的应用程序在端口 :8000
上处于开发模式但无法在浏览器中加载它。
日志说:no python application found, check your startup logs for errors
在日志中的这条注释上方,它抱怨无法加载 whitenoise
模块:
File "./testdjango/wsgi.py", line 35, in <module>
from whitenoise.django import DjangoWhiteNoise
这意味着(如果我没记错的话)它不会加载虚拟环境。
已更新
如果我 运行 uwsgi 终端命令,它就不再工作了
uwsgi --http :8000 --chdir /home/djangouser/testdjango --module testdjango.wsgi:application --env DJANGO_SETTINGS_MODULE=testdjango.settings --home /home/djangouser/Env/myapp_env
我不知道为什么会这样,非常感谢任何帮助或指导。
我在此处发布此问题之前进行了搜索,实际上在过去三天里我一直在尝试许多不同的解决方案,但均未成功。因此,我的文件现在看起来很乱。对此我深表歉意。
我使用 django 1.8、virtualenvvrapper、名为 djangouser 的 sudo 用户,服务器上的文件夹结构如下所示:
-home
|
|--djangouser
|
|--Env
| |--myapp_env
|
|--testdjango
|
|-- app
|-- testdjango
| |
| |-- wsgi.py
| |-- settings.py
|
|-- uwsgi.ini
|-- manage.py
/etc/uwsgi/sites/testdjango.ini
文件:
[uwsgi]
project = testdjango
base = /home/djangouser
chdir = %(base)/%(project)
home = %(base)/Env/myapp_env
module = %(project).wsgi:application
env = DJANGO_SETTINGS_MODULE=%(project).settings
master = true
processes = 5
socket = %(base)/%(project)/%(project).sock
chmod-socket = 666
vacuum = true
/etc/systemd/system/uwsgi.service
文件:
[Unit]
Description=uWSGI Emperor service
After=syslog.target
[Service]
ExecStart=/usr/local/bin/uwsgi --emperor /etc/uwsgi/sites
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all
[Install]
WantedBy=multi-user.target
/etc/nginx/sites-available/testdjango
文件:
server {
listen 80;
server_name xx.xx.xx.xx myapp.com www.myapp.com;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/djangouser/testdjango/static/;
}
location /media {
root /home/djangouser/testdjango/media/;
}
location / {
include uwsgi_params;
uwsgi_pass unix:/home/djangouser/testdjango/testdjango.sock;
}
}
wsgi.py
文件:
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "testdjango.settings")
from django.core.wsgi import get_wsgi_application
from whitenoise.django import DjangoWhiteNoise
application = DjangoWhiteNoise(get_wsgi_application())
更新 2
uwsgi --http :8000 --chdir /home/djangouser/testdjango --module testdjango.wsgi:application --env DJANGO_SETTINGS_MODULE=testdjango.settings --home /home/djangouser/Env/myapp_env
*** Starting uWSGI 2.0.15 (64bit) on [Wed Apr 5 14:48:34 2017] ***
compiled with version: 4.9.2 on 04 April 2017 17:12:38
os: Linux-4.9.7-x86_64-linode80 #2 SMP Thu Feb 2 15:43:55 EST 2017
nodename: xxonexx
machine: x86_64
clock source: unix
detected number of CPU cores: 1
current working directory: /home/djangouser/Env/myapp_env/lib/python2.7/site-packages
detected binary path: /usr/local/bin/uwsgi
!!! no internal routing support, rebuild with pcre support !!!
chdir() to /home/djangouser/testdjango
*** WARNING: you are running uWSGI without its master process manager ***
your processes number limit is 3934
your memory page size is 4096 bytes
detected max file descriptor number: 65536
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uWSGI http bound on :8000 fd 4
spawned uWSGI http 1 (pid: 5293)
uwsgi socket 0 bound to TCP address 127.0.0.1:36933 (port auto-assigned) fd 3
Python version: 2.7.9 (default, Jun 29 2016, 13:11:10) [GCC 4.9.2]
Set PythonHome to /home/djangouser/Env/myapp_env
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0x12036b0
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 72760 bytes (71 KB) for 1 cores
*** Operational MODE: single process ***
HI!
Djangomode is:
None
Traceback (most recent call last):
File "./testdjango/wsgi.py", line 38, in <module>
from whitenoise.django import DjangoWhiteNoise
File "/home/djangouser/Env/myapp_env/local/lib/python2.7/site-packages/whitenoise/django.py", line 8, in <module>
from django.contrib.staticfiles.storage import staticfiles_storage
File "/home/djangouser/Env/myapp_env/local/lib/python2.7/site-packages/django/contrib/staticfiles/storage.py", line 12, in <module>
from django.core.cache import (
File "/home/djangouser/Env/myapp_env/local/lib/python2.7/site-packages/django/core/cache/__init__.py", line 34, in <module>
if DEFAULT_CACHE_ALIAS not in settings.CACHES:
File "/home/djangouser/Env/myapp_env/local/lib/python2.7/site-packages/django/conf/__init__.py", line 48, in __getattr__
self._setup(name)
File "/home/djangouser/Env/myapp_env/local/lib/python2.7/site-packages/django/conf/__init__.py", line 44, in _setup
self._wrapped = Settings(settings_module)
File "/home/djangouser/Env/myapp_env/local/lib/python2.7/site-packages/django/conf/__init__.py", line 92, in __init__
mod = importlib.import_module(self.SETTINGS_MODULE)
File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "./testdjango/settings.py", line 59, in <module>
ALLOWED_HOSTS = os.getenv('ALLOWED_HOSTS').split(',')
AttributeError: 'NoneType' object has no attribute 'split'
unable to load app 0 (mountpoint='') (callable not found or import error)
*** no app loaded. going in full dynamic mode ***
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI worker 1 (and the only) (pid: 5292, cores: 1)
在生产中,您需要在 settings.py 中编辑 ALLOWED_HOSTS
。
The official docs 显示以下示例:
ALLOWED_HOSTS = [
'.example.com', # Allow domain and subdomains
'.example.com.', # Also allow FQDN and subdomains
]
您可能应该遵循 /etc/nginx/sites-available/testdjango
文件开头的任何内容。
您在开发中看不到这一点的原因是因为该设置会自动填充 'localhost',因此它永远不会为空。
好了,折腾了四天终于找到问题所在了。 在第三次重新开始这个问题并检查服务器上的错误消息后,我发现我应该将我的环境变量导入到 uwsgi ini 文件中。 这样做之后,uwsgi.log 中的错误消失了,应用开始按预期运行。
我真的希望这个答案能在将来节省一些人的时间。