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
- Đườ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
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.
Gõ 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!