【问题标题】:Nginx Bad Gateway after altering project structure更改项目结构后的 Nginx Bad Gateway
【发布时间】:2017-06-04 23:12:53
【问题描述】:

我有一个托管在 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

我在重启实例之前做了以下操作:

  1. gunicorn.conf 的位置从root /var/www/myproject/myproject/myproject/myproject 更改为root /var/www/myproject/myproject/myproject
  2. nginx.conf 的位置从root /var/www/myproject/myproject/myproject/myproject 更改为root /var/www/myproject/myproject/myproject

我现在在尝试访问我的网站 URL 时看到 502 BAD GATEWAY,在查看 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 的错误日志。
  • 刚刚添加了一些错误信息,可能与Celery有关?
  • 是的,您需要查看该导入错误。也许删除 init.py 中的相对导入?由于它无法导入,gunicorn 无法运行 python 代码,所以 nginx 无法连接到它,你会得到 502。
  • 太棒了!知道为什么我的 celery 导入会突然停止工作,因为我所做的只是删除了一个除了容纳 appspec.yml 文件之外并没有真正做任何事情的上游文件夹?
  • 我猜某处的某些路径没有更改以反映目录结构?

标签: django amazon-web-services nginx wsgi gunicorn


【解决方案1】:

原来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 文件相同的目录运行此命令。

【讨论】:

    猜你喜欢
    • 2013-11-21
    • 2020-11-12
    • 2015-07-25
    • 2023-03-20
    • 2018-01-20
    • 2018-04-23
    • 2021-02-24
    • 1970-01-01
    • 2022-08-16
    相关资源
    最近更新 更多