查了一些資料,看了一些別人寫的文檔,總結如下,實現nginx session的共享
PHP伺服器有多台,用nginx做負載均衡,這樣同一個IP訪問同一個頁面會被分配到不同的伺服器上,如果session不同步的話,就會出現很多問題,比如說最常見的登入狀態,下面提供了幾種方式來解決session共享的問題:
1、不使用session,換用cookie
session是存放在伺服器端的,cookie是存放在客戶端的,我們可以把使用者存取頁面產生的session放到cookie裡面,就是以cookie為中轉站。你訪問web伺服器A,產生了session然後把它放到cookie裡面,當你的請求被分配到B伺服器時,伺服器B先判斷伺服器有沒有這個session,如果沒有,再去看看客戶端的cookie裡面有沒有這個session,如果也沒有,表示session真的不存,如果cookie裡面有,就把cookie裡面的sessoin同步到伺服器B,這樣就可以實現session的同步了。
說明:這種方法實現起來簡單,方便,也不會加大資料庫的負擔,但是如果客戶端把cookie禁掉了的話,那麼session就無從同步了,這樣會給網站帶來損失;cookie的安全性不高,雖然它已經加了密,但還是可以偽造的。
2、session存在資料庫(MySQL等)中
PHP可以設定將session保存在資料庫中,這種方法是把存放session的表和其他資料庫表放在一起,如果mysql也做了叢集了話,每個mysql節點都要有這張表,而且這張session表的資料表要即時同步。
說明:用資料庫來同步session,會增加資料庫的IO,增加資料庫的負擔。而且資料庫讀寫速度較慢,不利於session的適時同步。
3、session存在memcache或redis中
memcache可以做分佈式,php設定檔中設定儲存方式為memcache,這樣php自己就會建立一個session集群,將session資料儲存在memcache中。
說明:以這種方式來同步session,不會加大資料庫的負擔,並且安全性比用cookie大大的提高,把session放到記憶體裡面,比從檔案中讀取要快很多。但是memcache把記憶體分成很多種規格的儲存塊,有塊就有大小,這種方式也就決定了,memcache不能完全利用內存,會產生內存碎片,如果存儲塊不足,還會產生內存溢出。
4、nginx中的ip_hash技術能夠將某個ip的請求定向到同一台後端,這樣一來這個ip下的某個客戶端和某個後端就能建立起穩固的session,ip_hash是在upstream設定中定義的:
- stream nginx.example.com
- { 8.74.235:80;
- server 192.168.74.236:80 server 192.168.74.236:80 server 192.168.74.236:800 ip_hash;
- }
- server
- {
- listen 80;
- location /
- {
- proxy_pass
- http://nginx.example.com ;
- }
- }
- } _ipkip在一些情況下使用:
- 1 .nginx不是最前端的伺服器。 ip_hash要求nginx一定是最前端的伺服器,否則nginx得不到正確ip,就不能根據ip作hash。譬如使用的是squid為最前端,那麼nginx取ip時只能得到squid的伺服器ip位址,用這個位址來做分流是肯定錯亂的。 2.nginx的後端還有其它方式的負載平衡。
假如nginx後端又有其它負載平衡,將請求又透過另外的方式分流了,那麼某個客戶端的請求肯定不能定位到同一台session應用伺服器上。這麼算起來,nginx後端只能直接指向應用程式伺服器,或是再搭一個squid,然後指向應用程式伺服器。最好的方法是用 location作一次分流,將需要session的部分請求通過ip_hash分流,剩下的走其它後端去。
5、upstream_hash
為了解決ip_hash的一些問題,可以使用upstream_hash這個第三方模組,這個模組多數情況下是用作url_hash的,但是並不妨礙將它用來做session共享。沒試過真心的不懂
補充:memcached簡單的介紹
一、概念
Memcached是danga.com(營運LiveJournal的技術團隊)開發的一套分散式記憶體物件快取系統,用於在動態系統中減少資料庫負載,提升效能。
二、適用場合
1. 分散式應用。由於memcached本身是基於分散式的系統,因此特別適合大型的分散式系統。
2. 資料庫前段快取。資料庫常常是網站系統的瓶頸。資料庫的大並發量訪問,常常造成網站記憶體溢出。當然我們也可以使用Hibernate的快取機制。但memcached是基於分散式的,並可獨立於網站應用程式本身,所以更適合大型網站進行應用程式的分割。
3. 伺服器間資料共享。舉例來講,我們將網站的登入系統、查詢系統拆分為兩個應用,放在不同的伺服器上,並進行集群,那這個時候用戶登入後,登入資訊如何從登入系統伺服器同步到查詢系統伺服器呢?這時候,我們便可以使用memcached,登入系統將登入資訊快取起來,查詢系統便可以獲得登入信息,就像獲取本地資訊一樣。
三、不適用場合
那些不需要「分佈」的,不需要共享的,或者乾脆規模小到只有一台伺服器的應用,memcached不會帶來任何好處,相反還會拖慢系統效率,因為網路連線同樣需要資源
解決方案,使用memcached做為session的存儲,memcached伺服器設定在和nginx同一台linux主機上。
解決過程,
兩台apache的主機IP分別是192.168.74.235192.168.74.236
Nginx主機IP是192.168.74.131174.1317135332533393333個主機3413139353339393393393339333393333933339333333333333333型.
在192.168.74.131 安裝memcached,且啟動以一台為例192.168.74.236,安裝php及php對memcached的依賴函式庫yuminstall memcached-devel.i686 libmemcached-devel.i686 php-pecl-meacheache.i6865% save_handler= memcachesession.save_path= "tcp://192.168.74.131:11211"或(以下兩個都沒有嘗試)1.某個目錄下的.htaches ):mccache> "php_value session.save_path "tcp://IP:11211"
2.在某個應用中:
ini_set("session.save_handler", "memcache");
ini_set("session.save_handler", "memcache");ini_set("ses.save_set("ses" "tcp://IP:11211");
同時一定要把下面的;session.save_path= "/var/lib/php/session" 註解掉
同時把extension=memcache.so 打開
[root@Git ~]# memcached-tool127.0.0
[root@Git ~]# memcached-tool127.0.0 .1:11211 # Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM在236機器上加入以下的php... SESSION['TEST '])) { $_SESSION['TEST'] = time();}$_SESSION['TEST3'] = time();";print $_SESSION['TEST3'];print "
";print session_id();?>print session_id();?>然後去mcmeached執行[root@Git ~]# memcached-tool127.0.0.1:11211 # Item_Size Max_age Pages 0s 1 0 no 寫到memcached伺服器上了。 總結下:
1. 防火牆問題,許多連接區域網路伺服器失敗都是防火牆造成的
2. 依賴沒有安裝完畢,一開始使用memcached總失敗,因為我沒有安裝的擴充內容-memcacheded
以上就介紹了解決nginx負載平衡的session共享問題,包含了方面的內容,希望對PHP教程有興趣的朋友有幫助。

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP不是在消亡,而是在不斷適應和進化。 1)PHP從1994年起經歷多次版本迭代,適應新技術趨勢。 2)目前廣泛應用於電子商務、內容管理系統等領域。 3)PHP8引入JIT編譯器等功能,提升性能和現代化。 4)使用OPcache和遵循PSR-12標準可優化性能和代碼質量。

PHP的未來將通過適應新技術趨勢和引入創新特性來實現:1)適應云計算、容器化和微服務架構,支持Docker和Kubernetes;2)引入JIT編譯器和枚舉類型,提升性能和數據處理效率;3)持續優化性能和推廣最佳實踐。

在PHP中,trait適用於需要方法復用但不適合使用繼承的情況。 1)trait允許在類中復用方法,避免多重繼承複雜性。 2)使用trait時需注意方法衝突,可通過insteadof和as關鍵字解決。 3)應避免過度使用trait,保持其單一職責,以優化性能和提高代碼可維護性。

依賴注入容器(DIC)是一種管理和提供對象依賴關係的工具,用於PHP項目中。 DIC的主要好處包括:1.解耦,使組件獨立,代碼易維護和測試;2.靈活性,易替換或修改依賴關係;3.可測試性,方便注入mock對象進行單元測試。

SplFixedArray在PHP中是一種固定大小的數組,適用於需要高性能和低內存使用量的場景。 1)它在創建時需指定大小,避免動態調整帶來的開銷。 2)基於C語言數組,直接操作內存,訪問速度快。 3)適合大規模數據處理和內存敏感環境,但需謹慎使用,因其大小固定。

PHP通過$\_FILES變量處理文件上傳,確保安全性的方法包括:1.檢查上傳錯誤,2.驗證文件類型和大小,3.防止文件覆蓋,4.移動文件到永久存儲位置。

JavaScript中處理空值可以使用NullCoalescingOperator(??)和NullCoalescingAssignmentOperator(??=)。 1.??返回第一個非null或非undefined的操作數。 2.??=將變量賦值為右操作數的值,但前提是該變量為null或undefined。這些操作符簡化了代碼邏輯,提高了可讀性和性能。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

禪工作室 13.0.1
強大的PHP整合開發環境

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境