Máy chủ web Apache sử dụng server ảo để quản lý nhiều domain trên một version duy nhất. Tương tự, PHP-FPM sử dụng daemon để quản lý nhiều version PHP trên một version duy nhất. Cùng với nhau, bạn có thể sử dụng Apache và PHP-FPM để lưu trữ nhiều ứng dụng web PHP, mỗi ứng dụng sử dụng một version PHP khác nhau, tất cả trên cùng một server và tất cả cùng một lúc. Điều này rất hữu ích vì các ứng dụng khác nhau có thể yêu cầu các version PHP khác nhau, nhưng một số ngăn xếp server , như LAMP được cấu hình thường xuyên , chỉ có thể quản lý một ngăn xếp . Kết hợp Apache với PHP-FPM cũng là một giải pháp tiết kiệm chi phí hơn so với lưu trữ từng ứng dụng trên version riêng của nó.
PHP-FPM cũng cung cấp các tùy chọn cấu hình cho ghi log stderr và stdout , khởi động lại khẩn cấp và tạo quy trình thích ứng, rất hữu ích cho các trang web tải nặng. Trên thực tế, sử dụng Apache với PHP-FPM là một trong những cách tốt nhất để lưu trữ các ứng dụng PHP, đặc biệt là khi nói đến hiệu suất.
Trong hướng dẫn này, bạn sẽ cài đặt hai trang web PHP trên một version duy nhất. Mỗi trang web sẽ sử dụng domain riêng và mỗi domain sẽ triển khai version PHP của riêng mình. Đầu tiên, site1.your_domain , sẽ triển khai PHP 7.0. Thứ hai, site2.your_domain , sẽ triển khai PHP 7.2.
Yêu cầu
Bước 1 - Cài đặt các version PHP 7.0 và 7.2 với PHP-FPM
Với các yêu cầu đã hoàn thành, bây giờ bạn sẽ cài đặt version PHP 7.0 và 7.2. Kho lưu trữ SCL (Software Collections) duy trì nhiều version của ngăn xếp PHP cho hệ thống CentOS 7. Nếu bạn yêu cầu version PHP mới nhất tuyệt đối và nó không có sẵn trên SCL, hãy kiểm tra nhắc remi PPA ( repository cá nhân) .
Bắt đầu bằng cách cài đặt repository SCL vào hệ thống của bạn:
Trước tiên, hãy khám phá những version PHP 7 có sẵn trên SCL:
Bạn sẽ thấy một kết quả như thế này:
Output
Available Packages rh-php70.x86_64 2.3-1.el7 centos- sclo-rh rh-php71.x86_64 1-1.el7 centos-sclo-rh rh- php72.x86_64 1-2.el7 centos-sclo-rh rh-php73.x86_64 1-1.el7 centos-sclo-rh
Bạn sẽ lưu ý version mới nhất, PHP 7.3, cũng có sẵn. Tuy nhiên, đối với các ví dụ của ta , ta sẽ cài đặt version 7.0 và 7.2.
Hãy bắt đầu với version cũ hơn. Cài đặt rh-php70 và rh-php70-php-fpm :
Bây giờ lặp lại quy trình cho version PHP 7.2. Cài đặt rh-php72 và rh-php72-php-fpm .
Tiếp theo, chạy các lệnh sau để bắt đầu sử dụng cả hai bộ sưu tập phần mềm:
Theo mặc định, cả hai version PHP đều đang nghe trên cổng 9000 . Nhưng trong hướng dẫn này, ta muốn chạy hai version đồng thời. Do đó, hãy chỉ định hai cổng mới:
Để thực hiện điều này, bạn có thể mở /etc/opt/rh/rh-php70/php-fpm.d/www.conf trong editor yêu thích của bạn và thay đổi mọi giao diện của 9000 thành 9002 . Sau đó, lưu file và lặp lại quy trình cho /etc/opt/rh/rh-php72/php-fpm.d/www.conf , bây giờ chỉ thay thế 9000 bằng 9003 . Ngoài ra, bạn có thể sử dụng hai lệnh sed để thực hiện các lệnh thay thế:
Đến đây bạn đã chỉ định một cổng dành riêng cho mỗi dịch vụ PHP của bạn . Tuy nhiên, trước khi các sửa đổi này hoạt động, bạn phải thêm các cổng vào cấu hình SELinux của bạn .
SELinux là viết tắt của Security Enhanced Linux và nó được bật theo mặc định trên CentOS 7. Bạn phải thêm các cổng 9002 và 9003 vào database SELinux và gán chúng cho các dịch vụ httpd của bạn, nếu không các ứng dụng của bạn sẽ không chạy. Sử dụng lệnh semanage để thực hiện tác vụ này:
Cờ -a chỉ định rằng bạn đang thêm một đối tượng vào database . Cờ -t chỉ định loại đối tượng, trong trường hợp này là http_port_t . Và cờ -p chỉ định giao thức tcp . Bạn có thể tìm hiểu thêm về SELinux và lệnh semanage trong hướng dẫn này hoặc bằng cách truy cập tài liệu chính thức của SELinux .
Đến đây bạn đã sẵn sàng để bắt đầu và kích hoạt các dịch vụ PHP của bạn . Bắt đầu với dịch vụ rh-php70-php-fpm và cho phép nó chạy khi khởi động:
Tiếp theo, xác minh trạng thái của dịch vụ rh-php70-php-fpm :
Bạn sẽ thấy một kết quả như thế này:
Output
● rh-php70-php-fpm.service - The PHP FastCGI Process Manager Loaded: loaded (/usr/lib/systemd/system/rh-php70-php-fpm.service; enabled; vendor preset: disabled) Active: active (running) since Sat 2020-04-18 04:49:59 UTC; 1min 6s ago Main PID: 1852 (php-fpm) Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec" CGroup: /system.slice/rh-php70-php-fpm.service ├─1852 php-fpm: master process (/etc/opt/rh/rh-php70/php-fpm.conf) ├─1853 php-fpm: pool www ├─1854 php-fpm: pool www ├─1855 php-fpm: pool www ├─1856 php-fpm: pool www └─1857 php-fpm: pool www Apr 18 04:49:59 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Starting The PHP FastCGI Process Manager... Apr 18 04:49:59 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Started The PHP FastCGI Process Manager.
Lặp lại quá trình này, khởi động dịch vụ rh-php72-php-fpm và cho phép nó bắt đầu khi server khởi động :
Tiếp theo, xác minh trạng thái của dịch vụ rh-php72-php-fpm :
Bạn sẽ thấy một kết quả khác như thế này:
Output
● rh-php72-php-fpm.service - The PHP FastCGI Process Manager Loaded: loaded (/usr/lib/systemd/system/rh-php72-php-fpm.service; enabled; vendor preset: disabled) Active: active (running) since Sat 2020-04-18 04:50:04 UTC; 1min 59s ago Main PID: 1876 (php-fpm) Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec" CGroup: /system.slice/rh-php72-php-fpm.service ├─1876 php-fpm: master process (/etc/opt/rh/rh-php72/php-fpm.conf) ├─1877 php-fpm: pool www ├─1878 php-fpm: pool www ├─1879 php-fpm: pool www ├─1880 php-fpm: pool www └─1881 php-fpm: pool www Apr 18 04:50:04 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Starting The PHP FastCGI Process Manager... Apr 18 04:50:04 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Started The PHP FastCGI Process Manager.
Đến đây, bạn đã cài đặt hai version PHP trên server của bạn . Tiếp theo, bạn sẽ tạo cấu trúc folder cho từng trang web mà bạn muốn triển khai.
Bước 2 - Tạo cấu trúc folder cho cả hai trang web
Trong phần này, bạn sẽ tạo một folder root tài liệu và một trang index cho hai trang web của bạn .
Đầu tiên, tạo folder root tài liệu cho cả site1.your_domain và site2.your_domain :
Theo mặc định, web server Apache chạy như một user apache và một group apache . Vì vậy /var/www/ và tất cả các file và folder con của nó cũng phải thuộc sở hữu của chúng. Chạy các lệnh sau để xác minh quyền sở hữu và quyền chính xác của folder root trang web :
sudo chown -R apache:apache /var/www/site1.your_domain
sudo chown -R apache:apache /var/www/site2.your_domain
sudo chmod -R 755 /var/www/site1.your_domain
sudo chmod -R 755 /var/www/site2.your_domain
Lệnh chown thay đổi quyền sở hữu hai folder trang web thành user apache và group apache . Lệnh chmod thay đổi các quyền được liên kết với user và group đó, cũng như những người khác.
Tiếp theo, bạn sẽ tạo một file info.php bên trong mỗi folder root của trang web. Điều này sẽ hiển thị thông tin version PHP của mỗi trang web. Bắt đầu với site1 :
Thêm dòng sau:
/var/www/site1.your_domain/info.php
<?php phpinfo(); ?>
Lưu và đóng file . Bây giờ sao chép file info.php bạn đã tạo vào site2 :
Web server của bạn hiện có các folder root tài liệu mà mỗi trang web yêu cầu để cung cấp dữ liệu cho khách truy cập. Tiếp theo, bạn sẽ cấu hình web server Apache của bạn để hoạt động với hai version PHP khác nhau.
Bước 3 - Cấu hình Apache cho cả hai trang web
Trong phần này, bạn sẽ tạo hai file cấu hình server ảo. Điều này sẽ cho phép hai trang web hoạt động đồng thời với hai version PHP khác nhau.
Để Apache phục vụ nội dung này, cần tạo file server ảo với các lệnh chính xác. Bạn sẽ tạo hai file cấu hình server ảo mới bên trong folder /etc/httpd/conf.d/ .
Đầu tiên, hãy tạo một file cấu hình server ảo mới cho trang web site1.your_domain . Tại đây, bạn sẽ hướng dẫn Apache để hiển thị nội dung bằng PHP 7.0:
Thêm nội dung sau. Đảm bảo rằng đường dẫn folder trang web, tên server , cổng và version PHP trùng với cài đặt của bạn:
/etc/httpd/conf.d/site1.your_domain.conf
<VirtualHost *:80>
ServerAdmin admin@site1.your_domain
ServerName site1.your_domain
DocumentRoot /var/www/site1.your_domain
DirectoryIndex info.php
SetHandler "proxy:fcgi://127.0.0.1:9002
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
AddHandler php70-fcgi .php
Action php70-fcgi /cgi-bin/php70.fcgi
ErrorLog /var/log/httpd/site1.your_domain_error.log
CustomLog /var/log/httpd/site1.your_domain_access.log combined
</VirtualHost>
Đối với DocumentRoot bạn đang chỉ định đường dẫn của folder root trang web của bạn . Đối với ServerAdmin bạn đang thêm một email mà administrator your_domain site có thể truy cập. Đối với ServerName bạn đang thêm url cho domain phụ đầu tiên của bạn . Đối với SetHandler bạn đang chỉ định cổng 9002 . Các chỉ thị còn lại cũng cấu hình dịch vụ của bạn để triển khai PHP 7.0.
Lưu và đóng file .
Tiếp theo, tạo file cấu hình server ảo mới cho trang web site2.your_domain . Bạn sẽ chỉ định domain phụ này để triển khai PHP 7.2:
Thêm nội dung sau. , hãy đảm bảo đường dẫn folder trang web, tên server , cổng và version PHP trùng với thông tin duy nhất của bạn:
/etc/httpd/conf.d/site2.your_domain.conf
<VirtualHost *:80> ServerAdmin admin@site2.your_domain ServerName site2.your_domain DocumentRoot /var/www/site2.your_domain DirectoryIndex info.php SetHandler "proxy:fcgi://127.0.0.1:9003 ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" AddHandler php72-fcgi .php Action php72-fcgi /cgi-bin/php72.fcgi ErrorLog /var/log/httpd/site2.your_domain_error.log CustomLog /var/log/httpd/site2.your_domain_access.log combined </VirtualHost>
Lưu file khi bạn hoàn tất. Sau đó, kiểm tra file cấu hình Apache để biết bất kỳ lỗi cú pháp nào:
sudo apachectl configtest
Bạn sẽ thấy Syntax OK in kết quả Syntax OK :
Output
Cuối cùng, khởi động lại dịch vụ Apache để thực hiện các thay đổi :
sudo systemctl restart httpd
Đến đây bạn đã cấu hình Apache để phục vụ từng trang web, bạn sẽ kiểm tra chúng đảm bảo các version PHP thích hợp đang chạy.
Bước 4 - Kiểm tra cả hai trang web
Đến đây, bạn đã cấu hình hai trang web để chạy hai version PHP khác nhau. Bây giờ kiểm tra kết quả.
Mở trình duyệt web và truy cập cả hai trang web http:// site1.your_domain và http:// site2.your_domain . Bạn sẽ thấy hai trang trông như thế này:
Lưu ý các tiêu đề. Trang đầu tiên cho biết rằng site1.your_domain triển khai version PHP 7.0. Thứ hai cho biết site2.your_domain triển khai version PHP 7.2.
Đến đây bạn đã kiểm tra các trang web của bạn , hãy xóa các file info.php . Vì chúng chứa thông tin nhạy cảm về server của bạn và user lạ có thể truy cập được nên chúng có thể gây ra lỗ hổng bảo mật. Xóa các file :
Đến đây bạn có một server CentOS 7 xử lý hai trang web với hai version PHP khác nhau. PHP-FPM, tuy nhiên, không giới hạn cho một ứng dụng này.
Kết luận
Đến đây bạn đã kết hợp server ảo và PHP-FPM để phục vụ nhiều trang web và nhiều version PHP trên một server . Giới hạn thực tế duy nhất về số lượng trang web PHP và version PHP mà dịch vụ Apache của bạn có thể xử lý là sức mạnh xử lý của version của bạn.
Từ đây, bạn có thể cân nhắc khám phá các tính năng nâng cao hơn của PHP-FPM , như quy trình sinh sản thích ứng của nó hoặc cách nó có thể đăng nhập sdtout và stderr Ngoài ra, giờ đây bạn có thể bảo mật các trang web của bạn . Để thực hiện điều này, bạn có thể làm theo hướng dẫn của ta về cách bảo mật các trang web bằng certificate TLS / SSL miễn phí từ Let's Encrypt.