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