[DJANGO][GUNICORN] Операция запрещена

Я следовал этому руководству: http://michal.karzynski.pl/blog/2013/06/09/django-nginx-gunicorn-virtualenv-supervisor/

Моя структура каталогов совершенно такая же:

-rw-r--r-- 1 django webapps    0 Nov 30 15:58 access.log
drwxr-xr-x 3 django webapps 4096 Nov 30 17:27 bin
-rw-r--r-- 1 django webapps 6450 Nov 30 15:58 error.log
drwxr-xr-x 2 django webapps 4096 Nov 30 15:58 gunicorn
drwxr-xr-x 2 django webapps 4096 Nov 30 16:10 include
drwxr-xr-x 3 django webapps 4096 Nov 30 16:10 lib
lrwxrwxrwx 1 django webapps    3 Nov 30 16:10 lib64 -> lib
drwxr-xr-x 2 django webapps 4096 Nov 30 17:12 logs
drwxr-xr-x 5 django webapps 4096 Nov 30 13:36 narcisse
-rw-r--r-- 1 django webapps   59 Nov 30 16:11 pip-selfcheck.json
-rw-r--r-- 1 django webapps   75 Nov 30 16:10 pyvenv.cfg
-rw-r--r-- 1 django webapps   85 Nov 30 15:50 README.md
drwxrwxrwx 2 django webapps 4096 Nov 30 17:51 run

У меня есть файл /etc/supervisor/conf.d/filename, который выглядит так:

[program:site]
command = /var/www/site/bin/gunicorn_start -user=django
user = django
stdout_logfile = /var/www/site/logs/gunicorn_supervisor.log
redirect_stderr = true

Мой gunicorn_start находится внутри /var/www/site/bin() и выглядит так:

NAME="api"
DJANGODIR=/var/www/site/site
SOCKFILE=/var/www/site/run/gunicorn.sock
USER=django
GROUP=webapps
NUM_WORKERS=3
DJANGO_SETTINGS_MODULE=api.settings
DJANGO_WSGI_MODULE=api.wsgi

echo "Starting $NAME as `whoami`"

# 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

# Start your Django Unicorn
exec ../bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
  --name $NAME \
  --workers $NUM_WORKERS \
  --user=$USER --group=$GROUP \
  --bind=unix:$SOCKFILE \
  --log-level=debug \
  --log-file=-

И, наконец, файл конфигурации nginx:

upstream your-gunicorn {
    server unix:/var/www/site/run/gunicorn.sock fail_timeout=0;
}

server {
    listen 80 default;
    client_max_body_size 4G;
    server_name <ip_address>;
    keepalive_timeout 70;
    access_log /var/log/nginx/site.access_log;
    error_log /var/log/nginx/site.error_log;
    root /var/www/site/;

    location /static/ {
        autoindex on;
        alias /var/www/site/site/static/;
        expires 1M;
        access_log off;
        add_header Cache-Control "public";
        proxy_ignore_headers "Set-Cookie";
    }

    location @proxy_to_app {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass   http://127.0.0.1;
    }

    location / {
        try_files $uri @proxy_to_app;
    }
}

У меня такое чувство, что я перепробовал все комбинации клавиш. Не могу найти, что не так.

Я продолжаю получать эту ошибку «Операция не разрешена» в журналах пушки сразу после ее запуска.

Вот полный вывод:

    [2018-11-30 17:49:28 +0000] [13849] [INFO] Starting gunicorn 19.9.0
[2018-11-30 17:49:28 +0000] [13849] [DEBUG] Arbiter booted
[2018-11-30 17:49:28 +0000] [13849] [INFO] Listening at: unix:/var/www/site/run/gunicorn.sock (13849)
[2018-11-30 17:49:28 +0000] [13849] [INFO] Using worker: sync
[2018-11-30 17:49:28 +0000] [13923] [INFO] Booting worker with pid: 13923
[2018-11-30 17:49:28 +0000] [13923] [ERROR] Exception in worker process
Traceback (most recent call last):
  File "/var/www/site/lib/python3.6/site-packages/gunicorn/arbiter.py", line 583, in spawn_worker
    worker.init_process()
  File "/var/www/site/lib/python3.6/site-packages/gunicorn/workers/base.py", line 93, in init_process
    initgroups=self.cfg.initgroups)
  File "/var/www/site/lib/python3.6/site-packages/gunicorn/util.py", line 165, in set_owner_process
    os.setgid(gid)
PermissionError: [Errno 1] Operation not permitted

Спасибо за помощь.

Жюльен


person Julien Séveno-Piltant    schedule 01.12.2018    source источник
comment
Попробуйте удалить флаги --USER и --GROUP из команды gunicorn. Супервизор уже должен был сбросить привилегии соответствующему пользователю.   -  person Håken Lid    schedule 01.12.2018
comment
Эта конкретная ошибка не связана с конфигурацией nginx. Но я не понимаю, что вы там пытаетесь сделать. Почему вы проксируете на 127.0.0.1 вместо апстрима пушки?   -  person Håken Lid    schedule 01.12.2018
comment
Спасибо за помощь. Должен ли я вместо этого указать адрес сервера?   -  person Julien Séveno-Piltant    schedule 01.12.2018
comment
@HåkenLid на самом деле я понимаю, что вы имеете в виду. Пробовал и теперь снова и снова в логах получаю: Connection in use: ('127.0.0.1', 8000). Nginx использует этот адрес. Не знаю, почему еще.   -  person Julien Séveno-Piltant    schedule 01.12.2018
comment
Если адрес используется, то на этом порту уже что-то работает. Возможно, django runserver или другой экземпляр gunicorn. Либо выключите этот сервер, либо используйте другой номер порта. Или используйте сокет unix, который находится в конфигурации nginx.   -  person Håken Lid    schedule 01.12.2018
comment
@HåkenLid Да, я писал комментарий, чтобы объяснить, что я сделал. Я удаляю то, что прослушивалось на этом порту. Больше никаких ошибок, за исключением того, что gunicorn.sock не создан (не знаю почему, потому что нет ошибки, например, разрешение не является хорошим), поэтому я получаю ответ Bad Getaway от NGINX. После этого она будет решена. Еще раз спасибо, чувак.   -  person Julien Séveno-Piltant    schedule 01.12.2018
comment
Убедитесь, что у пользователей nginx и gunicorn есть разрешение на чтение/запись в файл сокета. sudo su nginx -c 'touch /var/run/app.socket   -  person Håken Lid    schedule 01.12.2018
comment
У них обоих есть разрешение. Но у меня такое ощущение, что гуникорн слушает не на сокете, а на 127.0.0.1. Что странно, потому что в файле gunicorn_start я указал unix:path_to_socket.   -  person Julien Séveno-Piltant    schedule 01.12.2018
comment
Глупая ошибка. Я прокомментировал строку в многострочной команде внутри gunicorn_start, и на самом деле она ведет себя так, как будто вся команда была прокомментирована. Фиксированный. Кажется, это работает. Спасибо. Я напишу свое исправление здесь.   -  person Julien Séveno-Piltant    schedule 01.12.2018


Ответы (1)


Итак, с помощью Haken Lid мне удалось исправить мою архитектуру.

Вот что я сделал:

Исправлен файл конфигурации nginx

upstream your-gunicorn {
    server unix:/var/www/site/run/gunicorn.sock fail_timeout=0;
}

Изменился на:

upstream gunicorn_upstream {
    server unix:/var/www/site/run/gunicorn.sock fail_timeout=0;
}

А также:

proxy_pass   http://127.0.0.1;

Изменился на:

proxy_pass   http://gunicorn_upstream;

Исправлен файл gunistart_start

Последняя строка изменена с:

exec ../bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
  --name $NAME \
  --workers $NUM_WORKERS \
  --user=$USER --group=$GROUP \
  --bind=unix:$SOCKFILE \
  --log-level=debug \
  --log-file=-

To:

exec ../bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
  --name $NAME \
  --workers $NUM_WORKERS \
  --bind=unix:$SOCKFILE \
  --log-level=debug \
  --log-file=-

Одна из ошибок, которые я сделал, была на самом деле довольно глупой, потому что я прокомментировал:

--user=$USER --group=$GROUP

строки, и это ведет себя так, как будто остальная часть строки также была прокомментирована. Так что в основном все было в конфигурационном файле nginx.

Теперь исправлено. Спасибо

Жюльен

person Julien Séveno-Piltant    schedule 01.12.2018