无法将 Django 应用程序与 Gunicorn 绑定

Unable to bind Django application with Gunicorn

尝试部署到 aws EC2 ubuntu 服务器对我来说非常困难,因为我来自 windows 背景。我在尝试将 Django 应用程序绑定到 gunicorn 时遇到错误。我 运行ning 的命令是 sudo gunicorn --bind 0.0.0.0:8000 logistics.wsgi:application 错误日志如下所示:

(venv) ubuntu@ip-172-31-18-196:/var/www/html$ sudo gunicorn --bind 0.0.0.0:8000 logistics.wsgi:application
[2021-09-08 11:21:00 +0000] [29379] [INFO] Starting gunicorn 20.1.0
[2021-09-08 11:21:00 +0000] [29379] [INFO] Listening at: http://0.0.0.0:8000 (29379)
[2021-09-08 11:21:00 +0000] [29379] [INFO] Using worker: sync
[2021-09-08 11:21:00 +0000] [29382] [INFO] Booting worker with pid: 29382
[2021-09-08 11:21:00 +0000] [29382] [ERROR] Exception in worker process
Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/gunicorn/arbiter.py", line 589, in spawn_worker
    worker.init_process()
  File "/usr/local/lib/python3.5/dist-packages/gunicorn/workers/base.py", line 134, in init_process
    self.load_wsgi()
  File "/usr/local/lib/python3.5/dist-packages/gunicorn/workers/base.py", line 146, in load_wsgi
    self.wsgi = self.app.wsgi()
  File "/usr/local/lib/python3.5/dist-packages/gunicorn/app/base.py", line 67, in wsgi
    self.callable = self.load()
  File "/usr/local/lib/python3.5/dist-packages/gunicorn/app/wsgiapp.py", line 58, in load
    return self.load_wsgiapp()
  File "/usr/local/lib/python3.5/dist-packages/gunicorn/app/wsgiapp.py", line 48, in load_wsgiapp
    return util.import_app(self.app_uri)
  File "/usr/local/lib/python3.5/dist-packages/gunicorn/util.py", line 359, in import_app
    mod = importlib.import_module(module)
  File "/usr/lib/python3.5/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 986, in _gcd_import
  File "<frozen importlib._bootstrap>", line 969, in _find_and_load
  File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 665, in exec_module
  File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
  File "/var/www/html/logistics/wsgi.py", line 12, in <module>
    from django.core.wsgi import get_wsgi_application
  File "/usr/local/lib/python3.5/dist-packages/django/core/wsgi.py", line 2, in <module>
    from django.core.handlers.wsgi import WSGIHandler
  File "/usr/local/lib/python3.5/dist-packages/django/core/handlers/wsgi.py", line 3, in <module>
    from django.conf import settings
  File "/usr/local/lib/python3.5/dist-packages/django/conf/__init__.py", line 19, in <module>
    from django.utils.deprecation import RemovedInDjango40Warning
  File "/usr/local/lib/python3.5/dist-packages/django/utils/deprecation.py", line 5, in <module>
    from asgiref.sync import sync_to_async
  File "/usr/local/lib/python3.5/dist-packages/asgiref/sync.py", line 115
    launch_map: "Dict[asyncio.Task[object], threading.Thread]" = {}
              ^
SyntaxError: invalid syntax
[2021-09-08 11:21:00 +0000] [29382] [INFO] Worker exiting (pid: 29382)
[2021-09-08 11:21:00 +0000] [29379] [INFO] Shutting down: Master
[2021-09-08 11:21:00 +0000] [29379] [INFO] Reason: Worker failed to boot.

当我运行 gunicorn --bind 0.0.0.0:8000 logistics.wsgi:application,(即没有sudo)我得到另一个错误:

(venv) ubuntu@ip-172-31-18-196:/var/www/html$ gunicorn --bind 0.0.0.0:8000 logistics.wsgi:application
Traceback (most recent call last):
  File "/home/ubuntu/.local/bin/gunicorn", line 7, in <module>
    from gunicorn.app.wsgiapp import run
ModuleNotFoundError: No module named 'gunicorn'

但是我已经用命令pip3 install gunicorn --user安装了gunicorn。我在最后添加 --user 的原因是激活的虚拟环境中的 运行ning pip3 install gunicorn 正在抛出权限错误,如下所示:

(venv) ubuntu@ip-172-31-18-196:/var/www/html$ pip3 install gunicorn
Collecting gunicorn
  Using cached https://files.pythonhosted.org/packages/e4/dd/5b190393e6066286773a67dfcc2f9492058e9b57c4867a95f1ba5caf0a83/gunicorn-20.1.0-py3-none-any.whl
Requirement already satisfied: setuptools>=3.0 in ./venv/lib/python3.6/site-packages (from gunicorn) (40.6.2)
Installing collected packages: gunicorn
Could not install packages due to an EnvironmentError: [Errno 13] Permission denied: '/var/www/html/venv/lib/python3.6/site-packages/gunicorn-20.1.0.dist-info'
Consider using the `--user` option or check the permissions.

You are using pip version 18.1, however version 21.2.4 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

同样,我已经从 python3.5 升级到 python3.6,这样当我在终端上 运行 python3 时,我得到以下输出

(venv) ubuntu@ip-172-31-18-196:/var/www/html$ python3 --version
Python 3.6.13

然而,我不知道为什么错误日志引用 python3.5 而不是 python3.6,如下所示: File "/usr/local/lib/python3.5/dist-packages/gunicorn/app/wsgiapp.py" 每当我 运行 sudo gunicorn --bind 0.0.0.0:8000 logistics.wsgi:application 我想知道为什么我会收到那个错误

如何使用 Gunicorn 和 NGINX 在 AWS Ubuntu 中上传您的 Django 应用程序

您必须以 Ubuntu 用户身份登录并且 NOT sudo su/root

第 1 阶段:将 Gunicorn 绑定到 Django 应用程序并检查上游 gunicorn 是否正常工作。 请注意,没有其他阶段部署是不完整的

  1. sudo apt-get update

  2. sudo apt-get upgrade

  3. 可选 - 如果它显示 popup/options 那么只是 select pkg 维护者版本。

  4. python3 -m venv env

  5. sudo apt-get install python3-venv

  6. source env/bin/activate

  7. pip3 install django

  8. git clone <your-repo-url>

  9. pip3 install gunicorn

  10. sudo apt-get install -y nginx

  11. cd 到您的项目目录,其中 settings.pydb.sqlite3 和您项目的所有这些文件都存储在该目录中。

  12. pip3 install -r requirements.txt

  13. gunicorn --bind 0.0.0.0:8000 <project_name>.wsgi:application
    注意:您的项目名称是您在开始时使用 django-admin startproject <project_name> 命令创建的主应用程序名称

  14. 你会看到

    [2021-09-08 15:20:17 +0000] [12789] [INFO] Starting gunicorn 20.1.0
    [2021-09-08 15:20:17 +0000] [12789] [INFO] Listening at: http://0.0.0.0:8000 (12789)
    [2021-09-08 15:20:17 +0000] [12789] [INFO] Using worker: sync
    [2021-09-08 15:20:17 +0000] [12791] [INFO] Booting worker with pid: 12791
    

这意味着您已经成功地将您的 gunicorn 绑定到 运行 您的 Django 应用程序并且您的 Django 应用程序现在已准备好 link 使用网络服务器(在我们的例子中是 NGINX)。这标志着第一阶段的完成。 要测试阶段 1 是否成功,您可以使用端口 :8000 输入您的 IP 并查看您的应用程序 运行(确保您的 aws 安全允许端口 8000,否则您将看到 404)但是上面的 Booting worker使用 pid 确认它正在工作。


第 2 阶段:设置 supervisor 以便 Gunicors 在重新启动时和首次启动后自动启动 Django 应用程序。

  1. sudo apt-get install -y supervisor

  2. cd /etc/supervisor/conf.d/

  3. sudo touch gunicorn.conf

  4. sudo nano gunicorn.conf 这将打开一个编辑器,您必须在其中输入 gunicorn 的脚本(我们在第 1 阶段所做的绑定,但现在我们告诉主管在每次 server/instance 启动时绑定 gunicorn)

     [program:gunicorn]
     directory = /home/ubuntu/<path to manage.py>
     command = /home/ubuntu/env/bin/gunicorn --workers 3 --bind unix:/home/ubuntu/<App Directory>/app.sock <App Name>.wsgi:application
     autostart = true
     autorestart = true
     stderr_logfile = /var/log/gunicorn/gunicorn.err.log
     stdout_logfile = /var/log/gunicorn/gunicorn.out.log
    
     [group:guni]
     programs:gunicorn
    
  5. sudo mkdir /var/log/gunicorn,这里我们正在为我们的 gunicorn 输出和错误日志创建日志文件夹。

  6. sudo supervisorctl reread

  7. 如果你在这里看到guni:available,这意味着你的主管已经准备就绪,你已经正确地完成了到目前为止的一切。

  8. sudo supervisorctl update

  9. 如果您看到 guni: added process group 这是您已正确完成这些步骤的另一个标记。

  10. sudo supervisorctl status

  11. 如果您看到 guni:gunicorn RUNNING,这是您的 gunicorn 现在已正确设置的第三个也是最后一个指标。 完成所有这些步骤后,确认您的 gunicorn 现在正在与项目目录中自动创建的 app.sock 文件进行双向通信。


第 3 阶段:link 将 Gunicorn 上游服务器连接到 NGINX

的最后一步
  1. cd /etc/nginx/sites-available

  2. sudo touch django.conf

  3. sudo nano django.conf 这将打开您的 nano 编辑器,您必须在其中输入这些确切的服务器设置。

    server {
        listen 80;
        server_name <ipaddress or domain name> ;
        #server_name 192.168.0.1 yourdomain.com your_alternate_domain.com; this is how you can add multiple hosts. Do not add any comma just separate it with spaces
    
        location / {
            include proxy_params;
            proxy_pass http://unix:/home/ubuntu/Appdir/app.sock;
        }
    }
    
  4. sudo nginx -t(这将测试您的配置文件的语法)

  5. sudo ln django.conf /etc/nginx/sites-enabled/ <---- 这是非常关键的一步,确保这里没有输入错误,它会创建一个 symlink

  6. sudo nginx -t

  7. sudo service nginx restart

有了这个,你现在已经 link 将你的 Nginx 连接到 app.sock 上游的 gunicorn 所以前往你的浏览器并输入你的实例的 IP 地址,你将看到你的应用程序正在运行.

如果你能看到你的网站但没有任何 CSS 那么你已经正确地遵循了所有内容,一旦你确认一切正常,我将重新编辑我关于如何在 Nginx 中提供 Django 应用程序的静态文件的答案.

This answer is courtesy of WOLFx Digital Agency