Thứ ba, 22/07/2014 | 00:00 GMT+7

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 lamp02lamp03 .

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 lamp02lamp03 .

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 lamp01lamp03 .

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 lamp01lamp02 .

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


Tags:

Các tin liên quan

Cách sử dụng Framework PHP miễn phí béo
2014-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