私のnginxサイトのルートはシンボリックリンクを指しています。シンボリック リンクを変更すると (つまり、新しいバージョンの Web サイトをデプロイすると)、古いバージョンの php スクリプトが表示され続けます。キャッシュかバグの匂いがします。
最初は、Nginxがシンボリックリンクされたディレクトリをキャッシュしているように見えましたが、nginxをリロード/再起動/強制終了して起動しても修正されなかったため、php5-fpmを再起動しました-これで問題が修正されました。
しかし、デプロイ後に nginx や php5-fpm を再起動したくありません。なぜそのようなキャッシュ (またはバグ) が存在するのか、なぜ適切に機能しなかったのかを知りたいのです。
有用な情報:
- OS: Ubuntu 13.10 (GNU/Linux 3.8.0-19-generic x86_64)
- Nginx: ppa:nginx/stable 経由
- PHP: ppa:ondrej/php5 経由 (php5-fpm)
Nginx サイト構成:
root /home/rob/sandbox/deploy/public/;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass php;
}
Nginx サーバー構成 (一部、残りはデフォルト):
http {
sendfile off;
upstream php {
server unix:/var/run/php5-fpm.sock;
}
}
/home/rob/sandbox のツリー:
├── deploy -> web2
├── web1
│ └── public
│ └── index.php (echo ONE)
└── web2
└── public
└── index.php (echo TWO)
- リクエスト:
http://localhost/index.php
- 予想される応答: 2
- 実際の応答: 1
からの出力の一部realpath_cache_get()
[/home/rob/sandbox/deploy/public/index.php] => Array (
[key] => 1.4538996210143E+19
[is_dir] =>
[realpath] => /home/rob/sandbox/web2/public/index.php
[expires] => 1383730041
)
つまり、これdeploy/public/index.php
は適切にリンクされていることを意味しweb2/public/index.php
ますよね? まあ、realpath_cache リストに正しいパスがあっても、respone は 1 のままです。
Nginxを再起動した後rm deploy
、効果はありません。ln -s web2 deploy
この後に php5-fpm を再起動すると、予期される「TWO」の応答が返されます。
index.php ファイルのほかに、.css ファイルと .js ファイルを使用していくつかのテストを行ったことを知っておくとよいでしょう。web1 および web2 との間のシンボリック リンクを削除して再作成した後、nginx はファイルの正しい内容で応答します。
私は何を見逃して、何を見ていなかったのですか?