【问题标题】:Nginx vhost cache symlinkNginx 虚拟主机缓存符号链接
【发布时间】:2015-07-02 04:54:11
【问题描述】:

我在部署应用程序时遇到问题。我有一个 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; 
}

【问题讨论】:

  • 我也有同样的问题,也在想办法解决。我发现的解决方法是,如果你在 nginx 文件夹中创建和删除一个文件,它会强制 nginx 指向新的符号链接,但我不喜欢这种方法。

标签: caching nginx deployment capistrano


【解决方案1】:

问题出在实际路径缓存级别。它使用符号链接路径缓存 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 个指令。

【讨论】:

  • 记录一下,虽然解决方案是正确的,但这里的问题不是操作码缓存,而是realpath cache
  • 我已经更新了我的回复并删除了 Opcache 引用。
  • @DanielLucaCleanUnicorn 你能解释一下 $document_root 和 $realpath_root 之间的区别吗?我之前设置了 $docuement_root 并且它不起作用,但您的解决方案对我有用。
  • 我在回答中添加了关于 realpath_root 的评论。它解决了所有指向其真实路径的符号链接。
猜你喜欢
  • 2014-11-12
  • 1970-01-01
  • 2011-03-03
  • 2016-05-12
  • 2013-09-18
  • 1970-01-01
  • 2016-09-19
  • 2020-09-29
相关资源
最近更新 更多