Eu tenho um aplicativo de nó em execução na porta 8443. Meu nginx lida com as solicitações da web nas portas 80 e 443 e deve redirecionar o usuário para 8443.
aqui está minha /etc/nginx/sites-enabled/default
configuração:
upstream my_upstream {
server 127.0.0.1:8443;
keepalive 64;
}
server {
listen 80;
server_name myapp.com;
rewrite ^/(.*) https://myapp.com/$1 permanent;
}
server {
listen 443 ssl;
server_name 12.34.12.34 www.myapp.com myapp.com *.myapp.com;
ssl_certificate /path/to/my/cert.crt;
ssl_certificate_key /path/to/my/private.key
// other ssl params
location / {
proxy_redirect off;
proxy_pass https://my_upstream;
// other params
}
}
com esta configuração posso acessar meu aplicativo via
http(s)://myapp.com:8443
somente quando eu adiciono os seguintes iptables
iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-ports 8443
iptables -t nat -A OUTPUT -p tcp --dport 443 -o lo -j REDIRECT --to-port 8443
eu posso acessar
http(s)://myapp.com
Questões:
Parece meio bobo redirecionar da porta 80 para 443 para 8443 usando iptables. Existe uma maneira de fazer isso apenas com o nginx (ou é esse o caminho a seguir?).
Essa abordagem (ter o aplicativo em uma porta não padrão como 8443) é uma boa ideia?
Responder1
Fácil. Como seu node.js está rodando na porta 8443 e, pelo que entendi, você não tem nenhum outro serviço escutando solicitações em outras portas, você pode simplesmente fazer isso na configuração do nginx:
server {
# here comes the rest of your nginx configuration
location / {
proxy_pass http://127.0.0.1:8443;
}
}
Você não precisa usar nenhuma regra de iptables nem criar uma seção upstream em sua configuração do nginx. O nginx pode (e deve) fazer todo o redirecionamento de porta pronto para uso (como normalmente qualquer proxy reverso faz).
Posso estar errado, mas o motivo pelo qual sua aplicação começa a funcionar após as regras do iptables é porque seus clientes passam a acessar seu servidor node.js diretamente, por causa do redirecionamento de porta, que é semelhante a quando usamos o Squid como proxy transparente.
Este artigo pode ajudá-lo. Ignore o fato de que foi endereçado ao Apache:
Boa sorte e cumprimentos!
Responder2
É um pouco inútil e um desperdício fazer criptografia 127.0.0.1
entre o nginx e o seu upstream, quando o seu upstream está rodando em 127.0.0.1
.
Na verdade, sua solução com iptables
redirecionamento seria na verdade muito mais eficiente do que simplesmente incluir o nginx na mistura, sem quaisquer alterações no upstream.
Mas temos que perguntar: se você não está usando nenhum recurso extra interessante do nginx, por que deseja adicioná-lo ao mix em primeiro lugar?
A abordagem adequada seria executar seu upstream sem https
e redirecionar http e https para o upstream com nginx. O motivo pelo qual sua configuração atual não funciona provavelmente tem a ver com algum erro de configuração, que não é óbvio pelos trechos que você colou até agora.