更改项目结构后的 Nginx Bad Gateway
Nginx Bad Gateway after altering project structure
我在 AWS 上托管了一个 django 应用程序,并且一直在清理项目结构的某些方面。其中一项清理涉及删除根目录中的父文件夹,并将我的 appspec.yml 文件(用于 CodeDeploy)放入包含文档的文件夹中。所以我要从这个开始:
myproject/
appspec.yml
myproject/
requirements/
docs/
myproject/
manage.py
myproject/
__init__.py
urls.py
wsgi.py
settings/
myproject/
__init__.py
myproject.py
为此:
myproject/
appspec.yml
requirements/
docs/
myproject/
manage.py
myproject/
__init__.py
urls.py
wsgi.py
settings/
myproject/
__init__.py
myproject.py
我在重启实例之前做了以下操作:
- 已将
gunicorn.conf
位置从 root /var/www/myproject/myproject/myproject/myproject
更改为 root /var/www/myproject/myproject/myproject
- 已将
nginx.conf
位置从 root /var/www/myproject/myproject/myproject/myproject
更改为 root /var/www/myproject/myproject/myproject
我现在在尝试访问我的网站时看到 502 BAD GATEWAY URL 并且在查看 nginx error.log
时看到 failed (104: Connection reset by peer) while reading response header from upstream
.
这显然是因为我弄乱了项目目录。我是否遗漏了其他需要更改的内容,或者一开始更改目录只是个坏主意?
当前nginx.conf
server {
listen 80;
server_name www.myproject.co;
return 301 http://myproject.co$request_uri;
}
server {
listen 80;
server_name myproject.co;
##Deny illegal Host headers
if ($host !~* ^(myproject.co)$ ) {
return 444;
}
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /var/www/myproject/myproject/myproject;
}
location /media/ {
root /var/www/myproject/myproject/myproject;
}
location / {
include proxy_params;
proxy_pass http://127.0.0.1:8000;
}
}
当前gunicorn.conf
description "Gunicorn application server handling myproject"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
setuid ubuntu
setgid ubuntu
chdir /var/www/myproject/myproject/myproject
exec /usr/local/bin/gunicorn --workers 3 myproject.wsgi:application --env SECRET_KEY=""
回溯错误
当我 运行 exec /usr/local/bin/gunicorn --workers 3 myproject.wsgi:application --env SECRET_KEY=""
时,出现以下错误:
exec /usr/local/bin/gunicorn --workers 3 myproject.wsgi:application --env SECRET_KEY="f15a4d7s4bec9cnlw24sw2lj4ften12nu3e4cx3z1utqgajp87"
[2017-01-20 16:02:49 +0000] [9809] [INFO] Starting gunicorn 19.4.5
[2017-01-20 16:02:49 +0000] [9809] [INFO] Listening at: http://127.0.0.1:8000 (9809)
[2017-01-20 16:02:49 +0000] [9809] [INFO] Using worker: sync
[2017-01-20 16:02:49 +0000] [10039] [INFO] Booting worker with pid: 10039
[2017-01-20 16:02:49 +0000] [10039] [ERROR] Exception in worker process:
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/gunicorn/arbiter.py", line 515, in spawn_worker
worker.init_process()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base.py", line 122, in init_process
self.load_wsgi()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base.py", line 130, in load_wsgi
self.wsgi = self.app.wsgi()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/app/base.py", line 67, in wsgi
self.callable = self.load()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py", line 65, in load
return self.load_wsgiapp()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
return util.import_app(self.app_uri)
File "/usr/local/lib/python2.7/dist-packages/gunicorn/util.py", line 357, in import_app
__import__(module)
File "/var/www/myproject/myproject/myproject/myproject/__init__.py", line 5, in <module>
from .myproject import app as celery_app
ImportError: cannot import name app
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/gunicorn/arbiter.py", line 515, in spawn_worker
worker.init_process()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base.py", line 122, in init_process
self.load_wsgi()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base.py", line 130, in load_wsgi
self.wsgi = self.app.wsgi()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/app/base.py", line 67, in wsgi
self.callable = self.load()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py", line 65, in load
return self.load_wsgiapp()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
return util.import_app(self.app_uri)
File "/usr/local/lib/python2.7/dist-packages/gunicorn/util.py", line 357, in import_app
__import__(module)
File "/var/www/myproject/myproject/myproject/myproject/__init__.py", line 5, in <module>
from .myproject import app as celery_app
ImportError: cannot import name app
[2017-01-20 16:02:49 +0000] [10039] [INFO] Worker exiting (pid: 10039)
[2017-01-20 16:02:49 +0000] [9809] [INFO] Shutting down: Master
[2017-01-20 16:02:49 +0000] [9809] [INFO] Reason: Worker failed to boot.
/var/www/myproject/myproject/myproject/myproject/myproject.py
from __future__ import absolute_import
import os
from os.path import abspath, dirname
from sys import path
SITE_ROOT = dirname(dirname(abspath(__file__)))
path.append(SITE_ROOT)
from celery import Celery
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', "settings.production")
from django.conf import settings
app = Celery('myproject')
path.append('/var/www/myproject/myproject/myproject')
# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
# load task modules from all registered Django app configs.
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
/var/www/myproject/myproject/myproject/myproject/__init.py__
from __future__ import absolute_import
# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .myproject import app as celery_app
# __all__ = ['celery_app']
注释掉`from .myproject import app as celery_app:
后出错
[2017-01-20 18:13:49 +0000] [1411] [INFO] Starting gunicorn 19.4.5
[2017-01-20 18:13:49 +0000] [1411] [INFO] Listening at: http://127.0.0.1:8000 (1411)
[2017-01-20 18:13:49 +0000] [1411] [INFO] Using worker: sync
[2017-01-20 18:13:49 +0000] [1439] [INFO] Booting worker with pid: 1439
[2017-01-20 18:13:49 +0000] [1439] [ERROR] Exception in worker process:
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/gunicorn/arbiter.py", line 515, in spawn_worker
worker.init_process()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base.py", line 122, in init_process
self.load_wsgi()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base.py", line 130, in load_wsgi
self.wsgi = self.app.wsgi()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/app/base.py", line 67, in wsgi
self.callable = self.load()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py", line 65, in load
return self.load_wsgiapp()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
return util.import_app(self.app_uri)
File "/usr/local/lib/python2.7/dist-packages/gunicorn/util.py", line 357, in import_app
__import__(module)
ImportError: No module named myproject.wsgi
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/gunicorn/arbiter.py", line 515, in spawn_worker
worker.init_process()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base.py", line 122, in init_process
self.load_wsgi()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base.py", line 130, in load_wsgi
self.wsgi = self.app.wsgi()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/app/base.py", line 67, in wsgi
self.callable = self.load()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py", line 65, in load
return self.load_wsgiapp()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
return util.import_app(self.app_uri)
File "/usr/local/lib/python2.7/dist-packages/gunicorn/util.py", line 357, in import_app
__import__(module)
ImportError: No module named myproject.wsgi
[2017-01-20 18:13:49 +0000] [1439] [INFO] Worker exiting (pid: 1439)
[2017-01-20 18:13:49 +0000] [1411] [INFO] Shutting down: Master
[2017-01-20 18:13:49 +0000] [1411] [INFO] Reason: Worker failed to boot.
看来现在gunicorn很难找到任何模块了。
原来 gunicorn.conf
并没有指向包含 manage.py
的目录。所以我改成了:
description "Gunicorn application server handling myproject"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
setuid ubuntu
setgid ubuntu
chdir /var/www/myproject/myproject
exec /usr/local/bin/gunicorn --workers 3 myproject.wsgi:application --env SECRET_KEY=""
这解决了问题。请参阅 Django Docs - How to use Django with Gunicorn,其中指出您的项目应位于 Python 路径上;确保这一点的最简单方法是 运行 从与 manage.py 文件相同的目录中执行此命令。
我在 AWS 上托管了一个 django 应用程序,并且一直在清理项目结构的某些方面。其中一项清理涉及删除根目录中的父文件夹,并将我的 appspec.yml 文件(用于 CodeDeploy)放入包含文档的文件夹中。所以我要从这个开始:
myproject/
appspec.yml
myproject/
requirements/
docs/
myproject/
manage.py
myproject/
__init__.py
urls.py
wsgi.py
settings/
myproject/
__init__.py
myproject.py
为此:
myproject/
appspec.yml
requirements/
docs/
myproject/
manage.py
myproject/
__init__.py
urls.py
wsgi.py
settings/
myproject/
__init__.py
myproject.py
我在重启实例之前做了以下操作:
- 已将
gunicorn.conf
位置从root /var/www/myproject/myproject/myproject/myproject
更改为root /var/www/myproject/myproject/myproject
- 已将
nginx.conf
位置从root /var/www/myproject/myproject/myproject/myproject
更改为root /var/www/myproject/myproject/myproject
我现在在尝试访问我的网站时看到 502 BAD GATEWAY URL 并且在查看 nginx error.log
时看到 failed (104: Connection reset by peer) while reading response header from upstream
.
这显然是因为我弄乱了项目目录。我是否遗漏了其他需要更改的内容,或者一开始更改目录只是个坏主意?
当前nginx.conf
server {
listen 80;
server_name www.myproject.co;
return 301 http://myproject.co$request_uri;
}
server {
listen 80;
server_name myproject.co;
##Deny illegal Host headers
if ($host !~* ^(myproject.co)$ ) {
return 444;
}
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /var/www/myproject/myproject/myproject;
}
location /media/ {
root /var/www/myproject/myproject/myproject;
}
location / {
include proxy_params;
proxy_pass http://127.0.0.1:8000;
}
}
当前gunicorn.conf
description "Gunicorn application server handling myproject"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
setuid ubuntu
setgid ubuntu
chdir /var/www/myproject/myproject/myproject
exec /usr/local/bin/gunicorn --workers 3 myproject.wsgi:application --env SECRET_KEY=""
回溯错误
当我 运行 exec /usr/local/bin/gunicorn --workers 3 myproject.wsgi:application --env SECRET_KEY=""
时,出现以下错误:
exec /usr/local/bin/gunicorn --workers 3 myproject.wsgi:application --env SECRET_KEY="f15a4d7s4bec9cnlw24sw2lj4ften12nu3e4cx3z1utqgajp87"
[2017-01-20 16:02:49 +0000] [9809] [INFO] Starting gunicorn 19.4.5
[2017-01-20 16:02:49 +0000] [9809] [INFO] Listening at: http://127.0.0.1:8000 (9809)
[2017-01-20 16:02:49 +0000] [9809] [INFO] Using worker: sync
[2017-01-20 16:02:49 +0000] [10039] [INFO] Booting worker with pid: 10039
[2017-01-20 16:02:49 +0000] [10039] [ERROR] Exception in worker process:
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/gunicorn/arbiter.py", line 515, in spawn_worker
worker.init_process()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base.py", line 122, in init_process
self.load_wsgi()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base.py", line 130, in load_wsgi
self.wsgi = self.app.wsgi()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/app/base.py", line 67, in wsgi
self.callable = self.load()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py", line 65, in load
return self.load_wsgiapp()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
return util.import_app(self.app_uri)
File "/usr/local/lib/python2.7/dist-packages/gunicorn/util.py", line 357, in import_app
__import__(module)
File "/var/www/myproject/myproject/myproject/myproject/__init__.py", line 5, in <module>
from .myproject import app as celery_app
ImportError: cannot import name app
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/gunicorn/arbiter.py", line 515, in spawn_worker
worker.init_process()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base.py", line 122, in init_process
self.load_wsgi()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base.py", line 130, in load_wsgi
self.wsgi = self.app.wsgi()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/app/base.py", line 67, in wsgi
self.callable = self.load()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py", line 65, in load
return self.load_wsgiapp()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
return util.import_app(self.app_uri)
File "/usr/local/lib/python2.7/dist-packages/gunicorn/util.py", line 357, in import_app
__import__(module)
File "/var/www/myproject/myproject/myproject/myproject/__init__.py", line 5, in <module>
from .myproject import app as celery_app
ImportError: cannot import name app
[2017-01-20 16:02:49 +0000] [10039] [INFO] Worker exiting (pid: 10039)
[2017-01-20 16:02:49 +0000] [9809] [INFO] Shutting down: Master
[2017-01-20 16:02:49 +0000] [9809] [INFO] Reason: Worker failed to boot.
/var/www/myproject/myproject/myproject/myproject/myproject.py
from __future__ import absolute_import
import os
from os.path import abspath, dirname
from sys import path
SITE_ROOT = dirname(dirname(abspath(__file__)))
path.append(SITE_ROOT)
from celery import Celery
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', "settings.production")
from django.conf import settings
app = Celery('myproject')
path.append('/var/www/myproject/myproject/myproject')
# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
# load task modules from all registered Django app configs.
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
/var/www/myproject/myproject/myproject/myproject/__init.py__
from __future__ import absolute_import
# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .myproject import app as celery_app
# __all__ = ['celery_app']
注释掉`from .myproject import app as celery_app:
后出错[2017-01-20 18:13:49 +0000] [1411] [INFO] Starting gunicorn 19.4.5
[2017-01-20 18:13:49 +0000] [1411] [INFO] Listening at: http://127.0.0.1:8000 (1411)
[2017-01-20 18:13:49 +0000] [1411] [INFO] Using worker: sync
[2017-01-20 18:13:49 +0000] [1439] [INFO] Booting worker with pid: 1439
[2017-01-20 18:13:49 +0000] [1439] [ERROR] Exception in worker process:
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/gunicorn/arbiter.py", line 515, in spawn_worker
worker.init_process()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base.py", line 122, in init_process
self.load_wsgi()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base.py", line 130, in load_wsgi
self.wsgi = self.app.wsgi()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/app/base.py", line 67, in wsgi
self.callable = self.load()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py", line 65, in load
return self.load_wsgiapp()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
return util.import_app(self.app_uri)
File "/usr/local/lib/python2.7/dist-packages/gunicorn/util.py", line 357, in import_app
__import__(module)
ImportError: No module named myproject.wsgi
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/gunicorn/arbiter.py", line 515, in spawn_worker
worker.init_process()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base.py", line 122, in init_process
self.load_wsgi()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base.py", line 130, in load_wsgi
self.wsgi = self.app.wsgi()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/app/base.py", line 67, in wsgi
self.callable = self.load()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py", line 65, in load
return self.load_wsgiapp()
File "/usr/local/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
return util.import_app(self.app_uri)
File "/usr/local/lib/python2.7/dist-packages/gunicorn/util.py", line 357, in import_app
__import__(module)
ImportError: No module named myproject.wsgi
[2017-01-20 18:13:49 +0000] [1439] [INFO] Worker exiting (pid: 1439)
[2017-01-20 18:13:49 +0000] [1411] [INFO] Shutting down: Master
[2017-01-20 18:13:49 +0000] [1411] [INFO] Reason: Worker failed to boot.
看来现在gunicorn很难找到任何模块了。
原来 gunicorn.conf
并没有指向包含 manage.py
的目录。所以我改成了:
description "Gunicorn application server handling myproject"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
setuid ubuntu
setgid ubuntu
chdir /var/www/myproject/myproject
exec /usr/local/bin/gunicorn --workers 3 myproject.wsgi:application --env SECRET_KEY=""
这解决了问题。请参阅 Django Docs - How to use Django with Gunicorn,其中指出您的项目应位于 Python 路径上;确保这一点的最简单方法是 运行 从与 manage.py 文件相同的目录中执行此命令。