Cài đặt và kết nối Redis với LiteSpeed PHP

Cài đặt và kết nối Redis với LiteSpeed PHP

Vậy là chúng ta đang trong tuần làm việc đầu tiên sau Tết rồi. Mấy ngày nghỉ Tết vừa qua mình đã tranh thủ làm một bài chúc mừng năm mới ngắn ngắn, mong cho việc sáng tác trở thành niềm đam mê, có nhiều thuận lợi và gặt hái được nhiều hơn trong năm mới Mậu Tuất. Mình không có dự định làm video cho nó, tuy nhiên có thể sau này các mẩu đoạn nhạc trong đấy sẽ được sử dụng trong các sáng tác tiếp theo của mình.

Như mình đã từng viết ở đầu bài viết “Cài đặt một web server tối ưu về tốc độ”, mình đã cho các bạn biết rằng mình đã cài đặt Redis để ghi đệm cho cơ sở dữ liệu mà các trang web của mình đang sử dụng.

Trong bài viết đầu tiên năm Mậu Tuất trên Noisy Stream, mình sẽ giới thiệu và hướng dẫn cách cài đặt Redis và extension (phần mở rộng) kết nối Redis cho LiteSpeed PHP (gọi tắt là LSPHP, tức là bộ dịch PHP được chạy bởi LiteSpeed và OpenLiteSpeed) mà không để lại chút rác rưởi nào.

1. Redis là gì thế?

Trong bài viết sơ lược về cài đặt server có tốc độ tối ưu, mình có giới thiệu qua về Redis rồi. Ở đây mình sẽ viết lại một cách cụ thể hơn về chương trình Redis.

Redis là một phần mềm cache (bộ đệm) độc lập dùng cho server. Redis ghi cache trên bộ nhớ RAM, nên các bạn cần dành ra một chút khoảng trống trên RAM cho nó. Thật may mắn là trong nhiều trường hợp sử dụng Redis chỉ để cache (ghi tạm dữ liệu thường dùng), thì Redis rất tiết kiệm RAM và hoạt động rất nhanh.

Server hiện tại của mình đang sử dụng OpenLiteSpeed để chạy cùng lúc ba website, sử dụng Redis để cache trang điều khiển của mã nguồn, cũng như thực hiện cache một số ít trang cuối cùng chưa được ghi cache bởi module cache riêng của OpenLiteSpeed. Hiện tại Redis chỉ chiếm khoảng 20MB RAM thôi. Nó có một số điều chỉnh riêng, tuy nhiên cho đến giờ mình chưa gặp bất cứ trường hợp tắc nghẽn nào do Redis gây ra với các thiết lập mặc định.

Đối với trường hợp website động gần như hoàn toàn ngay từ server, thì Redis có hiệu quả tốt hơn hẳn một phần mềm cache độc lập khác là Memcached. Một phần lí do là, Redis chính là một hệ quản trị cơ sở dữ liệu phi SQL (NoSQL), thực hiện các thao tác tìm kiếm rất nhanh. Vì nó là một hệ quản trị cơ sở dữ liệu nên đối với một số website động cần phản hồi cực nhanh với tần suất cao, người ta có thể sao chép một phần lớn cơ sở dữ liệu vào Redis. Tất nhiên vì Redis chủ yếu ghi và đọc dữ liệu từ RAM, nên người ta luôn luôn lưu trữ dài hạn cơ sở dữ liệu trên ổ đĩa.

Redis hoạt động độc lập, vậy có cách nào để một mã nguồn có sẵn có thể cậy nhờ Redis ghi tạm dữ liệu hay không? Câu trả lời chính là (rất nhiều) những extension (phần mở rộng) hoặc thư viện (library) kết nối với Redis đối với các ngôn ngữ lập trình khác nhau. Hiện tại Noisy Stream sử dụng mã nguồn WordPress, được chạy bởi bộ dịch LSPHP. Đối với bộ dịch này mình sẽ cài đặt extension Redis từ PECL (PHP Extension Community Library).

2. Cài đặt chương trình Redis

Đầu tiên, các bạn cần có quyền root đã. Nếu đang sử dụng user khác, hãy lấy tạm quyền của root với câu lệnh sau:

sudo su

Nếu các bạn đang sử dụng hệ điều hành CentOS, thì trước khi cài đặt Redis, các bạn cần bổ sung EPEL repository.

yum install epel-release

Thực hiện cập nhật danh sách phần mềm sẵn sàng được cài đặt bằng một trong hai lệnh:

yum update # Đối với CentOS
apt-get update # Đối với Ubuntu/Debian

Sau đó cài đặt Redis.

yum install redis # CentOS
apt-get install redis-server # Ubuntu/Debian

Đến đây, Redis sẽ được thêm vào danh sách dịch vụ (service) của hệ điều hành dưới cái tên redis (với CentOS) hoặc redis-server (với Ubuntu/Debian). Hãy sử dụng bộ tiện ích hệ thống systemd (được cài sẵn trong vài phiên bản mới đây của Ubuntu/Debian và CentOS) để tiến hành chạy Redis và cho phép nó tự khởi động cùng hệ điều hành.

systemctl start redis # Chạy Redis
systemctl enable redis # Cho phép khởi động cùng hệ điều hành

Đó là trong trường hợp tên dịch vụ của Redis là redis. Nếu tên dịch vụ là redis-server thì các bạn thay redis bằng redis-server. Và trong trường hợp hệ điều hành không có systemd, thì các bạn hãy tự tìm hiểu và điều chỉnh thêm nhé.

Để kiểm tra xem Redis có đang chạy ổn định hay không, các bạn sử dụng tiện ích redis-cli, nằm trong gói redis-tools. Nếu các bạn sử dụng Ubuntu/Debian thì các bạn cần cài gói đó đã:

apt-get install redis-tools

Và đây là lệnh kiểm tra Redis qua redis-cli:

redis-cli ping

Nếu Redis đang chạy tốt thì kết quả xuất hiện sẽ là:

PONG

OK. Giờ chúng ta sẽ tiến hành “bắc cầu” giữa LSPHP và Redis.

3. Cài đặt extension Redis cho LSPHP

3.1. Kiểm tra qua phpinfo()

Các bạn cần làm việc này để cài đặt được extension Redis tương thích với LSPHP hiện tại. Có một cách đơn giản để kiểm tra, đó là qua lệnh phpinfo() của ngôn ngữ PHP.

Hãy tạo một file phpinfo.php với nội dung bên trong là:

<?php phpinfo();

Di chuyển nó vào trong document root tương ứng với virtual host đang chạy trang web, rồi mở link tương ứng. Ví dụ:

https://vidu.vn/phpinfo.php

Tại trang kết quả xuất hiện, có những thông tin sau mà các bạn cần tìm và ghi lại:

  • Phiên bản của LSPHP. Điều đó được ghi rất rõ ràng ngay ở dòng đầu tiên. Ví dụ, mình cài đặt LSPHP 7.2 từ repository (tương tự bài viết đầu tiên của mình về OpenLiteSpeed) và trên trang đó hiển thị chi tiết phiên bản như sau:
    PHP Version 7.2.2-1+xenial

    Từ dòng trên, các bạn chỉ cần quan tâm đó là bản LSPHP 7.2 thôi. Nếu các bạn cài đặt LSPHP qua repository, thì phiên bản 7.2 đó tương ứng với con số 72 trong tên các gói cài đặt liên quan. Đối với phiên bản LSPHP khác thì con số đấy sẽ đổi khác một cách tương ứng như vậy.

  • Riêng với hệ điều hành Ubuntu/Debian, vì có một lí do đặc biệt nên các bạn sẽ cần ghi nhận thêm các thông tin sau:
    • Đường dẫn tuyệt đối của thư mục LSPHP đang sử dụng. Các bạn nhìn vào dòng Configure Command, ở ngay đầu dòng có một xâu '--prefix=...'. Phần ... này chính là đường dẫn tuyệt đối ấy. Đối với ví dụ mà mình đưa ra, đường dẫn sẽ là:
      /usr/local/lsws/lsphp72

      Trong thư mục trên có thư mục con bin chứa file thực thi LSPHP. Trong phần hướng dẫn tiếp theo, có một công cụ nữa sẽ được cài đặt vào thư mục con này.

    • Đường dẫn tuyệt đối của các file .ini được bổ sung bởi các extension. Thông tin này được ghi tại dòng Scan this dir for additional .ini files. Đối với ví dụ của mình, đường dẫn đó là:
      /usr/local/lsws/lsphp72/etc/php/7.2/mods-available/
    • Đường dẫn tuyệt đối của các file module .so tương ứng với các extension. Thông tin này được ghi tại dòng (thiết lập) extension_dir, cột Master Value (bên phải) của bảng Core. Với ví dụ của mình, đường dẫn là:
      /usr/local/lsws/lsphp72/lib/php/20170718

3.2. Cài đặt extension Redis

3.2.1. Đối với hệ điều hành CentOS

Để quá trình cài đặt diễn ra đơn giản, hãy chắc chắn rằng các bạn đã bổ sung repository của LiteSpeed (chứa các gói cài đặt LiteSpeed, OpenLiteSpeed, LSPHP, v.v…) bằng một trong các lệnh sau:

# CentOS 5
rpm -ivh http://rpms.litespeedtech.com/centos/litespeed-repo-1.1-1.el5.noarch.rpm
# CentOS 6
rpm -ivh http://rpms.litespeedtech.com/centos/litespeed-repo-1.1-1.el6.noarch.rpm
# CentOS 7
rpm -ivh http://rpms.litespeedtech.com/centos/litespeed-repo-1.1-1.el7.noarch.rpm

Rồi các bạn cài đặt extension Redis.

yum install lsphp72-pecl-redis

Cài đặt xong, các bạn hãy khởi động lại LiteSpeed (hoặc OpenLiteSpeed). Mở lại trang phpinfo.php đã chuẩn bị ở phần trên ra, nếu thấy bảng thông tin riêng về Redis (có tiêu đề là redis), thì LSPHP đã kết nối được với Redis rồi đó.

3.2.2. Đối với hệ điều hành Ubuntu/Debian

Ban nãy mình có nhắc đến lí do đặc biệt đúng không nhỉ? Lí do là thế này…

Hơi thiệt thòi cho các bạn sử dụng một trong hai hệ điều hành trên rằng, người ta (công ty LiteSpeed Technologies) chưa đóng gói sẵn extension Redis cho LSPHP và đưa lên repository!

Vì thế, các bạn sẽ cần đi con đường dài hơn. Cụ thể, chúng ta tải mã nguồn của extension xuống, và từ mã nguồn này chúng ta tạo ra file module redis.so bên trong thư mục của LSPHP. Sau đó chúng ta chỉ định cho LSPHP sử dụng extension này. Cuối cùng là dọn dẹp những gói không sử dụng đến. (Thời gian qua mình đã gặp một lỗi kì lạ mà nhiều khả năng là do những gói như vậy gây ra.)

Các lệnh sau đây được thực hiện trong trường hợp ví dụ mình đưa ra từ đầu, tức là mình cài đặt LSPHP 7.2 từ repository. Vì thế, các bạn cần ghi nhận thêm hai đường dẫn như mình đã chỉ, để tiện thay thế vào các lệnh mà áp dụng cho môi trường của các bạn. Và nhắc lại, các lệnh sau đây chỉ có thể thực hiện thành công khi và chỉ khi các bạn sử dụng quyền root nhé.

Đầu tiên, các bạn cài đặt các gói bộ dịch của ngôn ngữ C mà extension Redis (cũng như các extension khác trên PECL) có sử dụng. Các gói này không ảnh hưởng đến quá trình hoạt động sau này của LSPHP.

apt-get install gcc make autoconf rcs

Tiếp theo, hãy cài đặt tiếp gói phát triển module cho phiên bản LSPHP hiện đang sử dụng. Trong gói này có tiện ích phpize để chuẩn bị môi trường tạo file .so cho các extension được PHP (cũng như LSPHP) sử dụng. Tiện ích đó, cùng với các tiện ích khác trong gói này, sẽ được cài đặt thẳng vào thư mục bin mà mình đã nhắc đến ở trên.

apt-get install lsphp72-dev

Một khi đã ấn phím Enter để chạy lệnh trên, hãy chú ý hai dòng tương tự như sau:

The following NEW packages will be installed:
  lsphp72-dev php-cli php-pear php-xml php7.0-cli php7.0-json php7.0-opcache php7.0-xml pkg-php-tools shtool

Dòng thứ hai ghi tên các gói sẽ được cài vào. Sau khi kết nối xong Redis và LSPHP, các bạn sẽ không cần đến các gói đó nữa. Hãy chép sẵn tên các gói đó ra ngoài, chờ điền lại vào lệnh gỡ bỏ sau.

Y và ấn Enter để chấp nhận cài toàn bộ các gói đó.

Tiếp theo, các bạn tham khảo trang của extension Redis tại PECL để biết phiên bản mới nhất (không tính bản RC) của extension này. Tại thời điểm viết bài này, phiên bản mới nhất là 3.1.6.

Nhìn sang cột Downloads, các bạn sẽ thấy link tải file .tgz tương ứng:

https://pecl.php.net/get/redis-3.1.6.tgz

Các bạn hãy chép link này vào lệnh sau (sử dụng tiện ích wget) để tải file đó về server.

wget https://pecl.php.net/get/redis-3.1.6.tgz

Giải nén file tải về được.

tar -xvzf redis-3.1.6.tgz

Một thư mục redis-3.1.6 được xả ra. Các bạn hãy mở thư mục này lên và tiến hành tạo file redis.so bên trong thư mục của LSPHP bằng các lệnh dưới đây. Chú ý thay đường dẫn tuyệt đối đến thư mục của LSPHP một cách tương ứng nè.

cd redis-3.1.6
/usr/local/lsws/lsphp72/bin/phpize
./configure --enable-redis --with-php-config=/usr/local/lsws/lsphp72/bin/php-config
make
make install

Bây giờ hãy thử vào thư mục chứa các file .so của các extension, xem file redis.so có ở đó không nhé.

cd /usr/local/lsws/lsphp72/lib/php/20170718
ls

Nếu trong kết quả xuất hiện có tên file redis.so thì ngon! Tới bước tiếp theo nào.

Chúng ta sẽ chỉ định cho LSPHP sử dụng extension đó. Các bạn sẽ tạo một file redis.ini bên trong thư mục chứa các file .ini được bổ sung bởi các extension trước đó. Mình quen sử dụng chương trình nano để soạn thảo, các bạn có thể sử dụng chương trình soạn thảo khác.

cd /usr/local/lsws/lsphp72/etc/php/7.2/mods-available/
nano redis.ini

Đây là nội dung duy nhất của file redis.ini:

extension=redis.so

Trong đó redis.so là tên file .so vừa nãy.

Giờ các bạn hãy khởi động lại LiteSpeed (hoặc OpenLiteSpeed, tuỳ các bạn đang sử dụng gì), rồi vào lại phpinfo.php kiểm tra tương tự như cuối mục 3.2.1. Nếu kiểm tra thấy ổn rồi thì hãy chạy lệnh gỡ bỏ các gói không cần thiết đã cài từ lúc đầu.

apt-get remove lsphp72-dev php-cli php-pear php-xml php7.0-cli php7.0-json php7.0-opcache php7.0-xml pkg-php-tools shtool

4. Sử dụng Redis qua mã nguồn PHP

Đến đây, LSPHP đã sử dụng Redis để lưu tạm dữ liệu rồi. Mình đã thử thay đổi một số thiết lập ở Redis và kiểm tra bằng cách thử kết nối đến cơ sở dữ liệu MySQL qua các hàm mysqli_, thì thấy Redis có ảnh hưởng đến LSPHP.

Tuy nhiên các bạn vẫn chưa thật sự sử dụng Redis đâu nhé. Nếu các bạn đang tự phát triển mã nguồn bằng ngôn ngữ PHP, thì các ví dụ sử dụng tại TutorialsPoint sẽ là khởi đầu rất tốt. Nhưng nếu các bạn sử dụng mã nguồn PHP bên ngoài, thì các bạn hãy tìm kiếm plugin hỗ trợ Redis. Bất cứ plugin nào có ghi “hỗ trợ qua PECL extension” hoặc “hỗ trợ qua PhpRedis” đều sẽ hoạt động tốt qua extension Redis mà các bạn mới cài theo các bước ở mục 3.

Ví dụ, Noisy Stream sử dụng mã nguồn WordPress. Có một plugin hỗ trợ Redis qua extension Redis trên mà mình đã từng sử dụng, vừa tốt lại vừa đơn giản, đó là Redis Object Cache. Hiện tại, chính plugin LiteSpeed Cache (plugin tạo cache qua module cache của LiteSpeed và OpenLiteSpeed) đã hỗ trợ luôn Redis qua extension mà hôm nay mình giới thiệu, nên mình không còn sử dụng plugin Redis Object Cache nữa.

Có thể mình sẽ viết riêng một bài viết về cách mình tối ưu tốc độ cho Noisy Stream cho các bạn tham khảo. Tại đó mình sẽ đi sâu vào thiết lập cho plugin LiteSpeed Cache sau.

Hi vọng bài viết này của mình thật sự giúp ích cho các bạn!

Bài viết này có 2 bình luận

  1. Bạn cho mình hỏi, mình cài LiteSpeed Cache, tuy nhiên khi kiểm tra header thì được kết quả như này:

    HTTP/1.0 200 OK
    X-Powered-By: PHP/7.1.19
    Content-Type: text/html; charset=UTF-8
    Link: ; rel=shortlink
    X-Litespeed-Cache: hit
    Server: LiteSpeed
    Connection: close
    Date: Tue, 24 Jul 2018 16:21:45 GMT

    ———————–
    Nó không có chỉ số X-Litespeed-Cache-ControlX-Litespeed-Tag
    Như vậy có đúng không?
    Mình sử dụng OpenLiteSpeed và WordPress.
    Trang web của mình: https://flamingocarcare.vn/
    Cảm ơn vì những bài viết rất hay và chi tiết của bạn.

    1. OpenLiteSpeed đã ẩn hẳn hai header X-Litespeed-Cache-ControlX-Litespeed-Tag từ các phiên bản 1.4.321.5.0 RC4 rồi bạn.

      Mà về cache trong (Open)LiteSpeed, quan trọng chỉ là header X-Litespeed-Cache thông báo về việc trang đã được ghi cache hay chưa. Nếu giá trị của header đó là hit thì OK. Hai header kia không quan trọng lắm.

Tính năng bình luận đã được đóng.