Nginx リバースプロキシは特定のサブディレクトリのみをプロキシし、他のすべてをパススルーします

Nginx リバースプロキシは特定のサブディレクトリのみをプロキシし、他のすべてをパススルーします

複数のサービスを持つドメインがある開発状況があります:

https://somewebpage.com

このサービスにはサブディレクトリとして複数のプロジェクトがあります

  • https://somewebpage.com<- ランディングページ
  • https://somewebpage.com/api<- REST API サーバー
  • https://somewebpage.com/app<- 私のアプリ

https://somewebpage.com/appでは、nginx と hosts ファイルをローカル ビルドにのみリバース プロキシするように設定することは可能ですか (また、その方法は) http://localhost:3000?

問題は、アプリがデプロイされているときは/apiREST サーバーへのアクセスに問題がないが、ローカルでサービスを提供するときに nginx リバース プロキシがインターセプトしlanding pagerest api serverURL も取得してしまうことです。

私の nginx 設定は次のようになります:

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    
    keepalive_timeout  65;
    
    index index.html;

    proxy_max_temp_file_size 0;
    proxy_buffering off;

    server {
        listen 80;
        server_name somewebpage.com;

        location / {
            return 301 https://$host$request_uri;
        }
    }

    server {
        listen 443 ssl;
        server_name somewebpage.com;

        ssl_certificate /etc/ssl/certs/certificate.crt;
        ssl_certificate_key /etc/ssl/certs/ccertificate.key;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

        location /app {
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_pass http://localhost:3000;
        }
    }
}

そして私の中に/etc/hostsは:

127.0.0.1    somewebpage.com

同様の結果を達成するための他のコツはありますか?

私がこれをやろうとする理由は、これを から実行すると、エラーlocalhost:3000が応答されCORS、 への呼び出しが拒否されるからです/api

それとも、これはセキュリティ上の危険が大きすぎるので、別のアクセス方法を要求する必要があるのでしょうか/api?

事前にご回答いただきありがとうございます。

答え1

以下を追加する必要があります:

location / {
    try_files $uri $uri/ =404;
}

これは、nginxに、他の指定されたものと一致しないリクエストをどのように処理するかを伝えます。nginxが使用するブロックlocationを選択する方法の詳細については、以下を参照してください。locationnginx ドキュメント

答え2

私にとって有効な解決策を 1 つ思いつきました。

somewebpage.com静的 IP アドレスを指しているxx.xx.xx.xxので、Tero Kilkanen の回答と同様に、URL の代わりにその IP アドレスに転送する別のプロキシを追加しました。

  location / {
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_pass https://xx.xx.xx.xx;
  }

そうすれば、リクエストはドメイン解決をバイパスするため、/etc/hostsファイルはリクエストを傍受しません。somewebpage.com

最終的に、私にとってうまく機能する次の nginx 構成になりました。

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    
    keepalive_timeout  65;
    
    index index.html;

    proxy_max_temp_file_size 0;
    proxy_buffering off;

    server {
        listen 80;
        server_name somewebpage.com;

        location / {
            return 301 https://$host$request_uri;
        }
    }

    server {
        listen 443 ssl;
        server_name somewebpage.com;

        ssl_certificate /etc/ssl/certs/certificate.crt;
        ssl_certificate_key /etc/ssl/certs/ccertificate.key;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

        location /app {
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_pass http://localhost:3000;
        }

        location / {
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_pass https://xx.xx.xx.xx;
        }
    }
}

このソリューションは、舞台裏で複数の IP アドレスが使用されていたり、動的 IP アドレスなどがあるため、すべての人に有効であるとは限りません。しかし、私の場合は有効で、開発目的には十分でした。

関連情報