Saltar al contenido principal

Configurando NGINX como Proxy Reverso (HTTP/HTTPS)

aviso

⚠️ Todas las configuraciones hechas en este manual son ejemplos simples e hipotéticos. Será necesario realizar adaptaciones según la topología de su entorno.


🌐 Parte 1 - Configurando NGINX como Balanceador

Paso 1 – Montando la Topología

Agregue en la capa de balanceo el NGINX Balancer con IPv4 Público. Después de eso, aplique el cambio.

Adicionando NGINX na topologia

Paso 2 – Apuntando el Dominio

  1. Apunte su dominio a la IP Pública del NGINX.
  2. Acceda al directorio /etc/nginx/conf.d.

Acessando Diretório /etc/nginx/conf.d

  1. Cree un archivo de configuración para su dominio.

  2. Edite el archivo creado con el contenido según el ejemplo a continuación.

Configuración del HTTP

server {
listen *:80;
listen [::]:80;
server_name dominio.com.br; #Coloque o domínio de acesso aqui
# A linha abaixo redireciona o acesso para HTTPS, na porta 443
# Caso ela esteja sendo utilizada, o restante do código desse bloco server abaixo dela não precisa ser utilizado
# return 301 https://$host$request_uri;

access_log /var/log/nginx/dominio.access_log main; #troque dominio pelo nome desejado para logs de acesso e erro
error_log /var/log/nginx/dominio.error_log info;

proxy_temp_path /var/nginx/tmp/;
proxy_connect_timeout 5s;

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

proxy_next_upstream error timeout http_500;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Remote-Port $remote_port;
proxy_set_header X-URI $request_uri;
proxy_set_header X-ARGS $args;
proxy_set_header Refer $http_refer;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

location / {
proxy_pass http://200.150.194.160; # IP e porta da Instancia onde está a aplicação
add_header Set-Cookie "SRVGROUP=$group; path=/; HttpOnly";
}
}

💾 Después de editar, guarde los cambios y pruebe la sintaxis dentro del SSH del nginx usando el comando nginx -t de esta forma:

nginx -t

nginx: [warn] the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:1
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Si todo está bien, reinicie la instancia del NGINX

Reiniciando NGINx

📘 Documentación adicional: manual-nginx.jelastic.saveincloud.net


🔐 Añadiendo el Certificado SSL (HTTPS)

Paso 1 – Instalación de Let’s Encrypt

Instale el add-on Let's Encrypt Free SSL, completando con el dominio que apunta al NGINX.

Instalando Let's Encrypt

Paso 2 – Puerto 443 en NGINX

Edite el mismo archivo creado en NGINX, añadiendo la configuración para HTTPS:

server {
listen *:443 ssl;
listen *:443 quic;
listen [::]:443 ssl;
listen [::]:443 quic;
http2 on;
server_name dominio.com.br; #Coloque o domínio de acesso aqui

ssl_certificate /var/lib/jelastic/SSL/jelastic.chain;
ssl_certificate_key /var/lib/jelastic/SSL/jelastic.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
add_header alt-svc 'h3=":443"; ma=86400';

access_log /var/log/nginx/dominio.com.br.access_log main; #troque dominio pelo nome desejado para logs de acesso
error_log /var/log/nginx/dominio.com.br.error_log info; #troque dominio pelo nome desejado para logs de erro

proxy_temp_path /var/nginx/tmp/;

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

location / {
proxy_pass http://127.0.0.1; # IP da Instancia onde está a aplicação
proxy_next_upstream error;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-URI $request_uri;
proxy_set_header X-ARGS $args;
proxy_set_header Refer $http_refer;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Ssl-Offloaded "1";
}
}

✅ Guarde y reinicie NGINX nuevamente. Su sitio estará accesible con HTTPS y certificado válido.

tip

🔁 Configuración con upstream (Múltiples Instancias)

Si usted tiene más de una instancia de su aplicación (por ejemplo, para escalabilidad o alta disponibilidad), lo ideal es usar el bloque upstream en NGINX. Con esto, NGINX actuará como balanceador de carga entre esas instancias.

📌 Ejemplo de configuración con upstream

upstream app_backend {
server 192.168.0.101:8080;
server 192.168.0.102:8080;
server 192.168.0.103:8080;
# Você pode adicionar mais servidores conforme necessário
}

Luego, en su bloque server, apunte el proxy_pass a ese grupo de servidores:

location / {
proxy_pass http://app_backend; # <--- coloque seu upstream aqui
...
...
}

ℹ️ Detalles adicionales:

  • NGINX distribuirá las solicitudes entre las instancias listadas en upstream.
  • El balanceo por defecto es round-robin, pero puede usar otras opciones como least_conn o sticky_sessions, si es necesario.

🛠️ Solución de Problemas – Problemas Comunes

❌ Error al configurar HTTPS sin certificado

⚠️ Si usted agrega la configuración del puerto 443 en NGINX sin instalar el certificado SSL (Let's Encrypt), el servicio puede fallar al reiniciar, mostrando un error similar a:

nginx: [emerg] BIO_new_file("/var/lib/jelastic/SSL/jelastic.chain") failed (SSL: error:02001002:system library:fopen:No such file or directory)

💡 Para evitar este error:

  • Asegúrese de instalar el certificado Let's Encrypt antes de activar el bloque server en el puerto 443.
  • En caso de que aún esté probando o quiera evitar la falla temporalmente, comente o elimine la configuración HTTPS hasta que el certificado esté disponible.