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

วิธีเชื่อมต่อ NGINX กับ PHP-FPM โดยใช้ UNIX หรือซ็อกเก็ต TCP/IP


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

PHP-FPM ไม่เพียงแต่สนับสนุนการกำหนดค่าของกลุ่มทรัพยากร FastCGI เท่านั้น แต่ยังปรับปรุงส่วนภายในของ FastCGI จำนวนมากและเพิ่มการรายงานข้อผิดพลาด สคริปต์ การเลิกจ้าง และอื่นๆ อีกมากมาย มันมีคุณสมบัติการทำลายล้าง PHP, การจัดการกระบวนการ, จำนวนกระบวนการแบบไดนามิกที่สามารถส่งคำขอได้, ส่วนหัวของข้อผิดพลาด, การสนับสนุนการอัปโหลดแบบเร่งและอื่น ๆ

หากต้องการยอมรับคำขอ FastCGI จาก NGINX PHP-FPM สามารถฟังบนซ็อกเก็ต TCP/IP หรือโดเมน UNIX เบ้า. ที่อยู่ใดก็ตามที่คุณเลือกใช้คือสิ่งที่ NGINX ใช้ในการเชื่อมต่อ (คำขอพร็อกซี) กับ PHP-FPM โดยใช้คำสั่ง fastcgi_pass

คู่มือนี้จะอธิบายวิธีกำหนดค่า NGINX ให้กับแอปพลิเคชันเซิร์ฟเวอร์ PHP โดยใช้ PHP-FPM โดยจะอธิบายว่าเมื่อใดจึงควรใช้ซ็อกเก็ต TCP/IP หรือซ็อกเก็ตโดเมน UNIX เพื่อเชื่อมต่อ NGINX กับ PHP-FPM และเหตุผล

คู่มือนี้จะถือว่าคุณได้ติดตั้ง NGINX และ PHP-FPM บนระบบ Linux ของคุณ หรือโปรดดูที่:

  • วิธีการติดตั้งเซิร์ฟเวอร์ LEMP บน CentOS 8
  • วิธีการติดตั้ง LEMP stack PhpMyAdmin ในเซิร์ฟเวอร์ Ubuntu 20.04
  • วิธีติดตั้ง NGINX, MySQL/MariaDB และ PHP บน RHEL 8
  • วิธีติดตั้ง LEMP บนเซิร์ฟเวอร์ Debian 10

ฉันควรใช้อะไร: ซ็อกเก็ตโดเมน UNIX หรือซ็อกเก็ต TCP/IP

ซ็อกเก็ตโดเมน UNIX (หรือ IPC) เป็นวิธีการสื่อสารระหว่างกระบวนการ (IPC) ที่ให้การแลกเปลี่ยนข้อมูลอย่างมีประสิทธิภาพระหว่างกระบวนการที่ทำงานบนระบบปฏิบัติการเดียวกันในขณะที่ TCP /IP (หรือ โดเมนอินเทอร์เน็ต) ช่วยให้กระบวนการต่างๆ สามารถสื่อสารผ่านเครือข่ายได้

ไม่เหมือนกับซ็อกเก็ต TCP/IP ที่ระบุเซิร์ฟเวอร์ด้วยที่อยู่ IP และพอร์ต (เช่น 127.0.0.1:9000) คุณสามารถผูกเซิร์ฟเวอร์กับซ็อกเก็ตโดเมน UNIX โดยใช้ ชื่อพาธของไฟล์ (เช่น /run/php-fpm/www.sock) ซึ่งมองเห็นได้ในระบบไฟล์

ซ็อกเก็ตโดเมน UNIX เป็นไฟล์ประเภทพิเศษ - สิทธิ์ของไฟล์และไดเร็กทอรีนำไปใช้กับมัน (เช่นเดียวกับกรณีของไฟล์ UNIX ประเภทอื่น ๆ ) และสามารถใช้เพื่อจำกัดกระบวนการบนโฮสต์ที่สามารถอ่านและเขียนลงในไฟล์ได้ (และสื่อสารกับเซิร์ฟเวอร์ส่วนหลัง)

ด้วยวิธีนี้ ซ็อกเก็ตโดเมน UNIX มีความปลอดภัยเนื่องจากเฉพาะกระบวนการบนโฮสต์ภายในเครื่องเท่านั้นที่สามารถใช้งานได้ ซ็อกเก็ต TCP/IP อาจถูกเปิดเผยต่ออินเทอร์เน็ตซึ่งก่อให้เกิดความเสี่ยงด้านความปลอดภัย เว้นแต่มีการใช้มาตรการรักษาความปลอดภัยเพิ่มเติม เช่น ไฟร์วอลล์

ที่สำคัญ การใช้ซ็อกเก็ตโดเมน UNIX ไม่เหมือนกับการใช้ซ็อกเก็ต TCP/IP ที่เกี่ยวข้องกับประสิทธิภาพ การทดสอบและการวัดประสิทธิภาพหลายครั้งได้พิสูจน์แล้วว่าซ็อกเก็ตโดเมน UNIX ทำงานเร็วกว่า ข้อเสียเปรียบหลักของซ็อกเก็ตโดเมน UNIX คือปรับขนาดได้น้อยกว่า รองรับเฉพาะการสื่อสารระหว่างกระบวนการภายในระบบปฏิบัติการ (OS) เดียวกันเท่านั้น

ฉันจะกำหนดค่าที่อยู่ฟัง PHP-FPM ได้ที่ไหน

คุณสามารถกำหนดค่าที่อยู่ PHP-FPM ที่จะรับฟังในไฟล์การกำหนดค่าพูลทรัพยากร โปรดทราบว่าด้วย PHP-FPM คุณสามารถเรียกใช้กระบวนการต่างๆ ได้โดยใช้การตั้งค่าที่แตกต่างกัน พูลเริ่มต้นเรียกว่า www

ตำแหน่งของไฟล์การกำหนดค่าพูลทรัพยากรขึ้นอยู่กับวิธีการติดตั้ง PHP และ PHP-FPM บนระบบ Linux (ไม่ว่าจะเป็นค่าเริ่มต้น/เวอร์ชันเดียวหรือหลายเวอร์ชันพร้อมกัน) .

ตัวอย่างเช่น บน CentOS 8 ซึ่งเป็นเวอร์ชันเดียว ไฟล์การกำหนดค่า PHP ทั้งหมดจะอยู่ในไดเร็กทอรี /etc และ PHP-FPM เริ่มต้น ไฟล์การกำหนดค่าพูล (www) คือ /etc/php-fpm.d/www.conf:

หากต้องการแสดงรายการไฟล์การกำหนดค่า PHP ทั้งหมด ให้ใช้คำสั่ง ls ต่อไปนี้

ls /etc/php*

บน Ubuntu 20.04 ไฟล์การกำหนดค่า PHP จะอยู่ในไดเรกทอรี /etc/php// และค่าเริ่มต้น PHP-FPM ไฟล์การกำหนดค่าพูล (www) คือ /etc/php//fpm/pool.d/www.conf:

ls /etc/php/7.4/

การกำหนดค่า PHP-FPM เพื่อฟังบนซ็อกเก็ตโดเมน UNIX

หากต้องการกำหนดค่า PHP-FPM ให้ฟังบนซ็อกเก็ตโดเมน UNIX ให้เปิดไฟล์การกำหนดค่าพูล PHP-FPM เริ่มต้นของคุณ โดยใช้โปรแกรมแก้ไขข้อความที่คุณชื่นชอบ

sudo vim /etc/php/7.4/fpm/pool.d/www.conf	#Ubuntu/Debian
OR
vim /etc/php-fpm.d/www.conf			#CentOS/RHEL/Fedora

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

listen = /run/php/php7.4-fpm.sock	#Ubuntu/Debian
OR
listen = /run/php-fpm/www.sock		#CentOS/RHEL/Fedora

หากคุณใช้ซ็อกเก็ตโดเมน UNIX คุณจะต้องตั้งค่าสิทธิ์การอ่าน/เขียนที่เหมาะสมสำหรับไฟล์ เพื่ออนุญาตการเชื่อมต่อจากเว็บเซิร์ฟเวอร์ NGINX ตามค่าเริ่มต้น NGINX จะทำงานในฐานะผู้ใช้และกลุ่ม nginx บน CentOS/RHEL/Fedora และ www-data บน Ubuntu และ เดเบียน

ดังนั้น ค้นหาพารามิเตอร์ listen.owner และ listen.group แล้วตั้งค่าให้สอดคล้องกัน นอกจากนี้ ให้ตั้งค่าโหมดเป็น 0660 โดยใช้พารามิเตอร์ listen.mode

------------- On Debian and Ubuntu -------------
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

------------- On CentOS/RHEL and Fedora  -------------
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

โปรดทราบว่าหากสิทธิ์ในไฟล์ซ็อกเก็ตโดเมน UNIX ไม่ได้ตั้งค่าอย่างถูกต้อง NGINX อาจส่งคืนข้อผิดพลาดเกตเวย์ที่ไม่ถูกต้อง

การกำหนดค่า PHP-FPM เพื่อฟังบนซ็อกเก็ต TCP/IP

แม้ว่าซ็อกเก็ตโดเมน UNIX จะเร็วกว่าซ็อกเก็ต TCP/IP แต่ซ็อกเก็ตแบบแรกนั้นสามารถปรับขยายได้น้อยกว่า เนื่องจากสามารถรองรับการสื่อสารระหว่างกระบวนการบนระบบปฏิบัติการเดียวกันเท่านั้น หาก NGINX และแอปพลิเคชันเซิร์ฟเวอร์แบ็กเอนด์ (PHP-FPM) ทำงานบนระบบที่แตกต่างกัน คุณจะต้องกำหนดค่า PHP-FPM เพื่อรับฟัง ซ็อกเก็ต TCP/IP สำหรับการเชื่อมต่อ

ในไฟล์การกำหนดค่าพูล PHP-FPM ให้ตั้งค่าที่อยู่ listen ดังต่อไปนี้ ตรวจสอบให้แน่ใจว่าพอร์ตที่คุณเลือกไม่ได้ถูกใช้โดยกระบวนการหรือบริการอื่นบนระบบเดียวกัน

listen = 127.0.0.1:3000

การกำหนดค่า NGINX ให้ทำงานกับเซิร์ฟเวอร์แอปพลิเคชัน PHP-FPM

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

ตัวอย่างเช่น หากไฟล์การกำหนดค่าสำหรับเว็บไซต์ของคุณคือ /etc/nginx/conf.d/example.com.conf ให้เปิดไฟล์นั้นเพื่อแก้ไข

vim /etc/nginx/conf.d/example.com.conf 

มองหาบล็อก location สำหรับการประมวลผลไฟล์ .php และตั้งค่าพารามิเตอร์ fastcgi_pass ดังต่อไปนี้ หากคุณกำหนดค่า PHP-FPM ให้ฟังบน UNIX ซ็อกเก็ตโดเมน

fastcgi_pass unix:/run/php/php7.4-fpm.sock	#Ubuntu/Debian
OR
fastcgi_pass unix:/run/php-fpm/www.sock		#CentOS/RHEL/Fedora

หรือใช้ที่อยู่ TCP/IP หากคุณกำหนดค่า PHP-FPM ให้ฟังบนซ็อกเก็ต TCP/IP หากเซิร์ฟเวอร์แอปพลิเคชันแบ็กเอนด์ (PHP-FPM) ทำงานบนเซิร์ฟเวอร์แยกต่างหาก (แทนที่ 10.42.0.10 ด้วยที่อยู่ IP ของเครื่องที่เซิร์ฟเวอร์ PHP-FPM FastCGI กำลังวิ่ง).

fastcgi_pass  10.42.0.10:3000;

ข้อสำคัญ: บน CentOS 8, PHP-FPM ถูกกำหนดให้เป็นเซิร์ฟเวอร์อัปสตรีมใน / ฯลฯ/nginx/conf.d/php-fpm.conf ภายในบล็อกอัปสตรีม ชื่อ php-fpm

คุณสามารถทำการเปลี่ยนแปลงได้ที่นี่ ทั้งนี้ขึ้นอยู่กับที่อยู่ PHP-FPM ที่ได้รับการกำหนดค่าให้รับฟังในไฟล์การกำหนดค่าพูล การกำหนดค่าเริ่มต้นชี้ไปที่ซ็อกเก็ตโดเมน UNIX

upstream php-fpm {
        server unix:/run/php-fpm/www.sock;
}

และในไฟล์บล็อกเซิร์ฟเวอร์ของเว็บไซต์ของคุณ เพียงตั้งค่าพารามิเตอร์ fastcgi_pass ตามที่แสดง

fastcgi_pass php-fpm;

หลังจากเปลี่ยนแปลงการกำหนดค่า PHP-FPM และ NGINX แล้ว ให้ตรวจสอบไวยากรณ์การกำหนดค่าเพื่อความถูกต้องดังต่อไปนี้

------------- On Debian and Ubuntu -------------
sudo php-fpm -t
sudo nginx -t

------------- On CentOS/RHEL and Fedora  -------------
php-fpm -t
nginx -t

แม้ว่าเอาต์พุตคำสั่งจะแสดงเฉพาะไฟล์การกำหนดค่าหลักเท่านั้น ไฟล์การกำหนดค่าอื่นๆ ทั้งหมดจะถูกรวมและตรวจสอบด้วยเช่นกัน

ถัดไป คุณต้องรีสตาร์ทบริการทั้งสองเพื่อใช้การเปลี่ยนแปลงโดยใช้คำสั่ง systemctl

------------- On Debian and Ubuntu -------------
sudo systemctl restart nginx
sudo systemctl restart php7.4-fpm

------------- On CentOS/RHEL and Fedora  -------------
systemctl restart nginx
systemctl restart php-fpm

หากคุณได้รับข้อผิดพลาด คุณสามารถตรวจสอบไฟล์บันทึก NGINX และ PHP-FPM ได้โดยใช้คำสั่ง cat

------------- On Debian and Ubuntu -------------
cat /var/log/nginx/error.log
cat /var/log/php7.4-fpm.log

------------- On CentOS/RHEL and Fedora  -------------
cat /var/log/nginx/error.log
cat /var/log/php-fpm/www-error.log

นั่นคือทั้งหมดที่เรามีเพื่อคุณ ส่วนความคิดเห็นด้านล่างสามารถใช้เพื่อถามคำถามได้ สำหรับข้อมูลเพิ่มเติม โปรดดูเอกสารประกอบ NGINX และเอกสารประกอบ PHP-FPM