symgin แคช Nginx


12

ฉันมีระบบการปรับใช้บนเว็บเซิร์ฟเวอร์ของฉันทุกครั้งที่มีการปรับใช้แอพมันจะสร้างไดเรกทอรีเวลาบันทึกใหม่และ symlink "ปัจจุบัน" ไปยังไดเรกทอรีใหม่ ทั้งหมดนี้ใช้งานได้ดีและยอดเยี่ยมใน apache แต่บนเซิร์ฟเวอร์ nginx ใหม่ที่ฉันได้ตั้งค่าดูเหมือนว่าสคริปต์จากการปรับใช้ "เก่า" จะถูกเรียกใช้แทนที่จะเชื่อมโยงใหม่

ฉันได้อ่านบทช่วยสอนและโพสต์เกี่ยวกับวิธีแก้ไขปัญหานี้ แต่มีข้อมูลไม่มากและดูเหมือนว่าจะไม่มีอะไรทำงาน นี่คือไฟล์ vhost ของฉัน:

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)

คำตอบ:


22

ตัวแปรที่ฝังตัว , $realpath_root: ชื่อพา ธ สัมบูรณ์ที่สอดคล้องกับรากหรือนามแฝง ค่าสั่งสำหรับคำขอปัจจุบันมีการเชื่อมโยงสัญลักษณ์ทั้งหมดมีมติให้เส้นทางจริง

วิธีการแก้ปัญหาการใช้$realpath_rootแทนการ$document_rootคัดลอกวางทั่วเว็บไซต์ Q / A และฟอรั่ม; มันเป็นเรื่องยากจริงเพื่อหลีกเลี่ยงการหา it.Yet ฉันได้เห็นเพียง แต่จะดีอธิบายครั้งโดยRasmus Lerdorf มันคุ้มค่าที่ใช้งานร่วมกันในขณะที่มันอธิบายว่าทำไมการทำงานและเมื่อมันควรจะถูกนำมาใช้

ดังนั้นเมื่อคุณปรับใช้ผ่าน Capistrano ซึ่งทำหน้าที่เป็น symlink swap บนรูทเอกสารคุณต้องการให้คำขอใหม่ทั้งหมดเพื่อรับไฟล์ใหม่ แต่คุณไม่ต้องการไขคำขอที่ดำเนินการอยู่ในขณะที่การปรับใช้เกิดขึ้น สิ่งที่คุณต้องการในการสร้างสภาพแวดล้อมการปรับใช้ที่แข็งแกร่งคือการให้เว็บเซิร์ฟเวอร์ของคุณรับผิดชอบ เว็บเซิร์ฟเวอร์เป็นส่วนหนึ่งของสแต็กที่เข้าใจเมื่อเริ่มคำขอใหม่ แคช opcode อยู่ลึกเกินไปในสแต็กที่จะรู้หรือสนใจ

ด้วย nginx นี่ค่อนข้างง่าย เพียงเพิ่มสิ่งนี้ในการกำหนดค่าของคุณ:

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

สิ่งนี้บอกให้ nginx แก้ไข realpath แก้ไข docroot symlink ซึ่งหมายความว่าตราบใดที่แอปพลิเคชัน PHP ของคุณรู้เป้าหมายของ symlink ถ้า document_root จริง ตอนนี้เมื่อการร้องขอเริ่มขึ้น nginx จะแก้ไข symlink ตามที่ปรากฏ ณ จุดนั้นและในช่วงระยะเวลาของการร้องขอนั้นจะใช้ไดเรกทอรี docroot เดียวกันแม้ว่าสวิตช์ symlink จะเกิดขึ้นในช่วงกลางของการร้องขอ ทั้งหมดนี้กำจัดอาการที่อธิบายไว้ที่นี่และมันเป็นวิธีการที่ถูกต้อง นี่ไม่ใช่สิ่งที่สามารถแก้ไขได้ในระดับ 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 symlink จะได้รับการแก้ไข นี่จะบ่งบอกว่าฉันมีปัญหาการแคช 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 ในการปรับใช้ใช้งานได้สำหรับฉันเรามี bash script สำหรับการปรับใช้ที่ไม่ใช่ Capistrano ฉันคิดว่าเป็นวิธีที่ง่ายกว่าและเป็นวิธีปฏิบัติที่ดีในการล้าง opcache ของคุณในการปรับใช้ต่อไป Esa ขอบคุณสำหรับลิงค์ไปยังความคิดเห็นราสมุสว่าเป็นทองคำ!
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 เมื่อใช้-Nginx

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.