Настройка домашнего веб-сервера под управлением Windows 10

Решил я установить DataExpress Web Server на свой домашний компьютер. Да не просто установить, а настроить работу по протоколу https с использованием сертификатов Let’s Encrypt. Мой компьютер находится в домашней сети, а доступ к Интернет осуществляется через роутер TP-Link TL-WR840N. Т.е. компьютер в сети Интернет недоступен. Плюс у меня не было статического IP-адреса и мне пришлось подключить эту услугу у своего провайдера Интернет. И еще… Мне потребуется привязать домен к статическому IP-адресу и подтвердить, что я владелец домена, иначе сертификат Let’s Encrypt не получить. Хорошо, что у меня есть сайт! План действий такой:

  1. Настройка в роутере проброса портов, чтобы компьютер был доступен в сети Интернет.
  2. Установка СУБД Firebird 2.5 или 5.
  3. Установка DataExpress Web Server.
  4. Привязка IP-адреса к домену в панели управления хостингом.
  5. Получение сертификата с помощью утилиты win-acme.
  6. Установка веб-сервера nginx, настройка обратный прокси.
  7. Настройка автоматического запуска веб-серверов с помощью утилиты nssm.

Проброс портов

Вот, что у меня получилось:

Проброс портов в роутере

Порт 8090 — это порт DataExpress Web Server. Его пробрасывать не обязательно, но я сделал этот для проверки работы веб-сервера. Порт 443 — это порт https, который будет использоваться веб-сервером nginx.

Установка СУБД Firebird

О том как установить Firebird в Windows читайте здесь или здесь.

Установка DataExpress Web Server

Скачиваем веб-сервер по ссылке https://mydataexpress.ru/files/dxwebsrv_win32.zip и распакуем в папку, например d:\dxwebsrv_win32. Настраиваем веб-сервер. У меня получился такой конфигурационный файл dxwebsrv.cfg:

[Server]
Language=ru
Port=8090
Firebird=25
UseSSL=0
PrivateKey=
Certificate=

[DemoDB]
Database=127.0.0.1:d:\dxwebsrv_win32\demo_db.fdb
Templates=d:\dxwebsrv_win32\templates
SessionTime=30
DBPwd=

Порт сервера 8090, используется Firebird версии 2.5, настроил подключение к демонстрационной базе. Т. к. пароль SYSDBA в моем случае стандартный, то параметр DBPwd оставляю пустым. Подробнее о параметрах читайте тут.

Обратите внимание на IP-адрес в пути к базе данных. Т. к. СУБД Firebird устанавлен на том же компьютере, что и веб-сервер, то указывается именно такой IP-адрес или localhost.

Запустим веб-сервер для проверки работы. Должно появится консольное окно.

Если консольное окно исчезло, значит что-то пошло не так. Посмотрите файл dxwebsrv.log. Основной причиной ошибки является занятый порт другим приложением или веб-сервер запущен дважды.

Проверьте работу веб-сервера, введя в браузере следующий адрес: http://127.0.0.1:8090/demodb/ или http://static_IP_address:8090/demodb/. Вы должны увидеть страницу ввода пользователя и пароля. Если вариант со статическим IP-адресом не работает, то убедитесь что вы правильно пробросили порт 8090.

Привязка IP-адреса к домену

Для успешного получения сертификатов Let’s Encrypt требуется, чтобы у вашего сервера было доменное имя, например: base.mysite.ru. Если у вас есть какой-нибудь сайт, то в панели управления хостинга должна быть возможность создания бесплатного домена третьего уровня, который затем можно привязать к IP-адресу вашего сервера. Если же сайта нет, то вам нужно купить домен у регистратора доменов и в личном кабинете регистратора привязать домен к IP-адресу.

В данном руководстве подробнее остановлюсь только на первом варианте. В моем случае хостером является TimeWeb. В панели управления хостингом в разделе «Домены» добавляю домен третьего уровня.

Затем перехожу в редактор DNS и добавляю A-запись, т. е. привязываю свой статический IP-адрес к домену.

Теперь мой сервер доступен по имени домена. В моем случае это http://signal.mydataexpress.ru:8090.

Получение сертификатов Let’s Encrypt

Для получения сертификатов Let’s Encrypt будем использовать утилиту win-acme. Скачайте утилиту с сайта https://www.win-acme.com/. Распакуйте архив в папку, например d:\utils\win-acme.

У меня нет возможности подтвердить подлинность домена по протоколу http, т. к. я не могу пробросить порт 80 в роутере. А для проверки подлинности используется именно этот порт и никакой другой (хотя есть вариант через 443 порт, но я не знаю как).

Если у вас есть возможность использовать порт 80, то это будет самый простой и удобный способ проверки. В этом случае нужно запустить утилиту с правами администратора, чтобы утилита могла запустить свой встроенный веб-сервер для проверки подлинности. К тому же сертификат будет обновляться утилитой автоматически.

Я же буду использовать метод DNS. Обновлять сертификат придется вручную, раз в 3 месяца. Запустим утилиту wacs.exe с правами простого пользователя прямо из проводника.

Вводим N для создания нового сертификата с настройками по умолчанию.

Вводим 2, чтобы указать домен, для которого выпускается сертификат, вручную.

Вводим имя домена.

Для проверки подлинности выбираем 6 пункт.

Выбираем формат сертификатов PEM.

Указываем в какой папке будут хранится сертификаты. Пароль для закрытого ключа устанавливать не будем. Никаких скриптов и программ не выполняем - вводим 3.

Далее утилита показывает TXT-запись, которую нужно добавить в редакторе DNS.

Добавляем TXT-запись в редакторе DNS панели управления хостинга.

После того как добавили запись в редактор DNS подождем минут 5 и жмем в окне утилиты Enter. Если утилита сообщает, что TXT-запись не найдена, значит сведения в DNS еще не обновились. Подождите еще немного и введите 1 (Retry check) для повторной проверки.

После успешного подтверждения удаляем TXT-запись в редакторе DNS и снова жмем ENTER.

Сертификаты созданы и сохранены в папке d:\cert.

Настройка nginx

Скачиваем веб-сервер по ссылке https://nginx.org/ru/download.html и распаковываем в папку, например d:\utils\nginx. Включим https-протокол на веб-сервере. Для этого нужно в файле d:\utils\nginx\conf\nginx.conf раскомментировать и отредактировать секцию в конце файла:

Вот, что должно у вас получиться:

    # HTTPS server
    #
    server {
        listen       443 ssl;
        #server_name  localhost;

        ssl_certificate      d:\cert\signal.mydataexpress.ru-chain.pem;
        ssl_certificate_key  d:\cert\signal.mydataexpress.ru-key.pem;

        #ssl_session_cache    shared:SSL:1m;
        #ssl_session_timeout  5m;

        #ssl_ciphers  HIGH:!aNULL:!MD5;
        #ssl_prefer_server_ciphers  on;

        location / {
            root   html;
            index  index.html index.htm;
        }
		
		#############################################
		# Перенаправления на DataExpress Web Server #
		#############################################
		
		location ~* /(img|cache|html|demodb) {
			proxy_pass http://127.0.0.1:8090;
			proxy_set_header Host $host;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			proxy_set_header X-Real-IP $remote_addr;
			proxy_http_version 1.1;
			proxy_set_header Connection "";
			proxy_cache off;
		}
    }

Запустите файл nginx.exe, чтобы проверить работу сервера. Введите в браузере адрес: https://base.mysite.ru/demodb/. Если вы видите страницу входа в базу данных, значит все в порядке.

Автоматический запуск веб-серверов

Осталось теперь настроить автоматический запуск веб-серверов DataExpress и nginx. Версии для Windows не могут запускаться как служба. Для обхода этого ограничения воспользуемся утилитой nssm. Эта утилита позволяет превратить обычное консольное приложение в системную службу и запускать его автоматически при загрузке компьютера.

Скачаем утилиту по ссылке https://www.nssm.cc/download и распакуем архив в папку, например в d:\utils\nssm.

Запускать утилиту нужно из командной строки с правами администратора. В командной строке переходим в папку утилиты и введим следующую команду для установки службы:

nssm install dxwebsrv d:\dxwebsrv_win32\dxwebsrv.exe

Если все нормально установилось, то вы увидите следующее сообщение:

Service "dxwebsrv" installed successfully!

Теперь запустим службу:

nssm start dxwebsrv

Проделываем то же самое для nginx:

nssm install nginx d:\utils\nginx\nginx.exe
nssm start nginx

Если нужно удалить службы, введите следующие команды:

nssm stop dxwebsrv
nssm remove dxwebsrv
nssm stop nginx
nssm remove nginx