PHP集羣session共享

摘要:集羣的概念沒有多複雜,其實就是多臺電腦爲了同一個目標在一起工作。在Web應用中,就是多個服務器提供一個站點的服務。搭建PHP集羣的第一步就是設置負載均衡。首先我們需要三臺主機:Nginx負載:192.166.5.111PHP應 ...

集羣的概念沒有多複雜,其實就是多臺電腦爲了同一個目標在一起工作。在Web應用中,就是多個服務器提供一個站點的服務。

搭建PHP集羣的第一步就是設置負載均衡。首先我們需要三臺主機:

Nginx負載:192.166.5.111
PHP應用1:192.168.5.112
PHP應用2:192.168.5.113

先前,在PHP應用所在的主機,我們需要安裝Nginx或者apache等這類web服務器,然後再在前面使用Nginx作爲負載。Nginx 負載和php應用之間的通信是在應用層的,Nginx         負載其實就相當於一個代理。但是,現在情況不同了。Fastcgi技術的應用允許在php應用層可以不用再安裝web服務器。現在PHP5.5版本已經將fpm作爲內部模塊支持了。在這種情況下,Nginx 負載和php應用之間的通信是在傳輸層的,二者之間使用socket進行通信。當然了,這需要fpm服務的支持。

Nginx設置

首先對Nginx(192.168.5.111)進行設置,編輯nginx.conf配置文件

http{
         ……
         upstream onmpw_phpApps{
            server 192.168.18.88:9000;
            server 192.168.18.191:9000;
        }
        ……
       Server{
         listen        80;
         server_name   load.onmpw.com   ##這裏是域名
         root           /www/onmpw         
         ……
         location ~ \.php$ {
                   root         /www/onmpw   ##這裏是PHP應用所在目錄
                   fastcgi_pass   onmpw_phpApps;
                   ……
         }
      }
}

以上是對Nginx進行的設置。其中只是包含了關鍵的部分,其餘的和平常我們使用Nginx+PHP作爲web服務的時候進行的設置相同。

PHP所在主機設置

這裏的設置就比較簡單了。

首先編輯php-fpm.conf文件,修改監聽的ip和端口,然後啓動fpm服務

主機192.168.5.112

Listen = 192.168.5.112:9000   //這裏的端口可以自行設置。保存退出
# /usr/local/php/sbin/php-fpm   //開啓服務

主機192.168.5.113

Listen = 192.168.5.113:9000
# /usr/local/php/sbin/php-fpm

到這裏就對PHP的主機設置完成了。當然了,代碼需要在兩臺主機上各上傳一份兒。

好了,經過上面的設置,一個基本的PHP集羣就已經搭建完成了。但是有一個問題,這種情況如果只是訪問靜態資源或者不進行交互的話是沒有問題的。如果需要交互,那就涉及到一個session共享的問題。默認情況下PHP是將session存在本地磁盤上的。那這兩臺主機之間如何共享session呢,接下來我們就來解決這個問題。

PHP主機之間Session共享

之前在網上看到過一種解決方式。由於PHP是將session存儲在文件中,那我們可以在Nginx負載主機上面搭建一個分佈式文件系統(NFS),讓兩臺PHP主機的session都存放在此文件系統中。以此來達到共享session的目的。

我個人比較傾向於將session存儲到數據庫中。因此這裏我介紹的是將session存儲到redis中。所以我們需要增加一臺Redis服務器

Redis服務器:192.168.5.114

PHP默認情況下是不支持對Redis的操作的。所以這裏我們需要自己手動安裝第三方的擴展,使其支持對Redis的操作。關於如何使PHP支持Redis,我們可以參考《PHP操作Redis的兩種方式》

在這裏我就認爲我們的PHP已經支持Redis了。接下來是將session存儲到Redis中,有兩種方式:一種是直接修改PHP的配置文件php.ini;另一種是重寫session機制。

修改PHP配置文件php.ini將session存儲到Redis

使用vim打開php.ini,需要修改的有這兩項:session.save_handler和session.save_path。

session.save_handler = Redis
session.save_path = “tcp://192.168.5.114:6379”
//Redis不需要密碼驗證
session.save_path = “tcp://192.168.5.114:6379?auth=password”
//Redis 需要密碼驗證

修改完成,保存退出。然後重啓php-fpm服務

# kill -INT `cat /usr/local/php/var/run/php-fpm.pid`
# /usr/local/php/sbin/php-fpm

兩臺PHP主機都做按照以上步驟操作。經過以上步驟,對於session的所有信息都保存到了Redis中。從而實現了session的共享。

通過重寫session機制將session存儲到Redis

通常,在很多情況下我們是沒有權限修改php.ini文件的。這時候我們可以通過重寫session機制來修改session信息的存儲。

對於重寫session,php已經爲我們提供了SessionHandlerInterface 接口。我們只要實現這個接口就可以了。關於如何重寫session機制,大家可以參考《PHP重寫session機制》這篇文章。並且我自己也重寫了session的機制,該類的完整代碼在github上,大家有興趣的和可以點此查看

總結

PHP集羣的架構方式有很多種,但是其原理都大同小異。關鍵是找出*適合自己項目的*佳方案。例如:對於session存儲方式的選擇,你也可以選擇使用memcache或者mysql數據庫等。總之*適合自己的就是*優的。希望本文對大家有所幫助。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章