1. 程式人生 > >yii專案做負載均衡時請注意驗證碼session共享問題

yii專案做負載均衡時請注意驗證碼session共享問題



眾所周知,做負載均衡的時候,必須解決兩個棘手的問題,一是session會話共享問題,二是上傳檔案同步問題,今天給大家分享一個我遇到過的問題,yii專案登入功能驗證碼無法同步的解決辦法。

本文測試環境:

  • 負載均衡機一臺(nginx,做分發用)

  • A伺服器(程式所在機器)

  • B伺服器(程式所在機器)

  • memcached伺服器一臺(暫稱為s1吧)

關於負載均衡的session會話同步,我不詳說,網上一搜一大片,無非就是以下三種:

  1. 利用資料庫同步session

  2. 利用cookie同步session

  3. 利用memcache同步session

今天我所說的是第三種,利用memcache同步session

,開啟A、B伺服器的php.ini設定如下:

#設定php.ini儲存session的方式為memcache
session.save_handler = memcache  // 設定session的儲存方式為memcache
memcache.hash_strategy = "consistent" //設定memcache的hash演算法
session.save_path = "tcp://192.168.1.101:11211" //設定session儲存的位置,101為s1伺服器的IP

下面我們進行登入,發現一直提示驗證碼不正確,儘管輸入了無數次也不對:

然後我輸出一下session資訊,看了看,發現yii的驗證碼類在存放驗證碼session的時候,如下:

Array
(
    [Yii.CCaptchaAction.1d220968.admin/default.captcha] => nime
    [Yii.CCaptchaAction.1d220968.admin/default.captchacount] => 2
)

發現每次重新整理頁面後,這個session的key都不一樣,不一樣的地方就在"1d220968"這裡,然後我就打開了yii的原始檔一看究竟,位置如下:

\framework\web\widgets\captcha\CCaptchaAction.php

第219行的getSessionKey方法,索性我直接去掉了裡面的Yii::app()->getId()的拼接,正是上面所說的1d220968部分

protected function getSessionKey()
{
    //原來的:
    //return self::SESSION_VAR_PREFIX . Yii::app()->getId() . '.' . $this->getController()->getUniqueId() . '.' . $this->getId();
    //修改後:
    return self::SESSION_VAR_PREFIX . $this->getController()->getUniqueId() . '.' . $this->getId();
}

再重新整理檢視session的值,已經沒有了1d220968:

Array
(
    [Yii.CCaptchaAction.admin/default.captcha] => nime
    [Yii.CCaptchaAction.admin/default.captchacount] => 2
)

然後就登入成功,實現了session的同步,也實現了yii驗證碼session的同步!就此完畢!

相關推薦

yii專案負載均衡注意驗證session共享問題

 眾所周知,做負載均衡的時候,必須解決兩個棘手的問題,一是session會話共享問題,二是上傳檔案同步問題,今天給大家分享一個我遇到過的問題,yii專案登入功能驗證碼無法同步的解決辦法。 本文測試環境: 負載均衡機一臺(nginx,做分發用) A伺服器(程式所在機器

Nginx負載均衡session共享問題詳解

壓縮 多臺 nts 獲得 hash 常見 hub img font 用nginx做負載均衡時,同一個IP訪問同一個頁面會被分配到不同的服務器上,如果session不同步的話,就會出現很多問題,比如說最常見的登錄狀態。 再者Nginx連接Memcached集群時,Nignx的

Nginx+Tomcat負載均衡一臺伺服器宕機實現自動切換

思路:有兩種方式。 第一種:設定一臺伺服器為備機,只有當訪問的伺服器異常時才會訪問它; 第二種:設定伺服器轉發請求超時時間。 一、設定備機: 在安裝目錄下(例E:\nginx-1.14.0\conf)開啟nginx.conf修改 upstream netitcast.com {

Windows+Nginx+Tomcat搭建負載均衡和叢集環境同時實現session共享(一)

摘要:隨著網站的訪問量越來越多,所以就考慮給網站增加伺服器了,現在比較流行的做法就是給網站做叢集環境,下面我把我做的過程記錄一下,方便日後檢視,同時也希望可以幫助到有需要的朋友! 一:首先是環境: 1.jdk 1.6.0_45 2.tomcat 6.0.44 3.nginx

nginx負載均衡 tomcat獲得客戶端真實ip

需要 項目 參考 real nginx代理 x-real-ip 發現 百度 通過 因項目需要做tomcat2臺機器的負載均衡,配置好負載環境後,發現tomcat的日誌一律是我前置nginx代理服務器的ip 通過百度教材發現需要修改nginx的配置文件,修改代理頭信息,傳遞

windows平臺下利用Nginx負載均衡

htm oot 部署 top proxy rec cnblogs access cast 1.下載nginx(http://nginx.org/en/download.html)安裝包,解壓,並使用cmd命令轉到nginx.exe所在的目錄 2.執行cmd命令start n

Linux 下 tomcat基於nginx負載均衡

tomcat 負載 測試目的:在一臺裝有nginx服務器上訪問nginx這臺的ip地址,刷新一次就會顯示後端三臺不同的tomcat服務器的測試頁。測試環境:三臺centos 6.8 一臺 centos 7.3軟件版本: nginx 1.12.1

生產環境使用nginx負載均衡配置的五種策略

寫入 8.0 pass 其它 所有 highlight ups ron debug nginx的upstream目前支持5種方式的分配1.輪詢(默認) 每個請求按時間順序逐一分配到不同的後端服務器,如果後端服務器down掉,能自動剔除。 2.weight指定輪詢幾率,w

批量同步代:有3臺服務器(A,B,C)負載均衡,由於規模太小目前並未使用專業的自動化運維工具

rda 屬性。 環境變量 再次 由於 執行 http sleep 依次 需求背景是:一個業務,有3臺服務器(A,B,C)做負載均衡,由於規模太小目前並未使用專業的自動化運維工具。有新的需求時,開發同事改完代碼會把變更上傳到其中一臺服務器A上。但是其他2臺服務器也需要做相同變

nginx與lvs在負載均衡方面的區別

lvs nginx負載均衡一、Nginx 1、nginx工作在網絡的7層,所以它可以針對http應用本身來做分流策略,比如針對域名、目錄結構等。 2、nginx有用的功能使其可調整度要高於lvs,所以經常要去觸碰觸碰,由lvs的第2條優點看,觸碰多了,人為出問題的幾率也就會大。 二、Lvs 1、抗負載能力

服務器配置,負載均衡需配置MachineKey

href 遇到 eve orm 連接 配置 ashx auto forms 服務器配置,負載均衡時需配置MachineKey https://blog.csdn.net/liuqiao0327/article/details/54018922 Asp.Net應用程序中為什

nginx 80和443同時負載均衡

ups art 均衡 負載均衡 follow service cert 同時 remote nginx 80和443同時做負載均衡: vi /etc/nginx/conf.d/default.conf upstream bugqa.ming.com {server 10.0

Spring Cloud負載均衡

home source 消費 output 應用程序 sch 中心 gist ice 1.新建maven工程,點擊finish完成 2.在pom.xml文件中加入必要的依賴 <?xml version="1.0" encoding="UTF-8"?>

mysql叢集一:主從複製,通過mysql-proxy負載均衡

mysql叢集架構方式很多,根據不同的需求做不一樣的架構,簡單一點的就是mysql的replication,也就是Mysql的複製功能,模式有:master-slaves,master-slaves-slaves,master-master-slaves等可以有多個分層,那麼現在我所要說的是mas

解決asp.net負載均衡Session共享的問題

     每個客戶端在訪問網站時,都會建立相應的Session,用來儲存客戶的狀態資訊,網站如果做了負載均衡,session共享是要做的,IIS對於session的儲存有五種模式 一、ASP.Net session儲存方式 1、InProc模式(程序內模式) 。為預設設定

tomcat7下配置session複製和nginx負載均衡

基於Nginx+Tomcat叢集的Session共享 (如果啟用了防火牆請開發配置中用到的埠) 在Linux環境下  第一步:下載對應的nginx 和 tomcat 包並解壓、安裝、配置(此步驟之前文章有提過,在此省略。。)  #user nobody; worke

【Nginx】使用Nginx負載均衡

一、前言       前文簡單介紹瞭如何安裝Nginx,方法非常簡單,操作也非常方便。上文中提到了Nginx可以做http伺服器、虛擬主機、負載均衡。在這篇部落格中小編就向

Jenkins服務使用nginx代理伺服器負載均衡

學習nginx代理伺服器做負載均衡的使用 在本地安裝Nginx 1.下載nginx http://nginx.org/en/download.html         下載穩定版本,以nginx/Windows-1.12.2為例,直接下載 nginx-1.12.2.zip 下載後解壓,解壓後如下 2.啟動n

centOS7安裝nginx負載均衡

我的機器資訊: 系統版本: [[email protected] ~]# lsb_release -a LSB Version: :core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-noarch:d

nginx 負載均衡,炒雞簡單

nginx 負載均衡 第一步,在nginx 配置 nginx.conf 的 http 指令中建立upstream upstream backend_https { server 10.2.20.80:443 weight=1 max_fails=2 fail_timeo