Cách nâng cấp PHP 5.6 lên 7.1 trong CentOS 7 Linux

Tác giả sysadmin, T.M.Hai 23, 2022, 01:36:43 CHIỀU

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 1 Khách đang xem chủ đề.

Cách nâng cấp PHP 5.6 lên 7.1 trong CentOS 7 Linux


Trong bài đăng này, tôi sẽ chỉ cho bạn cách nâng cấp PHP 5.6 lên 7.1 trong CentOS 7 Linux. Tôi đã thực hiện quy trình này hôm nay trên máy chủ này và muốn ghi lại các sự cố mà tôi gặp phải trong quá trình thực hiện, cùng với các bản sửa lỗi có liên quan.

Lưu ý: Trước khi bạn nâng cấp PHP 5.6 lên 7.1, tôi khuyên bạn nên chạy qua quy trình này trên máy chủ sản xuất, tôi đã sao chép máy ảo vào một phiên bản thử nghiệm và thử nghiệm ở đó trước. Bước này rất quan trọng vì tôi gặp nhiều sự cố với mã PHP không tương thích với PHP 7.1 và các sự cố khác. Về cơ bản, trước tiên bạn nên thực hiện nâng cấp trên máy chủ thử nghiệm và kiểm tra tất cả chức năng của trang web trong khi xem nhật ký lỗi cụ thể của máy chủ web và php-fpm để tìm sự cố. Bằng cách này, bạn có thể khắc phục sự cố trong phiên bản thử nghiệm và biết điều gì sẽ xảy ra khi bạn làm điều đó thực sự.

Đối với PHP 5.6, tôi đã sử dụng kho lưu trữ Webtatic. Đây là kho lưu trữ của bên thứ ba cho phép tôi cài đặt các phiên bản PHP mới hơn trong CentOS 7. Sau một số nghiên cứu, tôi phát hiện ra rằng kho lưu trữ IUS được khuyến nghị và Webtatic được CentOS liệt kê là kho lưu trữ có vấn đề.

Lưu ý đến thông tin đó, tôi quyết định rằng khi nâng cấp lên PHP 7.1, tôi cũng sẽ đổi sang kho lưu trữ IUS.

1. Chuẩn bị cập nhật PHP

Trước khi bắt đầu, chúng ta có thể thấy rằng chúng ta hiện đang chạy phiên bản PHP 5.6.30.

Mã nguồn [Chọn]
[root@centos7 ~]# php -v
PHP 5.6.30 (cli) (built: Jan 19 2017 22:31:39)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies

Bây giờ chúng ta hãy lên ý tưởng về các gói mà chúng ta cần nâng cấp. Tôi sẽ chạy 'danh sách yum đã cài đặt' rồi grep cho webtatic để chúng ta có thể xem tất cả các gói được cài đặt từ kho lưu trữ này.

Mã nguồn [Chọn]
[root@centos7 ~]# yum list installed | grep -i webtatic
php56w.x86_64                     5.6.30-1.w7       @webtatic
php56w-cli.x86_64                 5.6.30-1.w7       @webtatic
php56w-common.x86_64              5.6.30-1.w7       @webtatic
php56w-fpm.x86_64                 5.6.30-1.w7       @webtatic
php56w-gd.x86_64                  5.6.30-1.w7       @webtatic
php56w-mbstring.x86_64            5.6.30-1.w7       @webtatic
php56w-mysqlnd.x86_64             5.6.30-1.w7       @webtatic
php56w-opcache.x86_64             5.6.30-1.w7       @webtatic
php56w-pdo.x86_64                 5.6.30-1.w7       @webtatic
php56w-pear.noarch                1:1.10.1-1.w7     @webtatic
php56w-pecl-igbinary.x86_64       2.0.1-1.w7        @webtatic
php56w-pecl-memcache.x86_64       3.0.8-2.w7        @webtatic
php56w-pecl-memcached.x86_64      2.2.0-1.w7        @webtatic
php56w-process.x86_64             5.6.30-1.w7       @webtatic
php56w-xml.x86_64                 5.6.30-1.w7       @webtatic
webtatic-release.noarch           7-3               installed

Ghi lại tất cả các gói PHP này, chúng ta sẽ cần chúng sau.

2. Thay đổi kho lưu trữ

Lưu ý rằng nếu bạn đang gắn bó với Webtatic hoặc IUS thì bạn không cần thực hiện bước này, đây chỉ là tôi thay đổi kho lưu trữ của mình. Nếu bạn đã sử dụng Webtatic và không thay đổi hoặc IUS và không thay đổi, hãy chuyển sang bước 'Cấu hình sao lưu' bên dưới.

Như đã đề cập, tôi đang sử dụng Webtatic nhưng tôi muốn đổi sang IUS, vì vậy trước tiên tôi sẽ bắt đầu bằng cách xóa các kho Webtatic. Điều này có thể được thực hiện bằng cách xóa gói phát hành webtatic, gói này kiểm soát các tệp.repo khác nhau trong thư mục /etc/yum.repos.d/.

Mã nguồn [Chọn]
yum remove webtatic-release -y
Sau đó, tôi cài đặt kho lưu trữ IUS bằng cách chạy lệnh bên dưới.

Mã nguồn [Chọn]
yum install https://centos7.iuscommunity.org/ius-release.rpm
Điều này yêu cầu cài đặt EPEL mà tôi đã cài đặt.

3. Cấu hình dự phòng

Trước khi chúng tôi tiếp tục và xóa phiên bản PHP cũ hơn, hãy nhớ rằng việc cài đặt các gói mới cũng có nghĩa là các tệp cấu hình mới. Tôi khuyên bạn nên sao chép các tệp cấu hình cụ thể của PHP, chẳng hạn như /etc/php.ini và /etc/php-fpm.d/www.conf.

4. Xóa các gói PHP cũ

Mặc dù bạn có thể sử dụng thứ gì đó như 'yum replace' cho việc này, nhưng tôi chỉ sử dụng 'yum remove' để xóa tất cả các gói PHP đã liệt kê trước đó. Hãy nhớ ghi lại những điều này, vì chúng ta sẽ cần điều đó trong bước tiếp theo.

Mã nguồn [Chọn]
[root@centos7 ~]# yum remove php56w php56w-cli php56w-common php56w-fpm php56w-gd php56w-mbstring php56w-mysqlnd php56w-opcache php56w-pdo php56w-pear php56w-pecl-igbinary php56w-pecl-memcache php56w-pecl-memcached php56w-process php56w-xml
5. Cài đặt PHP 7.1

Hướng dẫn 'nâng cấp PHP 5.6 lên 7.1' sẽ không hoàn chỉnh nếu không thực sự cài đặt PHP 7.1!

Bây giờ với danh sách các gói PHP mà chúng tôi đã xóa trước đó, chúng tôi chỉ cần sao chép chúng và chỉnh sửa chúng một chút. Chữ 'w' ở cuối gói có nghĩa là đó là Webtatic, nếu bạn đang dùng Webtatic, hãy giữ chữ 'w'. Khi tôi đổi sang IUS, các gói PHP kết thúc bằng chữ 'u'. Dựa trên điều này, tôi sử dụng yum để cài đặt các gói PHP tương tự ngoại trừ phiên bản 7.1 thay vì 5.6, tức là 71 thay vì 56. Ví dụ: gói php56w sẽ trở thành php71u.

Mã nguồn [Chọn]
yum install php71u php71u-cli php71u-common php71u-fpm php71u-gd php71u-mbstring php71u-mysqlnd php71u-opcache php71u-pdo php71u-pear php71u-pecl-igbinary php71u-pecl-memcache php71u-pecl-memcached php71u-process php71u-xml php71u-json -y
Bây giờ chúng ta có thể thấy rằng chúng ta đang chạy PHP 7.1.

Mã nguồn [Chọn]
[root@centos7 ~]# php -v
PHP 7.1.1 (cli) (built: Jan 18 2017 13:45:30) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.1.1, Copyright (c) 1999-2017, by Zend Technologies

Lưu ý rằng theo mặc định, php-fpm sẽ không khởi động khi khởi động hệ thống.

Mã nguồn [Chọn]
[root@centos7 ~]# systemctl is-enabled php-fpm
disabled

Điều này không lý tưởng, vì vậy chúng tôi kích hoạt php-fpm để nó tự động khởi động khi khởi động hệ thống.

Mã nguồn [Chọn]
[root@centos7 ~]# systemctl enable php-fpm
Created symlink from /etc/systemd/system/multi-user.target.wants/php-fpm.service to /usr/lib/systemd/system/php-fpm.s
         

6. Sửa đổi cấu hình

Bây giờ PHP 7.1 đã được cài đặt, tôi xem qua các tệp /etc/php.ini và /etc/php-fpm.d/www.conf cũ mà tôi đã sao lưu ở bước trước và sao chép các cài đặt mà tôi muốn sang tệp mới. các tập tin. Đối với cá nhân tôi, điều này chủ yếu liên quan đến việc chỉnh sửa tệp /etc/php-fpm.d/www.conf và nhận xét bên dưới:

Mã nguồn [Chọn]
;listen = 127.0.0.1:9000
Sau đó, tôi đã thêm các mục sau vào hoặc sửa đổi chúng từ các giá trị hiện có thành các mục này. Lưu ý rằng những cài đặt này dành riêng cho cấu hình Nginx của tôi, cấu hình của bạn có thể khác, đó là lý do tại sao điều quan trọng là phải đặt cùng cài đặt mà bạn đã lưu trước đó.

Mã nguồn [Chọn]
user = nginx
group = nginx
listen = /var/run/php-fpm/php-fpm.sock
listen.owner = nginx
listen.group = nginx

7. Xử lý sự cố

Dưới đây là các giải pháp cho một số vấn đề phổ biến mà bạn có thể gặp phải khi nâng cấp PHP 5.6 lên 7.1.

Sau đó, tôi cũng cần vào thư mục /var/lib/php/ và chown mọi thứ vào root:nginx bằng lệnh bên dưới, vì lệnh này đã thay đổi thành thuộc sở hữu của php-fpm, đây không phải là thứ tôi đang sử dụng. Nếu không có bước này, các tệp phiên sẽ không ghi chính xác.

Mã nguồn [Chọn]
[root@centos7 ~]# cd /var/run/php/
[root@centos7 php]# chown -R root:nginx *

[root@centos7 php]# ls -la
total 40
drwxr-xr-x.  5 root root     44 Mar  5 00:54.
drwxr-xr-x. 35 root root   4096 Mar  5 00:48..
drwxrwx---.  5 root nginx    50 Mar  5 00:48 fpm
drwxrwx---.  5 root nginx    50 Mar  5 00:48 mod_php
drwxrwx---+  2 root nginx 73728 Mar  5 00:48 session

Nếu không có bước này, sẽ gặp phải các bản ghi lỗi trong tệp cấu hình Nginx của tôi như được hiển thị bên dưới. Mặc dù các lỗi này dành riêng cho một plugin WordPress cụ thể, nhưng nó cho thấy điều gì sẽ xảy ra khi không thể ghi phiên.

Mã nguồn [Chọn]
2017/03/05 00:49:19 [error] 905#905: *752 FastCGI sent in stderr: "PHP message: PHP Warning:  session_start(): open(/var/lib/php/fpm/session/sess_abcd, O_RDWR) failed: Permission denied (13) in /var/www/website/bwp-recaptcha/includes/class-bwp-recaptcha.php on line 236

2017/03/05 00:49:19 [error] 905#905: *749 FastCGI sent in stderr: "PHP message: PHP Warning:  session_start(): open(/var/lib/php/fpm/session/sess_8cpi4cdjdcq824pmnirdcaujr1, O_RDWR) failed: Permission denied (13) in /var/www/nginx/bwp-recaptcha/includes/class-bwp-recaptcha.php on line 236
PHP message: PHP Warning:  session_start(): Failed to read session data: files (path: /var/lib/php/fpm/session) in /var/www/nginx/bwp-recaptcha/includes/class-bwp-recaptcha.php on line 236" while reading response header from upstream, client: x.x.x.x, server: domain.com, request: "POST /wp-comments-post.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fpm/php-fpm.sock:", host: "www.domain.com", referrer: "https://www.domain.com/"

Tôi cũng đã cài đặt gói 'php71u-json' mặc dù chưa cài đặt gói tương đương với PHP 5.6, vì nó cần thiết cho lỗi sau.

Mã nguồn [Chọn]
FastCGI sent in stderr: "PHP message: PHP Fatal error:  Uncaught Error: Call to undefined function W3TC\json_decode()
Tôi vẫn gặp sự cố với plugin Jetpack. Đây có thể là lỗi với PHP opcache, như tôi đã tìm thấy tài liệu ở đây:   Đăng nhập để xem liên kết

Mã nguồn [Chọn]
2017/03/05 01:15:16 [error] 1688#1688: *61 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: x.x.x.x, server: domain.com, request: "POST /xmlrpc.php?for=jetpack&token=... HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fpm/php-fpm.sock:", host: "www.domain.com", referrer: "https://www.domain.com/xmlrpc.php?for=jetpack&token=..."
Điều này xuất hiện trong tệp nhật ký lỗi Nginx của tôi khi tôi tải bảng điều khiển WordPress, có vẻ như đây là một POST tới xmlrpc từ Jetpack. Vào thời điểm điều này xảy ra, tôi thấy nội dung sau trong tệp nhật ký lỗi php-fpm của mình.

Mã nguồn [Chọn]
[05-Mar-2017 01:15:16] WARNING: [pool www] child 1670 exited on signal 11 (SIGSEGV) after 163.427669 seconds from start
[05-Mar-2017 01:15:16] NOTICE: [pool www] child 1727 started

Mặc dù không lý tưởng nhưng tôi đã có thể khắc phục sự cố bằng cách chỉnh sửa xmlrpc.php và thêm mục bên dưới.

Mã nguồn [Chọn]
ini_set ('opcache.enable', 0);
Tôi đã không thể sao chép điều này trong một phiên bản thử nghiệm, tôi đang cố gắng sao chép nó trước khi tôi báo cáo đó là một lỗi PHP. Bất kể nó dường như không gây ra cho tôi bất kỳ vấn đề lớn nào, mọi thứ khác đều hoạt động.

Như hình chúng tôi đã hướng dẫn các bạn cách nâng cấp PHP 5.6 lên 7.1 thành công. Chúng tôi đã thay đổi kho lưu trữ Webtatic thành IUS, sao lưu cấu hình dành riêng cho PHP, xóa các gói cũ và cuối cùng cài đặt các gói mới.