Nginx経由でPHP製のWebアプリにつないだ際、なぜかWebアプリを稼働させているバックエンドのApacheのプロセスが無数に増えてしまい、RAMを食いつぶしてしまう問題に遭遇しました。
Apacheへ直つなぎした場合はそういった問題が起きないため、Apacheとnginxのアクセスログを見比べてみたところ、Apacheへ通信した際はHTTP/1.1が使われていたのに対し、nginx経由でアクセスした際は何故かApacheとの通信が”HTTP/1.0″になってしまっていました。
色々調べたところ、どうやらNginxでリバースプロキシを行う場合、何も指定しない場合、バックエンドのサーバーとはデフォルトでHTTP/1.0で通信してしまうとのこと。
HTTP/1.1で通信させたい場合は
server {}
ディレクティブに、下記の1行を追加すればOKです。
proxy_http_version 1.1;
記述例:
server {
server_name .example.com;
listen 80;
listen 443 ssl;
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
client_max_body_size 1g;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Fowarded-Proto \$scheme;
proxy_max_temp_file_size 0;
proxy_http_version 1.1; #HTTP1.1に固定
location / {
proxy_pass https://localhost:8081;
}
}
これでHTTPの通信が1.1となり、Apacheの負荷も少なくなりました。