Nginx 캐싱 심볼릭 링크


12

웹 서버에 배포 시스템이 있는데, 앱을 배포 할 때마다 타임 스탬프가 지정된 새로운 디렉토리가 생성되고 새 디렉토리에 "현재"심볼릭 링크가 생성됩니다. 이 모든 것은 아파치에서 훌륭하고 훌륭하게 작동했지만, 내가 설정 한 새로운 nginx 서버에서는 새로운 심볼릭 링크가 아닌 "오래된"배치의 스크립트가 실행되는 것처럼 보입니다.

이 문제를 해결하는 방법에 대한 자습서와 게시물을 읽었지만 많은 정보가 없으며 아무것도 작동하지 않는 것 같습니다. 내 호스트 파일은 다음과 같습니다.

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 (우분투)

답변:


22

임베디드 변수 , $realpath_root다음에 해당하는 절대 경로 루트 또는 별칭 현재 요청에 대한 지침의 가치, 모든 심볼릭 링크와 실제 경로로 해결

$realpath_root대신 에 사용 하는 솔루션은 $document_rootQ / A 사이트 및 포럼 전체에 복사 붙여 넣기됩니다. 실제로 그것을 찾기를 피하기는 어렵지만 아직 Rasmus Lerdorf가 한 번만 잘 설명 했습니다 . 작동하는 이유 와 사용 시기를 설명하므로 공유 할 가치 가 있습니다.

따라서 문서 루트에서 심볼릭 링크 스왑을 수행하는 Capistrano와 같은 것을 통해 배포 할 때 모든 새 요청이 새 파일을 가져 오길 원하지만 배포가 진행되는 동안 현재 실행중인 요청을 망가 뜨리고 싶지는 않습니다. 강력한 배포 환경을 만드는 데 실제로 필요한 것은 웹 서버가이를 담당하는 것입니다. 웹 서버는 새 요청이 언제 시작되는지 이해하는 스택입니다. opcode 캐시가 스택에서 너무 깊어서이를 알고 관리 할 수 ​​없습니다.

nginx를 사용하면 이것은 매우 간단합니다. 이것을 구성에 추가하십시오.

fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;

이것은 nginx에게 docroot symlink를 realpath로 해석하도록 지시합니다. PHP 응용 프로그램이 아는 한, 실제 document_root 인 경우 symlink의 대상입니다. 이제 요청이 시작되면 nginx는 해당 지점에있는대로 심볼릭 링크를 확인하고 요청 기간 동안 심볼릭 링크 전환 요청이 발생하더라도 동일한 docroot 디렉토리를 사용합니다. 이것은 여기에 설명 된 증상을 완전히 제거하며 올바른 접근 방법입니다. 이것은 opcache 수준에서 해결할 수있는 것이 아닙니다.

Kanishk Dudeja 는 이것에 문제있었고 유용한 알림을 추가했습니다. 이러한 변경 사항이 실제로 최종 구성 상태인지 확인하십시오 include fastcgi_params;.


안녕하세요, 이것은 훌륭한 답변이지만 내 구성에서 fastcgi_param DOCUMENT_ROOT $ realpath_root를 발견했습니다. fastcgi_param SCRIPT_FILENAME $ document_root $ fastcgi_script_name; fastcgi_params 뒤에 포함되며 실제로 도움이되지 않습니다. php-fpm을 다시 시작하면 심볼릭 링크가 해결됩니다. 이것은 대신 PHP 캐싱 문제가 있음을 나타 냅니까?
Auris

수정하십시오. 당신 SCRIPT_FILENAME$document_root하지 않습니다 $realpath_root.
Esa Jokinen

흠 ...하지만 내가 이해하는 방식으로 DOCUMENT_ROOT설정되었습니다 $realpath_root, 그것은 가치를 끌어 당겨야합니다 또는 내가 완전히 잘못하고 DOCUMENT_ROOT관련이 없습니다$document_root
Auris

1
안녕하세요, 귀하의 답변과 설명에 대단히 감사합니다. 제 실수는 DOCUMENT_ROOT영향 을받는 가정이었습니다$document root
Auris

2
이 문제가있는 서버에서 Apache + php-fpm을 사용하고 있으며 배포시 opcached를 지우면 Capistrano가 아닌 배포를위한 bash 스크립트가 있습니다. 더 간단한 솔루션이라고 생각하며 배포시 opcache를 지우는 것이 좋습니다. 금의 Rasmus 의견에 대한 링크 감사합니다!
Carlos Mafla

3

에서 /unix/157022/make-nginx-follow-symlinks , 당신이 변경하여 문제를 해결할 수있을 것 같다

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;

(경로를에서 $document_root로 변경 $realpath_root).

현재 nginx 서버에 액세스하여이를 확인 할 수는 없지만 (내 홈 서버는 현재 재구성 중입니다) https://medium.com/@kanishkdudeja/truly-atomic-deployments -with-nginx-and-php-fpm-aed8a8ac1cd9 입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.