
自宅に 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;
}
}