(13: Odmowa zezwolenia) podczas łączenia się z urządzeniem nadrzędnym: [nginx]

296

Pracuję z konfigurowaniem projektu Django z Nginx i Gunicorn.

Podczas uzyskiwania dostępu do mojego portu gunicorn mysite.wsgi:application --bind=127.0.0.1:8001na serwerze Nginx pojawia się następujący błąd w moim pliku dziennika błędów;

2014/05/30 11:59:42 [kryty] 4075 # 0: * 6 połączenie () do 127.0.0.1:8001 nie powiodło się (13: Odmowa dostępu) podczas łączenia z nadrzędnym, klient: 127.0.0.1, serwer: localhost, żądanie: „GET / HTTP / 1.1”, upstream:, "http://127.0.0.1:8001/"host: „localhost: 8080”

Poniżej znajduje się treść mojego nginx.confpliku;

server {
    listen 8080;
    server_name localhost;
    access_log  /var/log/nginx/example.log;
    error_log /var/log/nginx/example.error.log;

    location / {
        proxy_pass http://127.0.0.1:8001;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $http_host;
    }
}

Dostaję na stronie HTML 502 Bad Gateway.

Jaki popełniam błąd?

Mulagala
źródło

Odpowiedzi:

680

Miałem podobny problem z uruchomieniem Fedory 20, Nginx, Node.js i Ghost (blog). Okazuje się, że mój problem był spowodowany przez SELinux .

To powinno rozwiązać problem:

setsebool -P httpd_can_network_connect 1

Detale

Sprawdziłem błędy w dziennikach SELinux:

sudo cat /var/log/audit/audit.log | grep nginx | grep denied

I stwierdził, że uruchomienie następujących poleceń rozwiązało mój problem:

sudo cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M mynginx
sudo semodule -i mynginx.pp

Bibliografia:

http://blog.frag-gustav.de/2013/07/21/nginx-selinux-me-mad/

https://wiki.gentoo.org/wiki/SELinux/Tutorials/Where_to_find_SELinux_permission_denial_details

http://wiki.gentoo.org/wiki/SELinux/Tutorials/Managing_network_port_labels

http://www.linuxproblems.org/wiki/Selinux

joebarbere
źródło
22
Dzięki, że to naprawiło również mój problem, korzystam z CentOS 7.
Jahan
21
dzięki. Musiałem to zrobić yum install policycoreutils-python, aby uzyskać audit2allowpierwsze. Odniesienie: centos.org/forums/viewtopic.php?t=5012
gross.jonas
Wielkie dzięki, praca dla mnie przy użyciu serwera węzłów. (Redhat 7)
BlaShadow
Zobacz także tutaj . W moim przypadku musiałem dodać nginx do grupy użytkownika, w którego katalogu domowym był zapisany katalog wwwroot.
1
Na Fedorze 23 instalacja policycoreutils-pythonnie podała polecenia audit2allow. Po kilku badaniach odkryłem, że powinieneś zainstalować pakiet devel yum install policycoreutils-devel. Odniesienie: danwalsh.livejournal.com/61710.html
Joseph N.
182

Też natrafiłem na ten problem. Innym rozwiązaniem jest przełączenie wartości logicznej SELinux dla połączenia httpd z siecią on(Nginx używa etykiety httpd).

setsebool httpd_can_network_connect on

Aby utrzymać zmianę, użyj flagi -P.

setsebool httpd_can_network_connect on -P

Możesz zobaczyć listę wszystkich dostępnych boolanów SELinux dla httpd używających

getsebool -a | grep httpd
Sid
źródło
1
To działało, dzięki. Zaktualizowałem z CentOS 6.5 -> 6.7 i musiała mieć domyślną wartość wyłączoną podczas aktualizacji, ponieważ działała dobrze przed aktualizacją. Prosta poprawka.
Mike Purcell,
16

Miałem podobny problem na Centos 7. Kiedy próbowałem zastosować rozwiązanie przepisane przez Sorina, zacząłem poruszać się cyklicznie. Najpierw odmówiono mi pozwolenia. Potem, kiedy rozwiązałem problem, odmówiono mi pozwolenia {connectto}. Następnie wróć do pozwolenia {write} odmowa.

Po powyższej odpowiedzi @Sid sprawdzania za pomocą flag getsebool -a | grep httpdi przełączania ich znalazłem, że oprócz httpd_can_network_connect jest wyłączony. http_anon_write również był wyłączony, co spowodowało odmowę zapisu i odmowę dostępu {connectto}

type=AVC msg=audit(1501830505.174:799183): avc:  
denied  { write } for  pid=12144 comm="nginx" name="myroject.sock" 
dev="dm-2" ino=134718735 scontext=system_u:system_r:httpd_t:s0 
tcontext=system_u:object_r:default_t:s0 tclass=sock_file

Otrzymane przy użyciu sudo cat /var/log/audit/audit.log | grep nginx | grep odmowa, jak wyjaśniono powyżej.

Rozwiązałem je więc pojedynczo, przełączając flagi po kolei.

setsebool httpd_can_network_connect on -P

Następnie uruchom polecenia określone przez @sorin i @Joseph powyżej

sudo cat /var/log/audit/audit.log | grep nginx | grep denied | 
audit2allow -M mynginx
sudo semodule -i mynginx.pp

Zasadniczo możesz sprawdzić uprawnienia ustawione w setsebool i skorelować to z błędem uzyskanym z grepp'ing 'audit.log nginx, odmowa

unlockme
źródło
14

Rozwiązałem problem, uruchamiając Nginx jako użytkownik, z którego jestem obecnie zalogowany, Mulagala .

Domyślnie użytkownik jako nginx jest zdefiniowany w górnej części nginx.confpliku, jak pokazano poniżej;

user nginx; # Default Nginx user

Zmień nginx na nazwę bieżącego użytkownika - tutaj, Mulagala .

user mulagala; # Custom Nginx user (as username of the current logged in user)

Może to jednak nie rozwiązać rzeczywistego problemu i może mieć rzeczywiste skutki uboczne.

Aby znaleźć skuteczne rozwiązanie, zapoznaj się z rozwiązaniem Josepha Barbere'a .

Mulagala
źródło
Dziękuję, że pomogłeś mi przez to przejść
Overlord,
4

jeśli błąd „502 Bad Gateway” generuje adres URL apos centos dla przekazywania proxy interfejsu API api na nginx, uruchom następujące polecenie, aby rozwiązać problem

sudo setsebool -P httpd_can_network_connect 1
Ezhil Arasan
źródło
2

13-permission-denied-while-connection-to-upstreamnginx na serwerze centos -

setsebool -P httpd_can_network_connect 1

kumar
źródło
1

Też natrafiłem na ten problem. Używam Nginx z HHVM, poniższe rozwiązanie naprawiło mój problem:

sudo semanage fcontext -a -t httpd_sys_rw_content_t "/etc/nginx/fastcgi_temp(/.*)?"

sudo restorecon -R -v /etc/nginx/fastcgi_temp
sule
źródło
1
  1. Sprawdź użytkownika w /etc/nginx/nginx.conf
  2. Zmień własność na użytkownika.
sudo chown -R nginx:nginx /var/lib/nginx

Teraz zobacz magię.

anjaneyulubatta505
źródło
0

Dziękuję bardzo. Zastosowałem ten przewodnik na: Centos 7, AspNet Core 3.1, konfiguracja Nginx.

Quang Vu
źródło
0

Dziękuję wszystkim za odpowiedzi. Odpowiedź Kumara z 21 sierpnia 19 o 12:14 dała mi wytchnienie po kilku dniach rozwiązywania problemu, który miałem, tj .:

connect() to 127.0.0.1:9090 failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server

Zastosowane przeze mnie rozwiązanie było następujące:

setsebool -P httpd_can_network_connect 1
użytkownik386578
źródło
-3
sudo cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M mynginx

sudo semodule -i mynginx.pp
Tytan
źródło