У меня есть приложение Node, работающее на порту 8443. Мой nginx обрабатывает веб-запросы на портах 80 и 443 и должен перенаправлять пользователя на 8443.
вот моя /etc/nginx/sites-enabled/default
конфигурация:
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
}
}
с этой конфигурацией я могу получить доступ к своему приложению через
http(s)://myapp.com:8443
только когда я добавляю следующие 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
Я могу получить доступ
http(s)://myapp.com
Вопросы:
Мне кажется глупым перенаправлять с порта 80 на порт 443, а затем на порт 8443 с помощью iptables. Есть ли способ сделать это только с помощью nginx (или это выход?).
Является ли такой подход (размещение приложения на нестандартном порту, например 8443) хорошей идеей?
решение1
Легко. Поскольку ваш node.js работает на порту 8443, и, насколько я понял, у вас нет других служб, прослушивающих запросы на других портах, вы можете просто сделать это в конфигурации nginx:
server {
# here comes the rest of your nginx configuration
location / {
proxy_pass http://127.0.0.1:8443;
}
}
Вам не нужно использовать какие-либо правила iptables или создавать раздел upstream в конфигурации nginx. nginx может (и должен) выполнять все перенаправления портов «из коробки» (как обычно делает любой обратный прокси-сервер).
Я могу ошибаться, но причина, по которой ваше приложение начинает работать после правил iptables, заключается в том, что ваши клиенты начинают обращаться к вашему серверу node.js напрямую из-за перенаправления портов, что похоже на то, как мы используем Squid в качестве прозрачного прокси.
Эта статья может вам помочь. Не обращайте внимания на то, что она была адресована Apache:
Удачи и наилучших пожеланий!
решение2
Немного бессмысленно и расточительно использовать шифрование 127.0.0.1
между nginx и вашим вышестоящим сервером, когда ваш вышестоящий сервер работает на 127.0.0.1
.
Если уж на то пошло, ваше решение с iptables
перенаправлением на самом деле будет гораздо эффективнее, чем простое включение nginx без каких-либо изменений в upstream.
Но мы должны спросить — если вы не используете никаких дополнительных интересных функций nginx, зачем вы вообще хотите их добавлять?
Правильным подходом было бы запустить ваш upstream без https
, и перенаправить как http, так и https на upstream с помощью nginx. Причина, по которой ваша текущая конфигурация не работает, вероятно, связана с какой-то ошибкой конфигурации, которая не очевидна из фрагментов, которые вы вставили до сих пор.