nginx之會話保持
nginx之會話保持:使用檔案快取
web伺服器產生的session放在/tmp下
web伺服器掛載到nfs下的/session
一、伺服器準備
主機 | ip | 身份 |
---|---|---|
lb01 | 192.168.15.5 | 負載均衡 |
web01 | 192.168.15.7 | web伺服器 |
web02 | 192.168.15.8 | web伺服器 |
web03 | 192.168.15.9 | web伺服器 |
nfs | 192.168.15.31 | 檔案伺服器 |
二、web伺服器配置
1.建立一個django專案
[root@web02 opt]# cd /opt
[root@web02 opt]# django-admin startproject pysession
注意:三個web伺服器的/opt/pysession/pysession/settings.py 中的SECRET_KEY要一致
2.建立一個應用
[root@web02 opt]# cd pysession/
[root@web02 pysession]# django-admin startapp application
3.修改配置檔案
[root@web02 pysession]# vim pysession/settings.py
ALLOWED_HOSTS = ['*']
DATABASES = {}
4.測試
[root@web02 pysession]# python3 manage.py runserver 0.0.0.0:80001
測試成功,即可在瀏覽器192.168.15.8:8001訪問
[root@web02 pysession]# cd/opt/pysession
[root@web02 pysession]# vim pysession/settings.py
# 設定session儲存方式,這裡指定使用檔案的方式儲存session
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
# 指定session儲存的路徑
SESSION_FILE_PATH = '/tmp/'
#刪除tmp目錄中的檔案
rm -rf /tmp/*
6.使用session
配置檢視
[root@web02 pysession]# cd /opt/pysession
[root@web02 pysession]# >application/views.py
[root@web02 pysession]# vim application/views.py
from django.shortcuts import render, HttpResponse
def create(request):
request.session['code'] = 'web02' #設定session
return HttpResponse("設定成功")
def getSession(request): #獲取session
code = request.session.get('code')
return HttpResponse(f"獲取SESSION:{code}")
配置路由
[root@web02 pysession]# cd /opt/pysession
[root@web02 pysession]# >pysession/urls.py
[root@web02 pysession]# vim pysession/urls.py
from django.contrib import admin
from django.urls import path
from django.conf.urls import url
from application import views
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^create/', views.create),
url(r'^getSession/', views.getSession),
]
7.測試
python3 manage.py runserver 0.0.0.0:8001
測試成功,可訪問
8.安裝uwsgi
yum install python3 libxml* python-devel gcc* pcre-devel openssl-devel python3-devel -y #先裝這個,避免踩坑
yum install python3 -y
pip3 install uwsgi
pip3 install django==2.2.2
[root@web02 pysession]# cd /opt/pysession
[root@web02 pysession]# vim myuwsgi.ini
[uwsgi]
# 埠號
socket = :8001
# 指定專案的目錄
chdir = /opt/pysession
# wsgi檔案路徑
wsgi-file = pysession/wsgi.py
# 模組wsgi路徑
module = pysession.wsgi
# 是否開啟master程序
master = true
# 工作程序的最大數目
processes = 4
# 結束後是否清理檔案
vacuum = true
10.啟動uwsgi
uwsgi -d --ini myuwsgi.ini
11.配置Nginx連線uwsgi
vim /etc/nginx/conf.d/pysession.conf
server {
# 監聽埠
listen 80;
# 域名
server_name session.test.com;
# 配置路徑
location / {
# 載入nginx帶來uwsgi的配置項
include uwsgi_params;
# 指定uwsgi的訪問路徑
uwsgi_pass 127.0.0.1:8001;
# 連線uwsgi的超時時間
uwsgi_read_timeout 2;
# 自定義uwsgi代理專案的路徑及配置項
uwsgi_param UWSGI_SCRIPT pysession.wsgi;
# 指定python專案的路徑
uwsgi_param UWSGI_CHDIR /opt/pysession;
# 索引檔案
index index.html index.htm;
# 客戶端上傳檔案的最大值
client_max_body_size 35m;
}
}
12.重啟或者啟動nginx
systemctl restart nginx
13.修改Windows的hosts檔案
三、lb01伺服器配置
1.修改配置
[root@lb01 conf.d]# vim /etc/nginx/conf.d/pysession.conf
upstream session {
server 172.16.1.7;
server 172.16.1.8;
}
server {
server_name session.test.com;
listen 80;
location / {
proxy_pass http://session;
include proxy_params;
}
}
2.重啟或啟動nginx
systemctl restart nginx
四、nfs伺服器配置
在負載均衡中,操作檔案不同步(會話不保持)
1.添加掛載點
[root@nfs /]# vim /etc/exports
/session 172.16.1.0/20(rw,all_squash,sync,anonuid=996,anongid=996)
2.建立目錄,修改許可權
[root@nfs /]# mkdir /session
[root@nfs /]# chown www.www /session/
3.開啟nfs
[root@nfs /]# systemctl restart nfs-server rpcbind
4.檢視掛載點設定是否成功
[root@nfs /]# showmount -e
/session 172.16.1.0/20
五、web伺服器掛載
yun install nfs-utils rpcbind
[root@web02 ~]# mount -t nfs 172.16.1.31:/session /tmp/
[root@web01 ~]# mount -t nfs 172.16.1.31:/session /tmp/
6、測試
設定session:
http://session.test.com/create/
獲取session:
知識儲備:
1.什麼是會話保持
我們在訪問網站的時候,進行登陸以後,伺服器上回生成一個session,
然後伺服器會攜帶著session_id返回給瀏覽器記錄一個cookie值,
當第二次訪問時,cookie會來伺服器上與session進行對比,如果對比成功,則不需要重新登入
在使用負載均衡的時候會遇到會話保持的問題,可通過如下方式進行解決。
1.使用nginx的ip_hash,根據客戶端的IP,將請求分配到對應的IP上
2.基於服務端的session會話共享(NFS,MySQL,memcache,redis,file)
2、session共享的方法
1.把多臺後端伺服器session檔案目錄掛載到NFS同一目錄
2.通過程式將session儲存到mysql資料庫
3.通過程式將session儲存到redis快取