有一个 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 协议的支持,并且还支持自定义正则表达式测试。
例如,要将sslh
http 请求转发到 nginx,将非 http 请求转发到 ejabberd,只需在所有 nginx 的虚拟主机中替换即可
listen 80;
和
listen 127.0.0.1:88;
(也可以使用listen 127.0.0.1:80
ifsslh
仅在特定 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。