Computer >> คอมพิวเตอร์ >  >> ระบบ >> Linux

การกำหนดค่าเว็บเซิร์ฟเวอร์ NGINX และ PHP-FPM ประสิทธิภาพสูง

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 และ PHP-FPM ประสิทธิภาพสูง

ในการติดตั้ง 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 และ PHP-FPM ประสิทธิภาพสูง

จากนั้นเรียกใช้ 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 ของเซิร์ฟเวอร์ในเบราว์เซอร์ของคุณ

การกำหนดค่าเว็บเซิร์ฟเวอร์ NGINX และ PHP-FPM ประสิทธิภาพสูง

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

สร้างไฟล์การกำหนดค่าสำหรับโดเมนแยกต่างหาก 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 ไฟล์:

การกำหนดค่าเว็บเซิร์ฟเวอร์ NGINX และ PHP-FPM ประสิทธิภาพสูง

เรียกใช้ 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

การกำหนดค่าเว็บเซิร์ฟเวอร์ NGINX และ PHP-FPM ประสิทธิภาพสูง

เริ่ม 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; — เป็นวิธีการเชื่อมต่อที่เหมาะสมที่สุดใน Linux
  • multi_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 วินาทีก่อนที่จะปิดการเชื่อมต่อแบบ Keepalive
  • keepalive_requests 100; คือจำนวนคำขอ Keepalive สูงสุดจากลูกค้าหนึ่งราย
  • reset_timedout_connection on; — เปิดใช้งานพารามิเตอร์นี้หากคุณไม่ต้องการให้รีเซ็ตการเชื่อมต่อจากไคลเอนต์ที่หยุดตอบสนอง
  • client_body_timeout 10; — เว็บเซิร์ฟเวอร์จะรอให้ลูกค้ายืนยันคำขอเป็นเวลา 10 วินาทีจนกว่าการเชื่อมต่อจะถูกรีเซ็ต
  • send_timeout 2; — หากไคลเอ็นต์หยุดอ่านการตอบสนองของเว็บเซิร์ฟเวอร์ nginx จะรีเซ็ตการเชื่อมต่อ

หากเว็บไซต์ของคุณไม่ได้ออกแบบมาเพื่ออัปโหลดไฟล์ขนาดใหญ่ ให้ตั้งค่าขีดจำกัดโดยใช้ nginx:

  • client_max_body_size 2m; — เซิร์ฟเวอร์จะไม่รับคำขอที่เกิน 2 MB

การกำหนดค่าเว็บเซิร์ฟเวอร์ NGINX และ PHP-FPM ประสิทธิภาพสูง

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

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