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

时间:2013-11-06 09:56:14

标签: caching nginx php

我的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;
}

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
  • 预期回复:TWO
  • 实际回复: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
)

这意味着deploy/public/index.php已正确链接到web2/public/index.php,对吧? 好吧,即使在realpath_cache列表中有正确的路径,respone仍然是ONE。

重新启动rm deployln -s web2 deploy Nginx后,无效。 在此之后重新启动php5-fpm会得到'TWO'的预期响应。

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

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

3 个答案:

答案 0 :(得分:30)

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

fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;

Kudos去Vitaly Chirkov(https://stackoverflow.com/a/23904770/219272)。

答案 1 :(得分:7)

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

在为php-fpm加载了mod之后,我发现opcache已启动并正在运行。禁用它将在ttl结束时清除缓存的实际路径。

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

答案 2 :(得分:0)

我有完全相同的问题,并没有任何技巧帮助。除了本页列出的所有技巧,我确保禁用opcache,然后nginx缓存也被禁用。我设置了

sendfile off;

它是在stackoverflow上的某处描述的。

我开始对php和nginx进行扫描,结果发现有些库被读取了新位置,但也有一些库是从旧的符号链接不再指向的OLD位置读取的。 最重要的是,更新OLD目录中的PHP脚本总是正确显示 - 所以这看起来不像我的缓存。 为了使命令行更加混乱,工作正常并按照符号链接到新位置。 我把头发从头上拔了过来!

事实证明,对所有这些负责的是作曲家缓存 - 它正在缓存一些库。 我知道不是每个人都使用它,但如果你这样做并且有类似的问题,那么值得检查。 我的供应商与部署脚本处于同一级别,我认为编写器缓存会导致很多混淆,应该使用哪个位置。 用

清理后
composer clear-cache

系统开始按预期运行。

我希望它会帮助别人。