25

私の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 はファイルの正しい内容で応答します。

私は何を見逃して、何を見ていなかったのですか?

4

3 に答える 3

7

realpath_cache_ttl を '2' に変更すると (これで修正されるはずです)、間違ったコンテンツがまだ表示されていました。

ロードされた php-fpm の mod を少し調べたところ、opcache が稼働していることに気付きました。これを無効にすると、ttl が終了したときにキャッシュされた実パスがクリアされます。

realpath キャッシュの ttl をあまり下げたくないので、php-fpm のリロードで落ち着きます。このスレッドと私の回答が他の人に役立つことを願っています;)

于 2013-11-06T20:08:43.717 に答える
0

私はまったく同じ問題を抱えていましたが、どのトリックも役に立ちませんでした。このページにリストされているすべてのトリックに加えて、opcache が無効になっていることを確認してから、nginx キャッシュも無効にしました。設定しました

sendfile off;

それはstackoverflowのどこかに記載されていました。

PHP と nginx の strace を開始したところ、一部のライブラリは新しい場所に読み込まれているだけでなく、シンボリック リンクがもう指していない古い場所から読み込まれたものもあることがわかりました。その上、OLD ディレクトリ内の php スクリプトを更新すると、常に適切に表示されていたので、キャッシュのようには見えませんでした。さらに混乱させるために、コマンドラインは正常に機能し、新しい場所へのシンボリックリンクをたどりました。私はこれで頭から髪を引っ張っていました!

これらすべての原因は作曲家キャッシュであることが判明しました - それはいくつかのライブラリをキャッシュしていました. 誰もが使用しているわけではありませんが、使用していて同様の問題がある場合は、確認する価値があります。私は展開スクリプトと同じレベルのベンダーを持っており、コンポーザーのキャッシュがどの場所を使用すべきかについて多くの混乱を引き起こしていると思います。で掃除したら

composer clear-cache

システムが期待どおりに動作し始めました。

それが誰かを助けることを願っています。

于 2016-05-25T07:08:09.790 に答える