Liên kết bộ nhớ đệm Nginx


12

Tôi có một hệ thống triển khai trên máy chủ web của mình, mỗi khi một ứng dụng được triển khai, nó sẽ tạo một thư mục dấu thời gian mới và các liên kết tượng trưng "hiện tại" sang thư mục mới. Tất cả đều hoạt động tốt và tuyệt vời trên apache, nhưng trên máy chủ nginx mới tôi đã thiết lập, có vẻ như một tập lệnh từ triển khai "cũ" đang được chạy thay vì tập lệnh liên kết mới.

Tôi đã đọc một số hướng dẫn và bài viết về cách giải quyết vấn đề này nhưng không có nhiều thông tin và dường như không có gì để làm việc. Đây là tập tin vhost của tôi:

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;
    }
}

và đây là fastcgi_params của tôi:

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;

Tôi thực sự sẽ đánh giá cao nếu ai đó có thể giúp tôi với điều này vì hiện tại mọi triển khai đều liên quan đến việc xóa triển khai trước đó. Hệ thống là Ubuntu 14.04.5 LTS; PHP 7.1; Nginx nginx / 1.4.6 (Ubuntu)

Câu trả lời:


22

Các biến được nhúng , $realpath_root: một tên đường dẫn tuyệt đối tương ứng với giá trị của lệnh gốc hoặc bí danh cho yêu cầu hiện tại, với tất cả các liên kết tượng trưng được phân giải thành các đường dẫn thực

Giải pháp sử dụng $realpath_rootthay vì $document_rootđược dán sao chép xung quanh các trang web và diễn đàn Q / A; Thật sự rất khó để tránh việc tìm kiếm nó. Tuy nhiên, tôi chỉ thấy Rasmus Lerdorf giải thích rõ ràng một lần . Nó đáng để chia sẻ vì nó mô tả lý do tại sao nó hoạt động và khi nào nó nên được sử dụng.

Vì vậy, khi bạn triển khai thông qua một cái gì đó như Capistrano thực hiện trao đổi symlink trên thư mục gốc, bạn muốn tất cả các yêu cầu mới nhận được các tệp mới, nhưng bạn không muốn vượt qua các yêu cầu hiện đang thực hiện khi triển khai đang diễn ra. Những gì bạn thực sự cần để tạo ra một môi trường triển khai mạnh mẽ là để máy chủ web của bạn chịu trách nhiệm về việc này. Máy chủ web là phần của ngăn xếp hiểu được khi yêu cầu mới bắt đầu. Bộ đệm opcode quá sâu trong ngăn xếp để biết hoặc quan tâm đến điều đó.

Với nginx điều này khá đơn giản. Chỉ cần thêm nó vào cấu hình của bạn:

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

Điều này cho nginx biết realpath giải quyết symlink symroot có nghĩa là theo như ứng dụng PHP của bạn biết, mục tiêu của symlink nếu document_root thực. Bây giờ, khi một yêu cầu bắt đầu, nginx sẽ giải quyết liên kết tượng trưng khi nó đứng ở điểm đó và trong thời gian yêu cầu, nó sẽ sử dụng cùng một thư mục docroot, ngay cả khi chuyển đổi liên kết tượng trưng xảy ra giữa yêu cầu. Điều này hoàn toàn loại bỏ các triệu chứng được mô tả ở đây và đó là cách tiếp cận chính xác. Đây không phải là một cái gì đó có thể được giải quyết ở cấp độ opcache.

K Biếnk Dudeja có vấn đề với điều này và thêm một thông báo hữu ích: đảm bảo những thay đổi này sẽ thực sự ở cấu hình cuối cùng, tức là sau include fastcgi_params;đó sẽ ghi đè lên chúng.


Xin chào, đây là một câu trả lời tuyệt vời, nhưng nếu bạn nhận thấy trong cấu hình của mình, tôi có fastcgi_param DOCUMENT_ROOT $ realpath_root; fastcgi_param SCRIPT_FILENAME $ document_root $ fastcgi_script_name; bao gồm sau fastcgi_params, và điều này thực sự không có ích. Khi tôi khởi động lại php-fpm, các liên kết tượng trưng được giải quyết. Điều này sẽ chỉ ra rằng tôi có một vấn đề bộ đệm php thay thế?
Auris

Xem lại. Bạn SCRIPT_FILENAME$document_root, không $realpath_root.
Esa Jokinen

Hmm ... nhưng DOCUMENT_ROOTđược đặt $realpath_roottheo cách tôi hiểu, nó sẽ kéo giá trị hoặc tôi hoàn toàn sai và DOCUMENT_ROOTkhông liên quan đến$document_root
Auris

1
Xin chào, cảm ơn bạn rất nhiều vì câu trả lời của bạn và lời giải thích của bạn, sai lầm của tôi là giả định DOCUMENT_ROOTảnh hưởng$document root
Auris

2
Tôi đang sử dụng Apache + php-fpm trên các máy chủ có vấn đề này và việc xóa opcached khi triển khai làm việc cho tôi, chúng tôi có một tập lệnh bash để triển khai chứ không phải Capistrano. Tôi nghĩ là một giải pháp đơn giản hơn và đó là một cách thực hành tốt để xóa opcache của bạn khi triển khai. Esa cảm ơn vì liên kết đến bình luận Rasmus đó là vàng!
Carlos Mafla

3

Từ /unix/157022/make-nginx-follow-symlinks , có vẻ như bạn có thể giải quyết vấn đề bằng cách thay đổi

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

đến

fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;

(tức là thay đổi đường dẫn từ $document_rootđến $realpath_root).

Hiện tại tôi không có quyền truy cập vào máy chủ nginx để xác nhận điều này (máy chủ tại nhà của tôi hiện đang được xây dựng lại), nhưng giải pháp dường như được cộng tác bởi https://medium.com/@k Biếnkdudeja / truly-aticic-depepments -với-nginx-và-php-fpm-aed8a8ac1cd9 .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.