phpMyAdmin の読み込みが Nginx リバース プロキシ経由で非常に遅くなる

phpMyAdmin の読み込みが Nginx リバース プロキシ経由で非常に遅くなる

自宅に Synology NAS があり、WWW からアクセスする必要があるサービスがいくつか実行されていますが、当然ながら自宅の IP のポートをインターネット全体に公開したくはありません (特に外部サービスがポート 443 でサーバーにアクセスする必要があるため)。そこで、Ubuntu 22.04 がインストールされた Oracle Cloud で Always Free インスタンス (0.48Gbps 接続、1 CPU、1GB RAM) を起動し、そこに nginx をインストールして、自宅ネットワークの外部からこれらのサービスにアクセスすることにしました。次に、ルーターのポートをクラウド インスタンスの IP アドレスにのみ公開しました。

SSH 経由で Linux サーバーを管理した経験はありますが、リバース プロキシは言うまでもなく、nginx 全般を扱うのは今回が初めてです。

テスト中は、ポートをすべての IP に対して開いたままにして、ラボへの着信トラフィックを直接、およびリバース プロキシ経由でテストできるようにしました。ここで問題が起こり始めました。

  • アップストリームサーバーで実行されているphpMyAdminに直接アクセスすると(クエリを実行するだけでhttps://pma.upstream.mydomain.xyz:openedPort私のブラウザでは、キャッシュをクリアしてもすぐに読み込まれます
  • リバースプロキシ経由で上流サーバー上で実行されているphpMyAdminにアクセスすると(https://pma.reverseproxy.mydomain.xyz:443私のブラウザでは、ブラウザのキャッシュをクリアした後、ロードに 1 分以上かかります。キャッシュがすでにロードされている場合はそれほど遅くありません (おそらく 10 秒) が、上流サーバーに直接クエリするよりもはるかに遅くなります (より広いインターネットへのポートを閉じると、これはできなくなります)。ブラウザ コンソールをチェックしたところ、最も時間がかかるのは、phpMyAdmin がアイコンとして使用する小さな PNG (各イメージは最大で数百バイト) と、より大きな CSS/JS ファイル (数十 KB) です。

リバースプロキシ経由で上流サーバー上の別のサイトにアクセスすると、これらの問題は発生しないようですが、小さなJSファイルやPNGファイルはそれほど多くなく、ほとんどがテキストファイルです。

以下は私の nginx サーバー ブロック構成です。どこが間違っているのか、何かヒントをご存知の方はいらっしゃいますか? アドバイスをいただければ幸いです。

server {
    listen 443 ssl http2;
    server_name pma.reverseproxy.mydomain.xyz;

    sendfile on;
    tcp_nodelay on;
    tcp_nopush on;

    ssl_certificate /etc/letsencrypt/live/reverseproxy.mydomain.xyz/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/reverseproxy.mydomain.xyz/privkey.pem;

    resolver 1.1.1.1 8.8.8.8 valid=300s;
    set $backend_server https://pma.upstream.mydomain.xyz:openedPort;

    location / {
        proxy_pass $backend_server;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header Host pma.upstream.mydomain.xyz;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_buffer_size 128k;
        proxy_buffers 8 256k;
        proxy_busy_buffers_size 256k;

        gzip on;
        gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

        proxy_read_timeout 20s;
    }
}

関連情報