ค้นหาเว็บไซต์

วิธีแคชเนื้อหาใน NGINX


NGINX เป็นเว็บเซิร์ฟเวอร์โอเพ่นซอร์สประสิทธิภาพสูงแบบรวมที่เร่งความเร็วในการส่งเนื้อหาและแอปพลิเคชัน ปรับปรุงความปลอดภัย และปรับปรุงความสามารถในการปรับขนาด กรณีการใช้งานที่พบบ่อยที่สุดกรณีหนึ่งของ Nginx คือ การแคชเนื้อหา ซึ่งเป็นวิธีที่มีประสิทธิภาพสูงสุดในการเพิ่มประสิทธิภาพของเว็บไซต์

อ่านเพิ่มเติม: เครื่องมือแคชโอเพ่นซอร์สยอดนิยม 10 อันดับสำหรับ Linux

คุณสามารถใช้ NGINX เพื่อเร่งความเร็วเซิร์ฟเวอร์ต้นทางในเครื่องได้โดยการกำหนดค่าให้แคชการตอบสนองจากเซิร์ฟเวอร์อัปสตรีม และเพื่อสร้างเซิร์ฟเวอร์ Edge สำหรับเครือข่ายการนำส่งเนื้อหา (CDNs) NGINX ขับเคลื่อน CDN ที่ใหญ่ที่สุดบางแห่ง

เมื่อกำหนดค่าเป็นแคช NGINX จะ:

  • แคชเนื้อหาแบบคงที่และไดนามิก
  • ปรับปรุงประสิทธิภาพเนื้อหาแบบไดนามิกด้วยไมโครแคช
  • ให้บริการเนื้อหาเก่าในขณะที่ตรวจสอบอีกครั้งในเบื้องหลังเพื่อประสิทธิภาพที่ดีขึ้น
  • แทนที่หรือตั้งค่าส่วนหัว Cache-Control และอื่นๆ

ในบทความนี้ คุณจะได้เรียนรู้วิธีกำหนดค่า NGINX เป็น การแคชเนื้อหา ใน Linux เพื่อให้เว็บเซิร์ฟเวอร์ของคุณทำงานได้อย่างมีประสิทธิภาพมากที่สุด

ข้อกำหนดเบื้องต้น:

คุณควรติดตั้ง NGINX บนเซิร์ฟเวอร์ Linux ของคุณ หากไม่ทำตามคำแนะนำเหล่านี้เพื่อติดตั้ง Nginx:

  • วิธีการติดตั้ง Nginx บน CentOS 8
  • วิธีการติดตั้ง Nginx บน CentOS 7

แคชเนื้อหาแบบคงที่บน Nginx

เนื้อหาแบบคงที่คือเนื้อหาของเว็บไซต์ที่ยังคงเหมือนเดิม (ไม่มีการเปลี่ยนแปลง) ในแต่ละหน้า ตัวอย่างของเนื้อหาแบบคงที่ ได้แก่ ไฟล์ต่างๆ เช่น รูปภาพ วิดีโอ เอกสาร ไฟล์ CSS และไฟล์ JavaScript

หากเว็บไซต์ของคุณใช้เนื้อหาคงที่จำนวนมาก คุณสามารถปรับประสิทธิภาพให้เหมาะสมได้โดยเปิดใช้งานการแคชฝั่งไคลเอ็นต์ โดยที่เบราว์เซอร์จะจัดเก็บสำเนาของเนื้อหาคงที่เพื่อการเข้าถึงที่รวดเร็วยิ่งขึ้น

ตัวอย่างการกำหนดค่าต่อไปนี้ใช้งานได้ดี เพียงแทนที่ www.example.com ด้วย URL ของชื่อเว็บไซต์ของคุณ และทำการแก้ไขชื่อพาธอื่นๆ ตามความเหมาะสม

server {
    # substitute your web server's URL for www.example.com
    server_name www.example.com;
    root /var/www/example.com/htdocs;
    index index.php;

    access_log /var/log/nginx/example.com.access.log;
    error_log /var/log/nginx/example.com.error.log;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ .php$ {
        try_files $uri =404;
        include fastcgi_params;
        # substitute the socket, or address and port, of your WordPress server
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        #fastcgi_pass 127.0.0.1:9000;
 	}   

    location ~* .(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg
                  |jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid
                  |midi|wav|bmp|rtf)$ {
        expires max;
        log_not_found off;
        access_log off;
    }
}

แคชเนื้อหาไดนามิกบน Nginx

NGINX ใช้แคชบนดิสก์ถาวรซึ่งอยู่ที่ไหนสักแห่งในระบบไฟล์ในเครื่อง ดังนั้นให้เริ่มต้นด้วยการสร้างไดเร็กทอรีดิสก์ในเครื่องสำหรับจัดเก็บเนื้อหาที่แคชไว้
# mkdir -p /var/cache/nginx

ถัดไป ตั้งค่าความเป็นเจ้าของที่เหมาะสมในไดเร็กทอรีแคช ผู้ใช้ NGINX (nginx) และกลุ่ม (nginx) ควรเป็นเจ้าของดังนี้

chown nginx:nginx /var/cache/nginx

ดำเนินการต่อเพื่อดูวิธีเปิดใช้งานเนื้อหาแบบไดนามิกบน Nginx ในส่วนด้านล่าง

การเปิดใช้งานแคช FastCGI ใน NGINX

FastCGI (หรือ FCGI) เป็นโปรโตคอลที่ใช้กันอย่างแพร่หลายสำหรับการเชื่อมต่อแอปพลิเคชันแบบโต้ตอบ เช่น PHP กับเว็บเซิร์ฟเวอร์ เช่น NGINX. เป็นส่วนขยายของ CGI (Common Gateway Interface)

ข้อได้เปรียบหลักของ FCGI คือสามารถจัดการคำขอ CGI หลายรายการในกระบวนการเดียว หากไม่มีสิ่งนี้ เว็บเซิร์ฟเวอร์จะต้องเปิดกระบวนการใหม่ (ที่ต้องควบคุม ประมวลผลคำขอ และปิด) สำหรับทุกคำขอของลูกค้าสำหรับบริการ

ในการประมวลผลสคริปต์ PHP ในการปรับใช้ LEMP stack นั้น NGINX จะใช้ FPM (FastCGI Process Manager) หรือ PHP-FPM ซึ่งเป็นการนำ PHP FastCGI ทางเลือกยอดนิยมมาใช้ เมื่อกระบวนการ PHP-FPM ทำงาน NGINX จะถูกกำหนดค่าให้ส่งคำขอพร็อกซีเพื่อประมวลผล ดังนั้น NGINX ยังสามารถกำหนดค่าให้แคชการตอบสนองจากแอปพลิเคชันเซิร์ฟเวอร์แบ็กเอนด์ PHP-FPM ได้ด้วย

ภายใต้ NGINX แคชเนื้อหา FastCGI จะถูกประกาศโดยใช้คำสั่งที่เรียกว่า fastcgi_cache_path ใน http{} ระดับบนสุด บริบทภายในโครงสร้างการกำหนดค่า NGINX คุณยังสามารถเพิ่ม fastcgi_cache_key ซึ่งกำหนดคีย์ (ตัวระบุคำขอ) สำหรับการแคช

นอกจากนี้ หากต้องการอ่านสถานะอัปสตรีมแคช ให้เพิ่มคำสั่ง add_header X-Cache-Status ภายในบริบท http{} ซึ่งมีประโยชน์สำหรับวัตถุประสงค์ในการแก้ไขจุดบกพร่อง

สมมติว่าไฟล์การกำหนดค่าบล็อกเซิร์ฟเวอร์ของไซต์ของคุณอยู่ที่ /etc/nginx/conf.d/testapp.conf หรือ /etc/nginx/sites-available/testapp.conf ( ภายใต้ Ubuntu และอนุพันธ์) ให้เปิดไฟล์แก้ไขและเพิ่มบรรทัดต่อไปนี้ที่ด้านบนของไฟล์

fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=CACHEZONE:10m; inactive=60m max_size=40m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
add_header X-Cache $upstream_cache_status;

คำสั่ง fastcgi_cache_path ระบุจำนวนพารามิเตอร์ซึ่งได้แก่:

  • /var/cache/nginx - เส้นทางไปยังไดเร็กทอรีดิสก์ในเครื่องสำหรับแคช
  • ระดับ – กำหนดระดับลำดับชั้นของแคช โดยจะตั้งค่าลำดับชั้นไดเรกทอรีสองระดับภายใต้ /var/cache/nginx
  • keys_zone (name:size) – เปิดใช้งานการสร้างโซนหน่วยความจำที่ใช้ร่วมกันซึ่งจัดเก็บคีย์ที่ใช้งานอยู่และข้อมูลเกี่ยวกับข้อมูล (เมตา) ทั้งหมด โปรดทราบว่าการเก็บคีย์ไว้ในหน่วยความจำจะเร่งกระบวนการตรวจสอบให้เร็วขึ้น โดยทำให้ NGINX พิจารณาว่าเป็น MISS หรือ HIT ได้ง่ายขึ้น โดยไม่ต้องตรวจสอบสถานะบนดิสก์
  • ไม่ใช้งาน – ระบุระยะเวลาที่ข้อมูลที่แคชไว้ซึ่งไม่เข้าถึงในช่วงเวลาที่ระบุจะถูกลบออกจากแคชโดยไม่คำนึงถึงความสดใหม่ ค่า 60m ในการกำหนดค่าตัวอย่างของเราหมายความว่าไฟล์ที่ไม่เข้าถึงหลังจาก 60 จะถูกลบออกจากแคช
  • max_size – ระบุขนาดสูงสุดของแคช มีพารามิเตอร์เพิ่มเติมที่คุณสามารถใช้ได้ที่นี่ (อ่านเอกสาร NGINX สำหรับข้อมูลเพิ่มเติม)

ตัวแปรในคำสั่ง fastcgi_cache_key มีอธิบายไว้ด้านล่างนี้

NGINX ใช้ในการคำนวณคีย์ (ตัวระบุ) ของคำขอ ที่สำคัญ หากต้องการส่งการตอบกลับที่แคชไว้ไปยังไคลเอนต์ คำขอจะต้องมีคีย์เดียวกันกับการตอบกลับที่แคชไว้

  • $scheme – รูปแบบคำขอ HTTP หรือ HTTPS
  • $request_method – วิธีการร้องขอ โดยปกติจะเป็น “GET ” หรือ “POST
  • $host – อาจเป็นชื่อโฮสต์จากบรรทัดคำขอ หรือชื่อโฮสต์จากช่องส่วนหัวคำขอ “โฮสต์ ” หรือชื่อเซิร์ฟเวอร์ที่ตรงกับคำขอ โดยเรียงตามลำดับความสำคัญ .
  • $request_uri – หมายถึง URI คำขอดั้งเดิมแบบเต็ม (พร้อมอาร์กิวเมนต์)

นอกจากนี้ ตัวแปร $upstream_cache_status ในคำสั่ง add_header X-Cache-Status จะได้รับการคำนวณสำหรับแต่ละคำขอที่ NGINX ตอบสนอง ไม่ว่าจะเป็น MISS (ไม่พบการตอบสนองในแคช ได้รับจากแอปพลิเคชันเซิร์ฟเวอร์) หรือ HIT (การตอบสนองเสิร์ฟจากแคช) หรือค่าอื่นๆ ที่สนับสนุน

ถัดไป ภายในคำสั่ง location ซึ่งส่งคำขอ PHP ไปยัง PHP-FPM ให้ใช้คำสั่ง fastcgi_cache เพื่อเปิดใช้งานแคชที่คุณเพิ่งกำหนดไว้ข้างต้น

ตั้งเวลาแคชสำหรับการตอบกลับที่แตกต่างกันโดยใช้คำสั่ง fastcgi_cache_valid ดังที่แสดง

fastcgi_cache CACHEZONE;
fastcgi_cache_valid  60m;

หากระบุเฉพาะเวลาแคชในกรณีของเรา ระบบจะแคชการตอบสนองเพียง 200, 301 และ 302 เท่านั้น แต่คุณยังสามารถระบุคำตอบได้อย่างชัดเจนหรือใช้อย่างใดอย่างหนึ่ง (สำหรับรหัสตอบกลับใด ๆ ):

fastcgi_cache CACHEZONE;
fastcgi_cache_valid 200  301 203 60m;
fastcgi_cache_valid 404 10m;
OR
fastcgi_cache CACHEZONE;
fastcgi_cache_valid  any 10m;

การปรับแต่งประสิทธิภาพการแคช FastCGI อย่างละเอียดบน Nginx

หากต้องการกำหนดจำนวนครั้งขั้นต่ำที่ต้องส่งคำขอด้วยคีย์เดียวกันก่อนที่การตอบกลับจะถูกแคช ให้รวมคำสั่ง fastcgi_cache_min_uses ไว้ใน http{} หรือ เซิร์ฟเวอร์{} หรือบริบท ตำแหน่ง{}

fastcgi_cache_min_uses  3

หากต้องการเปิดใช้งานการตรวจสอบความถูกต้องอีกครั้งของรายการแคชที่หมดอายุโดยใช้คำขอแบบมีเงื่อนไขพร้อมกับฟิลด์ส่วนหัว “If-Modified-Since ” และ “If-None-Match ” ให้เพิ่ม fastcgi_cache_revalidate ภายในบริบท http{} หรือ server{} หรือ location{}

fastcgi_cache_revalidate on;

คุณยังสามารถสั่งให้ NGINX ส่งเนื้อหาที่แคชไว้เมื่อเซิร์ฟเวอร์ต้นทางหรือเซิร์ฟเวอร์ FCGI หยุดทำงาน โดยใช้คำสั่ง proxy_cache_use_stale ภายในคำสั่งตำแหน่ง

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

proxy_cache_use_stale error timeout http_500;

คำสั่งที่มีประโยชน์อีกประการหนึ่งในการปรับแต่งประสิทธิภาพแคช FCGI อย่างละเอียดคือ fastcgi_cache_ground_update ซึ่งทำงานร่วมกับคำสั่ง proxy_cache_use_stale เมื่อตั้งค่าเป็นเปิด ระบบจะสั่งให้ NGINX ให้บริการเนื้อหาเก่าเมื่อไคลเอนต์ร้องขอไฟล์ที่หมดอายุหรืออยู่ระหว่างการอัปเดตจากเซิร์ฟเวอร์อัปสตรีม

fastcgi_cache_background_update on;

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

fastcgi_cache_lock on;

หลังจากทำการเปลี่ยนแปลงข้างต้นทั้งหมดในไฟล์การกำหนดค่า NGINX แล้ว ให้บันทึกและปิด จากนั้นตรวจสอบโครงสร้างการกำหนดค่าเพื่อหาข้อผิดพลาดทางไวยากรณ์ก่อนเริ่มบริการ NGINX ใหม่

nginx -t
systemctl restart nginx

ถัดไป ทดสอบว่าแคชทำงานอย่างถูกต้องหรือไม่ ลองเข้าถึงเว็บแอปพลิเคชันหรือไซต์ของคุณโดยใช้คำสั่ง curl ต่อไปนี้ (ครั้งแรกควรระบุว่า พลาด แต่คำขอครั้งต่อไปควรระบุ HIT ดังที่แสดงในภาพหน้าจอ)

curl -I http://testapp.linux-console.net

นี่คือภาพหน้าจออื่นที่แสดง NGINX ที่ให้บริการข้อมูลเก่า

การเพิ่มข้อยกเว้นให้กับ Bypass Cache

คุณสามารถกำหนดเงื่อนไขที่ NGINX ไม่ควรส่งการตอบกลับที่แคชไว้ไปยังไคลเอนต์ได้ โดยใช้คำสั่ง fastcgi_cache_bypass และหากต้องการสั่ง NGINX ไม่ให้แคชการตอบสนองจากเซิร์ฟเวอร์อัปสตรีมเลย ให้ใช้ fastcgi_no_cache

ตัวอย่างเช่น หากคุณต้องการให้คำขอ POST และ URL ที่มีสตริงข้อความค้นหาไปที่ PHP เสมอ ขั้นแรก ให้ประกาศคำสั่ง if เพื่อกำหนดเงื่อนไขดังต่อไปนี้

set $skip_cache 0; 
if ($request_method = POST) { 
	set $skip_cache 1; 
} 

จากนั้นเปิดใช้งานข้อยกเว้นข้างต้นในคำสั่ง location ซึ่งส่งคำขอ PHP ไปยัง PHP-FPM โดยใช้ fastcgi_cache_bypass และ fastcgi_no_cache คำสั่ง

 
fastcgi_cache_bypass $skip_cache; 
fastcgi_no_cache $skip_cache;

มีส่วนอื่นๆ มากมายในไซต์ของคุณที่คุณอาจไม่ต้องการเปิดใช้งานการแคชเนื้อหา ต่อไปนี้คือตัวอย่างการกำหนดค่า NGINX เพื่อปรับปรุงประสิทธิภาพของไซต์ WordPress ซึ่งมีอยู่ในบล็อก nginx.com

หากต้องการใช้งาน ให้ทำการเปลี่ยนแปลง (เช่น โดเมน เส้นทาง ชื่อไฟล์ ฯลฯ) เพื่อให้สะท้อนถึงสิ่งที่มีอยู่ในสภาพแวดล้อมของคุณ

fastcgi_cache_path /var/run/NGINX-cache levels=1:2 keys_zone=WORDPRESS:100m inactive=60m; 
fastcgi_cache_key "$scheme$request_method$host$request_uri"; 
server { 
	server_name example.com www.example.com; 
	root /var/www/example.com; 
	index index.php; 
	access_log /var/log/NGINX/example.com.access.log; 
	error_log /var/log/NGINX/example.com.error.log; 
	set $skip_cache 0; 
	# POST requests and URLs with a query string should always go to PHP 	
	if ($request_method = POST) { 
		set $skip_cache 1; 
	} 
	if ($query_string != "") {
		set $skip_cache 1; 
	} 
	# Don't cache URIs containing the following segments 
	if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php |sitemap(_index)?.xml") { 
		set $skip_cache 1; 
	} 
	# Don't use the cache for logged-in users or recent commenters 
	if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass |wordpress_no_cache|wordpress_logged_in") {
		set $skip_cache 1; 
	} 
	location / { 
		try_files $uri $uri/ /index.php?$args; 
	} 
	location ~ .php$ { 
		try_files $uri /index.php; 
		include fastcgi_params; 
		fastcgi_pass unix:/var/run/php5-fpm.sock; 
		fastcgi_cache_bypass $skip_cache; 
		fastcgi_no_cache $skip_cache; 
		fastcgi_cache WORDPRESS; 
		fastcgi_cache_valid 60m; 
	} 
	location ~ /purge(/.*) {
		fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1"; 
	} 
	location ~* ^.+.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg |gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi |wav|bmp|rtf)$ { 
		access_log off; 
		log_not_found off; 
		expires max; 
	} 
	location = /robots.txt { 
		access_log off; 
		log_not_found off; 
	}
	location ~ /. { 
		deny all; 
		access_log off; 
		log_not_found off; 
	} 
}

การเปิดใช้งานพร็อกซีแคชใน NGINX

NGINX ยังสนับสนุนการแคชการตอบสนองจากเซิร์ฟเวอร์พร็อกซีอื่นๆ (กำหนดโดยคำสั่ง proxy_pass) สำหรับกรณีทดสอบนี้ เราใช้ NGINX เป็นพร็อกซีย้อนกลับสำหรับเว็บแอปพลิเคชัน Node.js ดังนั้นเราจะเปิดใช้งาน NGINX เป็นแคชสำหรับแอปพลิเคชัน Node.js คำสั่งการกำหนดค่าทั้งหมดที่ใช้ในที่นี้มีความหมายคล้ายกับคำสั่ง FastCGI ในส่วนก่อนหน้า ดังนั้นเราจะไม่อธิบายอีกครั้ง

หากต้องการเปิดใช้งานการแคชการตอบสนองจากเซิร์ฟเวอร์พร็อกซี ให้รวมคำสั่ง proxy_cache_path ในบริบท http{} ระดับบนสุด หากต้องการระบุวิธีการแคชคำขอ คุณสามารถเพิ่มคำสั่ง proxy_cache_key ได้ดังต่อไปนี้

proxy_cache_path /var/cache/nginx app1 keys_zone=PROXYCACHE:100m inactive=60m max_size=500m;
proxy_cache_key  "$scheme$request_method$host$request_uri";
add_header X-Cache-Status $upstream_cache_status;
proxy_cache_min_uses 3;

ถัดไป เปิดใช้งานแคชในคำสั่งตำแหน่ง

location / {
	proxy_pass http://127.0.0.1:3000;
	proxy_cache        PROXYCACHE;
	proxy_cache_valid 200 302 10m;
	proxy_cache_valid 404      1m;
}

หากต้องการกำหนดเงื่อนไขที่ NGINX จะไม่ส่งเนื้อหาที่แคชไว้และไม่แคชการตอบสนองเลยจากเซิร์ฟเวอร์อัปสตรีม ให้รวม proxy_cache_bypass และ proxy_no_cache

 
proxy_cache_bypass  $cookie_nocache $arg_nocache$arg_comment;
proxy_no_cache        $http_pragma $http_authorization;

การปรับแต่งประสิทธิภาพแคชพร็อกซีอย่างละเอียด

คำสั่งต่อไปนี้มีประโยชน์สำหรับการปรับแต่งประสิทธิภาพของแคชพร็อกซีอย่างละเอียด นอกจากนี้ยังมีความหมายเช่นเดียวกับคำสั่ง FastCGI

proxy_cache_min_uses 3;
proxy_cache_revalidate on;
proxy_cache_use_stale error timeout updating http_500;
proxy_cache_background_update on;
proxy_cache_lock on;

สำหรับข้อมูลเพิ่มเติมและคำสั่งการกำหนดค่าแคช โปรดดูเอกสารประกอบสำหรับโมดูลหลักสองโมดูล ngx_http_fastcgi_module และ ngx_http_proxy_module

แหล่งข้อมูลเพิ่มเติม: การแคชเนื้อหา NGINX และเคล็ดลับในการปรับปรุงประสิทธิภาพ WordPress