1. 程式人生 > 其它 >nginx之會話保持

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訪問

知識儲備: session使用來儲存資料。

5.設定session

[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

9.配置uwsgi檔案

[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快取