Nginx和/或php5-fpm会记住符号链接的根目录

Rob*_*ijn 24 php caching nginx

我的nginx站点根指向符号链接.如果我改变符号链接(也就是部署新版本的网站),那么旧版本的php脚本会一直显示出来.闻起来像缓存或臭虫.

首先它看起来像Nginx正在缓存符号链接的目录,但重新加载/重新启动/杀死并启动nginx没有解决它,所以我重新启动php5-fpm - 这解决了我的问题.

但我不希望在部署后重新启动nginx和/或php5-fpm - 我想知道为什么会有这样的缓存(或错误),以及为什么它无法正常工作.

有用的信息:

  • 操作系统:Ubuntu 13.10(GNU/Linux 3.8.0-19-通用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;
}
Run Code Online (Sandbox Code Playgroud)

Nginx服务器配置(部分,默认为休息):

http {
    sendfile off;
    upstream php {
        server unix:/var/run/php5-fpm.sock;
    }
}
Run Code Online (Sandbox Code Playgroud)

树/ for/home/rob/sandbox:

??? deploy -> web2
??? web1
?   ??? public
?       ??? index.php (echo ONE)
??? web2
    ??? public
        ??? index.php (echo TWO)
Run Code Online (Sandbox Code Playgroud)
  • 请求: http://localhost/index.php
  • 预期回应:两个
  • 实际回应:ONE

部分输出来自 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
)
Run Code Online (Sandbox Code Playgroud)

所以这意味着deploy/public/index.php正确地联系在一起web2/public/index.php吧?好吧,即使在realpath_cache列表中有正确的路径,respone仍然是ONE.

之后rm deployln -s web2 deployNginx重启,没有效果.在此之后重新启动php5-fpm会给出'TWO'的预期响应.

很高兴知道在index.php文件旁边,我用.css和.js文件做了一些测试.从web1和web2中删除并重新创建符号链接后,nginx将使用正确的文件内容进行响应.

我想念的是什么,我没看到什么?

sob*_*tel 30

使用$ realpath_root配置你的nginx.它应该有所帮助.

fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
Run Code Online (Sandbox Code Playgroud)

感谢Vitaly Chirkov(/sf/answers/1673333931/).


Rob*_*ijn 7

一旦我将realpath_cache_ttl更改为'2'(应该修复它),错误的内容仍然显示.

在为php-fpm加载mods之后,我发现opcache已启动并正在运行.禁用它将在ttl结束时清除缓存的realpath.

我不想将realpath缓存ttl降低到很多,所以我将重新加载php-fpm,因为它很优雅.我希望这个帖子和我的答案会帮助别人;)