TRANG CHỦ | Chia sẻ kiến thức

Cách chạy nhiều phiên bản PHP trên một server bằng Apache và PHP-FPM trên CentOS 7


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

  • Một server CentOS 7 với ít nhất 1GB RAM được cài đặt bằng cách thực hiện theo Cài đặt server ban đầu với CentOS 7 , bao gồm user không phải root có quyền sudo và firewall .
  • Web server Apache được cài đặt và cấu hình theo Cách cài đặt web server Apache trên CentOS 7 .
  • Tên domain được cấu hình để trỏ đến server CentOS 7 của bạn. Bạn có thể tìm hiểu cách trỏ domain tới DigitalOcean Server theo Cách trỏ đến server tên DigitalOcean từ các công ty đăng ký domain chung . Với mục đích của hướng dẫn này, ta sẽ sử dụng hai domain phụ, mỗi domain được chỉ định bằng bản ghi A trong cài đặt DNS của ta : site1.your_domain và site2.your_domain .

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:

  • sudo yum install centos-release-scl -y

Trước tiên, hãy khám phá những version PHP 7 có sẵn trên SCL:

  • sudo yum list rh-php7[0-9].x86_64

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 :

  • sudo yum install rh-php70  rh-php70-php-fpm -y
  • rh-php70 là một gói siêu nhỏ chạy các ứng dụng PHP.
  • rh-php70-php-fpm cung cấp trình thông dịch Fast Process Manager chạy dưới dạng daemon và nhận các yêu cầu Fast / CGI.

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 .

  • sudo yum install rh-php72  rh-php72-php-fpm -y

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:

  • sudo scl enable rh-php70 bash
  • sudo scl enable rh-php72 bash

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ế:

  • sudo sed -i 's/:9000/:9002/'  /etc/opt/rh/rh-php70/php-fpm.d/www.conf
  • sudo sed -i 's/:9000/:9003/'  /etc/opt/rh/rh-php72/php-fpm.d/www.conf

Đế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:

  • sudo semanage port -a -t http_port_t -p tcp 9002
  • sudo semanage port -a -t http_port_t -p tcp 9003

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:

  • sudo systemctl start rh-php70-php-fpm
  • sudo systemctl enable rh-php70-php-fpm

Tiếp theo, xác minh trạng thái của dịch vụ rh-php70-php-fpm :

  • sudo systemctl status 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 :

  • sudo systemctl start rh-php72-php-fpm
  • sudo systemctl enable rh-php72-php-fpm

Tiếp theo, xác minh trạng thái của dịch vụ rh-php72-php-fpm :

  • sudo systemctl status 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 :

  • sudo mkdir /var/www/site1.your_domain
  • sudo mkdir /var/www/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 :

  • sudo vi /var/www/site1.your_domain/info.php

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 :

  • sudo cp /var/www/site1.your_domain/info.php /var/www/site2.your_domain/info.php

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:

  • sudo vi /etc/httpd/conf.d/site1.your_domain.conf

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:

  • sudo vi /etc/httpd/conf.d/site2.your_domain.conf

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

  • Syntax OK

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 :

  • sudo rm -rf /var/www/site1.your_domain/info.php
  • sudo rm -rf /var/www/site2.your_domain/info.php

Đế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.