Ошибка Nginx: (13: разрешение отказано) при подключении к восходящему потоку

Я получаю эту ошибку в моем nginx-error.log файле:

2014/02/17 03:42:20 [crit] 5455#0: *1 connect() to unix:/tmp/uwsgi.sock failed (13: Permission denied) while connecting to upstream, client: xx.xx.x.xxx, server: localhost, request: "GET /users HTTP/1.1", upstream: "uwsgi://unix:/tmp/uwsgi.sock:", host: "EC2.amazonaws.com"

Браузер также показывает ошибку 502 Bad Gateway Error. Результат curl такой же, Bad Gateway html

Я попытался исправить это, изменив разрешения для /tmp/uwsgi.sock на 777. Это не сработало. Я также добавил себя в группу www-data (это подсказывала пара похожих вопросов). Кроме того, никаких кубиков.

Вот мой nginx.conf файл:

nginx.conf

worker_processes 1;
worker_rlimit_nofile 8192;

events {
  worker_connections  3000; 
}

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

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

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on; 
    #tcp_nopush     on; 

    keepalive_timeout  65; 

    #gzip  on; 

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

Я запускаю приложение Flask с Nginsx и Uwsgi, просто чтобы быть подробным в моем объяснении. Если у кого-то есть идеи, я был бы очень признателен.


ИЗМЕНИТЬ

Меня попросили предоставить мой файл конфигурации uwsgi. Итак, я лично никогда не писал свои файлы nginx или uwsgi. Я следовал руководству здесь, который настраивает все с помощью ansible-playbook. Файл nginx.conf был создан автоматически, но в /etc/uwsgi ничего не было, кроме файла README в папках apps-enabled и apps-available. Нужно ли мне создавать собственный файл конфигурации для uwsgi? У меня создалось впечатление, что обо всем этом позаботился ансибл.

Я считаю, что ansible-playbook разобрался с моей конфигурацией uwsgi с тех пор, как я запустил эту команду

uwsgi -s /tmp/uwsgi.sock -w my_app:app

он запускается и выводит это:

*** Starting uWSGI 2.0.1 (64bit) on [Mon Feb 17 20:03:08 2014] ***
compiled with version: 4.7.3 on 10 February 2014 18:26:16
os: Linux-3.11.0-15-generic #25-Ubuntu SMP Thu Jan 30 17:22:01 UTC 2014
nodename: ip-10-9-xxx-xxx
machine: x86_64
clock source: unix
detected number of CPU cores: 1
current working directory: /home/username/Project
detected binary path: /usr/local/bin/uwsgi
!!! no internal routing support, rebuild with pcre support !!!
*** WARNING: you are running uWSGI without its master process manager ***
your processes number limit is 4548
your memory page size is 4096 bytes
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uwsgi socket 0 bound to UNIX address /tmp/uwsgi.sock fd 3
Python version: 2.7.5+ (default, Sep 19 2013, 13:52:09)  [GCC 4.8.1]
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0x1f60260
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 72760 bytes (71 KB) for 1 cores
*** Operational MODE: single process ***
WSGI app 0 (mountpoint='') ready in 3 seconds on interpreter 0x1f60260 pid: 26790 (default app)
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI worker 1 (and the only) (pid: 26790, cores: 1)

person Alex Chumbley    schedule 17.02.2014    source источник
comment
Покажите конфигурацию uwsgi и прокси в nginx.   -  person iurisilvio    schedule 17.02.2014


Ответы (6)


Проблема с разрешениями возникает из-за того, что uwsgi сбрасывает права собственности и разрешения для /tmp/uwsgi.sock на 755 и пользователя, запускающего uwsgi при каждом запуске uwsgi.

Правильный способ решить проблему - заставить uwsgi изменить владельца и / или разрешение /tmp/uwsgi.sock, чтобы nginx мог писать в этот сокет. Следовательно, есть три возможных решения.

  1. Запустите uwsgi от имени пользователя www-data, чтобы этот пользователь стал владельцем созданного им файла сокета.

    uwsgi -s /tmp/uwsgi.sock -w my_app:app --uid www-data --gid www-data
    
  2. Измените владельца файла сокета, чтобы он принадлежал www-data.

    uwsgi -s /tmp/uwsgi.sock -w my_app:app --chown-socket=www-data:www-data
    
  3. Измените права доступа к файлу сокета, чтобы www-данные могли записывать в него.

    uwsgi -s /tmp/uwsgi.sock -w my_app:app --chmod-socket=666
    

Я предпочитаю первый подход, потому что он не оставляет работу uwsgi от имени пользователя root.

Первые две команды нужно запускать от имени пользователя root. Третью команду не нужно запускать от имени пользователя root.

Первая команда оставляет uwsgi запущенным как пользователь www-data. Вторая и третья команды оставляют uwsgi запущенным от имени фактического пользователя, выполнившего команду.

Первая и вторая команды позволяют только пользователю www-data писать в сокет. Третья команда позволяет любому пользователю писать в сокет.

Я предпочитаю первый подход, потому что он не оставляет uwsgi запущенным от имени пользователя root и не делает файл сокета доступным для записи всем.

person Susam Pal    schedule 25.03.2014
comment
У меня такая же проблема, но я использую gunicorn вместо uwsgi. Как решить эту проблему ..? - person Shiva; 30.05.2014
comment
@Shiva Этот вопрос и ответ не о боевом роге. Если у вас есть вопрос об огнестрельном роге, вы должны задать отдельный вопрос. - person Susam Pal; 31.05.2014
comment
У меня была эта проблема на CentOS, и ваши команды у меня не работали. Я использовал: chown -R www-data:www-data /tmp - person Roman; 06.10.2014
comment
По сути, это означает, что вам нужно запускать uwsgi от имени root, верно? В противном случае ваш uwsgi не сможет приготовить еду. Что, если вы хотите запустить uwsgi под учетной записью без полномочий root? (Что я действительно хочу из-за других проблем с разрешениями, которые возникают при использовании sorl + uwsgi под root) - person wes; 25.02.2015
comment
Другой подход - использовать интернет-сокет вместо unix-сокета, хотя unix-сокет будет более производительным для локальной связи - uwsgi-docs.readthedocs.org/en/latest/WSGIquickstart.html - person marcin_koss; 07.04.2015
comment
@Roman, вы должны проверить, почему uwsgi не смог обеспечить надлежащий контроль доступа. Теоретически должно быть, если только ваша конфигурация не является особенной. - person silpol; 25.06.2015
comment
@wes Я обновил ответ, чтобы показать использование параметров --uid и --gid, которые будут запускать uwsgi как учетную запись без полномочий root. Команду, использующую эти параметры, по-прежнему необходимо запускать от имени пользователя root, но эта команда запускает uwsgi, так что он запускается как пользователь без полномочий root. - person Susam Pal; 05.10.2015
comment
Когда я пробую первую команду, я получаю сообщение об ошибке привязки, что адрес уже используется. Когда я удаляю параметры --uid и --gid, кажется, что все работает нормально. Есть идеи, что могло бы вызвать это? - person Luke Mat; 07.10.2015
comment
@LukeMat Вам, вероятно, нужно rm /tmp/uwsgi.sock перед запуском uwsgi с параметрами --uid и --gid. Вероятно, проблема возникла из-за того, что вы сначала запустили uwsgi как root без параметров --uid и --gid. Это привело к тому, что файл /tmp/uwsgi.sock был создан с пользователем root. Позже, когда вы запустите uwsgi с параметрами --uid www-data и --gid www-data, www-data не сможет выполнить запись в файл сокета, потому что владельцем этого файла по-прежнему является root. Следовательно, удаление старого файла сокета перед использованием параметров --uid и --gid решит проблему. - person Susam Pal; 09.10.2015
comment
Ага, оказалось, что это так! Я немного понял это после комментариев и забыл вернуться и дать обновление. Однако, спасибо! - person Luke Mat; 09.10.2015
comment
В Ubuntu 18.04 я просто перезапускаю сервер и вуаля: проблема исчезла! (это после многих попыток ...) - person Fellipe Sanches; 13.01.2020
comment
--chmod-socket=666 у меня работал нормально. - person Ruben Alves; 19.12.2020

Хотя принятое решение верно, доступ может также блокироваться SELinux. Если вы правильно установили разрешения и по-прежнему получаете сообщения об отказе в разрешении, попробуйте:

sudo setenforce Permissive

Если это работает, значит, виноват SELinux - или, скорее, работал так, как ожидалось! Чтобы добавить разрешения, необходимые для nginx:

  # to see what permissions are needed.
sudo grep nginx /var/log/audit/audit.log | audit2allow
  # to create a nginx.pp policy file
sudo grep nginx /var/log/audit/audit.log | audit2allow -M nginx
  # to apply the new policy
sudo semodule -i nginx.pp

После этого сбросьте политику SELinux на принудительное выполнение с помощью:

sudo setenforce Enforcing
person enaut    schedule 26.03.2018
comment
Спасибо, @enaut! selinux действительно был моей проблемой. Я получаю такое же сообщение об ошибке в журнале, и как только я проверил selinux, он был в режиме принудительного применения. Я рвал волосы и дважды проверял права доступа к файлам в течение последнего часа, когда действительно проблема заключалась в политике selinux. Весьма признателен. - person darekm101; 26.08.2018
comment
Большой. но вам не нужно менять enforce режим. Для получения дополнительной информации посетите блог nginx: nginx.com/blog/using -nginx-plus-with-selinux - person MKatleast3; 30.12.2018
comment
Это отличное решение. Проведя часы и перепроверив все, я нашел это. Просто великолепно !! - person Rakesh Kumar; 13.07.2021

Вы должны установить эти разрешения (_1 _ / _ 2_) в конфигурации uWSGI.

Это chmod-socket и chown-socket.

http://uwsgi-docs.readthedocs.org/en/latest/Options.html#chmod-socket http://uwsgi-docs.readthedocs.org/en/latest/Options.html#chown-socket

person iurisilvio    schedule 17.02.2014
comment
Я попытался изменить разрешения (вручную) на сокете на 666, но все равно выдал ту же ошибку. - person Alex Chumbley; 17.02.2014
comment
@iurisilvio, пожалуйста, напишите синтаксис? - person Mitul Shah; 26.06.2015
comment
@MitulShah принятый ответ уже имеет правильный синтаксис. - person iurisilvio; 27.06.2015

Я знаю, что уже слишком поздно, но это может помочь другим. Я предлагаю выполнить Запуск фляги с virtualenv, uwsgi и nginx очень простая и приятная документация.

Необходимо активировать вашу среду, если вы запускаете свой проект в virtualenv.

вот yolo.py

from config import application

if __name__ == "__main__":
    application.run(host='127.0.0.1')

И создайте файл uwsgi.sock в каталоге / tmp / и оставьте его пустым. Как сказано в ответе @susanpal: «Проблема с разрешениями возникает из-за того, что uwsgi сбрасывает владение и разрешения /tmp/uwsgi.sock на 755, а пользователь запускает uwsgi каждый раз, когда запускается uwsgi». это правильно.

Таким образом, вы должны давать разрешение на файл sock при запуске uwsgi. так что теперь следуйте приведенной ниже команде

uwsgi -s /tmp/uwsgi.sock -w yolo:application -H /var/www/yolo/env --chmod-socket=666 

Команда немного отличается от @susanpal. А для сохранения соединения просто добавьте в конец команды "&"

uwsgi -s /tmp/uwsgi.sock -w yolo:app -H /var/www/yolo/env --chmod-socket=666 &
person Mitul Shah    schedule 28.06.2015

В моем случае изменение разрешения php делает трюк

sudo chown user:group -R /run/php

Я надеюсь, что это помогает кому-то.

person Florin    schedule 29.07.2019

Вы должны опубликовать оба файла конфигурации nginx и uwsgi для своего приложения (те, которые находятся в / etc / nginx / sites-enabled / и / etc / uwsgi / - или где бы вы их ни разместили).

Как правило, убедитесь, что в вашей конфигурации приложения nginx есть строка, аналогичная следующей:

uwsgi_pass unix:///tmp/uwsgi.sock;

и то же имя сокета в вашем конфигурационном файле uwsgi:

socket=/tmp/uwsgi.sock
person Eric B.    schedule 17.02.2014
comment
У меня нет этого конфигурационного файла uwsgi, см. Отредактировать вопрос. Нужен ли он мне, даже если я могу запустить команду uwsgi, и она работает? - person Alex Chumbley; 18.02.2014
comment
@AlexChumbley Нет необходимости создавать файл конфигурации, если он вам не нужен. На мой взгляд, файл конфигурации делает установку немного более аккуратной, потому что большинство параметров командной строки перемещаются в файл конфигурации, что означает, что вам нужно использовать меньше параметров в команде для работы. - person Susam Pal; 25.03.2014