Как прослушать разные порты на Nginx и прокси запрос? - PullRequest
0 голосов
/ 04 декабря 2018

Я новичок в конфигурации Nginx, и все, у меня есть процесс, который является экспресс-приложением, работающим на порте 3000 с использованием pm2, и я также разрешил порт 3000 с использованием ufw и создал экземпляр сервера на Nginx для проксиэто,

    server {
        # SSL configuration

        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name .mysite.co;
        location = /favicon.ico { access_log off; log_not_found off; }
        location /static/ {
            root /home/django/mysite;
        }
        proxy_cache mysite;
        location / {
            include proxy_params;
            proxy_pass http://unix:/home/django/mysite/mysite.sock;
        }
        gzip_comp_level  3;
        gzip_types       text/plain text/css image/*;
        ssl_certificate /etc/letsencrypt/live/mysite.co/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/mysite.co/privkey.pem; # managed by Certbot



    }
    server {
        if ($host = www.mysite.co) {
            return 301 https://$host$request_uri;
        } # managed by Certbot


        if ($host = mysite.co) {
            return 301 https://$host$request_uri;
        } # managed by Certbot


        listen 80 default_server;
        listen [::]:80 default_server;
        server_name .mysite.co;
        return 404; # managed by Certbot




    }

server{

    listen 3000;
    listen 443 ssl http2;
    server_name .mysite.co:3000;

    location / {
        proxy_pass https://localhost:3000;
    }

    }

Я запустил netstat -napl | grep 3000, и я могу подтвердить, что процесс запущен, и pm2 status также говорит, что он запущен и в журнале также нет ошибок.Как я мог сделать эту работу?Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 04 декабря 2018

Вы не сможете использовать nginx для прослушивания порта 3000, а также процесс вашего узла, поскольку только один сервис может действительно прослушивать порт одновременно.Поэтому вам нужно убедиться, что nginx прослушивает соединения через другой порт.Я представляю, что вы пытаетесь сделать, это прослушать порт 80/443 и затем отправить запрос на ваш экспресс-сервис, который прослушивает порт 3000?

В этом случае ваш нижний блок сервера почти верен.Чтобы это работало без TLS / SSL (только на порту 80), вам нужно использовать что-то вроде этого:

server {
       listen 80;
       server_name node.mysite.co

       location / {
            proxy_pass http://localhost:3000;
       }
}

Ниже приведен очень простой пример, и вы, вероятно, захотите переключить некоторые другиенастройки.Это заставит "http://node.mysite.co" пройти через прокси-сервер к любой службе (в данном случае сервер Express) локально прослушивает порт 3000.

Вам не нужно создавать брандмауэр (ufw) исключение для порта 3000 в данном случае, так как это локальный прокси-сервер. Вы должны закрыть порт на брандмауэре, чтобы люди не могли получить к нему прямой доступ, поэтому должен пройти через nginx.

Если вы хотите, чтобы SSL / TLS работал, вам понадобится еще один блок, который будет выглядеть примерно так: Опять же, это очень простой и не имеет много настроек, которые вы, вероятно, хотите исследоватьи установите (например, выбор шифров).

server {
       listen 443 ssl;
       server_name node.mysite.co

       ssl_certificate certs/mysite/server.crt;
       ssl_certificate_key certs/mysite/server.key;

       location / {
            proxy_pass http://localhost:3000;
       }
}

Вам потребуется заменить путь к сертификату и ключу, чтобы указать его соответственно на сертификат и ключ SSL / TLS. Это позволит вам получить доступ к https://node.mysite.co и он также будет перенаправлен на службу через порт 3000.

Как только вы это сделаете, вы можете затем вернуться и изменить сервер http (порт 80) на перенаправление наhttps, чтобы заставить httpsтолько соединения.

Также обратите внимание, что я убедился, что имя_сервера отличается от вашего существующего django имя_сервера с поддоменом (node.mysite.co).Возможно, вы захотите изменить это значение, но вы не можете иметь два серверных блока, прослушивающих один и тот же порт и имя_сервера, иначе nginx не будет знать, что делать с запросом.Я уверен, что вы делаете это в любом случае, но я хотел убедиться, что это было явно и будет работать с вашей существующей установкой.

Если вы хотите, чтобы сайт обслуживался только для mysite.co:3000

Если по какой-то причине вы хотите, чтобы пользователь пошел на порт 3000 в домене mysite.co, то вам нужно будет установить «listen» на 3000 и оставить имя сервера как «mysite»..co».Это позволит кому-то зайти на mysite.co:3000 в своем браузере и запустить службу вашего узла.Я полагаю, что это не совсем то, что вам нужно для общедоступного веб-сайта, но оно также не очень хорошо согласуется с версией вашего порта 443.

Примечание: я не претендую на то, чтоэксперт по nginx, но я использовал его для всех своих проектов узлов за последние несколько лет, и я нахожу, что эта настройка довольно понятна.Там может быть более приятный синтаксис, который вы можете использовать.

...