Computer >> Hướng Dẫn Máy Tính >  >> Hệ Thống >> Linux

Cấu hình máy chủ Web NGINX và PHP-FPM hiệu suất cao

PHP-FPM (Fast Process Manager) là một triển khai riêng của FastCGI để chạy script PHP. Bạn có thể dùng tổ hợp máy chủ web NGINX (xử lý tĩnh) và PHP-FPM để xây dựng máy chủ web nhanh hơn và hiệu suất cao hơn cho trang web của bạn so với ngăn xếp LAMP (NGINX, Apache và module mod_php).

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

Trong bài viết này, chúng ta sẽ xem cách cài đặt và tối ưu 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à Cấu hình Nginx làm máy chủ Web

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

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

Cấu hình máy chủ Web NGINX và PHP-FPM hiệu suất cao

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

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

Hoặc tạo file cấu hình kho thủ công (/etc/yum.repos.d/nginx.repo). Thêm các dòng sau vào file:

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

Nếu bạn 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

Cấu hình máy chủ Web NGINX và PHP-FPM hiệu suất cao

Sau đó chạy nginx và thêm 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 máy chủ web đang chạy, mở địa chỉ IP máy chủ trong trình duyệt.

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 dịch vụ được phép, cổng và vùng trong firewalld trên máy chủ của bạn.

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

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

Mở file cấu hình:

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

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

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;
}

File cấu hình chứa cài đặt truy cập trang web bằng giao thức HTTP an toàn vì nhiều CMS phổ biến dùng nó mặc định. Sau này bạn có thể cài đặt và cấu hình chứng chỉ Let's Encrypt miễn phí (giống như chúng ta cài chứng chỉ Let's Encrypt cho trang web trong IIS trên Windows Server).

Cài đặt PHP-FPM

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

Php-fpm là trình quản lý tiến trình PHP dễ dàng và nhanh. Nó không dùng giao thức HTTP (khác với Apache) và làm việc với giao thức FastCGI đặc biệt. Một quy trình FPM nhẹ và dễ dùng xử lý yêu cầu PHP nhanh hơn. Đồng thời, so với cấu hình apache, nó 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 ta, nginx sẽ là máy chủ proxy (máy chủ cache và front-end) và php-fpm sẽ đóng vai trò back-end.

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

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

Sau cài đặt, chỉnh sửa file /etc/yum.repos.d/remi-php74.repo:

Cấu hình máy chủ Web NGINX và PHP-FPM hiệu suất cao

Chạy cài đặt php-fpm và các module 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

Cấu hình máy chủ Web NGINX và PHP-FPM hiệu suất cao

Khởi động daemon php-fpm và thêm 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.

Để chắc chắn dịch vụ đã khởi động, chạy lệnh:

# 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 unix socket. Xóa dòng "listen = 127.0.0.1:9000" từ /etc/php-fpm.d/www.conf và thêm sau:

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

Để chạy php-fpm dưới user không phải apache (mặc định), chỉ định tham số sau trong file cấu hình:

user = nginx
group = nginx

Sau khi thay đổi file cấu hình php-fpm, 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 ta sẽ bỏ qua bước này, vì hướng dẫn hoàn chỉnh "Cài đặt và Tối ưu MariaDB trên Linux" đã được xuất bản trước đó. Hãy tận dụng nó.

Cấu hình Nginx + PHP-FPM cho tải cao

Để máy chủ web của bạn có thể xử lý số lượng lớn yêu cầu khách hàng (trang web traffic cao), việc cấu hình đúng nginx và php-fpm rất quan trọng.

Cấu hình Nginx

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

  • worker_processes 2; — đặt số tiến trình worker bằng số nhân trên máy chủ của bạn;
  • worker_connections 1024; — đặt số kết nối cho một tiến trình worker (đặt giá trị từ 1024 đến 4096);
  • use epoll; — là phương pháp 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 header và đầu file trong một gói;
  • tcp_nopush on;

Bật nén gzip cho dự án web chứa nhiều file tĩnh:

gzip on;

Thêm các loại file khác nhau để vượt qua tất cả kiểm tra googlespeed:
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/vnd.wap.wml text/vtt text/x-component text/x-cross-domain-policy;

Thay đổi cài đặt timeout:

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

Nếu trang web của bạn không thiết kế để tải file lớn, hãy đặt giới hạn bằng nginx:

  • client_max_body_size 2m; — máy chủ sẽ không chấp nhận yêu cầu lớn hơn 2 MB

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ể dùng caching 'expires max;' hoặc thêm tùy chọn tương ứng vào file cấu hình host cho các loại file bạn cần, ví dụ:

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

Cache cho các loại file chỉ định sẽ được lưu 7 ngày.

Đừng quên khởi động lại nginx sau khi thay đổi.

# systemctl restart nginx

Cấu hình Php-fpm

Khi cài đặt php-fpm, bạn đã chuyển nó sang unix socket ngay. Điều này tăng hiệu suất đáng kể. Theo ước tính, năng suất tăng 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 ví dụ cấu hình cho máy chủ đơn nhân (vCPU) với 1,024 MB RAM.

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

Thêm sau vào file cấu hình /etc/php-fpm/www.conf:

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

Tôi chưa mô tả cách tối ưu 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 kết quả hiệu suất tuyệt vời.

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