未连接到 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

本指南应该可以正常工作:-)

  1. 安装依赖项
[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
  1. 创建新网站
    /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;
    }
}
  1. 创建符号 link
[user@machine]$ ln -s /etc/nginx/sites-available/<site-name> /etc/nginx/sites-enabled
  1. 设置主管
    /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

  1. 然后
[user@machine]$ sudo supervisorctl reread
[user@machine]$ sudo supervisorctl update
[user@machine]$ sudo supervisorctl status web
[user@machine]$ sudo systemctl restart nginx.service

您的问题可能是以下几方面的结合:

  1. 验证您的 django settings.py 是否已正确设置以进行部署。请密切注意 STATIC_ROOTSTATICFILES_DIR 变量,因为它们对于为您的项目静态文件提供服务至关重要。

  2. 确保您的 virtualenv 已激活并且您有 运行 pip install -r requirements.txt.

注意:此时尝试 运行 你的项目与你的服务器 public ip python manage.py runserver server_public_ip:8000 很多人认为,因为他们的项目 运行 在本地,它将 运行 在服务器上。总是出问题。

  1. 确保你的服务器上 运行 python manage.py collectstatic。这会收集您的静态文件并为其创建一个目录。记下它告诉你它将把它们复制到的路径,你将需要它用于你的 nginx sites-available 配置文件中的 /static/ 位置块。

  2. 确保你的 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
    
  3. 您可以通过多种方式设置 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;
        }
    }
    
  4. 确保在每次 nginx 配置更改后 运行 sudo service nginx restart

  5. 确保在每次主管配置文件更改后 运行 sudo supervisorctl rereadsudo supervisorctl update allsudo supervisorctl restart all。在您的情况下,每次 gunicorn.conf 文件更改。

  6. 最后,作为一般规则,请确保您的所有目录路径都与其受尊重的进程相匹配。例如:假设你的 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 问题。