Мой корень сайта 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
- ожидаемый ответ: TWOli >
- фактический ответ: 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 deploy
и ln -s web2 deploy
Nginx был перезапущен, никакого эффекта.
Перезапуск php5-fpm после этого дает ожидаемый ответ "TWO".
Хорошо знать, что рядом с файлами index.php я сделал некоторый тест с файлами .css и .js. После удаления и повторного создания символической ссылки из/в web1 и web2, nginx ответит правильным содержимым файлов.
Что я пропустил, чего не вижу?