เมื่อใดที่จะใช้หรือไม่ใช้ sendfile เปิด / ปิดใน Nginx


12

เรามีการตั้งค่านี้ในของเราnginx.confค่อนข้างในขณะที่

sendfile on;

เมื่อเราอัปเดตไฟล์เช่น/js/main.jsและเข้าถึงจากเบราว์เซอร์https://test.com/js/main.js?newrandomtimestampมันจะยังคงโหลดเวอร์ชันเก่ากว่ายกเว้นว่าเราทำการรีเฟรชเต็มรูปแบบ (ล้างแคช) จากเบราว์เซอร์ของเรา

แต่เมื่อเราเปลี่ยนการตั้งค่าจาก sendfile บน; เพื่อ sendfile ปิด; เบราว์เซอร์จะโหลดเวอร์ชันที่ถูกต้องของไฟล์ที่อัปเดต

สำหรับเว็บเซิร์ฟเวอร์ที่ใช้งานจริงเราควรใช้ sendfile หรือ sendfile off ;? หาก sendfile เปิด; เป็นสิ่งจำเป็น (อาจเป็นเหตุผลของการแคชที่ดีกว่าหรือไม่ประสิทธิภาพได้เร็วขึ้น?) แล้ววิธีการแก้ปัญหาดังกล่าวข้างต้น?

ด้านล่างเป็นnginx.confเซิร์ฟเวอร์การผลิตของเราและเราใช้เวอร์ชั่น 1.7.5:

user  nginx;
worker_processes  2;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
worker_rlimit_nofile 51200;

events {
    use epoll;
    worker_connections  51200;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    client_max_body_size 8m;
    sendfile        on;
    keepalive_timeout  65;

    real_ip_header X-Forwarded-For;
    set_real_ip_from 0.0.0.0/0;
    large_client_header_buffers 4 32k;

    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 2;
    gzip_types text/plain application/x-javascript application/javascript text/css application/xml application/json;
    gzip_vary on;


    include /etc/nginx/conf.d/*.conf;
}

เพื่อให้ง่ายขึ้นเราควรรีสตาร์ท nginx ทุกครั้งที่เราปรับใช้ไฟล์ใหม่กับเซิร์ฟเวอร์ที่ใช้งานจริงของเราหรือไม่ หากเราไม่ต้องการรีสตาร์ท nginx เราจะล้างแคช nginx ได้อย่างไร (สมมติว่า sendfile on มีความเกี่ยวข้องกับแคช)
forestclown

nginx ของคุณอยู่ในสภาพแวดล้อมเสมือน (เช่น virtualbox) หรือไม่?
Alexey Ten

เซิร์ฟเวอร์ที่ใช้งานจริงของเราอยู่ที่ Amazon EC2
forestclown

มีรายงานข้อผิดพลาดหลายอย่างเกี่ยวกับsendfileและไดรฟ์ VirtualBox (เช่นvirtualbox.org/ticket/819 ) อาจมีปัญหาคล้ายกับ Amazon
Alexey Ten

ตรวจสอบการตั้งค่าคอนฟิกของ open_file_cache ในขณะที่คุณกดปุ่มแคชภายในที่นี่ คุณสามารถปิดการใช้งานได้อย่างสมบูรณ์หรือลด TTL (open_file_cache_valid) คุณจะพบรายละเอียดเพิ่มเติมได้ที่นี่: nginx.org/en/docs/http/ ...... ปัญหาที่กล่าวถึงที่เชื่อมโยงกับ Virtualbox นั้นเป็นเพราะระบบไฟล์ VBOXSF ที่เฉพาะเจาะจง แต่นี่ไม่ควรเป็นเช่นนั้น ปัญหาที่ทราบอื่น ๆ จะเชื่อมโยงกับระบบไฟล์ NFS ซึ่งยังไม่ได้อยู่ที่นี่
Jens Bradler

คำตอบ:


1

อาจมีวิธีแก้ไขปัญหาการแคชไฟล์ในระดับแอปพลิเคชัน มันเป็นปัญหาที่รู้จักกันดีในโลกการพัฒนา JavaScript การแก้ปัญหามักจะเรียกว่าบางสิ่งบางอย่างเช่น "เอาท์พุท hashing"

แนวคิดพื้นฐานคือการเพิ่มแฮชของเนื้อหาไฟล์ลงในชื่อไฟล์เพื่อให้ไฟล์นั้นถูกพิจารณาว่าเป็น "ใหม่" และไม่พบในแคช

เชิงมุมไม่ได้เวลาที่สร้าง (ดู: --outputHashing)


1

... เว้นแต่ว่าเราจะทำการรีเฟรชเต็มรูปแบบ (ล้างแคช) จากเบราว์เซอร์ของเรา

สิ่งนี้ในตัวมันเองการประกาศที่ชัดเจนว่า "ปัญหา" อยู่บนฝั่งไคลเอ็นต์

sendfile ไม่มีส่วนเกี่ยวข้องกับการแคชเฉพาะวิธีที่ NGINX บัฟเฟอร์ / อ่านไฟล์ (พยายามที่จะบรรจุเนื้อหาลงในช่อง "เครือข่าย" โดยตรงหรือทำการบัฟเฟอร์เนื้อหาก่อน)

คำอธิบายเดียวที่เหมาะสมคือการที่เฉพาะเจาะจงทิ้งเบราว์เซอร์?newrandomtimestampเป็นพารามิเตอร์โดยไม่คุ้มค่าดังนั้นมันโหลดทรัพยากรที่เก็บไว้เหมือนกันสำหรับทั้งสองและexample.com?blahexample.com?boo

หากคุณให้มันลองแล้วhttps://example.com/js/main.js?v=newrandomtimestampโครงการควรให้เนื้อหาใหม่ทุกครั้ง


0

คุณยังใช้การแยกออกจากการแคชไฟล์นี้เช่นเดียวกับฉัน

 location updater/serversettings.xml {
        expires -1;
        add_header 'Cache-Control' 'no-store, no-cache, 
 must-revalidate, proxy-revalidate, max-age=0';
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.