Как настроить публикацию веб-сервера 1С через обратный прокси-сервер и устранить ошибку 404 при переходе по ссылкам

Системный администратор 1С v8.3 (Управляемые формы) 1С:Документооборот IT и автоматизация бизнеса
← На главную

Рассмотрим распространенную ситуацию, когда в соответствии с политиками безопасности компании прямая публикация веб-сервера 1С в общую корпоративную сеть запрещена. Вместо этого доступ организуется через обратный прокси-сервер (reverse proxy), например, Nginx, Apache или IIS. При такой схеме внешние пользователи обращаются к базе по защищенному адресу прокси-сервера, который затем перенаправляет запросы на внутренний веб-сервер 1С.

При некорректной настройке подобной связки администраторы часто сталкиваются с двумя критическими проблемами:

  1. При переходе по навигационным ссылкам (например, из писем-уведомлений 1С:Документооборота) возникает ошибка HTTP: Not found (404).
  2. Веб-клиент работает нестабильно, наблюдаются серьезные визуальные подтормаживания и зависания интерфейса.

В этой статье мы подробно разберем причины возникновения этих неполадок и пошагово настроим систему для их устранения.

Выясним причину возникновения ошибки 404

Проанализируем механизм маршрутизации запросов при использовании прокси-сервера. Предположим, что база данных 1С опубликована на внутреннем веб-сервере по адресу http://127.0.0.1/do/, а внешний адрес на прокси-сервере выглядит как https://doc.xxxxx.ru/.

Когда прокси-сервер настроен так, что внешний корневой путь / перенаправляет запросы на внутренний путь с именем базы /do/, возникает конфликт, называемый double path mapping (двойное сопоставление путей):

  1. Пользователь успешно переходит по корневой ссылке https://doc.xxxxx.ru/. Прокси-сервер корректно транслирует этот запрос во внутренний адрес http://127.0.0.1/do/.
  2. Веб-клиент 1С загружается в браузере. В процессе работы скрипты платформы обращаются к файлу настроек публикации default.vrd и считывают из него реальное имя публикации базы — do.
  3. Платформа 1С считает, что имя публикации обязательно должно присутствовать в URL, и начинает автоматически добавлять его ко всем последующим динамическим запросам. Браузер пытается запросить служебные ресурсы по адресу вида https://doc.xxxxx.ru/do/ru_RU/....
  4. Прокси-сервер получает этот запрос. Так как в его правилах прописано перенаправление корня на внутренний путь /do/, он автоматически прибавляет входящий путь к адресу назначения. В результате на внутренний веб-сервер уходит некорректный дублированный запрос: http://127.0.0.1/do/do/ru_RU/....
  5. Внутренний веб-сервер (Apache или IIS) не находит у себя публикацию по пути /do/do/ и закономерно возвращает ошибку 404 Not Found.

Аналогичная проблема возникает при переходе по навигационным ссылкам из писем: веб-клиент пытается обработать хэш-часть URL, отправляет запросы с именем публикации и натыкается на дублирование путей.

Варианты решения проблемы сопоставления путей на прокси-сервере

Рассмотрим подробнее три практических метода настройки прокси-сервера (на примере Nginx) для устранения дублирования путей.

Вариант 1. Сохранение идентичности путей (Рекомендуемый)

Самый надежный и простой способ — сделать так, чтобы внешние и внутренние пути публикации полностью совпадали. То есть пользователи из сети должны обращаться к базе по адресу https://doc.xxxxx.ru/do/. В этом случае трансляция путей происходит «один в один», без подмены корня.

Настроим блок конфигурации Nginx следующим образом:


server {
    listen 443 ssl;
    server_name doc.xxxxx.ru;

    ssl_certificate /etc/nginx/ssl/doc.xxxxx.ru.crt;
    ssl_certificate_key /etc/nginx/ssl/doc.xxxxx.ru.key;

    location /do/ {
        proxy_pass http://127.0.0.1/do/;
        proxy_redirect off;
        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;
    }
}

Вариант 2. Публикация 1С в корень сайта на внутреннем веб-сервере

Если по требованиям бизнеса база должна открываться строго по корневому адресу https://doc.xxxxx.ru/ без каких-либо суффиксов в URL, нам необходимо переопубликовать базу 1С на внутреннем веб-сервере (IIS или Apache) непосредственно в корень сайта (чтобы локальный путь был http://127.0.0.1/, а не http://127.0.0.1/do/).

В таком случае конфигурационный файл Nginx будет предельно простым и безопасным:


location / {
    proxy_pass http://127.0.0.1/;
    proxy_redirect off;
    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;
}

Вариант 3. Настройка обработки двух путей в Nginx

Если изменить настройки внутренней публикации на IIS/Apache невозможно (например, там опубликовано несколько разных баз 1С), а внешнюю ссылку нужно сохранить в корневом формате, мы можем заставить Nginx обрабатывать оба типа запросов — и корневые, и содержащие суффикс базы:


# Первичный вход пользователя по корневому адресу
location / {
    proxy_pass http://127.0.0.1/do/;
    proxy_redirect off;
    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;
}

# Обработка последующих запросов веб-клиента с явным указанием "/do/"
location /do/ {
    proxy_pass http://127.0.0.1/do/;
    proxy_redirect off;
    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;
}

При такой конфигурации первый переход пользователя по ссылке https://doc.xxxxx.ru/ перенаправит его на внутреннюю базу, а последующие служебные AJAX-запросы веб-клиента, содержащие в пути /do/, будут перехвачены вторым блоком location и корректно отправлены на бэкенд без повторного добавления префикса.

Устраняем подтормаживания веб-клиента: оптимизация прокси-сервера

После решения проблемы с маршрутизацией путей разберем причины медленной работы веб-клиента через прокси-сервер. Интерактивный интерфейс 1С критичен к задержкам сети и требует быстрой обработки множества мелких запросов.

Выполним оптимизацию прокси-сервера по четырем направлениям:

  1. Включим поддержку WebSockets.

    Современная платформа 1С использует протокол WebSockets для мгновенной передачи уведомлений и асинхронных вызовов. Если прокси-сервер не настроен на проброс веб-сокетов, 1С принудительно переключается на ресурсоемкую технологию Long-Polling (постоянные тяжелые HTTP-запросы). Это перегружает веб-сервер и вызывает видимые задержки отрисовки форм.

    Добавим заголовки обновления соединения в конфигурационный файл Nginx:

    
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    
  2. Отключим буферизацию ответов.

    По умолчанию Nginx пытается накопить ответ бэкенда в буфере перед отправкой конечному пользователю. Для тяжелых интерактивных интерфейсов 1С это создает задержку ввода. Отключим буферизацию для обеспечения мгновенного отклика:

    proxy_buffering off;
  3. Включим протокол HTTP/2.

    Веб-клиент 1С при инициализации загружает сотни мелких картинок, стилей и JS-скриптов. В устаревшем протоколе HTTP/1.1 загрузка идет последовательно, что сильно замедляет старт системы. Протокол HTTP/2 поддерживает мультиплексирование (параллельную загрузку файлов по одному TCP-соединению).

    Активируем поддержку HTTP/2 в директиве listen конфигурации сервера:

    listen 443 ssl http2;
  4. Настроим сжатие данных (Gzip).**

    Сжатие тяжелых текстовых файлов (особенно библиотек JavaScript платформы 1С) позволяет сократить объем передаваемого трафика в несколько раз. Добавим глобальные настройки сжатия в конфигурацию:

    
    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    gzip_comp_level 5;
    

Настройка публикации на стороне 1С

Чтобы система формировала корректные навигационные ссылки для писем и внешних уведомлений, необходимо явно указать параметры публикации в самой базе данных 1С.

Разберем эти действия по шагам:

  1. Запустим информационную базу 1С (например, 1С:Документооборот) в режиме 1С:Предприятие под пользователем с полными административными правами.
  2. Перейдем в раздел меню Администрирование, далее выберем пункт Общие настройки.
  3. Развернем подраздел Публикация информационной базы.
  4. В поле Адрес в Интернете введем точный внешний URL-адрес, под которым пользователи заходят через прокси-сервер (например, https://doc.xxxxx.ru/do/ при Варианте 1 или https://doc.xxxxx.ru/ при Варианте 2).
  5. В поле Локальный адрес укажем внутренний сетевой адрес публикации (например, http://127.0.0.1/do/).
  6. Нажмем кнопку Записать и закрыть для сохранения настроек.

После выполнения этих настроек все ссылки на задачи, документы и бизнес-процессы, генерируемые программой для отправки по электронной почте, будут формироваться на основе правильного внешнего адреса, а запросы пользователей будут проходить через прокси-сервер без ошибок маршрутизации и задержек производительности.

← На главную