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

C-B*_*izz 1 django ubuntu amazon-ec2 python-3.x gunicorn

由于我来自 Windows 背景,因此尝试部署到 aws EC2 ubuntu 服务器对我来说非常困难。我在尝试将 django 应用程序绑定到 Gunicorn 时遇到错误。我正在运行的命令是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.
Run Code Online (Sandbox Code Playgroud)

当我运行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'
Run Code Online (Sandbox Code Playgroud)

但我已经使用命令安装了gunicorn pip3 install gunicorn --user--user我在最后添加的原因是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.
Run Code Online (Sandbox Code Playgroud)

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

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

然而,我不知道为什么错误日志引用 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 Please 我想知道为什么我收到该错误

Ruc*_*cro 6

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

此答案由 WOLFx 数字机构提供

您必须以Ubuntu用户身份登录,而不是sudo su/root

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

  1. sudo apt-get update

  2. sudo apt-get upgrade

  3. 可选 - 如果显示弹出窗口/选项,则只需选择 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
    
    Run Code Online (Sandbox Code Playgroud)

这意味着您已经成功绑定了 Gunicorn 来运行 Django 应用程序,并且您的 Django 应用程序现在已准备好与网络服务器(在我们的例子中为 NGINX)链接。这标志着第 1 阶段的完成。要测试第 1 阶段是否成功,您可以输入您的 IP 和端口:8000并查看您的应用程序运行(确保您的 aws 安全性允许端口 8000,否则您将看到 404),但上面的引导工作程序使用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阶段中进行的绑定,但现在我们告诉主管每次服务器/实例启动时绑定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
    
    Run Code Online (Sandbox Code Playgroud)
  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 现在已正确设置。app.sock经过所有这些步骤后,可以确认您的 Gunicorn 现在正在与项目目录中自动创建的文件进行双向通信。


第 3 阶段:将 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;
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. sudo nginx -t(这将测试您的配置文件的语法)

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

  6. sudo nginx -t

  7. sudo service nginx restart

现在,您已经将 Nginx 链接到了 app.sock 上的 Gunicorn 上游,因此请打开浏览器并输入实例的 IP 地址,您将看到您的应用程序正在运行。

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