Lưu trữ thẻ: #tối ưu

Hướng dẫn cấu hình tối ưu PHP-FPM

I. PHP-FPM là gì

PHP-FPM (FastCGI Process Manager) là một trình quản lý PHP thay thế cho FastCGI, với các tính năng bổ sung để có thể tối ưu cho các website có lượng truy cập lớn. Ưu điểm chính của PHP-FPM là nó sử dụng ít tài nguyên hơn so với bất kỳ giải pháp chạy PHP nào khác, qua đó quản lý hiệu quả tài nguyên và giúp tăng tốc website.

Trong nhiều trường hợp, việc tối ưu không tốt PHP-FPM không tốt có thể khiến server bị giới hạn khả năng chịu tải, trong khi vẫn dư thừa tài nguyên. Cụ thể hơn, Quý khách có thể thấy xuất hiện những lỗi như sau trong error log của PHP-FPM:

[05-Feb-2020 08:28:31] WARNING: [pool www] server reached pm.max_children setting (10), consider raising it
[05-Feb-2020 08:28:31] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 0 idle, and 9 total children

Thông báo này có nghĩa là PHP-FPM đang bận và không thể xử lý lưu lượng truy cập cao với các tham số cấu hình hiện có.

PHP-FPM có thể dẫn đến quá tải máy chủ do nhiều lý do:

  • Quá nhiều tiến tình chạy do lưu lượng truy cập cao hoặc bị tấn công
  • Cấu hình PHP-FPM không được tối ưu so với tài nguyên của máy chủ

II. Tối ưu PHP-FPM

  1. Thông số máy chủ

    • Đầu tiên, hãy xác định lại thông số máy chủ của bạn. Số core CPU và kích thước bộ nhớ RAM hiện có của server, lượng tài nguyên sẽ sử dụng cho PHP-FPM.
    • Ví dụ: giả sử bạn có 4vCPU và RAM 16 GB
      Trong bài viết này, chúng tôi sẽ sử dụng 10 GB RAM để phân bổ cho hoạt động PHP.
  2. Tính dung lượng RAM tiêu thụ của mỗi tiến trình PHP-FPM

    • Thực thi lệnh sau để kiểm tra dung lượng RAM mà mỗi tiến trình PHP-FPM đang sử dụng.
      ps -ylC php-fpm7.3 --sort:rss

      Thay thế với đúng tên phiên bản PHP đang sử dụng.

    • Kết quả nhận được sẽ giống như bên dưới:
      S UID PID  PPID C PRI NI RSS    SZ     WCHAN TTY TIME      CMD 
      S 0   9030 1    0 80  0  31244  120002 -     ?   00:00:05  php-fpm7.3 
      S 33  7511 9030 1 80  0  130636 148827 -     ?   00:00:04  php-fpm7.3 
      S 33  7479 9030 2 80  0  133724 150336 -     ?   00:00:16  php-fpm7.3 
      S 33  7504 9030 2 80  0  136272 150365 -     ?   00:00:08  php-fpm7.3
    • Hãy lưu ý các giá trị bên dưới cột RSS. Đây là bộ nhớ được sử dụng bởi mỗi tiến trình PHP-FPM của bạn. Như trên, chúng ta có trung bình khoản 150 MB RAM được sử dụng cho mỗi tiến trình con PHP-FPM.
  3. Cấu hình PHP-FPM

    • File cấu hình PHP-FPM
      /etc/php/7.3/fpm/pool.d/www.conf

      Đường dẫn có thể sẽ khác tùy thuộc vào phiên bản php. Có 4 giá trị chúng ta cần lưu ý khi cấu hình php-fpm, bao gồm:

      • pm.max_children
      • pm.start_servers
      • pm.min_spare_servers
      • pm.max_spare_servers
    • pm.max_children
      Giá trị max_children nên được tính bằng cách lấy tổng dung lượng bộ nhớ RAM sử dụng cho PHP-FPM chia cho dung lượng ram tiêu thụ trung bình cho mỗi tiến trình PHP-FPM (2).
      Ví dụ: trong bài hướng dẫn này, chúng ta có 10 GB RAM (10000 MB) phân bổ cho mỗi tiến trình 150 MB, nên:

       pm.max_children = 10000 / 150 ~ 67
    • pm.start_servers
      Giá trị start_servers nên được tính bằng cách lấy số core CPU nhân với 4.
      Ví dụ: trong hướng dẫn này, số core của server là 4, nên:

      pm.start_servers = 4 x 4 = 16
    • pm.min_spare_servers
      Giá trị min_spare_servers nên được tính bằng cách lấy số core CPU nhân với 2.
      Ví dụ:  trong môi trường hướng dẫn này:

      pm.min_spare_servers = 4 x 2 = 8
    • pm.max_spare_servers
      Giá trị max_spare_servers cũng nên được tính bằng lấy số lượng core CPU nhân với 4.
      Ví dụ: trong môi trường bài hướng dẫn này:

      pm.max_spare_servers = 4 x 4 = 16
    • Chúng ta được kết quả cuối cùng:
      pm.max_children = 67 
      pm.min_spare_servers = 8 
      pm.max_spare_servers = 16 
      pm.start_servers = 16
  4. Lưu lại và khởi động lại dịch vụ  PHP-FPM:
    sudo service php7.3-fpm restart

Như vậy Long Vân đã hướng dẫn Quý khách cách tối ưu cho PHP-FPM. Chúc Quý khách thành công.

Hướng dẫn tối ưu cấu hình Apache cho website có lưu lượng truy cập cao

Nếu bạn đang chạy một trang web nhận được nhiều lưu lượng truy cập, điều cần thiết là phải tối ưu hóa cấu hình máy chủ web Apache của bạn để đảm bảo hiệu suất và tính khả dụng tối đa. Trong bài viết này, Long Vân sẽ cung cấp cho bạn một số mẹo và ví dụ về cách tối ưu hóa cấu hình Apache của bạn cho các trang web có lưu lượng truy cập cao.

I. Sử dụng module MPM phù hợp

Apache sử dụng Multi-Processing Modules (MPM) để xử lý các yêu cầu của client. MPM chịu trách nhiệm tạo các tiến trình hoặc luồng con để xử lý các yêu cầu đến. Có ba module MPM có sẵn trong Apache: preforkworkervà event.

  • MPM preforklà module MPM lâu đời nhất và ổn định nhất. Nó tạo ra một tiến trình cho mỗi kết nối, điều này có thể dẫn đến việc sử dụng nhiều tài nguyên.
  • MPM workertạo nhiều luồng cho mỗi tiến trình, có thể cải thiện hiệu suất và giảm mức sử dụng tài nguyên.
  • MPM eventtương tự như workerMPM, nhưng nó bổ sung cơ chế thông báo sự kiện không đồng bộ để cải thiện hiệu suất hơn nữa.

Để tối ưu hóa cấu hình Apache của bạn để có lưu lượng truy cập cao, chúng tôi khuyên bạn nên sử dụng module worker hoặc event MPM. Bạn có thể kích hoạt các mô-đun này bằng cách bỏ # các dòng sau trong tệp cấu hình Apache của mình:

LoadModule mpm_worker_module modules/mod_mpm_worker.so

hoặc

LoadModule mpm_event_module modules/mod_mpm_event.so

II. Tăng số lượng tiến trình/luồng con

Để xử lý khối lượng lớn yêu cầu gửi đến, bạn cần tăng số lượng tiến trình hoặc luồng con mà Apache có thể tạo. Số lượng tiến trình hoặc luồng con bạn nên tạo tùy thuộc vào lượng bộ nhớ và tài nguyên CPU có sẵn trên máy chủ của bạn.

Để tăng số lượng tiến trình hoặc luồng con, bạn cần sửa đổi các giá trị StartServers,  MaxClients,  MaxSpareServersvà  MinSpareServers trong tệp cấu hình Apache của mình.

StartServers là số tiến trình con được khởi chạy khi Apache khởi động. MaxClients là số lượng kết nối đồng thời tối đa mà Apache có thể xử lý. MaxSpareServers là số tiến trình con nhàn rỗi tối đa mà Apache duy trì. MinSpareServers là số tiến trình con nhàn rỗi tối thiểu mà Apache duy trì.

Ví dụ: để đặt  StartServers thành 10,  MaxClients thành 500,  MaxSpareServers thành 200 và  MinSpareServers thành 10, bạn có thể thêm các dòng sau vào tệp cấu hình Apache của mình:

StartServers 10
MaxClients 500
MaxSpareServers 200
MinSpareServers 10

Bạn cũng nên cân nhắc việc đặt  ServerLimitcó cùng giá trị với  MaxClients. Điều này đảm bảo rằng Apache không tạo ra nhiều tiến trình con hơn mức cần thiết.

Một tham số quan trọng khác có thể giúp tăng số lượng tiến trình/luồng con trong Apache là giá trị  MaxRequestWorkers . Giá trị này chỉ định số lượng yêu cầu đồng thời tối đa mà Apache có thể xử lý.

Theo mặc định,  MaxRequestWorkers giá trị được đặt thành 256. Tuy nhiên, giá trị này có thể tăng lên để cho phép Apache xử lý đồng thời nhiều yêu cầu hơn.

Để điều chỉnh  MaxRequestWorkers giá trị, bạn có thể thêm dòng sau vào tệp cấu hình Apache của mình:

MaxRequestWorkers 500

Trong ví dụ trên, chúng tôi đã đặt  MaxRequestWorkers giá trị thành 500, có nghĩa là Apache có thể xử lý tối đa 500 yêu cầu đồng thời.

Điều quan trọng cần lưu ý là việc tăng  MaxRequestWorkers giá trị cũng làm tăng dung lượng bộ nhớ được Apache sử dụng. Do đó, bạn nên đảm bảo rằng máy chủ của bạn có đủ bộ nhớ để xử lý các yêu cầu bổ sung.

III. Kích hoạt KeepAlive

Tính năng KeepAlive cho phép client sử dụng lại cùng một kết nối với máy chủ cho nhiều yêu cầu, giảm chi phí tạo kết nối mới cho mỗi yêu cầu. Kích hoạt KeepAlive có thể cải thiện đáng kể hiệu suất trang web của bạn.

Để bật KeepAlive, bạn cần đặt KeepAlive thành On. Bạn cũng nên đặt KeepAliveTimeout thành một giá trị phù hợp với trang web của mình. Ví dụ: để đặt thời gian chờ KeepAlive thành 5 giây, bạn có thể thêm các dòng sau vào tệp cấu hình Apache của mình:

KeepAlive On
KeepAliveTimeout 5
MaxKeepAliveRequests 100 

IV. Kích hoạt bộ nhớ đệm

Bộ nhớ đệm là quá trình lưu trữ dữ liệu được truy cập thường xuyên trong bộ nhớ hoặc trên đĩa, giảm số lượng yêu cầu cần được máy chủ xử lý. Kích hoạt bộ nhớ đệm có thể cải thiện đáng kể hiệu suất trang web của bạn, đặc biệt đối với nội dung tĩnh.

Apache cung cấp một số module bộ nhớ đệm, chẳng hạn như mod_cachevà mod_disk_cache. Để bật bộ nhớ đệm, bạn cần tải module bộ nhớ đệm thích hợp và định cấu hình nó trong tệp cấu hình Apache của bạn. Ví dụ: để bật bộ nhớ đệm nội dung tĩnh bằng cách sử dụng mod_disk_cache, bạn có thể thêm các dòng sau vào tệp cấu hình Apache của mình:

LoadModule cache_module modules/mod_cache.so
LoadModule disk_cache_module modules/mod_disk_cache.so
CacheEnable disk /
CacheRoot /var/cache/apache2/mod_disk_cache
CacheDirLevels 2
CacheDirLength 1

Những dòng này kích hoạt các module mod_cachevà mod_disk_cachevà định cấu hình bộ nhớ đệm cho thư mục gốc ( /) bằng bộ đệm đĩa. Lệnh này CacheRootchỉ định thư mục nơi nội dung được lưu trong bộ đệm sẽ được lưu trữ, đồng thời CacheDirLevelsCacheDirLengthkiểm soát cấu trúc phân cấp thư mục bộ đệm.

V. Sử dụng tính năng nén dữ liệu trong Apache

Nén là quá trình giảm kích thước dữ liệu được gửi qua mạng bằng cách loại bỏ thông tin dư thừa. Việc kích hoạt tính năng nén có thể làm giảm đáng kể lượng dữ liệu cần truyền đi, cải thiện hiệu suất trang web của bạn.

Apache cung cấp một module nén có tên mod_deflate. Để bật tính năng nén, bạn cần tải mod_deflatemodule và định cấu hình nó trong tệp cấu hình Apache của mình.

Ví dụ: để bật tính năng nén nội dung dựa trên văn bản, bạn có thể thêm các dòng sau vào tệp cấu hình Apache của mình:

LoadModule deflate_module modules/mod_deflate.so
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript application/json

Những dòng này kích hoạt mod_deflate mô-đun và chỉ định loại nội dung cần được nén.

VI. Hạn chế quyền truy cập vào tài nguyên

Việc hạn chế quyền truy cập vào tài nguyên có thể giúp giảm tải cho máy chủ và cải thiện hiệu suất trang web của bạn. Bạn có thể giới hạn quyền truy cập vào tài nguyên bằng cách sử dụng các lệnh OrderAllowvà Denytrong tệp cấu hình Apache của mình.

Ví dụ: để giới hạn quyền truy cập vào thư mục có tên admin, bạn có thể thêm các dòng sau vào tệp cấu hình Apache của mình:

<Directory /var/www/html/admin>
    Order deny,allow
    Deny from all
    Allow from 192.168.0.0/24
</Directory>

Những dòng này chỉ định rằng quyền truy cập vào adminthư mục sẽ bị từ chối đối với tất cả các máy khách ngoại trừ những máy khách trong 192.168.0.0/24mạng con.

VII. Tối ưu hóa tài nguyên máy chủ

Ngoài việc tối ưu hóa Apache, bạn cũng có thể tối ưu hóa tài nguyên máy chủ để đảm bảo hiệu suất và tính khả dụng tối đa cho trang web của mình.

1. Tăng giới hạn bộ nhớ và đặt Opcache

Giới hạn bộ nhớ mặc định của tập lệnh PHP có thể không đủ để xử lý khối lượng lớn yêu cầu gửi đến. Bạn có thể tăng giới hạn bộ nhớ bằng cách sửa đổi  memory_limit lệnh trong tệp cấu hình PHP của mình.

Ngoài ra, bạn cũng có thể kích hoạt Opcache, đây là bộ đệm mã byte cho các tập lệnh PHP. Opcache lưu trữ bytecode tập lệnh được biên dịch sẵn trong bộ nhớ, giảm chi phí phân tích cú pháp và biên dịch tập lệnh cho mọi yêu cầu.

Cài đặt OPCache
# For CentOS, RedHat and Alma Linux use this command :
$ sudo yum install php-opcache
# For Ubuntu and Debian use this command :
$ sudo apt-get install php-opcache

Sau khi quá trình cài đặt hoàn tất, hãy khởi động lại Apache để áp dụng các thay đổi:

$ sudo systemctl restart apache2

Đó là nó! OPcache bây giờ sẽ được cài đặt và kích hoạt trên hệ thống Ubuntu của bạn. Bạn có thể xác minh rằng nó đã được bật bằng cách kiểm tra cấu hình PHP của bạn.

2. Thiết lập tệp Hoán đổi hoặc phân vùng Hoán đổi

Nếu máy chủ của bạn hết bộ nhớ, nó có thể bắt đầu sử dụng đĩa cứng làm bộ nhớ ảo, điều này có thể làm giảm đáng kể hiệu suất trang web của bạn. Bạn có thể tránh điều này bằng cách thiết lập tệp Hoán đổi hoặc phân vùng Hoán đổi, cung cấp thêm bộ nhớ ảo khi bộ nhớ vật lý cạn kiệt.

Để thiết lập tệp Hoán đổi, bạn có thể sử dụng các lệnh sau:

$ sudo fallocate -l 1G /swapfile
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile

Các lệnh này tạo tệp Hoán đổi 1GB, đặt quyền cho tệp, định dạng tệp là Hoán đổi và bật Hoán đổi.

3. Kích hoạt tính năng nén GZIP

Kích hoạt tính năng nén GZIP có thể giảm kích thước dữ liệu được truyền qua mạng, cải thiện hiệu suất trang web của bạn. Bạn có thể kích hoạt tính năng nén GZIP bằng cách tải  deflatemodule trong Apache và định cấu hình nó trong tệp cấu hình Apache của bạn.

Để bật tính năng nén GZIP, bạn có thể sử dụng các lệnh sau:

$ sudo a2enmod deflate
$ sudo service apache2 restart

Các lệnh này kích hoạt  deflate mô-đun trong Apache và khởi động lại dịch vụ Apache. Sau khi  deflate mô-đun được bật, Apache sẽ tự động nén nội dung bằng GZIP khi máy khách hỗ trợ nó.

Như vậy Long Vân đã hướng dẫn Quý khách tối ưu cấu hình Apache cho website có lưu lượng cao. Chúc Quý khách thành công.