如何将80端口上的非http请求转发到另一个端口?

如何将80端口上的非http请求转发到另一个端口?

有一个 nginx Web 服务器监听 80 和 443 端口。我想处理所有http照常请求并转发所有非http请求到另一个端口(例如,1234)。

我的问题与 stackoverflow 上已经回答的问题非常相似:是否可以将非 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)错误。

答案1

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 无法区分流量类型。

答案2

正如 @AlexeyTen 在他的评论中提到的,sslh这是实现此目的的正确工具。它内置对 HTTP、SSL、SSH、OpenVPN、tinc 和 XMPP 协议的支持,并且还支持自定义正则表达式测试。

例如,要将sslhhttp 请求转发到 nginx,将非 http 请求转发到 ejabberd,只需在所有 nginx 的虚拟主机中替换即可

    listen 80;

    listen 127.0.0.1:88;

也可以使用listen 127.0.0.1:80ifsslh仅在特定 IP 上监听端口 80,或者使用例如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

相关内容