Mục thông tin
Redis là gì?
Được viết tắt của cụm từ Remote Dictionary Server, là hệ thống mã nguồn mở, kho lưu trữ dữ liệu có cấu trúc dạng key-value hỗ trợ nhiều loại dữ liệu khác nhau (hash, set, list, string, sorted, bitmap,…).

Nó có thể dùng như một database, message broker, bộ nhớ cache hay một queue.
Ngoài ra Redis còn hỗ trợ clustering (nhóm hai hoặc nhiều server hoạt động cùng lúc) nhờ đó Redis luôn được dùng trong môi trường có yêu cầu tính sẵn sàng cao (high availability) và độ linh hoạt cao (scalable).
Lợi ích của Redis
Nói về tốc độ, Redis server xử lý rất nhanh. Là một NoSQL database, nó có tốc độ lưu trữ truy xuất rất cao, hoạt động tốt với nhiều kiểu dữ liệu khác nhau dù là dữ liệu phức tạp. Dễ sử dụng, đa dạng chức năng, nhiều tùy chọn đã giúp Redis nổi bật và được tin tưởng làm cơ sở dữ liệu chính cho cá nhân và doanh nghiệp.
PHP session là gì?
Khi người dùng làm việc với một ứng dụng, mở – thay đổi – tương tác – đóng lại ứng dụng, điều này có thể coi là một phiên (session).
Ở trên máy tính thông thường, thông tin user là ai, bắt đầu và kết thúc ứng dụng nào, có thay đổi chỉnh sửa những gì nó đều biết.
Tuy nhiên trên môi trường Internet lại khác, các web-server không làm được điều đó, do HTTP không duy trì trạng thái.
Các session giải quyết vấn đề này bằng cách lưu trữ thông tin người dùng được sử dụng trên nhiều trang (tên tuổi hay sở thích,..), Theo mặc định thì các biến session này tồn tại đến khi người dùng đóng trình duyệt.
Session handler là gì?
Session handler chịu trách nhiệm lưu trữ và truy xuất dữ liệu được lưu trong session.
Mặc định PHP sử dụng kiểu dữ liệu file cho việc này.
Trong môi trường có nhiều web server được dùng cho việc xử lí PHP, các file lưu trữ nằm rải rác khắp web-server, làm thông tin người dùng không nhất quán khi truy cập vào website.
Cấu hình session mặc định trong file php.ini :
session.save_handler = files
session.save_path = "/tmp"
Do đó, một giải pháp session handler bên ngoài (không lưu trữ local dưới dạng file) được dùng để đảm bảo tính scalable cho hệ thống là lưu trữ tập trung trên một hoặc nhiều Redis server.
Sau đây, chúng tôi sẽ hướng dẫn bạn cách cài đặt và cấu hình PHP session trên Redis.
Các bước cài đặt và cấu hình PHP session trên Redis
Yêu cầu:
- Cần 2 server khác nhau nằm trong cùng trung tâm dữ liệu và sử dụng mạng private, có bao gồm:
- Hệ điều hành Ubuntu server mới để cài đặt Redis (tối thiểu version 20.04) – tạm gọi là Redis
- Một PHP web-server cùng với LAMP stack hoặc LEMP stack đã có trước đó – tạm gọi là web, trong ví dụ này sẽ là CentOS 7 chạy LEMP.
Bước 1: Cài đặt Redis server
Khuyến khích nên login vào root user hoặc user non-root có quyền sudo.
$ apt-get install redis-server
Gõ Y/y để tiếp tục.
Người dùng sẽ chờ thời gian ngắn để hoàn tất cài đặt.
Khi này, có thể dùng mẹo nhỏ để kiểm tra Redis cài đặt bình thường hay chưa.
Dùng lệnh $ redis-cli ping
Lúc này kết quả trả về sẽ là PONG. Để biết port mà Redis đang sử dụng, dùng lệnh $ netstat -tlpn
, kết quả trả về số port, trạng thái hoạt động của port.
Người dùng có thể thấy Redis đang chạy tốt ở port 6379.
Sau đó hãy kiểm tra service của Redis đã bắt đầu chạy hay chưa bằng lệnh:
$ systemctl status redis-server
Nếu chưa, hãy dùng lệnh $ systemctl start redis-server
rồi kiểm tra lại.
Bước 2: Cấu hình Redis
Trước tiên cần biết IP chỉ định để gán cho Redis, sử dụng lệnh $ ifconfig
.
Trong ví dụ này, ở interface ens18
của server Redis là 192.168.168.44
, người dùng sẽ gán IP này ở các bước sau để kết nối Redis và server web.
Cụ thể, tất cả các IP kể cả server web trên nằm cùng range IP với Redis đều có thể kết nối vào Redis, tuy nhiên người dùng nên hạn chế dùng IP public khi cấu hình hoặc nếu cần dùng thì phải cấu hình firewall để giới hạn truy cập vào các dữ liệu nhạy cảm, dễ bị lợi dụng tấn công.
Tiếp tục dùng trình soạn thảo nano và mở file config theo đường dẫn:
$ nano /etc/redis/redis.conf
và tiến hành gán IP.
Tìm xuống dòng lệnh sau:
bind 127.0.0.1 ::1
Dùng #
để vô hiệu dòng lệnh cũ và thay vào dòng lệnh mới:
bind 192.168.168.44
Sau đó hãy save và đóng file này (nhấn Ctrl + X, gõ Y và nhấn Enter).
Tiếp theo, khởi động lại service Redis bằng lệnh
$ service redis-server restart
Để server Redis được an toàn hơn, người dùng cần thiết lập các mục bảo vệ.
Bước 3: Khởi tạo mật khẩu cho Redis
Dùng nano và mở lại file conf của Redis:
$ nano /etc/redis/redis.conf
Tìm xuống vị trí có dòng # requirepass foobared
và thêm dòng RequirePass + password.
Trong ví dụ này sẽ là:
requirepass strongpassword
Sau khi hoàn tất hãy lưu và đóng file này.
Khởi động lại service và tiến hành kiểm tra xác thực (thực hiện trực tiếp từ bên trong server Redis).
Gõ lệnh $ redis-cli -h [ip của Redis-server]
để login vào server Redis.
Lưu ý: Trong trường hợp khi đã set mật khẩu nhưng không thực hiện xác thực AUTH, hệ thống sẽ báo lỗi sau:
(error) NOAUTH Authentication required
Trong trường hợp nhập chính xác, tiếp tục gõ keys * để xem kết quả.
Ở đây kết quả trả về là “empty array”, điều này nghĩa là server Redis đang trống, người dùng vẫn chưa cấu hình web server thành session handler.
Bước 4: Cài đặt extension php-redis trên webserver – cấu hình session handler
Tại bước này, cấu hình sẽ thực hiện trên web-server là CentOS 7 chạy LEMP.
$ apt-get install php-redis
Gõ Y/y và chờ cài đặt hoàn tất.
Hãy dùng trình soạn thảo nano để tiến hành chỉnh sửa cấu hình như sau:
$ nano /etc/php.ini
Dò xuống mục [Session] và thay đổi giá trị của 2 dòng:
session.save_handler = files
session.save_path = "/tmp"
Trở thành:
session.save_handler = redis
session.save_path = "tcp://192.168.168.44:6379?auth=strongpassword”
Trong đó ở phần “auth” sẽ là nơi nhận mật khẩu đã được set ở bước trên.
Save và đóng file cấu hình lại, tiếp tục khởi động lại service của PHP
- Với Ubuntu:
$ service php5-fpm restart
- Với CentOS 7:
$ service php-fpm restart
Bước 5: Kiểm tra handler session của Redis
Ở bước này, sau khi đã cấu hình ở 2 bên server, người dùng cần 1 đoạn script hoặc ứng dụng để có thể đảm bảo session khi truy cập web được Redis handling.
Cách đơn giản là tạo 1 file script đặt tên là “index.php” và lưu lại trên đường dẫn chứa trong thư mục gốc DocRoot (document-root) của phía web-server.
Tạo 1 file tên tùy ý hoặc chèn thêm nội dung vào file có sẵn là index.php trong thư mục gốc DocRoot.
Trong ví dụ này, trên server web chạy LEMP có DocRoot là /var/www/testweb.com
và có sẵn file là index.php.
Thêm các dòng lệnh tùy ý, có thể lưu lệnh cho phép đếm số lần reload lại website như trong hình.
Mở browser và nhập URL là “http://(tên trang web)/index.php” cho ra kết quả như sau.
Mỗi lần reload lại website, số lần ở dưới sẽ tăng 1 lần và lặp lại.
Sau đó quay lại với phía Redis server và gõ lệnh:
$ redis-cli -h 192.168.168.44
rồi nhập mật khẩu xác thực.
Tiếp tục gõ keys * để xem kết quả.
Chúc các bạn thành công.