запуск приложения node.js с nginx

запуск приложения node.js с nginx

У меня есть приложение 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. Причина, по которой ваша текущая конфигурация не работает, вероятно, связана с какой-то ошибкой конфигурации, которая не очевидна из фрагментов, которые вы вставили до сих пор.

Связанный контент