我的Web服务器上有一个部署系统,每次部署一个应用程序时,它会创build一个新的时间戳目录,并将“当前”符号链接到新目录。 在apache上这一切都很好,但是在我设置的新的nginx服务器上,它看起来像是一个来自“旧”部署的脚本,而不是新的符号链接的脚本。
我已经阅读了一些教程和post,如何解决这个问题,但没有太多的信息,似乎没有任何工作。 这是我的虚拟主机文件:
server { listen 80; server_name ~^(www\.)?(?<sname>.+?).testing.domain.com$; root /var/www/$sname/current/public; index index.html index.htm index.php; location / { try_files $uri $uri/ /index.php$is_args$args; } location ~* \.(jpg|jpeg|gif|png|bmp|ico|pdf|flv|swf|exe|html|htm|txt|css|js) { add_header Cache-Control public; add_header Cache-Control must-revalidate; expires 7d; } location ~ \.php$ { #fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php/php7.1-fpm.sock; include fastcgi_params; fastcgi_param DOCUMENT_ROOT $realpath_root; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_index index.php; } location ~ /\.ht { deny all; } }
这里是我的fastcgi_params:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $realpath_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; fastcgi_param HTTPS $https if_not_empty; # PHP only, required if PHP was built with --enable-force-cgi-redirect fastcgi_param REDIRECT_STATUS 200; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
我真的很感激,如果有人可以帮助我,因为目前每个部署都涉及删除以前的部署。 系统是Ubuntu 14.04.5 LTS; PHP 7.1; Nginx的nginx / 1.4.6(Ubuntu)
embedded式variables
$realpath_root:与当前请求的根或别名指令值相对应的绝对path名,所有符号链接都parsing为实际path
使用$realpath_root而不是$document_root的解决scheme是在Q / A网站和论坛中复制粘贴的; 实际上很难避免find它。但是,我只看到了一次由Rasmus Lerdorf 解释清楚。 这是值得分享,因为它描述了为什么它的工作原理和时间应该使用。
所以,当你通过像Capistrano这样的在文档根目录上进行符号链接交换来部署的时候,你希望所有新的请求都能得到新的文件,但是你不想在部署正在进行的时候执行当前正在执行的请求。 您真正需要创build一个强大的部署环境是让您的Web服务器负责这一点。 Web服务器是当新的请求开始时可以理解的栈的一部分。 操作码caching太深,无法知道或关心。
用nginx这个很简单。 只需将此添加到您的configuration:
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; fastcgi_param DOCUMENT_ROOT $realpath_root;这告诉nginx realpath解决docroot符号链接的含义,就像你的PHP应用程序所知道的那样,符号链接的目标是真正的document_root。 现在,一旦请求开始,nginx将parsing符号链接,并且在请求期间它将使用相同的docroot目录,即使符号链接交换发生在请求中。 这完全消除了这里描述的症状,这是正确的方法。 这不是在opcache级别可以解决的问题。
Kanishk Dudeja 遇到了问题 ,并添加了一个有用的通知:确保这些更改实际上是在最终configuration中,即在include fastcgi_params; 否则将会覆盖它们。
从https://unix.stackexchange.com/questions/157022/make-nginx-follow-symlinks ,似乎你可以通过更改解决该问题
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
至
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
(即将path从$document_root更改为$realpath_root )。
我目前无法访问nginx服务器来确认这一点(我的家庭服务器目前正在进行重build),但解决scheme似乎是通过https://medium.com/@kanishkdudeja/truly-atomic-deployments -with-nginx-and-php-fpm-aed8a8ac1cd9 。