Lưu trữ thẻ: #apache mpm

Hướng dẫn cấu hình Apache MPM

I. Giới thiệu và so sánh sự khác nhau giữa 3 mode chính

Apache MPM là các module muti-processing quyết định cách thức mà Apache sẽ tiếp nhận và xử lý các request từ client. MPM là module của apache nên có thể enable hay disable trong file config của apache. Apache từ version 2.4 trở đi hỗ trợ 3 modules multi-processing : worker, prefork và event (lưu ý : trong một thời điểm chỉ sử dụng được 1 trong 3 modules này).

  1. MPM Perfork
    Sử dụng nhiều tiến trình con (chill process) trong apache và mỗi chill process đó chỉ có 1 luồng (thread) để xử lý một request tại cùng một thời điểm.

    • Ưu điểm: Các process được xử lý hoàn toàn một cách độc lập không liên quan gì đến nhau, cho nên nếu một process chết thì các process còn lại vẫn hoạt động và vẫn hoàn thành công việc của nó. Đây là module mặc định và là module ổn định nhất, tương thích với các phần mềm cũ hơn.
    • Nhược điểm: do xử lý không phân luồng nên tạo ra quá nhiều process sẽ chiếm dụng lượng tài nguyên server lớn.
    • Thông số cần lưu ý:
      • StartServers : số process được tạo ra lúc apache start
      • MinspareServer : số process tối thiểu được chuẩn bị sẵn.
      • MaxSpareServer : số process tối đa được chuẩn bị sẵn
      • ServerLimit : Giá trị lớn nhất của Maxclient trong thời gian chạy apache
      • MaxClient : số process lớn nhất được chạy
      • MaxRequestsPerChild : số lượng request tối đa mà một process có thể phục vụ
      • MaxRequestWorkers : số lượng tiến trình con tối đa có thể tồn tại cùng một lúc
  2. MPM Worker
    Sử dụng nhiều tiến trình con (chill process) trong apache và mỗi chill process sẽ có nhiều luồng (thread) và mỗi luồng sẽ xứ lý một request tại một thời điểm.

    • Ưu điểm: có thể xử lý nhiều tiến trình cùng 1 lúc. Nhanh hơn prefork và có thể xử lý nhiều khách truy cập hơn.
    • Nhược điểm: do xử lý nhiều nên tính ổn định sẽ không cao so với prefork.
    • Thông số cần lưu ý:
      • StartServers : số process được tạo ra lúc apache start
      • MaxClient : tổng số connections đồng thời sẽ được xử lý
      • MinSpareThread : số Thread tối thiểu được chuẩn bị sẵn
      • MaxSpareServer : Số Thread tối đa được chuẩn bị sẵn
      • ThreadsPerChild : số thread có trong một process
      • MaxrequestsPerchild : tổng số connections đồng thời được process xử lý.
      • MaxRequestWorkers : tổng số luồng tối đa có thể hoạt động đồng thời.
  3. MPM Event
    Event MPM dựa trên mô hình Worker MPM để hoạt động. Event MPM sử dụng các tiến trình parent ( tiến trình cha ) chịu trách nhiệm chạy các chill process, mỗi chill process sẽ tạo ra nhiều thread để xứ lý các request.

    • Ưu điểm : là cải tiến từ mpm worker với mục tiểu chỉ sử dụng các luồng cho các kết nối có xử lý tích cực và là module nhanh nhất, sử dụng ít tài nguyên nhất.
    • Nhược điểm : Do xử lý phức tạp và xử lý nhiều tiến trình hơn cho với 2 module trên nên tính ổn định kém nhất.

II. Kiểm tra module MPM đang chạy trên server

Để kiểm tra module mpm nào đang chạy trên server, Quý khách có thể thực hiện lệnh sau:

  • Centos: httpd -V | grep -i mpm
  • Ubuntu: apachectl -V | grep -i mpm

III. Tính toán và thiết lập các thông số để tối ưu phù hợp

  1. Tính toán các thông số:
    • Cài đặt python ps_mem.py
      wget https://raw.githubusercontent.com/pixelb/ps_mem/master/ps_mem.py
      chmod a+x ps_mem.py
      python ps_mem.py


      Như ví dụ trong bài viết này đang có 3 process size apache (httpd) tiêu thụ 4.6MB, vì vậy mỗi apache process đang sử dụng khoảng 1.5MB RAM và mỗi PHP process size sẽ sử dụng khoảng 4.5MB

    • Công thức tính MaxrequestWorkers và ServerLimit:
      MaxRequestWorkers = (Total RAM – Memory used for Linux, DB, etc.) / process size
      MaxRequestWorkers = (3770 – 925) / 1.5 = 1896
    • Công Thức tính php-fpm max-children
      Max-children = (Tổng RAM – Bộ nhớ được sử dụng cho Linux, DB, v.v.) / PHP process zise
      Max-children = (3770 – 925) / 4.5 = 632
  2. Điều chỉnh cấu hình
    • Vào file cấu hình của module MPM đang chạy để chỉnh sửa ví dụ trong bài viết đang chạy MPM Event thì ta vào đường dẫn ” /etc/apache2/mods-enabled/mpm_event.conf ”
    • Lưu ý rằng cài đặt mặc định không chứa “server limit “, vì vậy thêm nó vào đây còn các thông số khác thì để mặc định.
    • Cấu hình thông số php-fpm (8.1 là version trong bài  viết này sử dụng), vào file config của php-fpm “/etc/php/8.1/fpm/pool.d/www.conf”
      pm = dynamic
      pm.max_children =  640
      pm.start_servers = (cpu cores * 4)
      pm.min_spare_servers =  (cpu cores * 2)
      pm.max_spare_servers =  (cpu cores * 4)
      pm.max_requests = 1000
    • Lưu lại và restart service apache để áp dụng cấu hình mới.

Như vậy, Long Vân đã hoàn thành hướng dẫn Quý khách cách cấu hình module mpm trong máy chủ Apache. 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.

Tìm hiểu Apache MPM

I. Giới thiệu và so sánh sự khác nhau giữa 3 mode chính (Prefork, Worker, Event)

Apache MPM là các module muti-processing quyết định cách thức mà apache sẽ tiếp nhận và xử lý các request từ client. MPM là module của apache nên có thể enable hay disable trong file config của apache. Apache từ version 2.4 trở đi hỗ trợ 3 modules multi-processing : worker, prefork và event (lưu ý : chỉ sử dụng được 1 trong 3 modules này).

   1. MPM Perfork
Sử dụng nhiều tiến trình con (chill process) trong apache và mỗi chill process đó chỉ có 1 luồng (thread) để xử lý một request tại cùng một thời điểm.

Ưu điểm: Các process được xử lý hoàn toàn một cách độc lập không liên quan gì đến nhau, cho nên nếu một process chết thì các process còn lại vẫn hoạt động và vẫn hoàn thành công việc của nó. Đây là module mặc định và là module ổn định nhất, tương thích với các phần mềm cũ hơn.

Nhược điểm: do xử lý không phân luồng nên tạo ra quá nhiều process sẽ chiếm dụng lượng tài nguyên server lớn.

Thông số cần lưu ý:

StartServers : số process được tạo ra lúc apache start
MinspareServer : số process tối thiểu được chuẩn bị sẵn.
MaxSpareServer : số process tối đa được chuẩn bị sẵn
ServerLimit : Giá trị lớn nhất của Maxclient trong thời gian chạy apache
MaxClient : số process lớn nhất được chạy
MaxRequestsPerChild : số lượng request tối đa mà một process có thể phục vụ
MaxRequestWorkers : xác định số lượng tiến trình con tối đa có thể tồn tại cùng một lúc.

 2. MPM Worker
Sử dụng nhiều tiến trình con (chill process) trong apache và mỗi chill process sẽ có nhiều luồng (thread) và mỗi luồng sẽ xứ lý một request tại một thời điểm.

Ưu điểm: có thể xử lý nhiều tiến trình cùng 1 lúc. Nhanh hơn prefork và có thể xử lý nhiều khách truy cập hơn.

Nhược điểm: do xử lý nhiều nên tính ổn định sẽ không cao so với prefork.
Thông số cần lưu ý:
StartServers : số process được tạo ra lúc apache start
MaxClient : tổng số connections đồng thời sẽ được xử lý
MinSpareThread : số Thread tối thiểu được chuẩn bị sẵn
MaxSpareServer : Số Thread tối đa được chuẩn bị sẵn
ThreadsPerChild : số thread có trong một process
MaxrequestsPerchild : tổng số connections đồng thời được process xử lý.
MaxRequestWorkers : trong Worker xác định tổng số luồng tối đa có thể hoạt động đồng thời.

   3. MPM Event
Event MPM dựa trên mô hình Worker MPM để hoạt động. Event MPM sử dụng các tiến trình parent ( tiến trình cha ) chịu trách nhiệm chạy các chill process, mỗi chill process sẽ tạo ra nhiều thread để xứ lý các request.

 Ưu điểm : là cải tiến từ mpm worker với mục tiểu chỉ sử dụng các luồng cho các kết nối có xử lý tích cực và là module nhanh nhất, sử dụng ít tài nguyên nhất.

Nhược điểm : Do xử lý phức tạp và xử lý nhiều tiến trình hơn cho với 2 module trên nên tính ổn định kém nhất.

II. Kiểm tra module MPM đang chạy trên server

Centos: httpd -V | grep -i mpm
Ubuntu: apachectl -V | grep -i mpm

III. Thiết lập và tính toán các thông số để tối ưu phù hợp

– Cài đặt python ps_mem.py
wget https://raw.githubusercontent.com/pixelb/ps_mem/master/ps_mem.py
chmod a+x ps_mem.py
python ps_mem.py

Như ví dụ trong bài viết này đang có 3 process size apache (httpd) tiêu thụ 4.6MB, vì vậy mỗi apache process đang sử dụng khoảng 1.5MB RAM và mỗi PHP process size sẽ sử dụng khoảng 4.5MB

– Công thức tính MaxrequestWorkers và ServerLimit:
MaxRequestWorkers = (Total RAM – Memory used for Linux, DB, etc.) / process sizeMaxRequestWorkers = (3770 – 925) / 1.5 = 1896

– Công Thức tính php-fpm max-children
Max-children = (Tổng RAM – Bộ nhớ được sử dụng cho Linux, DB, v.v.) / PHP process zise
Max-children = (3770 – 925) / 4.5 = 632

IV. Chỉnh sửa cấu hình MPM trong apache

Vào file cấu hình của module MPM đang chạy để chỉnh sửa ví dụ trong bài viết đang chạy MPM Event thì ta vào đường dẫn ” /etc/apache2/mods-enabled/mpm_event.conf ”

Lưu ý rằng cài đặt mặc định không chứa “server limit “, vì vậy thêm nó vào đây còn các thông số khác thì để mặc định.
Cấu hình thông số php-fpm (8.1 là version trong bài  viết này sử dụng), vào file config của php-fpm “/etc/php/8.1/fpm/pool.d/www.conf”

pm = dynamic

pm.max_children =  640

pm.start_servers = (cpu cores * 4)

pm.min_spare_servers =  (cpu cores * 2)

pm.max_spare_servers =  (cpu cores * 4)

pm.max_requests = 1000