Files
2026-10-20 15:59:55 +07:00

93 lines
5.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# HTTP-пути и reverse proxy
С0.7.5 WS/BOSH используют настройки `http_paths.websocket` и `http_paths.bosh`.
`http_paths.file_share` задаёт внутренний путь upload-компонента. Настройки
VirtualHost/Component имеют приоритет над глобальными; `$host` заменяется именем
XMPP-хоста. Дефолты: `/xmpp-websocket`, `/http-bind`, `/file_share`.
HTTP-пути задаются без query/fragment; конечный `/` допускается. Поддержаны
литеральные RFC3986 path-символы и percent encoding, например `/v1:ws` и
`/bind%20endpoint`. Закодированные slash/backslash, control и dot segments
отвергаются, чтобы избежать неоднозначного переписывания прокси.
`http_host` задаёт HTTP Host, который proxy должен отправлять backend.
`http_default_host` глобально выбирает fallback для неизвестного HTTP Host.
Runtime по-прежнему обслуживает один VirtualHost и его компоненты.
`http_external_url` задаёт публичный HTTP(S) origin и необязательный префикс.
Например, `https://chat.example.org/xmpp/` вместе с `http_paths.bosh: /bind`
соответствует публичному `https://chat.example.org/xmpp/bind` и внутреннему `/bind`.
Прокси должен удалить `/xmpp/` перед отправкой backend. Эта настройка сама по
себе не меняет внутренние маршруты и не включает автоматическое discovery.
Для WebSocket клиент использует эквивалентный `wss://` URL.
## TLS на прокси
Пример фрагмента YAML для существующего конфига (сохраните остальные параметры):
```yaml
global:
http_ports: [5280]
http_interfaces: [127.0.0.1]
trusted_proxies: [127.0.0.1, '::1']
http_legacy_x_forwarded: true
http_default_host: wthome.ru
http_external_url: https://wthome.ru/xmpp/
http_paths:
websocket: /ws
bosh: /bind
http_cors_override:
websocket:
origins: [https://conversejs.wthome.ru]
bosh:
origins: [https://conversejs.wthome.ru]
```
Nginx: переменная map задаётся внутри `http`, location — внутри TLS server.
```nginx
map $http_upgrade $xmpp_connection {
default upgrade;
'' close;
}
location /xmpp/ {
proxy_pass http://127.0.0.1:5280/;
proxy_http_version 1.1;
proxy_set_header Host wthome.ru;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $xmpp_connection;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_buffering off;
proxy_read_timeout 120s;
}
```
Публичные адреса: `wss://wthome.ru/xmpp/ws` и
`https://wthome.ru/xmpp/bind`. Для прежнего прямого WSS5281 настройка
прокси не требуется. Origin — адрес страницы Converse, а не WSS endpoint.
IP/CIDR в `trusted_proxies` разрешают доверять forwarded-данным только от
указанных socket peers. По умолчанию доверены loopback127.0.0.1 и::1.
Пустой список отключает доверие. Не задавайте `0.0.0.0/0` для публичного backend.
X-Forwarded-For разбирается справа налево до первого недоверенного адреса.
X-Forwarded-Proto=https разрешает HTTP WS/BOSH без consider_*_secure только
для доверенного прокси. Прямой HTTP без такого подтверждения получает403,
если `consider_websocket_secure`/`consider_bosh_secure` не включены явно.
Не включайте consider_*_secure на открытом внешнем HTTP listener.
При `http_legacy_x_forwarded: false` используются RFC7239 `Forwarded`
с IP, bracketed IPv6/port, `proto=https` и цепочками доверенных прокси.
В RFC-режиме защищённость TLS termination принимается от ближайшего доверенного
прокси; каждый следующий разобранный hop также должен иметь `proto=https`. Это
намеренно отличается от консервативного `secure AND proto` supplied native
revision, не позволявшего так отметить HTTP backend защищённым.
`X-Forwarded-Host`/`Forwarded host` не заменяют HTTP Host: настройте Host на прокси.
Поддержаны HTTP reverse proxies, сохраняющие WebSocket Upgrade и BOSH body.
HAProxy PROXYv1/v2, произвольные Lua HTTP-приложения и горячая перенастройка
маршрутов не реализованы. Nginx-конфигурация дана для оператора; настоящий
Nginx и production-сертификат в локальном прогоне не запускались.
Основание семантики: https://prosody.im/doc/http и supplied mod_http.lua.