Существует веб-сервер nginx, который прослушивает как 80-, так и 443-порты. Я хотел бы обработать все http запросы как обычно и пересылаем все не-http запросы на другой порт (скажем, 1234).
Мой вопрос очень похож на тот, на который уже был дан ответ в stackoverflow: Можно ли перенаправить запрос на соединение NON-http на другой порт в nginx?. Возможно, я неправильно понял ответ, получивший наибольшее количество голосов, но когда я добавляю что-то вроде этого в nginx.conf:
stream {
upstream backend {
server example.com:1234;
}
server {
listen 80;
proxy_pass backend;
}
}
Я получаю (ожидаемый) bind() to 0.0.0.0:80 failed (98: Address already in use)
ошибка.
Как отметил @AlexeyTen в своем комментарии, sslh
- подходящий инструмент для этой цели. Он имеет встроенную поддержку протоколов HTTP, SSL, SSH, OpenVPN, tinc и XMPP, а также поддерживает пользовательские тесты регулярных выражений.
Например, чтобы сделать sslh
пересылать http-запросы на nginx и не-http запросы на ejabberd, достаточно заменить на всех виртуальных хостах nginx
listen 80;
с участием
listen 127.0.0.1:88;
(также можно использовать listen 127.0.0.1:80
если sslh
с прослушиванием порта 80 только на определенном IP-адресе или для использования, например, listen 88
), затем установите sslh
и отредактируйте его параметры по умолчанию:
RUN=yes
DAEMON_OPTS="--numeric --user sslh --listen 0.0.0.0:80 --http 127.0.0.1:88 --xmpp 127.0.0.1:5222 --pidfile /var/run/sslh/sslh.pid"
(/etc/default/sslh
в Debian). И, наконец, просто (повторно) запустите службы:
systemctl restart nginx
systemctl start sslh
Если --transparent
вариант для sslh
требуется, потребуются дополнительные шаги - они хорошо задокументированы на github.
nginx может одновременно предоставлять порт только один вид сервиса.
Итак, эта конфигурация будет работать:
http {
server {
listen 80;
server_name example.com;
...
}
}
stream {
server {
listen 81;
proxy_pass backend;
}
upstream backend {
server 127.0.0.1:12345;
}
}
Вы не можете использовать тот же порт на stream
и http
блоки, поскольку nginx не может различать тип трафика.