Nginx ne peut pas se connecter au socket uWSGI avec les autorisations appropriées

3

J'essaie de connecter Nginx à uWSGI pour pouvoir exécuter une application écrite en Ruby (où je ne peux pas utiliser passager). Voici la configuration de mon hôte virtuel:

server {    
        listen unix:/var/run/nginx/redmine.sock;
        root /var/www/redmine/public;

        location / {
                try_files $uri @uwsgi;
        }

        location @uwsgi {
                include uwsgi_params;
                uwsgi_pass unix:/var/run/uwsgi/redmine.sock;
        }
}

C'est facile, j'essaie de trouver un fichier statique, sinon je passe à uwsgi qui écoute sur le socket Unix. Cela me concerne une erreur 502 de "mauvaise passerelle". Je suis allé lire les journaux d'erreur et j'ai les informations suivantes:

2014/09/09 20:08:56 [crit] 20922#0: *29484 connect() to unix:/var/run/uwsgi/redmine.sock failed (13: Permission denied) while connecting to upstream, client: unix:, server: , request: "GET /redmine HTTP/1.0", upstream: "uwsgi://unix:/var/run/uwsgi/redmine.sock:", host: "localhost"

Mais j'étais à peu près sûr d'avoir configuré uWSGI pour utiliser le même utilisateur que Nginx:

user nginx;

et

[uwsgi]
socket = /var/run/uwsgi/redmine.sock
chdir = /var/www/redmine
rails = .
plugins = 0:rack_ruby20
rack = config.ru
idle = 3600

chmod-socket = 660
chown-socket = nginx:nginx
uid = nginx
gid = nginx

Et la prise est:

fenix ~ # ls -lh /var/run/uwsgi/redmine.sock 
srw-rw---- 1 nginx nginx 0 Set  9 20:08 /var/run/uwsgi/redmine.sock

Donc, Nginx ne peut même pas lire et écrire sur un socket qu’il possède? Qu'est-ce que c'est censé vouloir dire? Je n'arrive pas à comprendre comment le faire.

J'ai également remarqué que Nginx ne fonctionnerait pas, même si les autorisations de socket sont 777.

ranisalt
la source
Pourquoi votre nginx écoute le même socket que uwsgi? Ça devrait probablement êtrelisten 80;
Alexey Ten
@AlexeyTen non, ce n'est pas le cas. Les chemins sont différents.
ranisalt
Oh, désolé, j'ai raté ça.
Alexey Ten

Réponses:

6

J'ai eu un problème similaire avec les autorisations et c'était parce que SELinux n'avait pas la stratégie permettant à nginx d'écrire sur des sockets

Vous pouvez consulter les messages SELinux AVC via audit2why -alpour voir plus de détails sur l’erreur, quelque chose du genre:

type=AVC msg=audit(1414460265.454:2612): avc:  denied  { connectto } for  pid=22107 comm="nginx" path="/tmp/uwsgi.sock" scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 tclass=unix_stream_socket
Was caused by:
    Missing type enforcement (TE) allow rule.

    You can use audit2allow to generate a loadable module to allow this access.

Pour ajouter la stratégie d’application pour nginx, commencez par confirmer la stratégie d’application en exécutant

> grep nginx /var/log/audit/audit.log | audit2allow -m nginx

Vous devriez voir une sortie similaire à

module nginx 1.0;

require {
    type unconfined_t;
    type httpd_t;
    type home_root_t;
    type soundd_port_t;
    class sock_file write;
    class unix_stream_socket connectto;
    class tcp_socket name_connect;
}

#============= httpd_t ==============

#!!!! This avc is allowed in the current policy
allow httpd_t home_root_t:sock_file write;

#!!!! This avc is allowed in the current policy
allow httpd_t soundd_port_t:tcp_socket name_connect;
allow httpd_t unconfined_t:unix_stream_socket connectto;

Enfin, vous chargez la politique personnalisée en exécutant

> grep nginx /var/log/audit/audit.log | audit2allow -M nginx
> semodule -i nginx.pp 
slamuu
la source
Je n'ai pas SELinux
ranisalt
Vous pouvez vérifier si SELinux est activé en l'exécutant sestatus.
ChrisGuest
Sur CentOS6.6, j'avais besoin d'installer audit2allow. J'ai fait ça:yum install setroubleshoot
ChrisGuest le