Nginx не работает вне локальной сети

Вопрос или проблема

У меня есть сервер node.js с express, который обслуживает веб-сайт по https. Сервер работает на Windows 10. Я настроил no-ip ddns с ssl сертификатами. Веб-сайт работает на порту 3000, и я хочу запустить обратный прокси с помощью nginx, чтобы получить доступ к нему без указания порта, только по доменному имени. Проблема в том, что nginx работает для машин в локальной сети, но не для внешних. Вот конфигурация для nginx:

worker_processes 1;
error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;
events {
    worker_connections 1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen 80;
        server_name servidordelacruz.dynns.com;

        location / {
            return 301 https://$host$request_uri;
        }
    }

    server {
        listen 443 ssl;
        server_name xxxxxx.dynns.com;

        ssl_certificate      route_to\noip_fullchain_cert.pem; 
        ssl_certificate_key  route_to\cert.key;

        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers HIGH:!aNULL:!MD5;

        location / {
            proxy_pass https://localhost:3000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}

У меня открыты порты 80 и 443 на роутере для сервера, и для тестирования брандмауэр Windows полностью отключен. Я также подтвердил, что ddns работает, так как у меня также есть сервер minecraft, который доступен. В файле access.log я также вижу, что телефон достигает сервера:

X.X.X.X - - [05/Nov/2024:20:52:40 +0100] "GET / HTTP/1.1" 301 169 "-" "Mozilla/5.0 (Android 15; Mobile; rv:132.0) Gecko/132.0 Firefox/132.0"

Наконец, в файле errors.log я постоянно вижу эту ошибку:

2024/11/05 21:05:46 [info] 5276#10252: *943 SSL_do_handshake() failed (SSL: error:0A000412:SSL routines::sslv3 alert bad certificate:SSL alert number 42) while SSL handshaking, client: X.X.X.X, server: 0.0.0.0:443

IP-адрес клиента — это мой собственный публичный IP. Я читал, что это может быть неважно.

Ответ или решение

Решение проблемы с доступом к Nginx из внешней сети: пошаговое руководство

Введение

При развертывании веб-сервера с использованием Nginx и Node.js, возникают ситуации, когда сервер доступен в локальной сети, но недоступен для внешних пользователей. В данной статье мы подробно рассмотрим возникшую проблему и предложим пути ее решения, используя данные, предоставленные в описании проблемы.

Фоновые сведения о конфигурации

Вы настроили сервер Node.js с помощью Express для обслуживания HTTPS на порту 3000. Далее настроили обратный прокси с Nginx для обработки запросов к вашему домену без необходимости указывать номер порта. Однако возникли трудности с доступом из внешней сети.

Конфигурация Nginx включает два сервера: один для перенаправления HTTP-запросов на HTTPS, и второй для работы с SSL-сертификатами. Ошибка, которая возникает в логах, указывает на проблему с SSL-соединением:

SSL_do_handshake() failed (SSL: error:0A000412:SSL routines::sslv3 alert bad certificate)

Потенциальные причины и решения

  1. Проблемы с SSL-сертификатами
    Ошибка, связанная с SSL, может указывать на некорректные или просроченные сертификаты. Убедитесь, что вы загружаете правильные файлы сертификатов. Рекомендуется проверить сертификат на валидность с помощью утилит, таких как openssl:

    openssl s_client -connect servidordelacruz.dynns.com:443
  2. Настройки DNS и доступа
    Убедитесь, что ваш DDNS корректно указывает на внешний IP-адрес вашего сервера. Также важно, чтобы порты 80 и 443 были открыты на маршрутизаторе и перенаправлены на локальный IP вашего сервера Windows 10.

  3. Проблемы с локальным файрволом
    Хотя вы указали, что файрвол Windows отключен, стоит проверить дополнительные средства безопасности, такие как антивирусные программы или другие брандмауэры, которые могут блокировать трафик.

  4. Проверка конфигурации Nginx
    Убедитесь, что ваш конфигурационный файл Nginx правильно указан. Убедитесь, что server_name совпадает с тем, что вы указали в DDNS. Если вы используете динамический DNS, возможно, стоит временно отключить старые записи и убедиться, что соответствующий A-запись указывает на правильный IP-адрес.

  5. Проверка перенаправления и маршрутизации
    Ваша конфигурация для перенаправления HTTP-запросов на HTTPS выглядит корректной. Однако важно убедиться, что запросы, приходящие на port 443, правильно маршрутизируются к вашему Node.js приложению. Возможно, стоит временно упростить конфигурацию, убрав SSL, чтобы протестировать доступность Node.js приложения без прокси.

Проверка доступа извне

Для проверки доступа попробуйте выполнить запрос на ваш HTTP и HTTPS сервера из внешней сети. Вы можете использовать такие утилиты, как curl или веб-браузеры с другого устройства, не подключенного к вашему локальному сетевому окружению.

Вот пример команды для curl:

curl -I https://servidordelacruz.dynns.com

Заключение

Прежде чем делать выводы, рекомендуется тщательно проанализировать каждый из шагов и возможные причины проблемы. Если описанные решения не помогли, стоит обратиться к документации Nginx и сообществу, где вы можете получить более детальные советы. Надеюсь, вышеприведенные рекомендации помогут вам устранить проблемы с доступом к вашему серверу Nginx из внешней сети и успешно завершить развертывание вашего веб-приложения.

Оцените материал
Добавить комментарий

Капча загружается...