如何测试gunicorn是否正常工作并与nginx通信?

Esc*_*her 7 django nginx gunicorn

我正在部署我第一次尝试使用django + gunicorn + nginx.

  • 我有django工作(curl -XGET http://127.0.0.0.1:8000如果我运行开发服务器,工作正常).
  • 我有nginx工作静态内容(例如我可以http://example.com/static/my_pic.png在我的浏览器中检索).
  • 我没有从我的网站上获得任何wsgi内容,但我找不到一个好的故障排除指南(它是否适用于其他所有人?!).我使用supervisor启动gunicorn,它报告它确实在运行:

(在shell :)

supervisorctl status my_app
my_app                   RUNNING    pid 1002, uptime 0:29:51
Run Code Online (Sandbox Code Playgroud)

这是我用来启动它的样板脚本:

#!/bin/bash
#script variables
NAME="gunicorn_myapp"                      # Name of process
DJANGODIR=/webapps/www/my_project          # Django project directory
SOCKFILE=/webapps/www/run/gunicorn.sock    # communicte using this socket
USER=app_user                              # the user to run as
GROUP=webapps                              # the group to run as
NUM_WORKERS=3
DJANGO_SETTINGS_MODULE=my_project.settings # settings file
DJANGO_WSGI_MODULE=my_project.wsgi         # WSGI module name

# Activate the virtual environment
cd $DJANGODIR
source ../bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH

# Create the run directory if it doesn't exist
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR

exec ../bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
  --name $NAME \
  --workers $NUM_WORKERS \
  --user=$USER --group=$GROUP \
  --bind=unix:$SOCKFILE
Run Code Online (Sandbox Code Playgroud)

这是(精简的)nginx配置文件:

upstream my_server {
  server unix:/webapps/www/run/gunicorn.sock fail_timeout=10s;
}
server {
        listen 80;
        server_name www.example.com;
        return 301 $scheme://example.com$request_uri;
}
server {
    listen   80;
    server_name example.com;
    client_max_body_size 4G;
    access_log /webapps/www/logs/nginx-access.log;
    error_log /webapps/www/logs/nginx-error.log;

    location /favicon.ico { access_log off; log_not_found off; }

    location /static/ {
        autoindex on;
        alias   /webapps/www/my_project/my_app/static/;
    }

    location /media/ {
        autoindex on;
        alias   /webapps/www/my_project/my_app/media/;
    }

    location / {
        proxy_pass         http://my_server;
        proxy_redirect     off;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        if (!-f $request_filename) {
            proxy_pass http://example.com;
            break;
        }
    }

    location  /robots.txt {
        alias /webapps/www/my_project/my_app/static/robots.txt ;
    }
    # Error pages
    error_page 500 502 503 504 /500.html;
    location = /500.html {
        root /webapps/www/my_project/my_app/static/;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以:gunicorn正在运行,nginx正在运行...我应该执行什么测试(以及如何?)以确定gunicorn是否正确地执行了wsgi(如果nginx正确地代理了所说的东西)?

编辑:我已经通过unix socket将问题缩小到gunicorn和nginx之间的通信.如果我将$ SOCKFILE更改为绑定0.0.0.0:80并停止nginx,则应用程序的页面将从我的网站提供.坏消息是套接字文件字符串在两个conf文件之间完全相同,所以我不知道他们为什么不进行通信.我想这意味着nginx没有正确获取并传递数据呢?

san*_*_dj 3

转到项目目录:

cd projectname
gunicorn --log-file=- projectname.wsgi:application
Run Code Online (Sandbox Code Playgroud)

sudo systemctl status gunicorn
Run Code Online (Sandbox Code Playgroud)

  • 请解释这些命令的作用以及为什么有人会执行这些命令来解决问题。 (2认同)