PHP集群session共享

2020-10-23 強叔微聊

集群的概念沒有多複雜,其實就是多臺電腦為了同一個目標在一起工作。在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資料庫等。總之*適合自己的就是*優的。希望本文對大家有所幫助。

相關焦點

  • 分布式集群環境下的Session共享解決方案
    而如果我們把web伺服器搭建成分布式的集群,然後利用LVS或Nginx做負載均衡,那麼來自同一用戶的Http請求將有可能被分發到兩個不同的web站點中去。那麼問題就來了,如何保證不同的web站點能夠共享同一份session數據呢?最簡單的想法就是把session數據保存到內存以外的一個統一的地方,例如Memcached/Redis等資料庫中。
  • PHP中的Session工作機制與Session ID的實現原理
    A list of available hashes is returned by the hash_algos(); function.; http://php.net/session.hash-functionsession.hash_function=0PHP session工作原理session 技術相當於Cookie技術的升級版,Cookie的工作機制是將信息記錄在客戶端,而
  • 負載均衡中使用 Redis 實現共享 Session
    但是,這裡有一個問題,如果我們登錄了百度的一個帳號,如網頁的百度網盤,但是每次有可能請求的是不同的伺服器,我們知道每個伺服器都會有自己的會話session,所以會導致用戶每次刷新網頁又要重新登錄,這是非常糟糕的體驗,因此,根據以上問題,希望session可以共享,這樣就可以解決負載均衡中同一個域名不同伺服器對應不同session的問題。
  • PHP-Session利用總結
    0x00 前言最近刷題碰到好幾個關於php代碼審計中session相關的問題,之前沒有做過系統的總結,在此補一下鍋。0x01 Session基礎知識這裡主要講講傳統的PHP中的「服務端Session」。
  • php session 會話使用案例
    php//開啟session會話session_start();//設置session$_SESSION['username'] = 'adminuser';//獲取session$username = $_SESSION['username'];//刪除sessionunset($_SESSION['username']);//清空sessionsession_unset();//或$_SESSION
  • PHP禁止Cookie之後Session還能用嗎?
    設置php.ini配置文件中的「session.use_trans_sid = 1」,或者編譯時打開打開了「--enable-trans-sid」選項,讓PHP自動跨頁傳遞Session ID。手動通過URL傳值、隱藏表單傳遞Session ID。用文件、資料庫等形式保存Session ID,在跨頁過程中手動調用。
  • PHP中session如何存儲及刪除變量的?
    但是session會話信息是臨時的,在用戶離開網站後就會被刪除。如果需要永久儲存信息,就需要把數據存儲在資料庫中。那麼下面我們就結合簡單的代碼示例,為大家介紹PHP中session的基礎用法,存儲變量以及刪除變量。一、session存儲變量當你需要將用戶的信息存儲到session中時,必須先開啟會話。
  • 關於PHP5 Session生命周期介紹
    php session_start(); // 保存一天 $lifeTime = 24 * 3600; setcookie(session_name(), session_id(), time() + $lifeTime, "/"); ?
  • Nginx+Tomcat實現負載均衡及Session共享
    >Host2:Tomcat2Tomcat_version:8.5.59 第二部分 Nginx+Tomcat實現負載均衡1、nginx及tomcat的安裝省略2、nginx負載均衡配置:http標籤中定義tomcat集群
  • spring data redis集成以及session共享
    redis 是一款基於內存存儲的高性能緩存框架,支持多種數據結構如string, hash, list, set、sorted set、bitmap等多種數據類型,也提供了很多高可用功能如rdb和aof備份、哨兵模式和集群模式部署。redis有許多的應用場景,一般用於替代一些資料庫訪問熱點數據操作減少資料庫壓力以及提高性能,也可用於session共享、排行榜等。
  • 在SpringBoot中使用Spring Session解決分布式會話共享問題
    前言如果你正在使用Java開發Web應用,想必你對HttpSession非常熟悉,但我們知道HpptSession默認使用內存來管理Session,如果將應用橫向擴展將會出現Session共享問題Spring Session提供了一套創建和管理Servlet HttpSession的方案,以此來解決Session共享的問題,更為重要的是在Spring Boot中使用它極其簡單。Session共享的問題HttpSession是通過Servlet容器創建和管理的,像Tomcat/Jetty都是保存在內存中的。
  • 基礎面試系列-session與cookie區別
    1.為什麼會有cookie和session這是因為http協議的無狀態性,如用戶訪問www.jd.com/a.htmlwww.jd.com/b.html這兩個頁面是沒有任何關係的,那怎麼標識這兩次是一個人訪問的呢,cookie和session就應運而生了。
  • session技術的基本使用
    session技術session技術,也是會話技術——即用於區分不同用戶(瀏覽器)的一種技術;session技術,它是把數據存儲在「伺服器端」;session技術,它基本上依賴於cookie技術。session技術原理:原理圖:實際上,該用來標識一個用戶的「唯一身份」的cookie數據:其名字為:PHPSESSID //其實就是cookie名。其值類似:40324;e320424;w$$%@s32455235 ——隨機不重複!
  • SESSION與COOKIE的區別是什麼?-PHP面試題
    目前可以通過使用redis來保存SESSION信息,SESSION保存在伺服器端的文件或資料庫中,默認保存在文件中,文件路徑由php配置文件的session.save_path指定。SESSION文件是公有的。4、COOKIE的存儲量有限、只允許存入4KB,而SESSION是無限量的。COOKIE可以通過javscript來操作,使用起來比較方便。
  • SpringBoot中實現分布式的Session共享
    SpringBoot中實現Session共享1. 創建web項目我們按照之前的經驗,創建一個web程序,並將之改造成Spring Boot項目,具體過程略。</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-core
  • Cookie、Session、localStorage與sessionStorage詳解
    伺服器通過檢查該Cookie來獲取用戶狀態cookie是不可跨域,但是只在域名不同的情況下不支持跨域,忽略協議與埠,https://localhost:80/和http://localhost:8080/的Cookie是共享的,可以通過domain設置域,path設置域下的共享路徑cookie屬性 name 表示設置的cookie名也就是key,不能重複,不可更改
  • PHP 微服務集群搭建
    Consul 是一個支持多數據中心、分布式高可用的服務發現和配置共享的服務軟體,由 HashiCorp 公司用 Go 語言開發, 基於 Mozilla Public License 2.0 的協議進行開源。Consul 支持健康檢查,並允許 HTTP 、gRPC 和 DNS 協議調用 API 存儲鍵值對。
  • SpringBoot如何用Session共享實現分布式部署?
    ,通過登錄攔截,進行操作但是分布式部署的時候,我們請求的伺服器可能不是同一臺伺服器,那麼我們就必須要面對 session 共享的問題,下面介紹的是在 SpringBoot 實現 session 共享的方式
  • Springboot Cloud Alibaba第十二節 session共享
    各位好久不見,話不多說,這節開練:1、首先分布式項目的準備:2、然後,我們需要spring-session-redis實現session的共享,沒想到的是,竟然如此簡單;我們先導入依賴:我這邊為了進行版本的管理,分別在父子工程中都引入了依賴:
  • 關於PHP session 安全、性能和擴展性的5點建議
    1,HTTPS協議服務端不用HTTPS的話,攻擊者可以輕易獲取用戶session ID,偽裝成用戶;2,PHP 核心配置修改PHP配置進一步提高伺服器安全性:2.1 session.cookie_secure:保證瀏覽器只在安全的HTTPS