Thứ hai, 14/11/2016 | 00:00 GMT+7

Cách thiết lập server Redis làm trình xử lý phiên cho PHP trên Ubuntu 16.04

Redis là một hệ thống lưu trữ và bộ nhớ cache key-value open-souce , còn gọi là server cấu trúc dữ liệu do hỗ trợ nâng cao cho một số kiểu dữ liệu, chẳng hạn như băm, danh sách, bộ và bitmap, trong số những loại khác. Nó cũng hỗ trợ phân cụm, làm cho nó hữu ích trong các môi trường có khả năng mở rộng và khả dụng cao.

Trong hướng dẫn này, ta sẽ xem cách cài đặt và cấu hình server Redis bên ngoài được sử dụng làm trình xử lý phiên cho ứng dụng PHP chạy trên Ubuntu 16.04.

Trình xử lý phiên có nhiệm vụ lưu trữ và truy xuất dữ liệu đã lưu vào phiên. Theo mặc định, PHP sử dụng tệp cho việc này. Điều này hoạt động đủ tốt cho một server duy nhất, nhưng có một số hạn chế về hiệu suất và khả năng mở rộng đáng kể vì thông tin phiên được gắn với một server duy nhất.

Trình xử lý phiên bên ngoài cung cấp một vị trí trung tâm cho dữ liệu phiên được chia sẻ được dùng bởi nhiều server ứng dụng. Điều này rất quan trọng khi tạo môi trường PHP có thể mở rộng đằng sau bộ cân bằng tải vì dữ liệu phiên giống nhau sẽ có sẵn dù server ứng dụng nào phục vụ một yêu cầu riêng lẻ.

Yêu cầu

Hướng dẫn này sẽ cấu hình xử lý phiên sử dụng hai server . Để làm theo, bạn cần :

  • Web server PHP chạy LAMP hoặc LEMP trên Ubuntu 16.04. Ta sẽ gọi server này là web .
  • Server Ubuntu 16.04 sạch thứ hai, nơi Redis sẽ được cài đặt. Ta sẽ gọi server này là redis .

Bạn cần phải có user không phải root với các quyền sudo cấu hình trên mỗi server này. Ta cũng sẽ giả định mỗi server đều có một firewall cơ bản đang chạy. Bạn có thể cài đặt cả hai yêu cầu này theo hướng dẫn cài đặt server ban đầu Ubuntu 16.04 của ta trên cả hai server .

Bước 1: Cài đặt Redis Server và Client Software

Bước đầu tiên của ta sẽ là cài đặt phần mềm cần thiết trên cả hai máy của ta . Máy redis của ta cần một server Redis. Trên máy web của ta , ta sẽ cài đặt phần mở rộng Redis PHP để xử lý phiên và ứng dụng client dòng lệnh Redis để thử nghiệm.

Cài đặt Server Redis

Điều đầu tiên ta cần làm là chạy server Redis trên máy redis của ta .

Ta sẽ sử dụng trình quản lý gói Ubuntu thông thường với repository PPA tin cậy do Chris Lea cung cấp. Điều này là cần thiết đảm bảo ta nhận được version ổn định mới nhất của Redis.

Lưu ý: Như một lời khuyên chung về bảo mật, bạn chỉ nên sử dụng PPA từ các nguồn tin cậy .

Đầu tiên, thêm repository PPA bằng lệnh:

  • sudo apt-add-repository ppa:chris-lea/redis-server

Nhấn ENTER để xác nhận.

Tiếp theo, cập nhật index gói và cài đặt server Redis bằng lệnh :

  • sudo apt-get update
  • sudo apt-get install redis-server

Redis bây giờ sẽ được cài đặt và chạy trên server của bạn. Kiểm tra xem dịch vụ đang chạy và chấp nhận kết nối bằng lệnh :

  • redis-cli ping
Redis server output
PONG

Thao tác này sẽ kết nối với version Redis chạy trên localhost trên cổng 6379 . Bạn sẽ nhận được PONG làm phản hồi.

Cài đặt Redis Client và PHP Extension

Tiếp theo, cài đặt ứng dụng client dòng lệnh Redis và phần mở rộng Redis PHP trên server web . Ta sẽ sử dụng client dòng lệnh để dễ dàng kiểm tra kết nối và xác thực. Ta sẽ sử dụng phần mở rộng PHP để lưu trữ dữ liệu phiên của ta .

Cập nhật index gói local và cài đặt phần mềm trên server web của bạn bằng lệnh :

  • sudo apt-get update
  • sudo apt-get install redis-tools php-redis

Đến đây bạn sẽ có quyền truy cập vào công cụ redis-cli , mặc dù bạn chưa có quyền truy cập vào server để kiểm tra.

Bước 2: Cấu hình Redis để chấp nhận các kết nối bên ngoài

Theo mặc định, Redis chỉ cho phép kết nối từ localhost , về cơ bản nghĩa là bạn sẽ chỉ có quyền truy cập từ bên trong server nơi Redis được cài đặt. Ta cần thay đổi cấu hình này để cho phép các kết nối đến từ các server khác.

Redis không cung cấp tùy chọn mã hóa root và giả định nó đã được triển khai cho một mạng riêng biệt gồm các đồng nghiệp tin cậy . Điều này nghĩa là để cho phép các kết nối bên ngoài một cách an toàn, cả hai server phải nằm trên một mạng cô lập hoặc bạn cần bảo mật lưu lượng giữa chúng theo cách khác.

Nếu Redis được triển khai vào một mạng cô lập…

Nếu server của bạn đang hoạt động trong một mạng bị cô lập, bạn có thể chỉ cần điều chỉnh file cấu hình của Redis để liên kết với địa chỉ IP mạng bị cô lập của bạn .

Trên server redis , backup và mở file cấu hình Redis:

  • sudo cp /etc/redis/redis.conf /etc/redis/redis.conf.bak
  • sudo nano /etc/redis/redis.conf

Tìm đường bind và nối thêm địa chỉ IP mạng bị cô lập của server Redis:

/etc/redis/redis.conf
bind 127.0.0.1 isolated_IP_address 

Lưu và đóng file . Khởi động lại dịch vụ bằng lệnh :

  • sudo systemctl restart redis-server.service

Mở quyền truy cập vào cổng Redis:

  • sudo ufw allow 6379

Redis hiện có thể chấp nhận các kết nối từ mạng bị cô lập của bạn.

Nếu Redis không được triển khai vào một mạng bị cô lập…

Đối với các mạng không bị cô lập hoặc bạn không kiểm soát, bắt buộc lưu lượng phải được bảo mật thông qua các phương tiện khác. Có nhiều tùy chọn để bảo mật lưu lượng truy cập đến server Redis, bao gồm:

  • Tạo tunnel với tunnel : Bạn cần cài đặt tunnel đến trên server redis và tunnel gửi đi trên server web . Web server sẽ kết nối với một cổng local để giao tiếp với dịch vụ Redis từ xa.
  • Tạo tunnel với spiped : Server web phải hoạt động như một client spiped . Bạn cần tạo một file đơn vị systemd trên mỗi server . Web server sẽ kết nối với một cổng local để giao tiếp với dịch vụ Redis từ xa.
  • Cài đặt VPN với PeerVPN : Cả hai server cần có thể truy cập được trên VPN. Server web sẽ có thể truy cập server redis bằng địa chỉ IP VPN của nó.

Sử dụng một trong các phương pháp ở trên, cấu hình quyền truy cập an toàn từ server web tới server redis của bạn. Bạn cần biết địa chỉ IP và cổng mà máy web của bạn sẽ sử dụng để kết nối với dịch vụ Redis trên máy từ xa.

Đến đây, bạn có thể truy cập server Redis của bạn từ web server một cách an toàn.

Bước 3: Đặt password cho server Redis

Để thêm một lớp bảo mật bổ sung cho cài đặt Redis của bạn, bạn nên đặt password để truy cập dữ liệu server . Ta sẽ chỉnh sửa file cấu hình Redis tại /etc/redis/redis.conf :

  • sudo nano /etc/redis/redis.conf

Tìm các requirepass chỉ thị và đặt nó vào cụm từ password mạnh. Mặc dù lưu lượng truy cập Redis của bạn phải được bảo mật khỏi các bên bên ngoài, điều này cung cấp xác thực cho chính Redis. Vì Redis nhanh và không giới hạn tỷ lệ các lần nhập password , hãy chọn một passphrase (password bảo vệ) mạnh, phức tạp để bảo vệ khỏi các nỗ lực vũ phu:

/etc/redis/redis.conf
requirepass yourverycomplexpasswordhere 

Lưu file khi bạn hoàn tất.

Khởi động lại dịch vụ Redis để thực hiện thay đổi:

  • sudo systemctl restart redis-server.service

Server Redis của bạn bây giờ sẽ từ chối các yêu cầu chưa được xác thực.

Bước 4: Kiểm tra kết nối và xác thực Redis

Để kiểm tra xem các thay đổi có hoạt động như mong đợi hay không, hãy kết nối với dịch vụ Redis từ máy web .

Theo mặc định, server Redis lắng nghe trên 6379 trên giao diện local , nhưng mỗi tùy chọn bảo mật mạng mà ta đề cập ở trên sẽ sửa đổi mặc định theo một số cách cho các bên bên ngoài. Ta có thể sử dụng client redis-cli với tùy chọn -h để chỉ định địa chỉ IP và tùy chọn -p để chỉ định cổng cần thiết để kết nối với dịch vụ từ xa. Bạn có thể loại bỏ một trong hai điều này nếu chúng sử dụng các tùy chọn mặc định (tương ứng là 127.0.0.1 và 6379).

Các giá trị bạn sử dụng sẽ phụ thuộc vào phương pháp bạn đã sử dụng để bảo mật lưu lượng mạng của bạn :

  • mạng cô lập : Sử dụng địa chỉ IP mạng cô lập của server Redis. Cổng Redis mặc định (6379) được sử dụng, vì vậy ta không cần phải đề cập đến nó: redis-cli -h redis_isolated_IP
  • stunnel hoặc spiped : Sử dụng cổng local dẫn đến dịch vụ Redis từ xa: redis-cli -p 8000
  • PeerVPN : Sử dụng địa chỉ IP VPN của server Redis: redis-cli -h 10.8.0. 1

Hình thức chung là:

  • redis-cli -h ip_to_contact_redis -p port_to_contact_redis

Bạn có thể kết nối với version Redis từ xa từ server web .

Nếu bạn đã xác định password và bây giờ cố gắng truy cập dữ liệu, bạn sẽ gặp lỗi AUTH:

  • keys *
Web server output
(error) NOAUTH Authentication required.

Để xác thực, bạn chỉ cần chạy lệnh AUTH , cung cấp cùng một password mà bạn đã xác định trong file /etc/redis/redis.conf :

  • AUTH yourverycomplexpasswordhere

Bạn sẽ nhận được một OK như phản ứng cho biết thông tin của bạn đã được chấp nhận.

Web server output
OK

Tiếp theo, liệt kê các khóa được đặt trong Redis:

  • keys *

Nếu đây là một server Redis mới, kết quả sẽ tương tự như sau:

Web server output
(empty list or set)

Đầu ra này chỉ nghĩa là server Redis của bạn trống, đó chính xác là những gì ta mong đợi. Server web chưa được cấu hình để sử dụng server Redis này làm trình xử lý phiên.

Thoát trở lại shell lệnh bằng lệnh :

  • exit

Bây giờ ta đã xác minh ta có thể kết nối thành công với xác thực, ta có thể đặt Redis thành trình xử lý phiên mặc định của bạn .

Bước 5: Đặt Redis làm Trình xử lý phiên mặc định trên Server Web

Bây giờ ta cần chỉnh sửa file php.ini trên server web để thay đổi trình xử lý phiên mặc định cho PHP. Vị trí của file này sẽ phụ thuộc vào ngăn xếp hiện tại của bạn.

Đối với ngăn xếp LAMP trên Ubuntu 16.04 được cài đặt từ repository mặc định , đây thường là /etc/php/7.0/apache2/php.ini . Đối với ngăn xếp LEMP trên Ubuntu 16.04, đường dẫn thường là /etc/php/7.0/fpm/php.ini . Nếu bạn đã xác minh một trong những vị trí này là chính xác, vui lòng bỏ qua phần tiếp theo.

(Tùy chọn) Tìm đúng file php.ini

Nếu bạn không chắc chắn về vị trí của file php.ini chính của bạn , bạn có thể tìm hiểu bằng cách sử dụng hàm phpinfo() . Mở một file trên server web của bạn có tên là info.php trong root tài liệu của bạn, file này theo mặc định sẽ là /var/www/html cho cả LAMP và LEMP:

  • sudo nano /var/www/html/info.php

Đặt mã sau vào file :

/var/www/html/info.php
<?php phpinfo(); 

Truy cập domain hoặc địa chỉ IP của server web trong trình duyệt của bạn, sau đó là /info.php :

http://web_server_domain_or_IP/info.php 

Tìm hàng có chứa “Tệp cấu hình đã tải” và bạn sẽ tìm thấy vị trí chính xác của php.ini chính được tải.

Xóa file khi bạn hoàn tất, vì nó hiển thị thông tin nhạy cảm về môi trường của bạn:

  • sudo rm /var/www/html/info.php

Đến đây bạn đã biết vị trí của file , bạn có thể chuyển sang chỉnh sửa.

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

Mở file php.ini để chỉnh sửa.

Nếu bạn đang sử dụng ngăn xếp LAMP trong cấu hình mặc định của nó, lệnh bạn cần là:

  • sudo nano /etc/php/7.0/apache2/php.ini

Nếu bạn đang sử dụng ngăn xếp LEMP trong cấu hình mặc định của nó, lệnh bạn cần là:

  • sudo nano /etc/php/7.0/fpm/php.ini

Nếu bạn phát hiện ra một đường dẫn khác bằng phương thức phpinfo() nêu ở trên, hãy thay thế đường dẫn đó tại đây.

Bên trong file php.ini , hãy tìm kiếm dòng chứa session.save_handler . Giá trị mặc định là files . Thay đổi điều này thành redis để sử dụng phần mở rộng Redis PHP.

php.ini
 session.save_handler = redis 

Tiếp theo, tìm dòng chứa session.save_path . Bạn cần bỏ ghi chú nó và thay đổi giá trị để nó chứa chuỗi kết nối Redis của bạn.

Chuỗi kết nối có thể được tạo bằng cách sử dụng định dạng sau, tất cả trong một dòng:

tcp://IP_address:port?auth=redis_password 

, các giá trị thích hợp sẽ phụ thuộc vào chiến lược mạng an toàn mà bạn đã chọn. Sử dụng các giá trị tương tự mà bạn đã cung cấp cho lệnh redis-cli trước đó. Ví dụ: nếu bạn đang sử dụng stunnel hoặc spiped , thì session.save_path có thể sẽ trông giống như sau:

php.ini
 session.save_path = "tcp://127.0.0.1:8000?auth=yourverycomplexpasswordhere" 

Lưu file khi bạn hoàn tất. Tiếp theo, khởi động lại dịch vụ PHP để thực hiện các thay đổi .

Trong môi trường LAMP , hãy nhập:

  • sudo systemctl restart apache2

Trong môi trường LEMP , hãy nhập:

  • sudo systemctl restart php7.0-fpm

PHP bây giờ nên được cấu hình để sử dụng Redis làm trình xử lý phiên.

Bước 6: Kiểm tra xử lý phiên Redis

Để đảm bảo các phiên của bạn hiện được Redis xử lý, bạn cần một tập lệnh PHP hoặc ứng dụng lưu trữ thông tin trong các phiên. Ta sẽ sử dụng một tập lệnh đơn giản để triển khai một bộ đếm. Mỗi lần bạn reload trang, số lượng được in sẽ tăng lên.

Tạo một file có tên test.php trên server web bên trong folder root tài liệu của bạn:

  • sudo nano /var/www/html/test.php

Bên trong, dán mã sau:

/var/www/html/test.php
 <?php //simple counter to test sessions. should increment on each page reload. session_start(); $count = isset($_SESSION['count']) ? $_SESSION['count'] : 1;  echo $count;  $_SESSION['count'] = ++$count; 

Lưu và đóng file .

Trỏ trình duyệt của bạn đến địa chỉ IP công cộng của server web theo sau là /test.php để truy cập tập lệnh:

http://web_server_public_IP/test.php 

Nó sẽ tăng số lượng bạn thấy mỗi khi reload trang.

Bây giờ, trên máy redis của bạn, hãy sử dụng redis-cli để mở một phiên. Vì ta đang kết nối với version local , ta sẽ không phải cung cấp địa chỉ IP hoặc cổng:

  • redis-cli

Xác thực bằng password Redis:

  • AUTH yourverycomplexpasswordhere
Redis server output
OK

Bây giờ, hãy kiểm tra các khóa hiện có:

  • keys *

Bạn sẽ thấy một mục mới cho phiên PHP của ta :

Redis server output
1) "PHPREDIS_SESSION:2ofnvhhr6gdvp88u0c4e7kb800"

Nếu bạn yêu cầu giá trị của khóa, bạn có thể thấy giá trị bộ đếm hiện tại:

  • get PHPREDIS_SESSION:2ofnvhhr6gdvp88u0c4e7kb800
Redis server output
"count|i:6;"

Điều này cho thấy rằng thông tin phiên đang được lưu trữ trên server Redis. Bạn có thể kết nối các web server bổ sung với server Redis để quản lý phiên tập trung.

Kết luận

Redis là một dịch vụ lưu trữ key-value nhanh và mạnh mẽ, cũng được dùng làm trình xử lý phiên cho PHP, cho phép các môi trường PHP có thể mở rộng bằng cách cung cấp một hệ thống phân tán để lưu trữ phiên. Để biết thêm thông tin về mở rộng ứng dụng PHP, bạn có thể xem bài viết này: Ứng dụng PHP mở rộng theo chiều ngang .


Tags:

Các tin liên quan

Cách cấu hình Redis Replication trên Ubuntu 16.04
2016-11-11
Cách mã hóa lưu lượng truy cập vào Redis với Spiped trên Ubuntu 16.04
2016-11-09
Cách mã hóa lưu lượng truy cập vào Redis với Stunnel trên Ubuntu 16.04
2016-11-08
Cách mã hóa lưu lượng truy cập vào Redis với PeerVPN trên Ubuntu 16.04
2016-11-08
Cách cài đặt và cấu hình Redis trên Ubuntu 16.04
2016-05-11
Cách di chuyển dữ liệu Redis với Master-Slave Replication trên Ubuntu 14.04
2016-05-05
Cách tìm log Redis trên Ubuntu
2016-03-01
Cách bảo mật cài đặt Redis của bạn trên Ubuntu 14.04
2015-09-25
Cách backup và khôi phục dữ liệu Redis của bạn trên Ubuntu 14.04
2015-09-14
Cách thiết lập server Redis làm Trình xử lý phiên cho PHP trên Ubuntu 14.04
2015-08-21