Назад | Перейти на главную страницу

Как перенаправить запросы, отличные от 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) ошибка.

Как отметил @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 не может различать тип трафика.