Cách chia sẻ các phiên PHP trên nhiều server Memcached trên Ubuntu 14.04
Memcached là một hệ thống bộ nhớ đệm đối tượng phân tán lưu trữ thông tin trong bộ nhớ, thay vì trên đĩa, để truy cập nhanh hơn. Mô-đun Memcache của PHP được dùng để xử lý các phiên mà nếu không sẽ được lưu trữ trên hệ thống file . Lưu trữ các phiên PHP trong Memcached có lợi thế là có thể phân phối chúng đến nhiều server cloud đang chạy Memcached, để duy trì dự phòng phiên.Nếu không có cài đặt Memcached này, nếu ứng dụng của bạn đang được cân bằng tải trên nhiều server , thì cần phải cấu hình độ dính của phiên trên bộ cân bằng tải. Điều này duy trì trải nghiệm user và ngăn họ bị đăng xuất đột ngột. Việc cấu hình Memcached để xử lý các phiên sẽ đảm bảo tất cả các server cloud trong group Memcached có cùng một tập dữ liệu phiên, giúp loại bỏ nhu cầu gắn bó với một server để duy trì phiên.
Yêu cầu
Giả định bạn đã quen với việc cài đặt server LAMP trong Ubuntu .
Cài đặt này sẽ sử dụng 3 server với hình ảnh Ubuntu 14.04 .
Server 1
- Tên: lamp01
- IP công cộng: 1.1.1.1
- IP riêng: 10.1.1.1
Server 2
- Tên: lamp02
- IP công cộng: 2.2.2.2
- IP riêng: 10.2.2.2
Server 3
- Tên: lamp03
- IP công cộng: 3.3.3.3
- IP riêng: 10.3.3.3
Đảm bảo rằng hộp kiểm Mạng riêng được chọn khi tạo các server . Ngoài ra, hãy ghi lại các địa chỉ IP riêng vì ta cần chúng sau này.
Cài đặt LAMP trên cả ba server .
Đầu tiên, cập nhật repository và cài đặt Apache.
apt-get update apt-get install apache2
Cài đặt phần mở rộng mod_php của PHP và Apache.
apt-get install php5 libapache2-mod-php5 php5-mcrypt
Để biết thêm thông tin, hãy xem bài viết này .
Bước một - Cài đặt gói Memcache
Trên lamp01 , cài đặt daemon Memcached và module Memcache của PHP.
apt-get install php5-memcache memcached
PHP có hai gói: php5-memcache và php5-memcached (chú ý chữ “d” ở cuối). Ta sẽ sử dụng gói đầu tiên (memcache) vì nó nhẹ hơn mà không có bất kỳ phụ thuộc nào. Đọc so sánh giữa memcache và memcached .
Dịch vụ Memcached chỉ lắng nghe trên localhost (127.0.0.1). Điều này phải được thay đổi để chấp nhận các kết nối từ mạng riêng.
nano /etc/memcached.conf
Tìm dòng sau:
-l 127.0.0.1
Thay đổi nó để lắng nghe trên địa chỉ IP riêng của server này.
-l 10.1.1.1
Khởi động lại dịch vụ bộ nhớ memcached
.
service memcached restart
Lặp lại các bước này trên hai server khác, thay thế 127.0.0.1
bằng địa chỉ IP riêng thích hợp.
đèn02
-l 10.2.2.2
đèn03
-l 10.3.3.3
Khởi động lại dịch vụ bộ nhớ memcached
trên hai server thứ hai.
Bước hai - Đặt Memcache làm Trình xử lý phiên của PHP
Trên lamp01 , mở file php.ini
để chỉnh sửa.
nano /etc/php5/apache2/php.ini
Tệp này nằm tại /etc/php5/fpm/php.ini
trên bản cài đặt PHP-FPM.
Tìm các chỉ thị cấu hình sau:
session.save_handler = session.save_path =
Sửa đổi chúng để sử dụng Memcache như sau. Sử dụng tất cả ba địa chỉ IP riêng trong session.save_path
.
session.save_handler = memcache session.save_path = 'tcp://10.1.1.1:11211,tcp://10.2.2.2:11211,tcp://10.3.3.3:11211'
Bạn có thể cần bỏ ghi chú session.save_path
bằng cách xóa dấu chấm phẩy ở đầu. Hãy nhớ nhập số cổng 11211 sau mỗi địa chỉ IP, vì Memcached sẽ lắng nghe trên cổng này.
Thêm chính xác các cài đặt tương tự trên hai server khác.
Trên đèn 02 :
session.save_handler = memcache session.save_path = 'tcp://10.1.1.1:11211,tcp://10.2.2.2:11211,tcp://10.3.3.3:11211'
Trên đèn 03 :
session.save_handler = memcache session.save_path = 'tcp://10.1.1.1:11211,tcp://10.2.2.2:11211,tcp://10.3.3.3:11211'
Cấu hình này phải giống hệt nhau trên tất cả các server để chia sẻ phiên hoạt động bình thường.
Bước 3 - Cấu hình bộ nhớ đệm để dự phòng phiên
Trên lamp01 , chỉnh sửa file memcache.ini
.
nano /etc/php5/mods-available/memcache.ini
Thêm các chỉ thị cấu hình sau vào cuối file này.
memcache.allow_failover=1 memcache.session_redundancy=4
Chỉ thị memcache.session_redundancy
phải bằng số lượng server memcached + 1 để thông tin phiên được sao chép tới tất cả các server . Điều này là do một lỗi trong PHP .
Các chỉ thị này cho phép chuyển đổi dự phòng và dự phòng phiên, vì vậy PHP ghi thông tin phiên vào tất cả các server được chỉ định trong session.save_path
; tương tự như cài đặt RAID-1.
Khởi động lại web server hoặc daemon PHP FPM tùy thuộc vào những gì đang được sử dụng.
service apache2 reload
Lặp lại chính xác các bước này trên lamp02 và lamp03 .
Bước 4 - Dự phòng phiên kiểm tra
Để kiểm tra cài đặt này, hãy tạo tập lệnh PHP sau trên tất cả các Server.
/var/www/html/session.php
<?php header('Content-Type: text/plain'); session_start(); if(!isset($_SESSION['visit'])) { echo "This is the first time you're visiting this server\n"; $_SESSION['visit'] = 0; } else echo "Your number of visits: ".$_SESSION['visit'] . "\n"; $_SESSION['visit']++; echo "Server IP: ".$_SERVER['SERVER_ADDR'] . "\n"; echo "Client IP: ".$_SERVER['REMOTE_ADDR'] . "\n"; print_r($_COOKIE); ?>
Tập lệnh này chỉ dùng để thử nghiệm và có thể bị xóa sau khi các server được cài đặt .
Truy cập file này trên Server đầu tiên bằng cách sử dụng curl và extract thông tin cookie.
curl -v -s http://1.1.1.1/session.php 2>&1 | grep 'Set-Cookie:'
Kết quả sẽ trả về kết quả tương tự như sau.
< Set-Cookie: PHPSESSID=8lebte2dnqegtp1q3v9pau08k4; path=/
Sao chép cookie PHPSESSID
và gửi yêu cầu đến các Server khác bằng cách sử dụng cookie này. Phiên này sẽ bị PHP xóa nếu không có yêu cầu nào được thực hiện trong 1440 giây, vì vậy hãy đảm bảo bạn hoàn thành bài kiểm tra trong khung thời gian này. Đọc về session.gc-maxlifetime của PHP để tìm hiểu thêm về điều này.
curl --cookie "PHPSESSID=8lebte2dnqegtp1q3v9pau08k4" http://1.1.1.1/session.php http://2.2.2.2/session.php http://3.3.3.3/session.php
Bạn sẽ thấy rằng phiên đang được chuyển qua tất cả các Server.
Your number of visits: 1 Server IP: 1.1.1.1 Client IP: 117.193.121.130 Array ( [PHPSESSID] => 8lebte2dnqegtp1q3v9pau08k4 ) Your number of visits: 2 Server IP: 2.2.2.2 Client IP: 117.193.121.130 Array ( [PHPSESSID] => 8lebte2dnqegtp1q3v9pau08k4 ) Your number of visits: 3 Server IP: 3.3.3.3 Client IP: 117.193.121.130 Array ( [PHPSESSID] => 8lebte2dnqegtp1q3v9pau08k4 )
Để kiểm tra chuyển đổi dự phòng, hãy dừng dịch vụ memcached
và truy cập file này trên đó.
service memcached stop
Server sử dụng thông tin phiên được lưu trữ trên hai server khác một cách minh bạch.
curl --cookie "PHPSESSID=8lebte2dnqegtp1q3v9pau08k4" http://1.1.1.1/session.php
Đầu ra:
Your number of visits: 4 Server IP: 1.1.1.1 Client IP: 117.193.121.130 Array ( [PHPSESSID] => 8lebte2dnqegtp1q3v9pau08k4 )
Như vậy, một bộ cân bằng tải có thể được cấu hình để phân phối các yêu cầu một cách đồng đều mà không gặp rắc rối khi cấu hình độ dính của phiên.
Bắt đầu memcached
khi bạn đã hoàn tất quá trình kiểm tra:
service memcached start
Bước 5 - Bảo mật Memcached với IPTables
Ngay cả khi Memcached đang sử dụng mạng riêng, những user DigitalOcean khác trong cùng trung tâm dữ liệu có thể kết nối với Server nếu họ biết IP riêng của bạn. Vì vậy, ta sẽ cài đặt các luật IPTables để chỉ cho phép các server cloud trong group Memcached của ta giao tiếp với nhau.
Ta đang thực hiện bước này sau khi kiểm tra dự phòng phiên để dễ dàng hơn trong việc khắc phục sự cố có thể phát sinh nếu áp dụng các luật không chính xác.
Tạo luật firewall trên lamp01 với địa chỉ IP riêng của lamp02 và lamp03 .
iptables -A INPUT -s 10.2.2.2 -i eth1 -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT iptables -A INPUT -s 10.3.3.3 -i eth1 -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT
Trên một server LAMP điển hình, sau đây sẽ là bộ luật hoàn chỉnh:
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT iptables -A INPUT -s 10.2.2.2 -i eth1 -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT iptables -A INPUT -s 10.3.3.3 -i eth1 -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT iptables -P INPUT DROP
Nhập các luật firewall trên lamp02 với địa chỉ IP riêng của lamp01 và lamp03 .
iptables -A INPUT -s 10.1.1.1 -i eth1 -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT iptables -A INPUT -s 10.3.3.3 -i eth1 -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT
Thực hiện tương tự trên lamp03 với các địa chỉ IP riêng của lamp01 và lamp02 .
iptables -A INPUT -s 10.1.1.1 -i eth1 -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT iptables -A INPUT -s 10.2.2.2 -i eth1 -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT
Lặp lại các kiểm tra ở Bước 4 để xác nhận firewall không chặn lưu lượng của ta .
Đọc thêm
- Cách cài đặt LAMP trên Ubuntu 14.04
- Cách cô lập server trong mạng riêng bằng IPTables
- Cách lưu trữ các phiên PHP trong Memcached
Các tin liên quan
Cách sử dụng Framework PHP miễn phí béo2014-03-06
Cách tự động hóa quy trình triển khai ứng dụng PHP bằng Capistrano trên Ubuntu 13
2014-02-26
Cách triển khai ứng dụng Kohana PHP trên VPS Debian 7 / Ubuntu 13 với Nginx và PHP-FPM
2013-12-30
Cách cài đặt và thiết lập Kohana, Khung phát triển ứng dụng web PHP
2013-12-30
Cách tùy chỉnh MediaWiki bằng tệp LocalSettings.php
2013-09-16
Bắt đầu với Yii PHP Framework - Phần 2
2013-08-12
Cách lưu trữ các phiên PHP trong Memcached trên CentOS VPS
2013-08-05
Cách sử dụng Gmail hoặc Yahoo với chức năng PHP mail ()
2013-08-02
Cách tạo plugin Nagios với PHP trên Ubuntu 12.10
2013-04-29
Cách tạo plugin Nagios với PHP trên CentOS 6
2013-04-29