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 我想知道为什么我收到该错误
您必须以Ubuntu用户身份登录,而不是sudo su/root
第 1 阶段:将 Gunicorn 绑定到 Django 应用程序并检查上游的 Gunicorn 是否工作正常。 请注意,如果没有其他阶段,部署是不完整的
sudo apt-get update
sudo apt-get upgrade
可选 - 如果显示弹出窗口/选项,则只需选择 pkg 维护者版本。
python3 -m venv env
sudo apt-get install python3-venv
source env/bin/activate
pip3 install django
git clone <your-repo-url>
pip3 install gunicorn
sudo apt-get install -y nginx
cd到您的项目目录settings.py,db.sqlite3以及存储项目的所有这些文件。
pip3 install -r requirements.txt
gunicorn --bind 0.0.0.0:8000 <project_name>.wsgi:application django-admin startproject <project_name>注意:您的项目名称是您在开始时使用命令创建的主应用程序名称
你会看见
[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 应用程序。
sudo apt-get install -y supervisor
cd /etc/supervisor/conf.d/
sudo touch gunicorn.conf
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)
sudo mkdir /var/log/gunicorn,在这里我们为gunicorn 输出和错误日志创建日志文件夹。
sudo supervisorctl reread
如果您看到guni:available这里,则意味着您的主管已准备就绪,并且到目前为止您已经正确完成了所有操作。
sudo supervisorctl update
如果您看到guni: added process group这是您已正确完成这些步骤的另一个标记。
sudo supervisorctl status
如果您看到guni:gunicorn RUNNING这是第三个也是最后一个指标,则表明您的 Gunicorn 现在已正确设置。app.sock经过所有这些步骤后,可以确认您的 Gunicorn 现在正在与项目目录中自动创建的文件进行双向通信。
第 3 阶段:将 Gunicorn 上游服务器链接到 NGINX 的最后一步
cd /etc/nginx/sites-available
sudo touch django.conf
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)
sudo nginx -t(这将测试您的配置文件的语法)
sudo ln django.conf /etc/nginx/sites-enabled/<---- 这是非常关键的一步,确保这里没有输入错误,它会创建一个符号链接
sudo nginx -t
sudo service nginx restart
现在,您已经将 Nginx 链接到了 app.sock 上的 Gunicorn 上游,因此请打开浏览器并输入实例的 IP 地址,您将看到您的应用程序正在运行。
如果您可以在没有任何 CSS 的情况下看到您的网站,那么您已经正确遵循了所有内容,一旦您确认一切正常,我将重新编辑有关如何在 Nginx 中提供 Django 应用程序的静态文件的答案。
| 归档时间: |
|
| 查看次数: |
8323 次 |
| 最近记录: |