25

我的 nginx 站点根目录指向一个符号链接。如果我更改符号链接(也就是部署新版本的网站),旧版本的 php 脚本会不断出现。这闻起来像缓存或错误。

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

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

有用信息:

  • 操作系统: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
  • 预期响应:两个
  • 实际回复:一

部分输出来自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 列表中有正确的路径,响应仍然是 ONE。

之后rm deployln -s web2 deploy重启了Nginx,没有效果。在此之后重新启动 php5-fpm 会给出“TWO”的预期响应。

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

我错过了什么,我没有看到什么?

4

3 回答 3

31

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

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

感谢 Vitaly Chirkov ( https://stackoverflow.com/a/23904770/219272 )。

于 2014-11-27T21:47:02.710 回答
7

一旦我将 realpath_cache_ttl 更改为“2”(应该可以解决它),仍然显示不正确的内容。

在对 php-fpm 加载的 mods 进行了一些挖掘之后,我发现 opcache 已启动并正在运行。当 ttl 结束时,禁用它会清除缓存的真实路径。

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

于 2013-11-06T20:08:43.717 回答
0

我遇到了完全相同的问题,没有任何技巧有帮助。除了这个页面上列出的所有技巧之外,我确保 opcache 被禁用,然后 nginx 缓存也被禁用。我设置

sendfile off;

它在stackoverflow的某处被描述。

我开始搜索 php 和 nginx,结果发现有些库是从新位置读取的,但也有一些是从符号链接不再指向的旧位置读取的。最重要的是更新 OLD 目录中的 php 脚本总是正确显示 - 所以这对我来说看起来不像缓存。为了使它更令人困惑,命令行可以正常工作,并按照符号链接到新位置。我正把头发从头上扯下来!

事实证明,这一切都是由作曲家缓存负责的——它正在缓存一些库。我知道不是每个人都使用它,但是如果您使用它并且遇到类似的问题,则值得检查。我的供应商与部署脚本处于同一级别,我认为 composer 缓存导致了很多混乱应该使用哪个位置。清理干净后

composer clear-cache

系统开始按预期运行。

我希望它会帮助某人。

于 2016-05-25T07:08:09.790 回答