
Tengo una situación de desarrollo en la que tengo un dominio con múltiples servicios:
https://somewebpage.com
En este servicio hay varios proyectos como subdirectorios.
https://somewebpage.com
<- página de destinohttps://somewebpage.com/api
<- resto del servidor APIhttps://somewebpage.com/app
<- mi aplicación
Entonces, ¿es posible (y cómo) configurar nginx y el archivo hosts para invertir el proxy solo https://somewebpage.com/app
en mi compilación local http://localhost:3000
?
El problema es que cuando se implementa la aplicación, no tiene problemas para acceder al /api
servidor restante, pero cuando se sirve localmente, mi proxy inverso nginx también intercepta landing page
y URL.rest api server
Mi configuración de nginx se ve así:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
index index.html;
proxy_max_temp_file_size 0;
proxy_buffering off;
server {
listen 80;
server_name somewebpage.com;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name somewebpage.com;
ssl_certificate /etc/ssl/certs/certificate.crt;
ssl_certificate_key /etc/ssl/certs/ccertificate.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
location /app {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_pass http://localhost:3000;
}
}
}
Y en mi /etc/hosts
tengo:
127.0.0.1 somewebpage.com
¿Existen otros trucos sobre cómo lograr un resultado similar?
La razón por la que intento hacer esto es que si lo hago desde mi localhost:3000
responderá con CORS
errores y rechazará mis llamadas /api
.
¿O esto supone demasiado riesgo para la seguridad y tengo que solicitar otra forma de acceso /api
?
Gracias por sus respuestas de antemano.
Respuesta1
Es necesario agregar lo siguiente:
location / {
try_files $uri $uri/ =404;
}
Esto le dice a nginx cómo manejar las solicitudes que no coinciden con las otras especificadas location
. Para obtener más información sobre cómo nginx selecciona location
el bloque a usar, leadocumentación nginx.
Respuesta2
Se me ocurrió una solución que funciona para mí.
somewebpage.com
apunta a xx.xx.xx.xx
una dirección IP estática, así que agregué otro proxy hacia esa dirección IP en lugar de una URL similar a la respuesta de Tero Kilkanen.
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_pass https://xx.xx.xx.xx;
}
De esa manera, /etc/hosts
el archivo no interceptará mi somewebpage.com
solicitud, ya que la solicitud omitirá la resolución del dominio.
Entonces, al final terminé con la siguiente configuración de nginx que funcionó para mí:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
index index.html;
proxy_max_temp_file_size 0;
proxy_buffering off;
server {
listen 80;
server_name somewebpage.com;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name somewebpage.com;
ssl_certificate /etc/ssl/certs/certificate.crt;
ssl_certificate_key /etc/ssl/certs/ccertificate.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
location /app {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_pass http://localhost:3000;
}
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_pass https://xx.xx.xx.xx;
}
}
}
Es posible que esta solución no funcione para todos debido a múltiples direcciones IP detrás de escena o direcciones IP dinámicas o algo más. Pero funcionó para mí y fue lo suficientemente bueno para fines de desarrollo.