tutorial sirve servidores services que para elasticbeanstalk elastic ec2 docs aws amazon-web-services nginx elastic-beanstalk

amazon-web-services - sirve - elasticbeanstalk que es



elástico beanstalk extraña configuración nginx (1)

Estoy tratando de seguir la configuración de nginx en beanstalk elástico y algunas cosas no suman.

  • La instancia abre el puerto 80 en los grupos de seguridad, así que supongo que todo el tráfico entrante viene a través de ese puerto

  • La configuración de nginx en cat /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf establece:

    server { listen 8080; location / { proxy_pass http://nodejs; proxy_set_header Connection ""; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } gzip on; }

    Puerto 8080? De donde vino eso? Intenté meterme con esto, esta es la verdadera directiva que está funcionando.

  • server_name falta, pero no importa lo que pongas en él. Si incluyo cualquier valor en server_name, esta regla de servidor aún coincidirá con todas las solicitudes, incluso aquellas que no se pueden volver a seleccionar remotamente con el valor de server_name.

  • Mientras está conectado a la instancia en sí, parece que ambos puertos están siendo servidos:

    [ec2-user @ ip-172-31-45-222 ~] $ sudo netstat -lnptu

    tcp 0 0 0.0.0.0:8080 0.0.0.0:* ESCUCHAR 22506 / nginx

    tcp 0 0 0.0.0.0:80 0.0.0.0:* ESCUCHAR 22506 / nginx

Una vez más, 8080 nunca se abre en el grupo de seguridad, por lo que el equilibrio de carga elástica se está introduciendo a través del puerto 80. ¿El tráfico pasa mágicamente de 80 a 8080? Alguna idea de lo que está pasando aquí?


Te olvidas de mirar una parte de esa configuración nginx:

upstream nodejs { server 127.0.0.1:8081; keepalive 256; }

Esa parte le está diciendo a nginx que cree un grupo de servidores llamado nodejs como puede leer aquí .

8081 es el puerto en el que se ejecuta NodeJS (si usa la aplicación de ejemplo, por ejemplo).

Puede verificar esto mirando los registros de Elastic Beanstalk:

------------------------------------- /var/log/nodejs/nodejs.log ------------------------------------- Server running at http://127.0.0.1:8081/

Luego, si continuamos en el archivo nginx.conf, podemos ver lo que ya ha publicado:

server { listen 8080; location / { proxy_pass http://nodejs; proxy_set_header Connection ""; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }

Esto le dice a nginx que use el módulo proxy pass para pasar todo desde el puerto 8080 a nuestro nodejs grupo upstream que se está ejecutando en el puerto 8081. Esto significa que el puerto 8081 es solo para acceder localmente pero el puerto 8080 es lo que permite que las entidades externas hablen con el nginx que luego pasa cosas a nodejs.

Algunos de los razonamientos para no exponer directamente a NodeJS se pueden encontrar en esta respuesta de .

El puerto 8080 se utiliza porque es el puerto alternativo HTTP que "se usa comúnmente para proxy web y servidor de caché, o para ejecutar un servidor web como usuario no root".

Eso explica los puertos. Ahora el problema de ELB y cómo las cosas se hablan entre sí.

Dado que el grupo de seguridad solo permite el acceso en el puerto 80, existe una regla de iptables configurada para reenviar el puerto 80 al puerto 8080. Esto permite que los no root se vinculen al puerto 8080 porque los números de puerto más bajos requieren privilegios de raíz.

Puede verificar esto ejecutando lo siguiente:

[ec2-user@ip-xxx-xx-xx-x ~]$ sudo iptables -t nat -L Chain PREROUTING (policy ACCEPT) target prot opt source destination REDIRECT tcp -- anywhere anywhere tcp dpt:http redir ports 8080 Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination REDIRECT tcp -- anywhere anywhere tcp dpt:http redir ports 8080 Chain POSTROUTING (policy ACCEPT) target prot opt source destination

Entonces, en resumen, cuando carga su CNAME, el equilibrador de carga está redireccionando el tráfico a una instancia determinada en el puerto 80, que está permitido a través del grupo de seguridad, luego iptables reenvía eso al puerto 8080, que es el puerto que nginx está utilizando un proxy para pasar el tráfico al puerto 8081 que es el puerto local de NodeJS.

Espero que eso ayude.