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

2022-08-30 17:10:59

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

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

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

实用信息:

  • OS: Ubuntu 13.10 (GNU/Linux 3.8.0-19-generic x86_64)
  • Nginx: via ppa:nginx/stable
  • PHP: via ppa:ondrej/php5 (php5-fpm)

Nginx site config:

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
)

所以这个意思是正确链接到,对吧?好吧,即使realpath_cache列表中有正确的路径,respone仍然是ONE。deploy/public/index.phpweb2/public/index.php

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

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

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


答案 1

使用$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)的荣誉


答案 2

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

在对 php-fpm 的加载模组进行一些挖掘后,我发现 opcache 已启动并运行。禁用该功能将在 ttl 结束时清除缓存的 realpath。

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


推荐