Как переслать не-http запросы на порт 80 на другой порт?
Существует веб-сервер 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)
ошибка.
2 ответа
Как отметил @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 не имеет возможности различить тип трафика.