我的 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 deploy
又ln -s web2 deploy
重启了Nginx,没有效果。在此之后重新启动 php5-fpm 会给出“TWO”的预期响应。
很高兴知道除了 index.php 文件之外,我还对 .css 和 .js 文件进行了一些测试。在从/到 web1 和 web2 删除并重新创建符号链接后,nginx 将响应文件的正确内容。
我错过了什么,我没有看到什么?