10 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:8001
测试成功,即可在浏览器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目录中的文件
[root@web02 pysession]# 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'
return HttpResponse("设置成功")
def getSession(request):
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服务器挂载
yum 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缓存