80と443の両方のポートをリッスンするnginx Webサーバーがあります。すべてのhttpリクエストを通常どおりに処理し、すべてのnon-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
if if sslh
with listen to port 80 on specific ip only、or use eg 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"
(debianでは/etc/default/sslh
)。そして、最後に、サービスを(再)開始します。
systemctl restart nginx
systemctl start sslh
sslh
の--transparent
オプションが必要な場合は、追加の手順がいくつかあります。詳細は github に記載されています。
nginxは、ポートに同時に1種類のサービスしか提供できません。
したがって、この構成は機能します:
http {
server {
listen 80;
server_name example.com;
...
}
}
stream {
server {
listen 81;
proxy_pass backend;
}
upstream backend {
server 127.0.0.1:12345;
}
}
Nginxにはトラフィックタイプを区別する方法がないため、stream
ブロックとhttp
ブロックで同じポートを使用することはできません。