web-dev-qa-db-ja.com

ポート80上の非HTTPリクエストを別のポートに転送する方法は?

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)エラーが発生します。

2
semyonfilippov

@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 に記載されています。

0
semyonfilippov

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ブロックで同じポートを使用することはできません。

0
Tero Kilkanen