Nginx 虚拟主机缓存符号链接
Nginx vhost cache symlink
我在部署我的应用程序时遇到了问题。我有一个 PHP 应用程序,我使用 Capistrano 将我的应用程序部署到我的服务器。
Capistrano 使用我的应用程序的最新版本创建了一个新的发布文件夹,我的当前文件夹符号链接到该版本。效果很好,它确实链接了最新版本。
但是当我访问我的网站 URL 时,没有任何变化,文件来自旧版本文件夹,即使符号链接链接到当前文件夹(最新版本)也是如此。
Nginx 会缓存我所有的文件吗?或者它是否缓存了我的符号链接,我不知道。
文件夹结构:
current (symlink new release)
releases
new release
old release
虚拟主机:
server {
listen 443;
server_name servname.com;
root /apps/application/production/current/public;
}
问题出在实际路径缓存级别。它使用符号链接路径缓存 PHP 文件。您需要做的是提供真实的文档路径。
您需要在配置文件中添加这两行
fastcgi_param DOCUMENT_ROOT $realpath_root;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
重要的部分是$realpath_root
。
来自文档:
$realpath_root
an absolute pathname corresponding to the root or alias directive’s value for the current request, with all symbolic links resolved to real paths
含义$realpath_root
将所有符号链接解析为它们的真实路径。这是重要的部分。
所以你的location ~ \.php$
会变成
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param DOCUMENT_ROOT $realpath_root;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
}
确保 include fastcgi_params
(如果存在)不会覆盖您刚刚添加的 2 个指令。
我在部署我的应用程序时遇到了问题。我有一个 PHP 应用程序,我使用 Capistrano 将我的应用程序部署到我的服务器。
Capistrano 使用我的应用程序的最新版本创建了一个新的发布文件夹,我的当前文件夹符号链接到该版本。效果很好,它确实链接了最新版本。
但是当我访问我的网站 URL 时,没有任何变化,文件来自旧版本文件夹,即使符号链接链接到当前文件夹(最新版本)也是如此。
Nginx 会缓存我所有的文件吗?或者它是否缓存了我的符号链接,我不知道。
文件夹结构:
current (symlink new release)
releases
new release
old release
虚拟主机:
server {
listen 443;
server_name servname.com;
root /apps/application/production/current/public;
}
问题出在实际路径缓存级别。它使用符号链接路径缓存 PHP 文件。您需要做的是提供真实的文档路径。
您需要在配置文件中添加这两行
fastcgi_param DOCUMENT_ROOT $realpath_root;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
重要的部分是$realpath_root
。
来自文档:
$realpath_root
an absolute pathname corresponding to the root or alias directive’s value for the current request, with all symbolic links resolved to real paths
含义$realpath_root
将所有符号链接解析为它们的真实路径。这是重要的部分。
所以你的location ~ \.php$
会变成
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param DOCUMENT_ROOT $realpath_root;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
}
确保 include fastcgi_params
(如果存在)不会覆盖您刚刚添加的 2 个指令。