Прокси (nginx) показывает ошибку плохого шлюза

18

У меня есть служба (реестр Docker), которая работает 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"

Любая идея?

hellb0y77
источник
В моем случае мой сервис, который я проксировал, умер (и я этого не осознал), когда я использовал его. В одну секунду я получил к нему доступ, в следующую секунду я получил плохие ворота. Я должен был перезапустить службу.
Майкл

Ответы:

57

Я предполагаю, что это коробка Linux, поэтому, скорее всего, SELinux предотвращает соединение, так как нет политики, разрешающей соединение.

Вы должны быть в состоянии просто бежать

# setsebool -P httpd_can_network_connect true

и затем перезапустите nginx.

кроличий садок
источник
Selinux отключен, также служба firewalld
hellb0y77
2
Вы только что исправили мою проблему, даже если вы не исправили проблемы с hellb0y77. SE_LINUX снова наносит удар!
Уэсли Берр
1
Это сработало и для меня. У кого-нибудь есть дополнительная информация о том, что он на самом деле делает? Я ненавижу не зная!
martinedwards
Проголосовал и работал над centOs 7, могу ли я спросить, какие проблемы безопасности это может открыть. Я обычно запускаю набор правил iptables, которые разрешают локальный трафик. Интересно, что это за эффекты.
edencorbin
1
@edencorbin позволяет модулям httpd подключаться к сети.
Уоррен
5

Основываясь на сообщении об ошибке, я задаюсь вопросом, разрешается ли localhost: 5000 как адрес ipv6, который вы, возможно, не хотите. Вы можете попробовать изменить это на 127.0.0.1:5000

РЕДАКТИРОВАТЬ: В вашей строке 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, а также ваш домен. Я предполагаю, что registry.mydomain.com является лишь примером, и вы бы указали полное доменное имя вашего сервера.

Грегор
источник
Не работает, установить, 127.0.0.1:5000и я попробовал только server_name localhostи server_name registry.mydomain.com(пытаясь с другого сервера в той же локальной сети с именем хоста registry.mydomain.comв / etc / hosts), и оба, но ничего ... та же ошибка
hellb0y77
Whit registry.mydomain.com [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", с localhost:[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"
hellb0y77