未连接到 gunicorn,Gunicorn 退出得太快
Not connecting to gunicorn, Gunicorn Exited too quickly
我有一个名为 MySite 的 django 项目,这个项目里面有一些应用程序如下:
- MySite
-- app
-- venv
-- media
-- django_project
--- wsgi.py
--- settings.py
--- urls.py
--- asgi.py
要在aws上部署,我在gunicorn配置阶段。但是我遇到了这个错误:
guni:gunicorn BACKOFF Exited too quickly (process log may have details)
然而,第一次状态是这样的:
gunicorn STARTING
这是我的 gunicorn.conf
:
[program:gunicorn]
directory=/home/ubuntu/MySite
command=/usr/bin/gunicorn --workers 3 --bind unix:/home/ubuntu/MySite/app.sock django_project.wsgi.application
autostart=true
autorestart=true
stderr_logfile=/var/log/gunicorn/gunicorn.err.log
stdout_logfile=/var/log/gunicorn/gunicorn.out.log
[group:guni]
program:gunicorn
在 gunicorn.err.log
它说问题在:
usage: gunicorn [OPTIONS] [APP_MODULE]
gunicorn: error: unrecognized arguments: django_project.wsgi.application
当我尝试这个时:
gunicorn --bind 0.0.0.0:8000 django_project.wsgi:application
我收到这个错误:
SyntaxError: invalid syntax
[2021-02-10 10:12:40 +0000] [6914] [INFO] Worker exiting (pid: 6914)
[2021-02-10 10:12:40 +0000] [6912] [INFO] Shutting down: Master
[2021-02-10 10:12:40 +0000] [6912] [INFO] Reason: Worker failed to boot.
我安装 运行 gunicorn 的整个过程:
**********************************START********************************
sudo apt-get upgrade -y
sudo apt-get update -y
1) Clone the git project
git clone https://github.com/XX/MyProj.git
2) cd /MySite ## there is a venv with django installed in
3) Activate venv
source venv/bin/activate
5. Instal NGINX and GUNICORN
pip3 install gunicorn ## install without sudo..
sudo apt-get install nginx -y
pip install psycopg2-binary
6. Connect gunicorn (#Error: Worker failed to boot.)
gunicorn --bind 0.0.0.0:8000 django_project.wsgi:application
7. Install supervisor
sudo apt-get install -y supervisor ## This command holds the website after we logout
8. Config supervisor
cd /etc/supervisor/conf.d
sudo touch gunicorn.conf
9) ##In the file file do following###
[program:gunicorn]
directory=/home/ubuntu/MySite
command=/usr/bin/gunicorn --workers 3 --bind unix:/home/ubuntu/MySite/app.sock django_project.wsgi:application
autostart=true
autorestart=true
stderr_logfile=/var/log/gunicorn/gunicorn.err.log
stdout_logfile=/var/log/gunicorn/gunicorn.out.log
[group:guni]
Program:gunicorn
####endfile####
10). Config supervisor
cd /etc/supervisor/conf.d
sudo touch gunicorn.conf
11). Connect file to supervisor
sudo mkdir -p /var/log/gunicorn
sudo supervisorctl reread
sudo supervisorctl reread
sudo supervisorctl update
12. Check if gunicorn is running in background
sudo supervisorctl status
**********************************END********************************
报错告诉你启动gunicorn的方式不对
您似乎在使用 supervisor。根据 docs,正确的语法是:
[program:gunicorn]
command=/path/to/gunicorn main:application -c /path/to/gunicorn.conf.py
directory=/path/to/project
user=nobody
autostart=true
autorestart=true
redirect_stderr=true
本指南应该可以正常工作:-)
- 安装依赖项
[user@machine]$ sudo apt update && sudo apt upgrade -y
[user@machine]$ sudo apt install python3-dev python3-pip supervisor nginx -y
[user@machine]$ sudo systemctl enable nginx.service
[user@machine]$ sudo systemctl restart nginx.service
[user@machine]$ sudo systemctl status nginx.service
- 创建新网站
/etc/nginx/sites-available/<site-name>
server{
listen 80;
server_name <ip or domain>;
location = /favicon.ico {
access_log off;
log_not_found off;
}
location /static/ {
root /path/to/static/root;
}
# main django application
location / {
include proxy_params;
proxy_pass http://unix:/path/to/project/root/run.sock;
}
}
- 创建符号 link
[user@machine]$ ln -s /etc/nginx/sites-available/<site-name> /etc/nginx/sites-enabled
- 设置主管
/etc/supervisor/conf.d/<project-name>.conf
[program:web]
directory=/path/to/project/root
user=<user>
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/path/to/logs/gunicorn-error.log
command=/path/to/gunicorn --access-logfile - --workers 3 --bind unix:/path/to/project/root/run.sock <project-name>.wsgi:application
- 然后
[user@machine]$ sudo supervisorctl reread
[user@machine]$ sudo supervisorctl update
[user@machine]$ sudo supervisorctl status web
[user@machine]$ sudo systemctl restart nginx.service
您的问题可能是以下几方面的结合:
验证您的 django settings.py
是否已正确设置以进行部署。请密切注意 STATIC_ROOT
和 STATICFILES_DIR
变量,因为它们对于为您的项目静态文件提供服务至关重要。
确保您的 virtualenv 已激活并且您有 运行 pip install -r requirements.txt
.
注意:此时尝试 运行 你的项目与你的服务器 public ip python manage.py runserver server_public_ip:8000
很多人认为,因为他们的项目 运行 在本地,它将 运行 在服务器上。总是出问题。
确保你的服务器上 运行 python manage.py collectstatic
。这会收集您的静态文件并为其创建一个目录。记下它告诉你它将把它们复制到的路径,你将需要它用于你的 nginx sites-available 配置文件中的 /static/ 位置块。
确保你的 gunicorn.conf command
变量指向你的 virtualenv 路径,并且指向 gunicorn 和 nginx 可以访问的 .sock 文件(sudo chown user:group
).这是一个例子:
[program:gunicorn]
command=/home/user/.virtualenvs/djangoproject/bin/gunicorn -w3 --bind unix:/etc/supervisor/socks/gunicorn.sock djangoproject.wsgi:application --log-level=info
directory=/home/user/djangoproject
numprocs=3
process_name=%(program_name)s_%(process_num)d
user=user
environment=LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8,HOME="/home/user/djangoproject", USER="user"
autostart=true
autorestart=true
stderr_logfile=/var/log/supervisor/gunicorn.err.log
stdout_logfile=/var/log/supervisor/gunicorn.out.log
您可以通过多种方式设置 nginx 配置文件。一些文档让你在 nginx.conf 文件中完成所有操作,但是,你应该将其分解为 sites-available,并使用符号 link 到 sites-enabled。无论哪种方式都应该得到相同的结果。这是一个例子:
upstream django {
server unix:/etc/supervisor/socks/gunicorn.sock;
}
server {
listen 80;
server_name www.example.com;
client_max_body_size 4G;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_headers_hash_max_size 1024;
proxy_read_timeout 300s;
proxy_connect_timeout 75s;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log debug;
location /media/ {
autoindex off;
alias /home/user/djangoproject/media/;
}
location /static/ {
autoindex off;
alias /home/user/djangoproject/static/;
}
location / {
proxy_pass http://django;
proxy_redirect off;
}
}
确保在每次 nginx 配置更改后 运行 sudo service nginx restart
。
确保在每次主管配置文件更改后 运行 sudo supervisorctl reread
、sudo supervisorctl update all
和 sudo supervisorctl restart all
。在您的情况下,每次 gunicorn.conf 文件更改。
最后,作为一般规则,请确保您的所有目录路径都与其受尊重的进程相匹配。例如:假设你的 gunicorn 命令变量指向 /path/to/project/gunicorn.sock
中的 sock 文件,但你的 nginx 配置有一个 proxy_pass 到 /etc/supervisor/socks/gunicorn.sock
,nginx 不知道将你的传递到哪里请求,所以 gunicorn 永远不会看到请求。此外,您可以将此添加到您的 nginx 位置块,以便您可以在浏览器开发工具响应中查看每个请求到达的位置 header: add_header X-debug-message "The port 80, / location was served from django" always;
注意:如果您看到“欢迎使用 Nginx”页面,则意味着 nginx 不知道将请求发送到哪里。很多时候你有一个静态根目录路径问题。但是,还有其他问题,但要视情况而定。您必须通过反复试验进行调试。另外,尝试向已知的 url 添加一个位置块,例如 http://example.com/login
,如果你到达那里,你就知道你有一个 nginx 配置问题。如果您收到 404 not found,那么您很可能遇到了 django 项目问题或 gunicorn 问题。
我有一个名为 MySite 的 django 项目,这个项目里面有一些应用程序如下:
- MySite
-- app
-- venv
-- media
-- django_project
--- wsgi.py
--- settings.py
--- urls.py
--- asgi.py
要在aws上部署,我在gunicorn配置阶段。但是我遇到了这个错误:
guni:gunicorn BACKOFF Exited too quickly (process log may have details)
然而,第一次状态是这样的:
gunicorn STARTING
这是我的 gunicorn.conf
:
[program:gunicorn]
directory=/home/ubuntu/MySite
command=/usr/bin/gunicorn --workers 3 --bind unix:/home/ubuntu/MySite/app.sock django_project.wsgi.application
autostart=true
autorestart=true
stderr_logfile=/var/log/gunicorn/gunicorn.err.log
stdout_logfile=/var/log/gunicorn/gunicorn.out.log
[group:guni]
program:gunicorn
在 gunicorn.err.log
它说问题在:
usage: gunicorn [OPTIONS] [APP_MODULE]
gunicorn: error: unrecognized arguments: django_project.wsgi.application
当我尝试这个时:
gunicorn --bind 0.0.0.0:8000 django_project.wsgi:application
我收到这个错误:
SyntaxError: invalid syntax
[2021-02-10 10:12:40 +0000] [6914] [INFO] Worker exiting (pid: 6914)
[2021-02-10 10:12:40 +0000] [6912] [INFO] Shutting down: Master
[2021-02-10 10:12:40 +0000] [6912] [INFO] Reason: Worker failed to boot.
我安装 运行 gunicorn 的整个过程:
**********************************START********************************
sudo apt-get upgrade -y
sudo apt-get update -y
1) Clone the git project
git clone https://github.com/XX/MyProj.git
2) cd /MySite ## there is a venv with django installed in
3) Activate venv
source venv/bin/activate
5. Instal NGINX and GUNICORN
pip3 install gunicorn ## install without sudo..
sudo apt-get install nginx -y
pip install psycopg2-binary
6. Connect gunicorn (#Error: Worker failed to boot.)
gunicorn --bind 0.0.0.0:8000 django_project.wsgi:application
7. Install supervisor
sudo apt-get install -y supervisor ## This command holds the website after we logout
8. Config supervisor
cd /etc/supervisor/conf.d
sudo touch gunicorn.conf
9) ##In the file file do following###
[program:gunicorn]
directory=/home/ubuntu/MySite
command=/usr/bin/gunicorn --workers 3 --bind unix:/home/ubuntu/MySite/app.sock django_project.wsgi:application
autostart=true
autorestart=true
stderr_logfile=/var/log/gunicorn/gunicorn.err.log
stdout_logfile=/var/log/gunicorn/gunicorn.out.log
[group:guni]
Program:gunicorn
####endfile####
10). Config supervisor
cd /etc/supervisor/conf.d
sudo touch gunicorn.conf
11). Connect file to supervisor
sudo mkdir -p /var/log/gunicorn
sudo supervisorctl reread
sudo supervisorctl reread
sudo supervisorctl update
12. Check if gunicorn is running in background
sudo supervisorctl status
**********************************END********************************
报错告诉你启动gunicorn的方式不对
您似乎在使用 supervisor。根据 docs,正确的语法是:
[program:gunicorn]
command=/path/to/gunicorn main:application -c /path/to/gunicorn.conf.py
directory=/path/to/project
user=nobody
autostart=true
autorestart=true
redirect_stderr=true
本指南应该可以正常工作:-)
- 安装依赖项
[user@machine]$ sudo apt update && sudo apt upgrade -y
[user@machine]$ sudo apt install python3-dev python3-pip supervisor nginx -y
[user@machine]$ sudo systemctl enable nginx.service
[user@machine]$ sudo systemctl restart nginx.service
[user@machine]$ sudo systemctl status nginx.service
- 创建新网站
/etc/nginx/sites-available/<site-name>
server{
listen 80;
server_name <ip or domain>;
location = /favicon.ico {
access_log off;
log_not_found off;
}
location /static/ {
root /path/to/static/root;
}
# main django application
location / {
include proxy_params;
proxy_pass http://unix:/path/to/project/root/run.sock;
}
}
- 创建符号 link
[user@machine]$ ln -s /etc/nginx/sites-available/<site-name> /etc/nginx/sites-enabled
- 设置主管
/etc/supervisor/conf.d/<project-name>.conf
[program:web]
directory=/path/to/project/root
user=<user>
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/path/to/logs/gunicorn-error.log
command=/path/to/gunicorn --access-logfile - --workers 3 --bind unix:/path/to/project/root/run.sock <project-name>.wsgi:application
- 然后
[user@machine]$ sudo supervisorctl reread
[user@machine]$ sudo supervisorctl update
[user@machine]$ sudo supervisorctl status web
[user@machine]$ sudo systemctl restart nginx.service
您的问题可能是以下几方面的结合:
验证您的 django
settings.py
是否已正确设置以进行部署。请密切注意STATIC_ROOT
和STATICFILES_DIR
变量,因为它们对于为您的项目静态文件提供服务至关重要。确保您的 virtualenv 已激活并且您有 运行
pip install -r requirements.txt
.
注意:此时尝试 运行 你的项目与你的服务器 public ip python manage.py runserver server_public_ip:8000
很多人认为,因为他们的项目 运行 在本地,它将 运行 在服务器上。总是出问题。
确保你的服务器上 运行
python manage.py collectstatic
。这会收集您的静态文件并为其创建一个目录。记下它告诉你它将把它们复制到的路径,你将需要它用于你的 nginx sites-available 配置文件中的 /static/ 位置块。确保你的 gunicorn.conf
command
变量指向你的 virtualenv 路径,并且指向 gunicorn 和 nginx 可以访问的 .sock 文件(sudo chown user:group
).这是一个例子:[program:gunicorn] command=/home/user/.virtualenvs/djangoproject/bin/gunicorn -w3 --bind unix:/etc/supervisor/socks/gunicorn.sock djangoproject.wsgi:application --log-level=info directory=/home/user/djangoproject numprocs=3 process_name=%(program_name)s_%(process_num)d user=user environment=LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8,HOME="/home/user/djangoproject", USER="user" autostart=true autorestart=true stderr_logfile=/var/log/supervisor/gunicorn.err.log stdout_logfile=/var/log/supervisor/gunicorn.out.log
您可以通过多种方式设置 nginx 配置文件。一些文档让你在 nginx.conf 文件中完成所有操作,但是,你应该将其分解为 sites-available,并使用符号 link 到 sites-enabled。无论哪种方式都应该得到相同的结果。这是一个例子:
upstream django { server unix:/etc/supervisor/socks/gunicorn.sock; } server { listen 80; server_name www.example.com; client_max_body_size 4G; proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_headers_hash_max_size 1024; proxy_read_timeout 300s; proxy_connect_timeout 75s; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log debug; location /media/ { autoindex off; alias /home/user/djangoproject/media/; } location /static/ { autoindex off; alias /home/user/djangoproject/static/; } location / { proxy_pass http://django; proxy_redirect off; } }
确保在每次 nginx 配置更改后 运行
sudo service nginx restart
。确保在每次主管配置文件更改后 运行
sudo supervisorctl reread
、sudo supervisorctl update all
和sudo supervisorctl restart all
。在您的情况下,每次 gunicorn.conf 文件更改。最后,作为一般规则,请确保您的所有目录路径都与其受尊重的进程相匹配。例如:假设你的 gunicorn 命令变量指向
/path/to/project/gunicorn.sock
中的 sock 文件,但你的 nginx 配置有一个 proxy_pass 到/etc/supervisor/socks/gunicorn.sock
,nginx 不知道将你的传递到哪里请求,所以 gunicorn 永远不会看到请求。此外,您可以将此添加到您的 nginx 位置块,以便您可以在浏览器开发工具响应中查看每个请求到达的位置 header:add_header X-debug-message "The port 80, / location was served from django" always;
注意:如果您看到“欢迎使用 Nginx”页面,则意味着 nginx 不知道将请求发送到哪里。很多时候你有一个静态根目录路径问题。但是,还有其他问题,但要视情况而定。您必须通过反复试验进行调试。另外,尝试向已知的 url 添加一个位置块,例如 http://example.com/login
,如果你到达那里,你就知道你有一个 nginx 配置问题。如果您收到 404 not found,那么您很可能遇到了 django 项目问题或 gunicorn 问题。