PHP-FPM (ตัวจัดการกระบวนการที่รวดเร็ว) เป็นการนำ FastCGI ไปใช้งานแยกต่างหากเพื่อเรียกใช้สคริปต์ PHP คุณสามารถใช้เว็บเซิร์ฟเวอร์ NGINX ร่วมกัน (กำลังประมวลผลแบบคงที่) และ PHP-FPM เพื่อสร้างเว็บเซิร์ฟเวอร์ที่เร็วและมีประสิทธิภาพสูงสำหรับเว็บไซต์ของคุณมากกว่าบน LAMP stack (โมดูล NGINX, Apache และ mod_php)
LEMP เป็นชุดเครื่องมือซอฟต์แวร์โอเพ่นซอร์สที่มักจะติดตั้งร่วมกันเพื่อโฮสต์เว็บไซต์และเผยแพร่เว็บแอปพลิเคชัน ตัวย่อนี้ย่อมาจากชุดของ OS Linux , Nginx เว็บเซิร์ฟเวอร์ (แทนที่ Apache ใน LAMP stack ยอดนิยม), MySQL (MariaDB ) ฐานข้อมูลและ php เพื่อประมวลผลข้อมูลแบบไดนามิก
ในบทความนี้ เราจะมาดูวิธีการติดตั้งและเพิ่มประสิทธิภาพ LEMP stack (NGINX + PHP-FPM + MariaDB/MySQL) สำหรับการโฮสต์โครงการเว็บที่มีภาระงานสูงบนเซิร์ฟเวอร์ที่ใช้ Linux CentOS 7
ติดตั้งและกำหนดค่า Nginx เป็นเว็บเซิร์ฟเวอร์
เนื่องจากเซิร์ฟเวอร์ CentOS ที่ติดตั้งใหม่ใช้สำหรับการติดตั้ง ให้เชื่อมต่อที่เก็บ EPEL ยอดนิยมและอัปเดตแพ็คเกจทั้งหมดบนเซิร์ฟเวอร์
# yum install epel-release -y
# yum update -y
ในการติดตั้ง Nginx . ล่าสุด ให้เชื่อมต่อที่เก็บนักพัฒนาโดยใช้คำสั่งนี้:
# rpm -Uvh https://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
หรือสร้างไฟล์การกำหนดค่าที่เก็บด้วยตนเอง (/etc/yum.repos.d/nginx.repo) . เพิ่มบรรทัดต่อไปนี้ในไฟล์:
[nginx] name=nginx repo baseurl=https://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1
หากคุณกำลังใช้ CentOS 8 ให้เปลี่ยนเวอร์ชันใน URL
ติดตั้งแพ็คเกจเว็บเซิร์ฟเวอร์ Nginx โดยใช้ตัวจัดการแพ็คเกจ yum (หรือ dnf):
# yum install nginx -y
จากนั้นเรียกใช้ nginx และเพิ่มในการเริ่มต้นโดยใช้ systemctl:
# systemctl start nginx
# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service
หากต้องการตรวจสอบว่าเว็บเซิร์ฟเวอร์กำลังทำงานอยู่ ให้เปิดที่อยู่ IP ของเซิร์ฟเวอร์ในเบราว์เซอร์ของคุณ
หากคุณไม่เห็นหน้าทดสอบนี้ ให้ตรวจสอบการตั้งค่าบริการ พอร์ต และโซนที่อนุญาตในไฟร์วอลล์บนเซิร์ฟเวอร์ของคุณ
สร้างไฟล์การกำหนดค่าสำหรับโดเมนแยกต่างหาก woshub-linux.com . สร้างไดเร็กทอรีแยกต่างหากสำหรับไซต์และไฟล์ปรับแต่ง:
# mkdir -p /var/www/woshub-linux.com && mkdir -p /var/www/woshub-linux.com/log
เปิดไฟล์การกำหนดค่า:
# nano /etc/nginx/conf.d/woshub-linux.com.conf
และเพิ่มเนื้อหาต่อไปนี้ลงไป:
server { listen 80; server_name woshub-linux.com; root /var/www/woshub-linux.com; index index.php index.html index.htm; access_log /var/www/woshub-linux.com/log/access.log main; error_log /var/www/woshub-linux.com/log/error.log; location / { return 301 https://woshub-linux.com$request_uri; } location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico|woff)$ { return 301 https://woshub-linux.com$request_uri; } location ~ \.php$ { return 301 https://woshub-linux.com$request_uri; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { rewrite ^ /robots.txt break; allow all; log_not_found off; access_log off; } location ~ /\.ht { deny all; } } server { listen 80; server_name www.woshub-linux.com; rewrite ^ https://woshub-linux.com$request_uri? permanent; } server { listen 443 ssl http2; server_name woshub-linux.com; root /var/www/woshub-linux.com; index index.php index.html index.htm; access_log /var/www/woshub-linux.com/log/ssl-access.log main; error_log /var/www/woshub-linux.com/log/ssl-error.log; keepalive_timeout 60; ssl_certificate /etc/letsencrypt/live/woshub-linux.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/woshub-linux.com/privkey.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA'; add_header Strict-Transport-Security 'max-age=604800'; location / { try_files $uri $uri/ /index.php?$args; } location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico|woff)$ { access_log off; expires max; } location ~ \.php$ { try_files $uri =404; fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; fastcgi_index index.php; fastcgi_param DOCUMENT_ROOT /var/www/woshub-linux.com; fastcgi_param SCRIPT_FILENAME /var/www/woshub-linux.com/$fastcgi_script_name; fastcgi_param PATH_TRANSLATED /var/www/woshub-linux.com/$fastcgi_script_name; include fastcgi_params; 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 HTTPS on; fastcgi_intercept_errors on; fastcgi_ignore_client_abort off; fastcgi_connect_timeout 60; fastcgi_send_timeout 180; fastcgi_read_timeout 180; fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { allow all; log_not_found off; access_log off; } location ~ /\.ht { deny all; } } server { listen 443 ssl http2; server_name www.woshub-linux.com; rewrite ^ https://woshub-linux.com$request_uri? permanent; }
ไฟล์การกำหนดค่ามีการตั้งค่าเพื่อเข้าถึงไซต์โดยใช้การเข้าถึงโปรโตคอล HTTP ที่ปลอดภัย เนื่องจาก CMS ยอดนิยมจำนวนมากใช้เป็นค่าเริ่มต้น หลังจากนั้น คุณสามารถติดตั้งและกำหนดค่าใบรับรอง Let's Encrypt ได้ฟรี (เหมือนกับที่เราติดตั้งใบรับรอง Let's Encrypt สำหรับเว็บไซต์ใน IIS ใน Windows Server)
ติดตั้ง PHP-FPM
Nginx ไม่มีตัวจัดการ PHP ในตัว ดังนั้นเราต้องติดตั้ง php-fpm และบางโมดูล PHP เพื่อประมวลผลสคริปต์ PHP
Php-fpm เป็นผู้จัดการกระบวนการ PHP ที่ง่ายและรวดเร็ว ไม่ใช้โปรโตคอล HTTP (ต่างจาก Apache) และทำงานร่วมกับโปรโตคอล FastCGI พิเศษ FPM ที่เบาและใช้งานง่ายจะประมวลผลคำขอ PHP ได้เร็วขึ้น ในขณะเดียวกัน เมื่อเทียบกับการกำหนดค่าด้วย apache มันจะใช้หน่วยความจำน้อยลงในทางกลับกัน Nginx จะส่งกลับค่าคงที่อย่างมีประสิทธิภาพมากขึ้น ในการกำหนดค่าของเรา nginx จะเป็นพร็อกซีเซิร์ฟเวอร์ (แคชและเซิร์ฟเวอร์ส่วนหน้า) และ php-fpm จะทำหน้าที่เป็นส่วนหลัง
ใช้ที่เก็บ REMI เพื่อติดตั้ง php เวอร์ชันใหม่กว่า:
# rpm -ivh https://rpms.famillecollet.com/enterprise/remi-release-7.rpm
หลังการติดตั้ง แก้ไข /etc/yum.repos.d/remi-php74.repo ไฟล์:
เรียกใช้ php-fpm และการติดตั้งโมดูล php ยอดนิยม:
# yum install php-fpm php-cli php-mysql php-gd php-ldap php-odbc php-pdo php-opcache php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap php-zip
เริ่ม php-fpm daemon และเพิ่มในการเริ่มต้น:
# systemctl start php-fpm
# systemctl enable php-fpm
Created symlink from /etc/systemd/system/multi-user.target.wants/php-fpm.service to /usr/lib/systemd/system/php-fpm.service.
เพื่อให้แน่ใจว่าบริการได้เริ่มต้นขึ้นแล้ว ให้รันคำสั่งนี้:
# lsof -i:9000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME php-fpm 1551 root 7u IPv4 2078435 0t0 TCP localhost:cslistener (LISTEN) php-fpm 1552 apache 9u IPv4 2078435 0t0 TCP localhost:cslistener (LISTEN) php-fpm 1553 apache 9u IPv4 2078435 0t0 TCP localhost:cslistener (LISTEN) php-fpm 1554 apache 9u IPv4 2078435 0t0 TCP localhost:cslistener (LISTEN) php-fpm 1555 apache 9u IPv4 2078435 0t0 TCP localhost:cslistener (LISTEN) php-fpm 1556 apache 9u IPv4 2078435 0t0 TCP localhost:cslistener (LISTEN)
เรียกใช้ php-fpm โดยใช้ซ็อกเก็ตยูนิกซ์ ลบบรรทัด “listen = 127.0.0.1:9000
” จาก /etc/php-fpm.d/www.conf และเพิ่มสิ่งต่อไปนี้:
listen = /var/run/php-fpm/php-fpm.sock listen.mode = 0660 listen.owner = nginx listen.group = nginx
ในการเริ่ม php-fpm ในฐานะผู้ใช้ที่ไม่ใช่ apache (โดยค่าเริ่มต้น) ให้ระบุพารามิเตอร์เหล่านี้ในไฟล์กำหนดค่า:
user = nginx group = nginx
หลังจากเปลี่ยนไฟล์กำหนดค่า php-fpm แล้ว ให้เริ่มบริการใหม่:
# systemctl restart php-fpm
ติดตั้ง MySQL/MariaDB บนเว็บเซิร์ฟเวอร์
เราจะข้ามขั้นตอนนี้ เนื่องจากคู่มือฉบับสมบูรณ์ “การติดตั้งและการเพิ่มประสิทธิภาพ MariaDB บน Linux” ได้รับการเผยแพร่ก่อนหน้านี้ ใช้ประโยชน์จากสิ่งนี้
การกำหนดค่า Nginx + PHP-FPM สำหรับการโหลดสูง
เพื่อให้เว็บเซิร์ฟเวอร์ของคุณสามารถประมวลผลคำขอของลูกค้าจำนวนมาก (เว็บไซต์ที่มีการเข้าชมสูง) จำเป็นต้องกำหนดค่า nginx อย่างเหมาะสม และ php-fpm .
การกำหนดค่า Nginx
เปิด /etc/nginx/nginx.conf ไฟล์และเปลี่ยนการกำหนดค่า Nginx ดังนี้:
worker_processes 2;
— กำหนดจำนวนกระบวนการของผู้ปฏิบัติงานเท่ากับจำนวนคอร์บนเซิร์ฟเวอร์ของคุณworker_connections 1024;
— กำหนดจำนวนการเชื่อมต่อสำหรับกระบวนการทำงานเดียว (ตั้งค่าจาก 1024 ถึง 4096);use epoll;
— เป็นวิธีการเชื่อมต่อที่เหมาะสมที่สุดใน Linuxmulti_accept on;
— nginx จะยอมรับจำนวนการเชื่อมต่อสูงสุด
บล็อก http:
tcp_nodelay on;
— ส่งส่วนหัวและจุดเริ่มต้นของไฟล์ในแพ็คเกจเดียวtcp_nopush on;
เปิดใช้งานการบีบอัด gzip สำหรับโครงการบนเว็บที่มีไฟล์สแตติกจำนวนมาก:
gzip on;
เพิ่มไฟล์ประเภทต่างๆ เพื่อให้ผ่านการตรวจสอบความเร็วของ Google ทั้งหมด:gzip_types application/atom+xml application/javascript text/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json font/ttf application/x-font-ttf application/vnd.ms-fontobject application/font-woff application/font-woff2 application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vnd.wap.wml text/vtt text/x-component text/x-cross-domain-policy;
เปลี่ยนการตั้งค่าระยะหมดเวลา:
keepalive_timeout 30;
— เว็บเซิร์ฟเวอร์จะรอ 30 วินาทีก่อนที่จะปิดการเชื่อมต่อแบบ Keepalivekeepalive_requests 100;
คือจำนวนคำขอ Keepalive สูงสุดจากลูกค้าหนึ่งรายreset_timedout_connection on;
— เปิดใช้งานพารามิเตอร์นี้หากคุณไม่ต้องการให้รีเซ็ตการเชื่อมต่อจากไคลเอนต์ที่หยุดตอบสนองclient_body_timeout 10;
— เว็บเซิร์ฟเวอร์จะรอให้ลูกค้ายืนยันคำขอเป็นเวลา 10 วินาทีจนกว่าการเชื่อมต่อจะถูกรีเซ็ตsend_timeout 2;
— หากไคลเอ็นต์หยุดอ่านการตอบสนองของเว็บเซิร์ฟเวอร์ nginx จะรีเซ็ตการเชื่อมต่อ
หากเว็บไซต์ของคุณไม่ได้ออกแบบมาเพื่ออัปโหลดไฟล์ขนาดใหญ่ ให้ตั้งค่าขีดจำกัดโดยใช้ nginx:
client_max_body_size 2m;
— เซิร์ฟเวอร์จะไม่รับคำขอที่เกิน 2 MB
หากเนื้อหาของโครงการไม่เปลี่ยนแปลงบ่อย คุณสามารถใช้คำสั่ง หมดอายุสูงสุด ' แคชหรือเพิ่มตัวเลือกที่เกี่ยวข้องให้กับไฟล์การกำหนดค่าของโฮสต์ของคุณสำหรับประเภทไฟล์ที่คุณต้องการ ตัวอย่างเช่น:
location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico|woff)$ { expires 7d; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
แคชสำหรับประเภทไฟล์ที่ระบุจะถูกเก็บไว้เป็นเวลา 7 วัน
อย่าลืมรีสตาร์ท nginx หลังจากทำการเปลี่ยนแปลงใด ๆ
# systemctl restart nginx
การกำหนดค่า Php-fpm
เมื่อติดตั้ง php-fpm คุณเปลี่ยนเป็นซ็อกเก็ตยูนิกซ์ทันที มันช่วยเพิ่มประสิทธิภาพได้อย่างมาก จากการประมาณการ ผลผลิตเพิ่มขึ้น 2 หรือ 3 เท่า ต้องตั้งค่าพารามิเตอร์ php-fpm อื่นๆ สำหรับแต่ละโปรเจ็กต์แยกกัน มาลองพิจารณาตัวอย่างการกำหนดค่าสำหรับเซิร์ฟเวอร์ single-core (vCPU) ที่มี RAM 1,024 MB
คุณสามารถจัดสรรได้ประมาณ 512 MB สำหรับ php-fpm ส่วนที่เหลือสำหรับฐานข้อมูลและ nginx ของคุณ
เพิ่มสิ่งต่อไปนี้ในไฟล์กำหนดค่า /etc/php-fpm/www.conf :
pm.max_children = 18
คือจำนวนสูงสุดของกระบวนการลูกpm.start_servers = 6
คือจำนวนโปรเซสลูกที่สร้างขึ้นเมื่อเริ่มต้นpm.min_spare_servers = 4
คือจำนวนขั้นต่ำของกระบวนการเซิร์ฟเวอร์ที่ไม่ได้ใช้งานpm.max_spare_servers = 16
คือจำนวนสูงสุดของกระบวนการเซิร์ฟเวอร์ที่ไม่ได้ใช้งานpm.max_requests = 400
คือจำนวนการร้องขอโปรเซสลูก หลังจากนั้นกระบวนการจะเริ่มต้นใหม่
ฉันไม่ได้อธิบายวิธีเพิ่มประสิทธิภาพการตั้งค่า MariaDB เนื่องจากมีบทความที่เกี่ยวข้องในเว็บไซต์นี้ ฉันได้ตั้งค่าพารามิเตอร์ my.cnf สำหรับโครงการของฉันโดยอ้างอิงจากบทความ และฐานข้อมูลก็แสดงผลการทำงานที่ยอดเยี่ยม
หลังจากเปิดเว็บไซต์ของคุณ คุณจะเห็นด้วยตาเปล่าว่า nginx + php-fpm จะประมวลผลคำขอของคุณและส่งคืนหน้าเว็บได้เร็วกว่า apache2 + mod_php