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访问

 

知识储备: 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目录中的文件
[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

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服务器挂载

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缓存

posted @ 2021-10-30 11:28  甜甜de微笑  阅读(615)  评论(0)    收藏  举报