nginx+tomcat 内网实现一致性hash 负载均衡衡 ip_hash 不生效

3109人阅读
Nginx(4)
& & & & &Nginx占有内存少,并发能力强,事实上Nginx的并发能力确实在同类型的网页伺服器中表现较好.目前中国大陆使用Nginx网站用户有:新浪,网易,腾讯等.
& & & &&本文主要是基于Nginx搭建tomcat集群.
& & & & &Win8.1,JDK 1.6 ,&Nginx1.9.3
Tomcat 7.0.63(两个tomcat服务器)
& & & & & & & & & &&
一、Nginx之反向代理
1、Nginx配置:
upstreamlocahost{
server192.168.24.17:8080
server192.168.24.43:8080
& & & & & & & & & & & & &&
& & & & & & & & & & & &&
& & & & &&反向代理:对于客户端而言,它就像是演示服务器,并且客户端不需要进行任何特别的设置.客户端反向代理的命名空间中的内容发送普通请求,接着反向代理将判断向何处转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样.前面博客:里面介绍了.
二、Nginx之负载均衡
a.Nginx配置
upstream192.168.24.17{
server192.168.24.17:8080
server192.168.24.43:8080
server_name
192.168.24.17;
#charset koi8-r;
#access_log
logs/host.access.
location / {
index.html index.
proxy_pass
http://192.168.24.17;
proxy_connect_timeout1;
proxy_send_timeout30;
proxy_read_timeout60;
error_page
500 502 503 504
location = /50x.html {
b.配置说明:
a.Weight:权重,值越大,命中率越高
b.上面标红的地方:192.168.24.17,这三处要一致才能实现负载均衡的效果.
c.实验效果:
& & & &说明:这个IP以及端口号是nginx设置的名称以及端口号.访问后能分别调用到后端不同的服务器.实现负载均衡效果.进一步可以看出本实例使用的是轮询的方式,也就是负载均衡默认的方式.
1).upstream负载均衡模块说明:
&&&&&&&&& upstream是Nginx的HTTP
Upstream模块,这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡.在上面的设定中,听过upstream指令指定了一个负载均衡的名称为192.168.24.17.这个名称可以任意指定,在后面需要用到的地方直接调用即可.
2).updtream支持的负载均衡算法
Nginx的负载均衡模块目前支持4种调度算法.
轮询(默认).每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动提出,使用户访问不受影响.Weight指定轮询权值,Weight值越大,分配到的访问几率越高,用于后端每个服务器性能不均的情况下.
ip_hash&每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题.fair这是比上面两个更加智能的负载均衡算法.这种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配.Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块.url_hash此方法按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率.Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx的hash软件包.
3).upstream支持的状态参数
在HTTP Upstream模块汇总,可以通过server指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态.常用的状态有:
down,表示当前的server暂时不参与负载均衡.backup,预留的备份机器.当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这才记起的眼里最轻.max_fails,允许请求失败的次数,默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误.fail_timeout,在经历了max_fails次失败后,暂停服务时间.max_fails可以和fail_timeout一起使用.
注:当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能使weight和backup.
&&&&&&&&通过这种方式,当我们的网站访问量越来越大时,我们就能承受更多的压力,并且能够动态的添加服务器.配置负载均衡很简单,那么如何实现多台服务器之间session的共享呢?下篇继续介绍.
注意:nginx放到中文目录下,启动时会有问题.
打印出来的日志:
&&&&&&&&[emerg] : CreateFile()&E:\02 Java内容学习汇总\Nginx\nginx-1.4.7/conf/nginx.conf&failed
(1113: No mapping for the Unicode character exists in the targetmulti-byte code page)
一共有1位博乐进行推荐
通过这种方式,当我们的网站访问量越来越大时,我们就能承受更多的压力,并且能够动态的添加服务器.配置负载均衡很简单,那么如何实现多台服务器之间session的共享呢?期待腾腾的下一篇博文`(*∩_∩*)′
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:579890次
积分:15863
积分:15863
排名:第503名
原创:209篇
评论:5281条
阅读:14207
阅读:14122
阅读:60483
阅读:11446
文章:10篇
阅读:35124
文章:12篇
阅读:19315
(1)(1)(1)(1)(13)(10)(4)(5)(4)(4)(4)(4)(4)(3)(4)(3)(1)(4)(4)(4)(4)(4)(4)(4)(4)(3)(3)(1)(5)(8)(4)(5)(4)(3)(7)(9)(17)(6)(4)(7)(12)(9)(2)(1)(6)温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
本文转载自yunsi
apply plugin: 'java'apply plugin: 'maven'apply plugin: 'signing'&group = 'com.orangefunction'version = '2.0.0'&repositories {& mavenCentral()}&compileJava {& sourceCompatibility = 1.7& targetCompatibility = 1.7}&dependencies {& compile group: 'org.apache.tomcat', name: 'tomcat-catalina', version: '7.0.27'& compile group: 'redis.clients', name: 'jedis', version: '2.5.2'& compile group: 'mons', name: 'commons-pool2', version: '2.2'& //compile group: 'commons-codec', name: 'commons-codec', version: '1.9'&& testCompile group: 'junit', name: 'junit', version: '4.+'& testCompile 'org.hamcrest:hamcrest-core:1.3'& testCompile 'org.hamcrest:hamcrest-library:1.3'& testCompile 'org.mockito:mockito-all:1.9.5'& testCompile group: 'org.apache.tomcat', name: 'tomcat-coyote', version: '7.0.27'}&task javadocJar(type: Jar, dependsOn: javadoc) {& classifier = 'javadoc'& from 'build/docs/javadoc'}&task sourcesJar(type: Jar) {& from sourceSets.main.allSource& classifier = 'sources'}&artifacts {& archives jar&& archives javadocJar& archives sourcesJar}&//signing {//& sign configurations.archives//}&task copyJars(type: Copy) {& from configurations.runtime& into 'dist'& }&uploadArchives {& repositories {&&& mavenDeployer {&&&&& beforeDeployment { MavenDeployment deployment -& signing.signPom(deployment) }&&&&&& //repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") {&&&&& //& authentication(userName: sonatypeUsername, password: sonatypePassword)&&&&& //}&&&&& //repository(url: "https://oss.sonatype.org/content/repositories/snapshots") {&&&&& //& authentication(userName: sonatypeUsername, password: sonatypePassword)&&&& &//}&&&&&& pom.project {&&&&&&& name 'tomcat-redis-session-manager'&&&&&&& packaging 'jar'&&&&&&& description 'Tomcat Redis Session Manager is a Tomcat extension to store sessions in Redis'&&&&&&& url '/jcoleman/tomcat-redis-session-manager'&&&&&&&& issueManagement {&&&&&&&&& url ':jcoleman/tomcat-redis-session-manager/issues'&&&&&&&&& system 'GitHub Issues'&&&&&&& }&&&&&&&& scm {&&&&&&&&& url ':jcoleman/tomcat-redis-session-manager'&&&&&&&&& connection 'scm:git:git:///jcoleman/tomcat-redis-session-manager.git'&&&&&&&&& developerConnection 'scm:git::jcoleman/tomcat-redis-session-manager.git'&&&&&&& }&&&&&&&& licenses {&&&&&&&&& license {&&&&&&&&&&& name 'MIT'&&&&&&&&&&& url 'http://opensource.org/licenses/MIT'&&&&&&&&&&& distribution 'repo'&&&&&&&&& }&&&&&&& }&&&&&&&& developers {&&&&&&&&& developer {&&&&&&&&&&& id 'jcoleman'&&&&&&&&&&& name 'James Coleman'&&&&&&&&&&& email ''&&&& &&&&&&&url '/jcoleman'&&&&&&&&& }&&&&&&& }&&&&& }&&& }& }
?执行gradle命令构建源码,编译输出tomcat-redis-session-manager-master 及依赖jar包。
下载&包,解压即可运行。比如我将zip包解压到/root/ gradle-2.11目录,执行以下命令生成jar包。
[root@netron
tomcat-redis-session-manager-master]# /root/gradle-2.11/bin/gradle build -x
test& copyJars
[root@netron
tomcat-redis-session-manager-master]# ls dist/ -l
commons-pool2-2.2.jar ##需要拷贝到tomcat lib目录。
jedis-2.5.2.jar& ##需要拷贝到tomcat lib目录。
tomcat-annotations-api-7.0.27.jar
tomcat-api-7.0.27.jar
tomcat-catalina-7.0.27.jar
tomcat-juli-7.0.27.jar
tomcat-servlet-api-7.0.27.jar
tomcat-util-7.0.27.jar
[root@netron
tomcat-redis-session-manager-master]# ls build/libs/ -l
tomcat-redis-session-manager-master-2.0.0.jar
&&##需要拷贝到tomcat lib目录。
tomcat-redis-session-manager-master-2.0.0-javadoc.jar
tomcat-redis-session-manager-master-2.0.0-sources.jar
三、tomcat
session manager 配置
修改配置使用
tomcat-redis-session-manager-master 作为 tomcat&session 管理器
1、 分别将第三步生成的:tomcat-redis-session-manager-master-2.0.0.jar
及dist中的相应jar包覆盖到 tomcat 安装目录的 lib 文件夹。注意:全部放进去tomcat启动报错!!
2、分别修改2台 tomcat 的 context.xml 文件,使
tomcat-redis-session-manager-master 作为session管理器,同时指定redis地址和端口。
context.xml 增加以下配置:
&&&&& &Valve
className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve"
&&&&& &Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
&&&&&&&&&& host="localhost"& ##redis服务器的地址
&&&&&&&&&& port="6379"
&&&&&&&&&& database="0"
&&&&&&&&&& maxInactiveInterval="60"
&/Context&
四、测试页面
在webapp中建立一个test文件夹,在文件夹中建立index.jsp页面,并且建立来模拟一个应用。
index.jsp页面内容如下:
1 &#哪台服务器标示,随意写。
language="java"%&
&&&&&&& &h1&&font
color="red"&Session serviced by tomcat&/font&&/h1&
&&&&&&& &table aligh="center"
border="1"&
&&&&&&&&&&&&&&& &tr&
&&&&&&&&&&&&&&&&&&&&&&& &td&Session
&&&&&&&&&&&&&&&&&&&&&&&
&td&&%=session.getId() %&&/td&
&&&&&&&&&&&&&&&&&&&&&&& &%
session.setAttribute("abc","abc");%&
&&&&&&&&&&&&&&& &/tr&
&&&&&&&&&&&&&&& &tr&
&&&&&&&&&&&&&&&&&&&&&&& &td&Created
&&&&&&&&&&&&&&&&&&&&&&& &td&&%=
session.getCreationTime() %&&/td&
&&&&&&&&&&&&&&& &/tr&
&&&&&&& &/table&
测试时将两台tomcat都启动,访问以下index.jsp页面出现一个session ID,关闭其中一台tomcat,如果session保持一致就说明成功了。
五、nginx代理配置
upstream tomcat { &# 负载均衡站点的名称为tomcat,可以自己取
&&& ip_# 可选,根据来源IP方式选择web服务器,省略的话按默认的轮循方式选择web服务器
&&&&& &&server 192.168.0.101:8080;&& &# web服务器的IP地址及tomcat发布端口
&&&&&&& server 192.168.0.101:8080;
&&& listen&&&&&&
80;&&&&&&&&&&&&&&&&&& # 站点侦听端口80
&&& server_name&
&&&&&&&&&&& # 站点名称
&&& location / {
&&&&&&& index&
index.jsp index.
&&&&&&& proxy_pass http://tomcat/&&&&& # 负载均衡指向的发布服务tomcat
六、启动tomcat测试
启动所有的tomcat,访问测试页;首先关闭访问到的tomcat服务,然后刷新页面查看session ID是否改变,不变说明会话保持成功了。
阅读(123)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'Nginx+Tomcat实现负载均衡、Redis实现Tomcat session会话共享',
blogAbstract:'此文档来源于/lengfo/p/4260363.html,在其指导下做出,我只是在后续做出了部分补充。\n\n一、前言\n\nnginx ',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:8,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:1,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}为后端web服务器(,nginx,,weblogic)等做反向代理
&&& 几台后端web服务器需要考虑文件共享,共享,session共享问题.文件共享可以使用nfs,共享存储(fc,ip存储都行)+redhat GFS集群文件系统,rsync+inotify文件同步等.小规模的集群中使用更多的是nfs.对于内容管理系统,单台进行发布信息,向多台同步使用rsync+inotify就是个不错的选择.&&& 小规模集群,单台高性能(如志强双四核,32/64/128G内存)即可,大规模集群可能要考虑数据库集群了,可以使用mysql官方提供的集群软件,也可以使用keepalived+lvs读写分离做Mysql集群.&&& session共享问题是一个大问题,如果nginx采用ip_hash的轮询方法,每个ip在一定时间内会被固定的后端服务器,这样我们不用解决session共享问题.反之,一个ip的请求被轮询分发到多台服务器上,就要解决session共享的问题,可以使用nfs共享session,把session写入mysql或者memcache等方法,当机器规模比较大时,一般使用把session写入memcache里面.
&& 后端的web服务器如何配置我们这里就不讨论了,后端服务器可能是apache,nginx,tomcat,lighthttp等,前端不关心后端到底是什么.首先新建一个proxy.conf文件,方便后面我们进行调用(配置多个集群的话,把公共参数写到一个文件,然后继续是不错的方法)vi /usr/local/nginx/conf/proxy.confproxy_proxy_set_header Host $proxy_set_header X-Real-IP $remote_proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_client_body_buffer_size 90;proxy_connect_timeout 90;proxy_read_timeout 90;proxy_buffer_size 4k;proxy_buffers 4 32k;proxy_busy_buffers_size 64k;proxy_temp_file_write_size 64
我们这里讨论nginx的两种负载均衡方式 轮询加权(也可以不加权,就是1:1负载)和ip_hash(同一ip会被分配给固定的后端服务器,解决session问题)这个配置文件,我们可以写到nginx.conf里面(如果只有一个web集群),如果有多个web集群,最好写到vhosts里面,以虚拟主机的方式,这里我写到nginx.conf里面第一种配置:加权轮询,按服务器的性能给予权重,本例是1:2分配&utream lb {
&&&&&&&&&&&&&&& server 192.168.196.130 weight=1 fail_timeout=20s;&&&&&&&&&&&&&&& server 192.168.196.132 weight=2 fail_timeout=20s;&}
&server {&&&&&&&&&&&&&&& listen 80;&&&&&&&&&&&&&&& server_ ;&&index index.html index.htm index.&&location / {&&&&&&&&&&&&&&&&&&&&&&& proxy_pass http://&&&proxy_next_upstream http_500 http_502 http_503 error timeout invalid_&&&include proxy.&&&&&&&&&&&&&&& }&}
第二种配置:ip_hash轮询方法,不可给服务器加权重
&upstream lb {
&&&&&&&&&&&&&&& server 192.168.196.130 fail_timeout=20s;&&&&&&&&&&&&&&& server 192.168.196.132 fail_timeout=20s;&&ip_&}
&server {&&&&&&&&&&&&&&& listen 80;&&&&&&&&&&&&&&& server_ ;&&index index.html index.htm index.&&location / {&&&&&&&&&&&&&&&&&&&&&&& proxy_pass http://&&&proxy_next_upstream http_500 http_502 http_503 error timeout invalid_&&&include proxy.&&&&&&&&&&&&&&& }&}
方法二 nginx负载均衡基于ip_hash实现session粘帖
1、轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。&
upstream backserver {server 192.168.0.14;server 192.168.0.15;}2、指定权重指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。&
upstream backserver {server 192.168.0.14 weight=10;server 192.168.0.15 weight=10;}3、IP绑定 ip_hash每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。&
upstream backserver {ip_server 192.168.0.14:88;server 192.168.0.15:80;}4、fair(第三方)按后端服务器的响应时间来分配请求,响应时间短的优先分配。&
upstream backserver {server server1;server server2;}5、url_hash(第三方)按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。&
upstream backserver {server squid1:3128;server squid2:3128;hash $_hash_method crc32;}在需要使用负载均衡的server中增加&
proxy_pass http://backserver/;upstream backserver{ip_server 127.0.0.1:9090 (down 表示单前的server暂时不参与负载)server 127.0.0.1:8080 weight=2; (weight 默认为1.weight越大,负载的权重就越大)server 127.0.0.1:6060;server 127.0.0.1:7070 (其它所有的非backup机器down或者忙的时候,请求backup机器)}max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误fail_timeout:max_fails次失败后,暂停的时间
阅读(...) 评论() &11227人阅读
【Java综合】(34)
一、&&&&&& 工具
  nginx-1.8.0
  apache-tomcat-6.0.33
二、&&& 目标
  实现高性能负载均衡的Tomcat集群:
三、&&& 步骤
  1、首先下载Nginx,要下载稳定版:
  2、然后解压两个Tomcat,分别命名为apache-tomcat-6.0.33-1和apache-tomcat-6.0.33-2:
  3、然后修改这两个Tomcat的启动端口,分别为1,下面以修改第一台Tomcat为例,打开Tomcat的conf目录下的server.xml:
  共需修改3处端口:
  当然第二台Tomcat也一样,如下图:
  4、然后启动两个Tomcat,并访问,看是否正常:
  5、然后修改上面两个Tomcat的默认页面(为了区分下面到底访问的是那一台Tomcat,随便改一下即可):
  改完以后,进行访问,如下图:
  6、OK,现在我们可以开始配置Nginx来实现负载均衡了,其实非常的简单,只需要配置好Nginx的配置文件即可:
  配置如下(这里只进行了简单的配置,实际生产环境可以进行更详细完善配置):
worker_processes
1;#工作进程的个数,一般与计算机的cpu核数一致
worker_connections
1024;#单个进程最大连接数(最大连接数=连接数*进程数)
mime. #文件扩展名与文件类型映射表
default_type
application/octet-#默认文件类型
#开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
keepalive_timeout
65; #长连接超时时间,单位是秒
#启用Gizp压缩
#服务器的集群
#服务器集群名字
127.0.0.1:18080
weight=1;#服务器配置
weight是权重的意思,权重越大,分配的概率越大。
127.0.0.1:28080
#当前的Nginx的配置
80;#监听80端口,可以改成其他端口
server_############## 当前服务的域名
location / {
error_page
500 502 503 504
location = /50x.html {
  核心配置如下:
  到此配置完成,下面开始演示负载均衡。
  7、首先,我们启动Nginx:
  8、然后我们即可输入:localhost/index.jsp查看运行状况了
  第一次访问,发现访问的是Tomcat2上的程序:
  然后刷新,访问的还是Tomcat2上的程序:
  再刷新,发现变为了Tomcat1上的程序:
  再刷新,发现又变为了Tomcat2上的程序:
  到此,我们利用Nginx已经实现了负载均衡的Tomcat集群。我们不断的刷新,发现访问Tomcat2的概率大概是Tomcat1的2倍,这是因为我们在Nginx中配置的两台Tomcat的权重起的作用,如下图:
四、&&& 总结
  谁能想到实现一个高性能的负载均衡集群会如此简单。Nginx的功能如此强大,配置却如此简单,我们还有什么理由拒绝它呢?这比我们动不动就十多万至几十万人民币的F5 BIG-IP、NetScaler等硬件负载均衡交换机廉价了不知多少。此外,大家别忘了Nginx不仅仅是一个反向代理服务器,它本身也可以托管网站,作为Web服务器,进行Http服务处理。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:540091次
积分:8526
积分:8526
排名:第1742名
原创:158篇
转载:20篇
评论:2028条java(22)
Nginx 反向代理初印象
Nginx (“engine x”) 是一个高性能的HTTP和反向代理 服务器,也是一个IMAP/POP3/SMTP服务器。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:京东、新浪、网易、腾讯、淘宝等。
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
为什么要用Nginx
我个人觉得这个很不错。在master管理进程与worker工作进程的分离设计,使的Nginx具有热部署的功能,那么在7×24小时不间断服务的前提下,升级Nginx的可执行文件。也可以在不停止服务的情况下修改配置文件,更换日志文件等功能。
2、可以高并发连接
这是一个很重要的一个特性!在这一个 互联网 快速发展, 互联网 用户数量不断增加,一些大公司、网站都需要面对高并发请求,如果有一个能够在峰值顶住10万以上并发请求的Server,肯定会得到大家的青睐。理论上,Nginx支持的并发连接上限取决于你的内存,10万远未封顶。
3、低的内存消耗
在一般的情况下,10000个非活跃的HTTP Keep-Alive 连接在Nginx中仅消耗2.5M的内存,这也是Nginx支持高并发连接的基础。
4、处理响应请求很快
在正常的情况下,单次请求会得到更快的响应。在高峰期,Nginx可以比其他的Web服务器更快的响应请求。
5、具有很高的可靠性
Nginx是一个高可靠性的Web服务器,这也是我们为什么选择Nginx的基本条件,现在很多的网站都在使用Nginx,足以说明Nginx的可靠性。高可靠性来自其核心框架代码的优秀设计、模块设计的简单性;并且这些模块都非常的稳定。
代理和反向代理到底有什么区别
代理服务器通常分为两类,即转发代理(forward proxy)服务器和反向代理(reverse proxy)服务器。转发代理服务器又通常简称为代理服务器,我们常提到的代理服务器就指的是转发代理服务器。
转发代理服务器
普通的转发代理服务器是客户端与原始服务器之间的一个中间服务器。为了从原始服务器获取内容,客户端发送请求到代理服务器,然后代理服务器从原始服务器中获取内容再返回给客户端。客户端必须专门地配置转发代理来访问其他站点,如在浏览器中配置代理服务器地址及端口号等。
转发代理服务器的一个典型应用就是为处于防火墙后的内部客户端提供访问外部Internet网,比如校园网用户通过代理访问国外网站,公司内网用户通过公司的统一代理访问外部Internet网站等。转发代理服务器也能够使用缓存来缓解原始服务器负载,提供响应速度。
反向代理服务器
而反向代理服务器则相反,在客户端来看它就像一个普通的Web服务器。客户端不要做任何特殊的配置。客户端发送普通的请求来获取反向代理所属空间的内容。反向代理决定将这些请求发往何处,然后就好像它本身就是原始服务器一样将请求内容返回。
反向代理服务器的一个典型应用就是为处于防火墙后的服务器提供外部Internet用户的访问。反向代理能够用于在多个后端服务器提供负载均衡,或者为较慢的后端服务器提供缓存。此外,反向代理还能够简单地将多个服务器映射到同一个URL空间。
两者的相同点在于都是用户和服务器之间的中介,完成用户请求和结果的转发。主要的不同在于:
1.转发代理的内部是客户端,而反向代理的内部是服务器。即内网的客户端通过转发代理服务器访问外部网络,而外部的用户通过反向代理访问内部的服务器。
2.转发代理通常接受客户端发送的任何请求,而反向代理通常只接受到指定服务器的请求。如校园网内部用户可以通过转发代理访问国外的任何站点(如果不加限制的话),而只有特定的请求才发往反向代理,然后又反向代理发往内部服务器。
Nginx安装与配置
1.首先访问Nginx官网
下载安装包:
2.解压到相应的目录,比如我是d盘 然后修改目录名字为nginx,进入nginx目录 双击nginx.exe 来启动nginx
通过查看进程来查看Nginx是否启动成功,可以看到Nginx已经启动(为什么有几个,我也不清楚~_~)
3.此时 直接在浏览器地址栏输入:localhost 便能看到 欢迎页面,说明你虚拟主机已经搭建好了
Nginx+Tomcat 负载均衡
通过上面的安装与配置,Nginx就算是可以运行了,但是如何与Tomcat结合,实现负载均衡呢?既然要实现负载均衡,那肯定不是一个服务器,这里说说的服务器是我们自己配置的Tomcat服务器。如何在同一台电脑上配置多个服务器,在我的另外一篇博客中有说明,不清楚的可以转到这里查看[ 一台机器上同时开启多个Tomcat服务器] ()
1.配置好Tomcat服务器之后,要实现通过Nginx来反向代理,那么此时就需要修改Nginx的配置文件,进去到Nginx目录,找到conf下的nginx.conf文件,用记事本打开。
worker_processes
logs/error.log
logs/nginx.
worker_connections
default_type
application/octet-
access_log
logs/access.
client_header_timeout
client_body_timeout
send_timeout
client_header_buffer_size
large_client_header_buffers
tcp_nopush
tcp_nodelay
upstream localhost{
server localhost:8080;
server localhost:8088;
server_name
location / {
proxy_connect_timeout 3;
proxy_send_timeout 30;
proxy_read_timeout 30;
proxy_pass http://localhost;
需要设置的地方有:
tomcat服务器端口号server localhost:8080; server localhost:8088;这两个端口号在有讲到。
修改完配置文件后需要通过重新加载配置问来来使其生效:
nginx -s reload 是直接加载nginx.conf文件,并不检测nginx.conf文件是否有错误。
nginx -t 则会检查nginx.conf文件是否有错,并会现实相关错误信息,所以建议用此命令。
最终实现结果
在浏览器中输入localhost,结果为:
刷新几次后,可能会切换到令一个服务器,这样就实现了负载均衡。
可能遇到的问题:
由于端口冲突,当我们在Nginx配置文件中默认设置listen 80端口时,可能无法实现反向代理的功能,也就是我们在浏览器中输入localhost的时候无法跳转到Tomcat的主页,解决方法有两个:
1.修改Nginx配置文件中listen的端口号,设置为其他端口,比如说9090,这时在浏览器中输入localhost:9090就可以实现跳转。
2.既然80端口被占用了,那我们只需要释放这个端口就好了,cmd-&netstat -ano 80 查看80端口被占用的情况:
再通过PID号来查看到底是哪个进程或者程序占用了80端口:
结果发现都是nginx.exe 本身,那就不能通过kill pid是释放这个端口啦。
后来百度发现原来这个端口还被system占用,解决的办法:进入主表表中
找到HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/HTTP下的Start修改其值为0,然后重启电脑,重启电脑,重启电脑,重要的事情说三遍!!
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:10391次
排名:千里之外
原创:22篇
(4)(3)(1)(8)(11)(4)(1)(3)(1)

我要回帖

更多关于 ip hash 负载均衡 的文章

 

随机推荐