
Tenho uma situação de desenvolvimento onde tenho um domínio com vários serviços:
https://somewebpage.com
Neste serviço existem vários projetos como subdiretórios
https://somewebpage.com
<- página de destinohttps://somewebpage.com/api
<- servidor de API de descansohttps://somewebpage.com/app
<- meu aplicativo
Então, é possível (e como) configurar o arquivo nginx e hosts para reverter o proxy apenas https://somewebpage.com/app
para minha compilação local http://localhost:3000
?
O problema é que quando o aplicativo é implantado não há problemas para acessar o servidor rest, mas ao servir localmente, minhas interceptações e URLs /api
de proxy reverso nginx também.landing page
rest api server
Minha configuração do nginx é semelhante a:
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;
}
}
}
E no meu /etc/hosts
eu tenho:
127.0.0.1 somewebpage.com
Existem outros truques para obter resultados semelhantes?
A razão pela qual tento fazer isso é que, se eu fizer isso, localhost:3000
ele responderá com CORS
erros e rejeitará minhas chamadas para /api
.
Ou isso é um grande risco à segurança e tenho que pedir outra forma de acesso /api
?
Obrigado por suas respostas antecipadamente.
Responder1
Você precisa adicionar o seguinte:
location / {
try_files $uri $uri/ =404;
}
Isso informa ao nginx como lidar com solicitações que não correspondem às outras especificadas location
. Para obter mais informações sobre como o nginx seleciona location
o bloco a ser usado, leiadocumentação nginx.
Responder2
Eu encontrei uma solução que funciona para mim.
somewebpage.com
aponta para xx.xx.xx.xx
um endereço IP estático, então adicionei outro proxy para esse endereço IP em vez de um URL semelhante à resposta 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;
}
Dessa forma, /etc/hosts
o arquivo não interceptará minha somewebpage.com
solicitação, pois a solicitação ignorará a resolução do domínio.
Então, no final, acabei com a seguinte configuração do nginx que funcionou para mim:
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;
}
}
}
Esta solução pode não funcionar para todos devido a vários endereços IP ocultos ou endereços IP dinâmicos ou qualquer outra coisa. Mas funcionou para mim e foi bom o suficiente para fins de desenvolvimento.