Gần như mọi hướng dẫn cài đặt LAMP stack (Linux, Apache, MySQL, PHP) đều khuyên dùng module Apache tích hợp để xử lý script PHP. Ví dụ, trên Ubuntu bạn bật điều này khi dùng lệnh như sudo apt install libapache2-mod-php để cài gói. Điều này buộc Apache dùng mpm_prefork. Mỗi khi truy cập website, một tiến trình mới sẽ được khởi chạy xử lý kết nối. Điều này hoạt động tốt khi traffic thấp.
Nhưng, nó thành vấn đề lớn nếu bạn nhận được bùng nổ traffic đột ngột. Ví dụ, bài đăng Reddit có thể nhắc đến website của bạn, và nếu bài đăng phổ biến, bạn có thể nhận hàng nghìn truy cập trong vài phút.
Trong trường hợp tốt nhất, nếu Apache xử lý được bùng nổ traffic, một số khách truy cập không may phải chờ có thể 30-60 giây cho đến khi trang tải xong, điều kỳ quặc trong thế giới ngày nay. Trong trường hợp xấu nhất, server sẽ bắt đầu lag nghiêm trọng, và một số kết nối sẽ bị drop đơn giản vì thiếu tài nguyên. Lúc này khách truy cập sẽ thấy lỗi trên trình duyệt.
Đó không phải kịch bản tốt dù cách nào, vì bạn có thể mất sự chú ý của hàng trăm hoặc hàng nghìn độc giả, khách hàng hoặc fan tiềm năng.
Thật không may, PHP tiêu tốn tài nguyên khá lớn dù sao. Nhưng với mpm_event, Apache có thể xử lý bùng nổ traffic đột ngột hiệu quả hơn nhiều. Khuyến nghị server có ít nhất 2GB RAM và 2 nhân CPU, thật hoặc ảo, thậm chí nhiều hơn nếu bạn kỳ vọng spike traffic mạnh, như hơn mười truy cập mỗi giây. Nếu dùng VPS, thêm nhân CPU ảo và lưu trữ SSD. RAM là thứ cấp.
Cách dùng Apache MPM Event và PHP-FPM trên bản phân phối Debian-based
Trên Debian, Ubuntu hoặc các distro họ này, chỉ cần tránh cài gói "libapache2-mod-php". Khi cài Apache, nó dùng MPM event mặc định. Nhưng khi cài gói trên, một script vô hiệu hóa MPM event và bật MPM prefork. Module PHP Apache chỉ hoạt động (an toàn) với mpm_prefork. Tất nhiên, không có "libapache2-mod-php", bạn không có bộ xử lý cho tệp PHP. Vì vậy bạn sẽ dùng PHP-FPM thay vì module PHP trong Apache. Đây là cách cài LAMP stack trên server mới. Bạn có thể điều chỉnh bước theo yêu cầu ứng dụng web.
Đầu tiên, đăng nhập root. Sau đó, cài Apache.
apt update && apt install apache2
Lúc này bạn thấy Apache确实默认启用了 MPM event.
apachectl -V
Cài PHP-FPM.
apt install php-fpm
Bạn sẽ thấy hướng dẫn cách bật bộ xử lý PHP trong Apache.
Bật giao thức FastCGI.
a2enmod proxy_fcgi
Bật cấu hình mặc định PHP-FPM cho Apache.
a2enconf php7.0-fpm
Lưu ý: trong các phiên bản Debian/Ubuntu tương lai, lệnh này có thể thay đổi, ví dụ a2enconf php7.6-fpm, vì PHP-FPM sẽ là phiên bản khác.
Khởi động lại Apache.
systemctl restart apache2
Cài phần còn lại yêu cầu cho ứng dụng PHP. Ví dụ:
apt install mariadb-server php-mysql
Điều này cài server database và module PHP MySQL để ứng dụng PHP kết nối database.
Cách dùng Apache MPM Event và PHP-FPM trên bản phân phối RedHat-based
Lựa chọn server phổ biến khác là RedHat, hoặc CentOS. Cùng cách trên, ví dụ cài sạch Apache với MPM event bật và PHP-FPM sẽ được đưa ra.
Đăng nhập root và cài Apache.
yum install httpd
Khác với distro Debian-based, ở đây bạn thấy Apache dùng MPM prefork mặc định, ít nhất trên CentOS 7 mới nhất tại thời điểm viết.
apachectl -V
Để bật MPM event, bạn phải chỉnh tệp cấu hình.
sed -i '/mpm_prefork\.so$/s/^/#/' /etc/httpd/conf.modules.d/00-mpm.conf
Lệnh này thêm dấu # để chú thích (vô hiệu) dòng LoadModule mpm_prefork_module modules/mod_mpm_prefork.so.
Bây giờ bỏ chú thích (kích hoạt) dòng #LoadModule mpm_event_module modules/mod_mpm_event.so bằng cách xóa dấu # ở đầu với lệnh sau.
sed -i '/mpm_event\.so$/s/^#//' /etc/httpd/conf.modules.d/00-mpm.conf
Khởi động Apache và bật tự động chạy khi boot.
systemctl start httpd.service systemctl enable httpd.service
Kiểm tra Apache có dùng MPM event không.
apachectl -V
Cài PHP-FPM và module FastCGI.
yum install php-fpm mod_fcgid
Tạo "/etc/httpd/conf.d/php.conf" để chỉ dẫn Apache cách xử lý tệp PHP. Sao chép TẤT CẤT nội dung dưới, dán tất cả cùng lúc vào terminal, rồi nhấn ENTER.
cat </etc/httpd/conf.d/php.conf # Redirect to local php-fpm if mod_php is not available PASTE # Enable http authorization headers SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1 #SetHandler "proxy:unix:/run/php/php7.0-fpm.sock|fcgi://localhost" SetHandler "proxy:fcgi://127.0.0.1:9000" # Deny access to raw php sources by default # To re-enable it's recommended to enable access to the files # only in specific virtual host or directory Require all denied # Deny access to files without filename (e.g. '.php')Require all denied
Tin tưởng cho cấu hình tuyệt vời này thuộc về Debian. Nguồn khác khuyến nghị tệp cấu hình đơn giản như:
SetHandler "proxy:fcgi://127.0.0.1:9000"
Nhưng điều này dễ bị tấn công, và nếu dịch vụ nhất định fail, bạn có thể phơi bày tệp PHP ra công cộng, lần lượt có thể phơi bày mật khẩu, mã và dữ liệu nhạy cảm.
Khởi động lại Apache.
systemctl restart httpd.service
Khởi động PHP-FPM và bật tự động chạy khi boot.
systemctl start php-fpm.service systemctl enable php-fpm.service
Kết luận
Bây giờ bạn có server Apache mở rộng tốt hơn nhiều với traffic. Tuy nhiên, nhớ rằng bạn đang dùng cài đặt mặc định, như gì "tốt nhất" cho hầu hết mọi người. Nếu bạn thực sự muốn榨干HTTP server的性能,您必须阅读有关您可以调整的各种变量。这些变量的正确值高度依赖于您服务器的资源、预期流量和PHP应用程序。