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

Другие вопросы по тегам