[nginx] - 使用nginx实现反向代理,动静分离,负载均衡,session共享
反向代理概念
先说正向代理,比如要访问youtube,但是不能直接访问,只能先找个翻墙软件,通过翻墙软件才能访问youtube. 翻墙软件就叫做正向代理。
所谓的反向代理,指的是用户要访问youtube,但是youtube悄悄地把这个请求交给bilibili来做,那么bilibili就是反向代理了。
在当前教程指的就是访问nginx,但是nginx把请求交给tomcat来做。
nginx.conf
location / 标识处理所有请求
proxy_pass http://127.0.0.1:8080/; (tomcat端口), 表示把请求都交给 http://127.0.0.1:8080 来处理
重启nginx
nginx -s reload
既然能通过8080访问,为什么要通过nginx 80端口 去反向代理到tomcat呢?
因为nginx在处理静态文件的吞吐量上面比tomcat好很多,通常他们俩配合,不会把所有的请求都如本例所示交给tomcat,而是把静态请求交给nginx,动态请求,
如jsp,servlet,ssm,等请求交给tomcat,从而达到动静分离的效果.
动静分离
所谓的动静分离就是指图片,css,js之类的都交给nginx来处理,nginx处理不了的,比如jsp交给tomcat来处理.
好处是nginx处理静态内容的吞吐量很高,比tomcat高多了,这样无形中提升了性能.
修改nginx.conf实现动静分离
增加一个location
location ~\.(css|js|png|jpg)$ {
root /www/server/apache-tomcat-8.5.32/webapps/ROOT;
}
这表示所有的css,js,png,jpg访问都由nginx来做,访问地址是root后面路径
注意,这里的地址要用正斜杠 / 而不是要用反斜杠 \
负载均衡
负载均衡是指当访问量很大的时候,一个Tomcat吃不消了,这个时候就准备多个Tomcat,由Nginx按照权重来对请求进行分配,从而缓解单独一个Tomcat受到的压力
修改nginx.conf支持两个tomcat
upstream tomcat_8080_8082{
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8082 weight=2;
}
然后修改location,反向代理到上述配置
location / {
proxy_pass http://tomcat_8080_8082;
}
weight表示权重,值越大,被分配到的几率越大.最大多少?不太清楚,10以内基本OK了.
重启 nginx -s reload 就可以实现基本的负载均衡了
session共享
通过负载均衡,可以把请求分发到不同的Tomcat来缓解服务器压力,但是存在一个问题:当同一个用户第一次访问tomcat:8080并且登录成功,
而第二次访问却分配到了tomcat:8082,这里并没有记录他的登录状态,那么就会呈现未登录状态. 也就是session没有实现共享.
解决办法:
ip_hash,通过ip地址标记用户,如果多次请求都是从同一个ip来的,那么就都分配到同一个tomcat.
这样就不会出现负载均衡的session问题了,处理手段也很简单.
upstream tomcat_8080_8082{
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8082 weight=2;
ip_hash;
}
这种方案不是很完美,1.大量请求来自某个局域网,就没有负载均衡了.2.如果tomcat:8080挂了,那么此时nginx只能把请求交给tomcat:8082,但是这里却没有记录session.
解决办法Ⅱ
redis+tomcat-session-manager
第二种办法是用Redis来存取session.Redis这个独立的HashMap,存放session非常合适.当tomcat:8080需要保存session时,放入Redis,取的时候也从Redis取.
1.用户提交账号密码后被分配到tomcat:8080,登录信息被存放到Redis中.
2.当用户第二次访问时,被分配到了tomcat:8082.
3.此时tomcat:8082就会从Redis获取相关信息,如果有对应信息,就会呈现登录状态了.
在两个tomcat的配置文件 tomcat/conf/context.xml 中需要加入:
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="127.0.0.1"
port="6379"
database="0"
maxInactiveInterval="60" />
之后重启两个tomcat
完成配置.
[nginx] - 使用nginx实现反向代理,动静分离,负载均衡,session共享的更多相关文章
- nginx作反向代理,实现负载均衡
nginx作反向代理,实现负载均衡按正常的方法安装好 ngixn,方法可参考http://www.cnblogs.com/lin3615/p/4376224.html其中作了反向代理的服务器的配置如下 ...
- Nginx反向代理实现Tomcat负载均衡
这篇短文主要介绍Tomcat的集群和用Nginx反向代理实现Tomcat负载均衡. 1.首先需要对一些知识点进行扫盲(对自己进行扫盲,囧): 集群(Cluster) 简单来说就是用N台服务器构成一个松 ...
- Nginx 部署、反向代理配置、负载均衡
Nginx 部署.反向代理配置.负载均衡 最近我们的angular项目部署,我们采用的的是Nginx,下面对Nginx做一个简单的介绍. 为什么选择Nginx 轻:相比于Apache,同样的web服务 ...
- 【nginx+tomcat集群】Nginx1.12.2+Tomcat7集群+负载均衡+Session共享
今天想着将项目优化一下,就想的实现集群分布,在本机测试:利用nginx+tomcat实现 通过上一篇博客(http://www.cnblogs.com/qlqwjy/p/8535235.html),N ...
- linux+apache+nginx实现,反向代理动静分离
在我们开发的过程中,一定会遇到,负载均衡方面的问题.下面我们,做一个小例子:使用nginx+apache实现反向代理,动静分离. 这里apache.php.nginx的安装就不做赘述了,不懂的朋友可以 ...
- Nginx动静分离负载均衡
前期准备 使用Debian环境.安装Nginx(默认安装),一个web项目,安装tomcat(默认安装)等. Nginx.conf配置 # 定义Nginx运行的用户 和 用户组 如果对应服务器暴露在外 ...
- nginx 反向代理 和lvs负载均衡
nginx反向代理:用户请求nginx代理服务器然后代理服务器将用户请求转为服务器再由nginx代理服务器将服务器的响应反应给用户. lvs负载均衡:用户请求nginx代理服务器然后代理服务器将用户请 ...
- nginx+tomcat反向代理下使用tomcat-redis-session-manager进行session共享中值得注意的一个问题
公司目前项目使用nginx反向代理+多个tomcat进行负载均衡,之前使用ip_hash策略进行session控制.近期有考虑不再使用ip_hash策略,所以需要进行session共享. 根据项目实际 ...
- nginx+apache动静分离/负载均衡
[主从] [Mysql-Master] log-bin=mysql-bin server-id = MariaDB [(none)]> grant replication slave on *. ...
随机推荐
- 如何重置Sitecore CMS中的管理员密码
在Sitecore项目上工作时,有时管理员凭据会丢失或损坏.在这些情况下,重新获得快速访问权限以便不中断开发非常重要. 对Core数据库运行以下查询,您将能够admin/b再次使用以下命令登录Site ...
- RootConfig类
package com.ssm.yjblogs.config; import java.util.Properties; import javax.sql.DataSource; import org ...
- Java将对象保存到文件中/从文件中读取对象
1.保存对象到文件中 Java语言只能将实现了Serializable接口的类的对象保存到文件中,利用如下方法即可: public static void writeObjectToFile(Obje ...
- Apache+Tomcat+Memcached实现会话保持
会话保持的三种方式 Session sticky会话绑定:通过在前端调度器的配置中实现统一session发送至同一后发端服务器 Session cluster会话集群:通过配置Tomcat保持所有To ...
- java踩坑
1. java判断两个字符串是否相等用equals 2. java只传递指针遇到的坑: 1 import java.util.*; 2 3 public class mapTest { 4 publi ...
- Java Socket NIO入门
Java Socket.SocketServer的读写.连接事件监听,都是阻塞式的.Java提供了另外一种非阻塞式读写.连接事件监听方式——NIO.本文简单的介绍一个NIO Socket入门例子,原理 ...
- (Review cs231n) Gradient Calculation and Backward
---恢复内容开始--- 昨日之补充web. 求解下图的梯度的流动,反向更新参数的过程,表示为 输入与损失梯度的关系,借助链式法则,当前输入与损失之间的梯度关系为局部梯度乘以后一层的梯度. ---恢复 ...
- window下安装cross-env解决NODE_ENV ts-node 不是内部或外部命令,也不是可运行的程序 或批处理文件 问题
window下安装cross-env解决NODE_ENV ts-node 不是内部或外部命令,也不是可运行的程序 或批处理文件 问题 在git bash上启动无法进行调试,采用cross-env后可以 ...
- [资讯] NFC有什么作用。小米手机3NFC解读
在近几年的智能手机市场,NFC成了Android高端手机产品的标准配置,无论是Android还是Windows Phone阵营,有越来越多的厂商也开始为自己的产品加入NFC功能.而小米最新的旗舰产品— ...
- Python+OpenCV图像处理(四)—— 色彩空间
一.色彩空间的转换 代码如下: #色彩空间转换 import cv2 as cv def color_space_demo(img): gray = cv.cvtColor(img, cv.COLOR ...