Я не понимаю, как nginx находит gunicorn в моей настройке - PullRequest
0 голосов
/ 08 сентября 2018

В основном следуя инструкциям на https://tutos.readthedocs.io/en/latest/source/ndg.html, Я запустил стек nginx-gunicorn-django, и он надежно работает уже несколько недель.Глядя на то, как добавить что-то (загруженные пользователем медиа-файлы), я посмотрел на свою конфигурацию nginx, и похоже, что я не отредактировал в ней никаких упоминаний об огнестрельном оружии.Я хотел бы понять, что происходит, прежде чем вносить более сложные изменения.Как nginx может пересылать запросы в gunicorn, если в дереве каталогов конфигурации nginx нет упоминаний о gunicorn?

Мой основной файл конфигурации nginx выглядит следующим образом, который, по моему мнению, является значением по умолчанию для установки:

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
        # multi_accept on;
}

http {

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        # server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        gzip on;
        gzip_disable "msie6";

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}

и мой сценарий запуска gunicorn:

#!/bin/bash

# Based on an example from https://tutos.readthedocs.io/en/latest/source/ndg.html

NAME="makers"                              # Name of the application (*)
DJANGODIR=/var/www/makers                  # Django project directory (*)
SOCKFILE=/var/www/makers/run/gunicorn.sock # we will communicate using this unix socket (*)
USER=nginx                                 # the user to run as (*)
GROUP=webdata                              # the group to run as (*)
NUM_WORKERS=1                              # how many worker processes should Gunicorn spawn (*)
DJANGO_SETTINGS_MODULE=makers.settings     # which settings file should Django use (*)
DJANGO_WSGI_MODULE=makers.wsgi             # WSGI module name (*)

echo "Starting $NAME as `whoami`"

# Activate the virtual environment
cd $DJANGODIR
source /var/www/makers_venv/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

# Start your Django Unicorn
# Programs meant to be run under supervisor should not daemonize themselves (do not use --daemon)
exec /var/www/makers_venv/bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
  --name $NAME \
  --workers $NUM_WORKERS \
  --user $USER \
  --bind 0.0.0.0:8000
#   --bind=unix:$SOCKFILE

1 Ответ

0 голосов
/ 10 сентября 2018

Как nginx передает запрос серверу WSGI (т.е. gunicorn), определяется в одной из директив location в блоке server, которая включена в блок http, который вы можете видеть в вашем /etc/nginx.conffile:

http {

  # other http settings
  .....

  include /etc/nginx/conf.d/*.conf;
  include /etc/nginx/sites-enabled/*;
}

Внутри файла, в котором определен server, среди всех директив server и location вы, скорее всего, увидите настройку, подобную этой:

server {

  ...

  location / {

      ...

      # if your guincorn is listening to an IP add
      proxy_pass http:127.0.0.1:8000
      # or if your gunicorn is listening to a unix socket
      # proxy_pass http://unix:/var/www/makers/run/gunicorn.sock 
  }

Исходя из вашего сценария запуска gunicorn, ваш nginx передает запрос gunicorn по IP-адресу через порт 8000:

exec /var/www/makers_venv/bin/gunicorn makers.wsgi:application --bind 0.0.0.0:8000

Я бы рекомендовал вам прочитать Понимание структуры файла конфигурации Nginx и контекстов конфигурации, или мой блог для лучшего понимания того, как работает nginx и gunicorn (или WSGI в целом).

...