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 个指令。