Проксі (nginx) показує помилку помилки шлюзу


18

У мене є служба (реєстр докерів), що працює port 5000, я встановив nginx для перенаправлення http-запиту з 8080на 5000. Якщо я зроблю завиток, localhost:5000він працює, але коли я роблю завиток, localhost:8080я отримую Помилку поганого шлюзу .

Конфігураційний файл nginx:

upstream docker-registry {
 server localhost:5000;
}

server {
 listen 8080;
 server_name registry.mydomain.com;

 proxy_set_header Host       $http_host; 
 proxy_set_header X-Real-IP  $remote_addr; 
 client_max_body_size 0; 
 chunked_transfer_encoding on;

 location / {

     proxy_pass http://docker-registry;
 }
 location /_ping {
     auth_basic off;
     proxy_pass http://docker-registry;
 }
 location /v1/_ping {
     auth_basic off;
     proxy_pass http://docker-registry;
 }

}

У /var/log/nginx/error.logмене є:

[crit] 15595#0: *1 connect() to [::1]:5000 failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: registry.mydomain.com, request: "GET / HTTP/1.1", upstream: "http://[::1]:5000/", host: "localhost:8080"

Будь-яка ідея?


У моєму випадку моя послуга, яку я підтримував, померла (і я цього не усвідомлювала) посеред мене, використовуючи її. Одну секунду я отримував доступ до неї, наступної секунди я отримав поганий шлюз. Мені довелося перезапустити службу.
Майкл Плаут

Відповіді:


57

Я вважаю, що це поле Linux, тому, швидше за все, SELinux перешкоджає з’єднанню, оскільки немає політики, яка дозволяє це з'єднання.

Ви повинні вміти просто бігати

# setsebool -P httpd_can_network_connect true

а потім перезапустіть nginx.


Selinux відключений, також служба firewalld
hellb0y77

2
Ви просто виправили мою проблему, навіть якщо ви не виправили пекло. SE_LINUX знову вражає!
Веслі Бурр

1
Це працювало і для мене. Хтось має додаткову інформацію про те, що він насправді робить? Я ненавиджу не знаю!
понедельник

Я можу запитати, які проблеми з безпекою це може відкрити і які працюють над centOs 7. Я, як правило, запускаю набір правил iptables, які дозволяють локальний трафік. Цікаво, на що це впливає.
edencorbin

1
@edencorbin дозволяє модулям httpd мати змогу підключатися до мережі.
Воррен

5

Виходячи з повідомлення про помилку, я змушує задуматися, чи не вирішено localhost: 5000 як адресу ipv6, яку ви, можливо, не хочете. Ви можете спробувати змінити це на 127.0.0.1.1000000

EDIT: У рядку proxy_pass, можливо, ви не вистачаєте частини URL-адреси? Спробуйте додати $ request_uri, щоб це було:

proxy_pass http://docker-registry/$request_uri;

або, ймовірно:

proxy_pass http://docker-registry$request_uri;

Не впевнений, який із них найбільш правильний.

Інша справа. Ваша конфігурація вказує:

server_name registry.mydomain.com;

Отже, localhost: 8080 може не відповідати. Для тестування ви можете змінити це на:

server_name registry.mydomain.com localhost;

Тоді буде підходити localhost: 8080, як і ваш домен. Я припускаю, що register.mydomain.com - це лише приклад, і ви поставите туди свій реальний сервер FQDN.


Не працює, встановіть, 127.0.0.1:5000і я спробував лише server_name localhostі server_name registry.mydomain.com(намагаюся з іншого сервера в тому ж ланцюжку з ім'ям хоста registry.mydomain.comв / etc / hosts), і те і інше, але нічого ... та сама помилка
hellb0y77

Whit [crit] 16839#0: *5 connect() to 127.0.0.1:5000 failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: registry.mydomain,com request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:5000/", host: "localhost:8080"[crit] 16839#0: *5 connect() to 127.0.0.1:5000 failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:5000/", host: "localhost:8080"
register.mydomain.com
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.