Вопрос или проблема
У меня есть сервер 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)
Потенциальные причины и решения
-
Проблемы с SSL-сертификатами
Ошибка, связанная с SSL, может указывать на некорректные или просроченные сертификаты. Убедитесь, что вы загружаете правильные файлы сертификатов. Рекомендуется проверить сертификат на валидность с помощью утилит, таких какopenssl
:openssl s_client -connect servidordelacruz.dynns.com:443
-
Настройки DNS и доступа
Убедитесь, что ваш DDNS корректно указывает на внешний IP-адрес вашего сервера. Также важно, чтобы порты 80 и 443 были открыты на маршрутизаторе и перенаправлены на локальный IP вашего сервера Windows 10. -
Проблемы с локальным файрволом
Хотя вы указали, что файрвол Windows отключен, стоит проверить дополнительные средства безопасности, такие как антивирусные программы или другие брандмауэры, которые могут блокировать трафик. -
Проверка конфигурации Nginx
Убедитесь, что ваш конфигурационный файл Nginx правильно указан. Убедитесь, чтоserver_name
совпадает с тем, что вы указали в DDNS. Если вы используете динамический DNS, возможно, стоит временно отключить старые записи и убедиться, что соответствующий A-запись указывает на правильный IP-адрес. -
Проверка перенаправления и маршрутизации
Ваша конфигурация для перенаправления HTTP-запросов на HTTPS выглядит корректной. Однако важно убедиться, что запросы, приходящие на port 443, правильно маршрутизируются к вашему Node.js приложению. Возможно, стоит временно упростить конфигурацию, убрав SSL, чтобы протестировать доступность Node.js приложения без прокси.
Проверка доступа извне
Для проверки доступа попробуйте выполнить запрос на ваш HTTP и HTTPS сервера из внешней сети. Вы можете использовать такие утилиты, как curl
или веб-браузеры с другого устройства, не подключенного к вашему локальному сетевому окружению.
Вот пример команды для curl
:
curl -I https://servidordelacruz.dynns.com
Заключение
Прежде чем делать выводы, рекомендуется тщательно проанализировать каждый из шагов и возможные причины проблемы. Если описанные решения не помогли, стоит обратиться к документации Nginx и сообществу, где вы можете получить более детальные советы. Надеюсь, вышеприведенные рекомендации помогут вам устранить проблемы с доступом к вашему серверу Nginx из внешней сети и успешно завершить развертывание вашего веб-приложения.