1 votos

Proxy inverso nginx para enjambre docker - 502 mal gateway

Estoy ejecutando un enjambre docker en "swarm.example.com". En el servidor, hay un contenedor en ejecución al que se puede acceder en "swarm.example.com:3000".

En el servidor "example.com" estoy ejecutando un proxy inverso nginx con las siguientes reglas

 server {
    listen 80;
    server_name app.example.com;

    location / {
        proxy_pass http://swarm.example.com:3000;
    }
}
 

Cuando intento acceder a app.example.com, obtengo el error 502 Bad Gatway . Me estoy perdiendo de algo ?

Todos los servidores ejecutan CentOS 7.6

¡Gracias!

1voto

Gerald Schneider Puntos 193

Tratando de acceder al back-end a través del proxy inverso de los resultados en un 502 Bad Gateway de error:

$ wget -S --spider http://nginxtest.example.com/
Spider mode enabled. Check if remote file exists.
--2019-05-18 10:12:11--  http://nginxtest.example.com/
Resolving nginxtest.example.com (nginxtest.example.com)... 192.168.15.20
Connecting to nginxtest.example.com (nginxtest.example.com)|192.168.15.20|:80... connected.
HTTP request sent, awaiting response...
  HTTP/1.1 502 Bad Gateway
  Server: nginx/1.12.2
  Date: Sat, 18 May 2019 08:12:11 GMT
  Content-Type: text/html
  Content-Length: 3693
  Connection: keep-alive
  ETag: "5a9e5ebd-e6d"
Remote file does not exist -- broken link!!!

Esto es probablemente debido a que selinux por defecto no permite las conexiones salientes para servidores web, ya que suele ser algo que ellos no hacen.

Encontrará entradas como esta en /var/log/nginx/error.registro:

2019/05/18 10:12:11 [ict] 1041#0: *5 connect() para 192.168.15.52:3000 fallado (13: Permiso denegado), mientras que la conexión aguas arriba, cliente: 146.140.37.47, servidor: _, solicita: "JEFE / HTTP/1.1", aguas arriba: "http://192.168.15.52:3000/"host: "nginxtest.example.com"

Además, encontrará entradas como esta en /var/log/audit/audit.registro:

tipo=AVC msg=auditoría(1558167131.910:463): avc: denegado { name_connect } pid=1041 comm="nginx" dest=3000 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:ntop_port_t:s0 tclass=tcp_socket permisiva=0 tipo=SYSCALL msg=auditoría(1558167131.910:463): arco=c000003e syscall=42 éxito=salida=-13 a0=8 a1=562671c4eef0 a2=10 a3=7ffcfbc72530 elementos=0 ppid=1006 pid=1041 auid=4294967295 uid=996 gid=994 euid=996 suid=996 fsuid=996 gid=994 sgid=994 fsgid=994 tty=(none) ses=4294967295 comm="nginx" exe="/usr/sbin/nginx" subj=system_u:system_r:httpd_t:s0=(null)

Ejecute el siguiente comando para permitir nginx para conectarse a otros hosts:

setsebool -P httpd_can_network_connect true

(El parámetro -p hace que la configuración persistente. De lo contrario sería restablecer después del próximo reinicio.)

Y ahora el proxy funciona:

$ wget -S --spider http://nginxtest.example.com/
Spider mode enabled. Check if remote file exists.
--2019-05-18 10:15:14--  http://nginxtest.example.com/
Resolving nginxtest.example.com (nginxtest.example.com)... 192.168.15.20
Connecting to nginxtest.example.com (nginxtest.example.com)|192.168.15.20|:80... connected.
HTTP request sent, awaiting response...
  HTTP/1.1 200 OK
  Server: nginx/1.12.2
  Date: Sat, 18 May 2019 08:15:15 GMT
  Content-Type: text/html
  Content-Length: 40
  Connection: keep-alive
  Last-Modified: Sat, 18 May 2019 08:08:16 GMT
  ETag: "5cdfbd70-28"
  Accept-Ranges: bytes
Length: 40 [text/html]
Remote file exists and could contain further links,
but recursion is disabled -- not retrieving.

Si quieres saber más, hay un muy detallado artículo sobre nginx y selinux en el sitio web nginx.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: