nginx+php-fpm環境でDeployerを使いリリースを行っていますが、
最近立ち上げたAWSのインスタンスで、Depolyerでデプロイしても古い状態のまま、デプロイが反映されない状況になりました。
デプロイ自体は成功していてreleases/ディレクトリには1,2,3,4と正常にデプロイが行われています。
また、current/も正しくreleases内のデプロイファイルと正しくリンクが作成されていました。
おそらく前にリンクされた状態のときの物理ファイルの位置がキャッシュされて開放さなないのだとなんとなく思いましたが、解決はしませんでした。
やむをえず、Deployerの保存世代を1にし、古いリリースをリンクごと消すことで一応更新されるようになりましたが、これは応急処置で本当の解決には至っていません。
Googleで事例を調べたところOPcahceの問題のようで、OPcacheをOffにすることも考えましたが、あまり得策には感じなかったので他の方法を検討することにしました。
結論から言うと
$document_rootを$realpath_rootに変えると正しい動作になるようです。
まだ細かくチェックはしていませんがDeployは正常に行ました。もう少し使って見る必要はありそうですが。
nginxのlocation部分を修正しました。
...
...
location ~ \.php$ {
root /var/www/html/current/public;
fastcgi_pass 127.0.0.1:9000;
try_files $uri $uri/ /index.php?$query_string;
fastcgi_index index.php;
#↓コメントアウト
#fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#↓DeployerのOPcache対策以下のように書き換える
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
include fastcgi_params;
}
...
あと、やはりキャッシュをクリアする必要はあるようです。
下の例は10秒でクリアしています
php.iniに追記
opcache.revalidate_path=1
realpath_cache_ttl=10
以上
コメント