Computer >> Máy Tính >  >> Hệ thống >> Linux

Định cấu hình máy chủ web NGINX và PHP-FPM hiệu suất cao

PHP-FPM (Trình quản lý quy trình nhanh) là một triển khai riêng của FastCGI để chạy các tập lệnh PHP. Bạn có thể sử dụng kết hợp máy chủ web NGINX (xử lý tĩnh) và PHP-FPM để xây dựng máy chủ web hiệu suất cao và nhanh hơn cho các trang web của mình hơn là trên ngăn xếp LAMP (NGINX, Apache và mô-đun mod_php).

LEMP là một bộ phần mềm mã nguồn mở gồm các công cụ thường được cài đặt cùng nhau để lưu trữ các trang web và xuất bản ứng dụng web. Chữ viết tắt này là viết tắt của một tập hợp hệ điều hành Linux , Nginx máy chủ web (nó thay thế Apache trong ngăn xếp LAMP phổ biến hơn), MySQL ( MariaDB ) cơ sở dữ liệu và php để xử lý dữ liệu động.

Trong bài viết này, chúng ta sẽ xem xét cách cài đặt và tối ưu hóa ngăn xếp LEMP (NGINX + PHP-FPM + MariaDB / MySQL) để lưu trữ dự án web tải cao trên máy chủ chạy Linux CentOS 7.

Cài đặt và định cấu hình Nginx làm máy chủ web

Vì máy chủ CentOS mới được cài đặt được sử dụng để cài đặt, hãy kết nối kho lưu trữ EPEL phổ biến và cập nhật tất cả các gói trên máy chủ.

# yum install epel-release -y
# yum update -y

Định cấu hình máy chủ web NGINX và PHP-FPM hiệu suất cao

Để cài đặt Nginx mới nhất phiên bản, kết nối kho nhà phát triển bằng cách chạy lệnh sau:

# rpm -Uvh https://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

Hoặc tạo tệp cấu hình kho lưu trữ theo cách thủ công ( /etc/yum.repos.d/nginx.repo) . Thêm các dòng sau vào tệp:

[nginx]
name=nginx repo
baseurl=https://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

Nếu bạn đang sử dụng CentOS 8, hãy thay đổi phiên bản trong URL.

Cài đặt gói máy chủ web Nginx bằng trình quản lý gói yum (hoặc dnf):

# yum install nginx -y

Định cấu hình máy chủ web NGINX và PHP-FPM hiệu suất cao

Sau đó chạy nginx và thêm nó vào khởi động bằng 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

Để kiểm tra xem máy chủ web có đang chạy hay không, hãy mở địa chỉ IP của máy chủ trong trình duyệt của bạn.

Định cấu hình máy chủ web NGINX và PHP-FPM hiệu suất cao

Nếu bạn không thấy trang kiểm tra này, hãy kiểm tra cài đặt của các dịch vụ, cổng và vùng được phép trong firewalld trên máy chủ của bạn.

Tạo tệp cấu hình cho miền riêng woshub-linux.com . Tạo một thư mục riêng cho trang web và tệp cấu hình:

# mkdir -p /var/www/woshub-linux.com && mkdir -p /var/www/woshub-linux.com/log

Mở tệp cấu hình:

# nano /etc/nginx/conf.d/woshub-linux.com.conf

Và thêm các nội dung sau vào đó:

máy chủ
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;
}

Tệp cấu hình chứa các cài đặt để truy cập trang web bằng quyền truy cập giao thức HTTP an toàn vì nhiều CMS phổ biến sử dụng nó theo mặc định. Sau đó, bạn có thể cài đặt và định cấu hình chứng chỉ Let’s Encrypt miễn phí (giống như chúng tôi đã cài đặt chứng chỉ Let’s Encrypt cho một trang web trong IIS trong Windows Server).

Cài đặt PHP-FPM

Nginx không có trình xử lý PHP tích hợp sẵn, vì vậy chúng tôi phải cài đặt php-fpm và một số mô-đun PHP để xử lý các tập lệnh PHP.

Php-fpm là một trình quản lý quy trình PHP dễ dàng và nhanh chóng. Nó không sử dụng giao thức HTTP (không giống như Apache) và hoạt động với một giao thức FastCGI đặc biệt. FPM nhẹ và dễ sử dụng xử lý các yêu cầu PHP nhanh hơn. Đồng thời, so với cấu hình với apache, nó sẽ sử dụng ít bộ nhớ hơn.

Ngược lại, Nginx trả về tĩnh hiệu quả hơn. Trong cấu hình của chúng tôi, nginx sẽ là một máy chủ proxy (một máy chủ lưu vào bộ nhớ đệm và giao diện người dùng) và php-fpm sẽ đóng vai trò là một back-end.

Sử dụng kho lưu trữ REMI để cài đặt các phiên bản php mới hơn:

# rpm -ivh https://rpms.famillecollet.com/enterprise/remi-release-7.rpm

Sau khi cài đặt, hãy chỉnh sửa /etc/yum.repos.d/remi-php74.repo tệp:

Định cấu hình máy chủ web NGINX và PHP-FPM hiệu suất cao

Chạy php-fpm và cài đặt mô-đun php phổ biến:

# 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

Định cấu hình máy chủ web NGINX và PHP-FPM hiệu suất cao

Bắt đầu php-fpm daemon và thêm nó vào khởi động:

# 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.

Để đảm bảo nếu dịch vụ đã được khởi động, hãy chạy lệnh sau:

# 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)

Chạy php-fpm sử dụng ổ cắm unix. Xóa dòng “listen = 127.0.0.1:9000 ”Từ /etc/php-fpm.d/www.conf và thêm phần sau:

listen = /var/run/php-fpm/php-fpm.sock
listen.mode = 0660
listen.owner = nginx
listen.group = nginx

Để bắt đầu php-fpm với tư cách là người dùng không phải apache (theo mặc định), hãy chỉ định các tham số này trong tệp cấu hình:

user = nginx
group = nginx

Sau khi thay đổi tệp cấu hình php-fpm, hãy khởi động lại dịch vụ:

# systemctl restart php-fpm

Cài đặt MySQL / MariaDB trên Máy chủ Web

Chúng tôi sẽ bỏ qua bước này vì hướng dẫn đầy đủ “Cài đặt và tối ưu hóa MariaDB trên Linux” đã được xuất bản trước đây. Hãy tận dụng điều này.

Định cấu hình Nginx + PHP-FPM để tải cao

Để máy chủ web của bạn có thể xử lý một số lượng lớn các yêu cầu của khách hàng (trang web có lưu lượng truy cập cao), điều quan trọng là phải định cấu hình đúng nginx php-fpm .

Cấu hình Nginx

Mở /etc/nginx/nginx.conf và thay đổi cấu hình Nginx như sau:

  • worker_processes 2; - đặt số lượng quy trình công nhân bằng số lõi trên máy chủ của bạn;
  • worker_connections 1024; - đặt số lượng kết nối cho một quy trình làm việc (đặt giá trị từ 1024 đến 4096);
  • use epoll; - là một phương thức kết nối tối ưu trong Linux
  • multi_accept on; - nginx sẽ chấp nhận số lượng kết nối tối đa.

Khối http:

  • tcp_nodelay on; - gửi tiêu đề và phần đầu của tệp trong một gói;
  • tcp_nopush on;

Bật tính năng nén gzip cho các dự án web chứa nhiều tệp tĩnh:

gzip on;

Thêm các loại tệp khác nhau để vượt qua tất cả các kiểm tra tốc độ của googles:
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;

Thay đổi cài đặt thời gian chờ:

  • keepalive_timeout 30; - máy chủ web sẽ đợi trong 30 giây trước khi đóng kết nối lưu giữ;
  • keepalive_requests 100; là số lượng yêu cầu lưu giữ tối đa từ một khách hàng;
  • reset_timedout_connection on; - bật tham số này nếu bạn không muốn đặt lại các kết nối từ một ứng dụng khách đã ngừng phản hồi;
  • client_body_timeout 10; - máy chủ web sẽ đợi máy khách xác nhận yêu cầu trong 10 giây cho đến khi kết nối được đặt lại;
  • send_timeout 2; - nếu máy khách ngừng đọc phản hồi của máy chủ web, nginx sẽ đặt lại kết nối.

Nếu trang web của bạn không được thiết kế để tải lên các tệp lớn, hãy đặt giới hạn bằng cách sử dụng nginx:

  • client_max_body_size 2m; - máy chủ sẽ không chấp nhận các yêu cầu trên 2 MB

Định cấu hình máy chủ web NGINX và PHP-FPM hiệu suất cao

Nếu nội dung dự án của bạn không thay đổi thường xuyên, bạn có thể sử dụng giá thầu ‘ expires max; 'Caching hoặc thêm tùy chọn tương ứng vào tệp cấu hình của máy chủ lưu trữ của bạn cho các loại tệp bạn cần, ví dụ:

location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico|woff)$ {
expires 7d;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Bộ nhớ đệm cho các loại tệp được chỉ định sẽ được lưu trữ trong 7 ngày.

Đừng quên khởi động lại nginx sau khi thực hiện bất kỳ thay đổi nào.

# systemctl restart nginx

Cấu hình Php-fpm

Khi cài đặt php-fpm, bạn đã chuyển nó sang ổ cắm unix ngay lập tức. Nó tăng đáng kể hiệu suất. Theo ước tính, năng suất tăng gấp 2, 3 lần. Các tham số php-fpm khác phải được đặt cho từng dự án riêng lẻ. Hãy xem xét một ví dụ cấu hình cho máy chủ lõi đơn (vCPU) có RAM 1.024 MB.

Bạn có thể phân bổ khoảng 512 MB cho php-fpm, để lại phần còn lại cho cơ sở dữ liệu và nginx của bạn.

Thêm phần sau vào tệp cấu hình /etc/php-fpm/www.conf :

  • pm.max_children = 18 là số lượng quy trình con tối đa
  • pm.start_servers = 6 là số lượng quy trình con được tạo khi khởi động
  • pm.min_spare_servers = 4 là số lượng quy trình máy chủ không hoạt động tối thiểu
  • pm.max_spare_servers = 16 là số lượng tối đa các quy trình máy chủ không hoạt động
  • pm.max_requests = 400 là số lượng yêu cầu quy trình con, sau đó quy trình sẽ được khởi động lại

Tôi chưa mô tả cách tối ưu hóa cài đặt MariaDB, vì có bài viết tương ứng trên trang web này. Tôi đã đặt tham số my.cnf cho dự án của mình dựa trên bài viết và cơ sở dữ liệu đã cho thấy kết quả hoạt động xuất sắc.

Sau khi chạy trang web của mình, bạn sẽ thấy bằng mắt thường rằng nginx + php-fpm sẽ xử lý các yêu cầu của bạn và trả về các trang web nhanh hơn nhiều so với apache2 + mod_php.