nginx で node.js アプリケーションを実行する

nginx で node.js アプリケーションを実行する

ポート 8443 でノード アプリケーションを実行しています。nginx はポート 80 と 443 で Web 要求を処理し、ユーザーを 8443 にリダイレクトする必要があります。

私の設定は次のとおりです/etc/nginx/sites-enabled/default:

upstream my_upstream {
   server 127.0.0.1:8443;
   keepalive 64;
}

server {
    listen 80;
    server_name myapp.com;
    rewrite ^/(.*) https://myapp.com/$1 permanent;
}

server {
    listen 443 ssl;
    server_name 12.34.12.34 www.myapp.com myapp.com *.myapp.com;
    ssl_certificate /path/to/my/cert.crt;
    ssl_certificate_key /path/to/my/private.key
    // other ssl params

    location / {
        proxy_redirect off;
        proxy_pass https://my_upstream;
        // other params 
    }
}

この設定でアプリにアクセスできます

http(s)://myapp.com:8443

次のiptablesを追加した場合にのみ

iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-ports 8443
iptables -t nat -A OUTPUT -p tcp --dport 443 -o lo -j REDIRECT --to-port 8443

アクセスできる

http(s)://myapp.com

質問:

iptables を使用してポート 80 から 443、さらに 8443 にリダイレクトするのは、ちょっと馬鹿げているように思えます。これを nginx のみで実行する方法はありますか (または、これが正しい方法でしょうか)。

このアプローチ (アプリケーションを 8443 などの非標準ポートに配置する) は良いアイデアでしょうか?

答え1

簡単です。node.js はポート 8443 で実行されており、私が理解している限りでは、他のポートでリクエストをリッスンしている他のサービスはないので、nginx 構成で次のように実行できます。

server {
    # here comes the rest of your nginx configuration
    location / {
        proxy_pass http://127.0.0.1:8443;
    }
}

Iptables ルールを使用する必要はなく、nginx 構成にアップストリーム セクションを作成する必要もありません。nginx は、すべてのポート リダイレクトをすぐに実行できます (また、実行する必要があります) (通常のリバース プロキシと同様に)。

私が間違っているかもしれませんが、iptables ルールの後にアプリケーションが動作し始める理由は、ポート リダイレクトによりクライアントが node.js サーバーに直接アクセスし始めるためです。これは、Squid を透過プロキシとして使用する場合と似ています。

この記事が役に立つかもしれません。Apache 宛てであるという事実は無視してください。

幸運を祈ります。よろしくお願いいたします。

答え2

127.0.0.1アップストリームが で実行されているときに、nginx とアップストリームの間で暗号化を行うのは、少し無意味かつ無駄です127.0.0.1

どちらかといえば、リダイレクトを使用したソリューションはiptables、アップストリームに変更を加えずに nginx を単純に組み込むよりもはるかに効率的です。

しかし、私たちは尋ねなければなりません - nginx の追加のクールな機能を使用していないのであれば、そもそもなぜそれをミックスに追加したいのでしょうか?

適切なアプローチは、 なしでアップストリームを実行しhttps、nginx を使用して http と https の両方をアップストリームにリダイレクトすることです。現在の構成が機能しない理由は、これまでに貼り付けたスニペットからは明らかではない、何らかの構成エラーに関係している可能性があります。

関連情報