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

Cách cấu hình Apache và PHP cho website traffic cao trên Linux Server

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


# 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



PASTE

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应用程序。