技术开发站45793.com
nginx实现反向代理功能,会话保持
发布时间:
2024年01月09日
了解nginx反向代理:
反向代理和正向代理的区别就是:正向代理是代理客户端,反向代理是代理服务器。
反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。
实验目的:
通过nginx反向代理的功能,实现负载均衡将用户的请求通过算法,分配给后端的web站点。
实验拓扑:
共开启三台虚拟机服务器
一台做nginx代理,另外两台安装http
服务器一:192.168.8.5(nginx代理)
服务器二:192.168.8.6?? (httpd)
服务器三:192.168.8.7?? (httpd)
实验步骤:
1.服务器一安装nginx修改主配置文件实现负载均衡和反向代理
2.服务器二安装httpd 修改网页为web1
3.服务器三安装httpd 修改网页为web2
4.通过真实机访问测试,每次刷新网页,将呈现不同的网页(负载均衡和反向代理实现)
开始部署服务器一:
一.源代码编译安装nginx:
安装前提软件:
yum -y install gcc gcc-c++ make libtool zlib zlib-devel pcre pcre-devel openssl openssl-devel
创建程序用户:
useradd -s /sbin/nologin nginx
将软件包通过终端软件拖拽至虚拟机中:
cd /usr/src
拖拽
解压:
tar xf nginx-goodies-nginx-sticky-module-ng-08a395c66e42.tar.gz
tar xf ngx_cache_purge-2.3.tar.gz
tar xf nginx-1.12.0.tar.gz
编译安装:
cd /usr/src/nginx-1.12.0
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx \
--with-http_stub_status_module --with-http_realip_module --with-http_ssl_module \
--with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client \
--http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fcgi \
--with-pcre --add-module=../ngx_cache_purge-2.3 --with-http_flv_module \
--add-module=../nginx-goodies-nginx-sticky-module-ng-08a395c66e42 \
&& make && make install
添加nginx为系统服务并启动:
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
创建缓存目录,给予权限(nginx可以作为缓存服务器,通过配置proxy_cache指令来实现):
mkdir -p /var/tmp/nginx/client
chown -R nginx:nginx /var/tmp/nginx
创建nginx启动脚本:
vim /etc/init.d/nginx
添加执行权限:
chmod +x /etc/init.d/nginx?
添加系统服务并启动:
chkconfig --add nginx
chkconfig nginx on
service? nginx? start
修改配置文件,配置反向代理、缓存和lb 负载均衡
注意:
(使用yum安装或源代码编译安装,主配置文件存放路径不同)
vim /usr/local/nginx/conf/nginx.conf
注意:nginx默认的负载均衡调度算法为轮询算法
开始部署服务器二:
使用yum安装httpd:
yum -y install httpd
修改网页:
vim /var/www/html/index.html
内容web1
修改主机名:
hostnamectl set-hostname web1
bash
开始部署服务器三:
使用yum安装httpd:
yum -y install httpd
修改网页:
vim /var/www/html/index.html
内容web2
修改主机名:
hostnamectl set-hostname web2
bash
使用客户端访问服务器一:
http://192.168.8.5/
继续修改服务器一的nginx主配置文件,配置会话保持,黏滞会话
?proxy_buffering on;
????proxy_temp_path /usr/local/nginx/proxy_temp;
????proxy_cache_path /usr/local/nginx/proxy_cache levels=1:2 keys_zone=my-cache:100m inactive=600m max_size=2g;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_cache my-cache;
add_header Nginx-Cache $upstream_cache_status;
proxy_cache_valid 200 304 301 302 8h;
proxy_cache_valid 404 1m;
proxy_cache_valid any 1d;
proxy_cache_key $host$uri$is_args$args;
expires 30d;
再次测试
http://192.168.8.5/
页面将会保留在web1这个页面,至此便实现了会话保持
至此本章实验目标已全部实现,完结!!!
不配置会话保持的弊端:
当某台后端服务器启用了
Session
来本地化保存用户的一些数据后,下次用户的请求如果转发给了其他后端服务器,将导致之前的Session数据无法访问;
什么是session?
?session在网络应用中称为“会话控制”,是服务器为了保存用户状态而创建的一个特殊的对象。简而言之,session就是一个对象,用于存储信息。
session是存储于服务器端的特殊对象,服务器会为每一个游览器(客户端)创建一个唯一的session。
session类似于一个map可以存放多个键值对,session以键值对的方式存储。
什么是会话保持?:
是负载均衡的一种机制,保证了客户端与服务端的交互的关联性,保证了在进行负载均衡的时候,客户端的请求能够被定位到同一台服务器。
优点:再次请求的时候不需要再此建立连接,不用再次握手
nginx
配置会话保持还有另外一种方法:
基于ip_hash(哈希算法)的会话保持
在做Nginx的负载均衡时,可以在upstream里设置ip_hash,每个请求按访问ip的hash结果分配,映射到固定某一台的服务器,当后端服务器宕机后,session会丢失,再次发起请求时,会重新固定访问另一台正常的服务器并实现会话保持。缺点就是由于同一个IP客户端都固定访问一个后端服务器,这就可能会导致负载不均衡。
讲解sticky模块:
Sticky工作原理
Sticky是nginx的一个模块,它是基于cookie的一种nginx的负载均衡解决方案,通过分发和识别cookie,来使同一个客户端的请求落在同一台服务器上,默认标识名为route
1.客户端首次发起访问请求,nginx接收后,发现请求头没有cookie,则以轮询方式将请求分发给后端服务器。
2.后端服务器处理完请求,将响应数据返回给nginx。
3.此时nginx生成带route的cookie,返回给客户端。route的值与后端服务器对应,可能是明文,也可能是md5、sha1等Hash值
4.客户端接收请求,并保存带route的cookie。
5.当客户端下一次发送请求时,会带上route,nginx根据接收到的cookie中的route值,转发给对应的后端服务器。
什么是cookie?
cookie的中文翻译是曲奇,小甜饼的意思。cookie其实就是一些数据信息,类型为“
小型文本文件
”,存储于电脑上的文本文件中。
cokkie
的用处:
??我们想象一个场景,当我们打开一个网站时,如果这个网站我们曾经登录过,那么当我们再次打开网站时,发现就不需要再次登录了,而是直接进入了首页。例如bilibili,csdn等网站。这就是基于cokkie实现的。
这是怎么做到的呢?其实就是浏览器保存了我们的cookie,里面记录了一些信息,当然,这些cookie是服务器创建后返回给浏览器的。游览器只进行了保存。
文章来源:https://blog.csdn.net/2302_77503226/article/details/135467632
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:chenni525@qq.com进行投诉反馈,一经查实,立即删除!
最新文章
Python教程
深入理解 MySQL 中的 HAVING 关键字和聚合函数
Qt之QChar编码(1)
MyBatis入门基础篇
用Python脚本实现FFmpeg批量转换
css颜色样式详解
【Linux】进程间通信——管道
MES软件的功能和操作指南是什么?如何用好MES软件?
java并发编程四 synchronized锁对象分析和变量线程线程安全分析
【typescript】记录typescript可运行的demo工程
Java高可用监控中间件
Spring整合MyBatis
阿里云ECS(CentOS镜像)安装docker
LESS mixin 生成类名 控制间距
微服务基础概念、架构图、划分图