nginx 负载均衡时,一台tomcat宕机时的问题 自动切换

nginx 负载均衡时,一台tomcat宕机时的问题 自动切换如果Nginx没有仅仅只能代理一台服务器的话,那它也不可能像今天这么火,Nginx可以配置代理多台服务器,当一台服务器宕机之后,仍能保持系统可用。具体配置过程如下:1.在http节点下,添加upstream节点。upstreamlinuxidc{      server10.0.6.108:7080;      server10.0.0.85:8980;}

大家好,又见面了,我是你们的朋友全栈君。

如果Nginx没有仅仅只能代理一台服务器的话,那它也不可能像今天这么火,Nginx可以配置代理多台服务器,当一台服务器宕机之后,仍能保持系统可用。具体配置过程如下:

1. 在http节点下,添加upstream节点。

upstream linuxidc {

      server 10.0.6.108:7080;
      server 10.0.0.85:8980;
}

  2.  将server节点下的location节点中的proxy_pass配置为:http:// + upstream名称,即“
http://linuxidc”.

location / {

            root  html;
            index  index.html index.htm;
            proxy_pass http://linuxidc;
}

    3.  现在负载均衡初步完成了。upstream按照轮询(默认)方式进行负载,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能 自动剔除。虽然这种方式简便、成本低廉。但缺点是:可靠性低和负载分配不均衡。适用于图片服务器集群和纯静态页面服务器集群。

    除此之外,upstream还有其它的分配策略,分别如下:

    weight(权重)

    指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。如下所示,10.0.0.88的访问比率要比10.0.0.77的访问比率高一倍。

upstream linuxidc{

      server 10.0.0.77 weight=5;
      server 10.0.0.88 weight=10;
}

    ip_hash(访问ip)

    每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

upstream favresin{

      ip_hash;
      server 10.0.0.10:8080;
      server 10.0.0.11:8080;
}

    fair(第三方)

    按后端服务器的响应时间来分配请求,响应时间短的优先分配。与weight分配策略类似。

 upstream favresin{     
      server 10.0.0.10:8080;
      server 10.0.0.11:8080;
      fair;
}

url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

注意:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。

 upstream resinserver{

      server 10.0.0.10:7777;
      server 10.0.0.11:8888;
      hash $request_uri;
      hash_method crc32;
}

upstream还可以为每个设备设置状态值,这些状态值的含义分别如下:

down 表示单前的server暂时不参与负载.

weight 默认为1.weight越大,负载的权重就越大。

max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误.

fail_timeout : max_fails次失败后,暂停的时间。

backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

upstream bakend{ #定义负载均衡设备的Ip及设备状态
      ip_hash;
      server 10.0.0.11:9090 down;
      server 10.0.0.11:8080 weight=2;
      server 10.0.0.11:6060;
      server 10.0.0.11:7070 backup;
}

Nginx的配置与部署研究,Upstream负载均衡模块  http://www.linuxidc.com/Linux/2013-04/82526p2.htm

CentOS 6.2实战部署Nginx+MySQL+PHP http://www.linuxidc.com/Linux/2013-09/90020.htm

使用Nginx搭建WEB服务器 http://www.linuxidc.com/Linux/2013-09/89768.htm

搭建基于Linux6.3+Nginx1.2+PHP5+MySQL5.5的Web服务器全过程 http://www.linuxidc.com/Linux/2013-09/89692.htm

CentOS 6.3下Nginx性能调优 http://www.linuxidc.com/Linux/2013-09/89656.htm

CentOS 6.3下配置Nginx加载ngx_pagespeed模块 http://www.linuxidc.com/Linux/2013-09/89657.htm

CentOS 6.4安装配置Nginx+Pcre+php-fpm http://www.linuxidc.com/Linux/2013-08/88984.htm

Nginx安装配置使用详细笔记 http://www.linuxidc.com/Linux/2014-07/104499.htm

Nginx日志过滤 使用ngx_log_if不记录特定日志 http://www.linuxidc.com/Linux/2014-07/104686.htm

Nginx 的详细介绍请点这里
Nginx 的下载地址请点这里

用了nginx负载均衡后,在两台tomcat正常运行的情况下,访问http://localhost 速度非常迅速,通过测试程序也可以看出是得到的负载均衡的效果,但是我们试验性的把其中一台tomcat(server localhost:8080)关闭后,再查看http://localhost,发现反应呈现了一半反映时间快,一半反映时间非常非常慢的情况,但是最后都能得到正确结果.

 

解决办法:

问题解决,主要是proxy_connect_timeout 

 

 这个参数, 这个参数是连接的超时时间。 我设置成1,表示是1秒后超时会连接到另外一台服务器。


#user 

 nobody;


worker_processes 

 1;




#error_log 

 logs/error.log;


#error_log 

 logs/error.log 

 notice;


#error_log 

 logs/error.log 

 info;




#pid 

 

 

 

 

 

 

 logs/nginx.pid;






events {



 

 

 

 worker_connections 

 1024;


}






http {



 

 

 

 include 

 

 

 

 

 

 mime.types;


 

 

 

 default_type 

 application/octet-stream;




 

 

 

 

 upstream localhost {



 

 

 

 

 

 

 #ip_hash;


 

 

 

 

 

 

 server 127.0.0.1:8081;


 

 

 

 

 

 

 server 127.0.0.1:8080;


 

 

 

 

 }




 

 

 

 #log_format 

 main 

 ‘$remote_addr – $remote_user [$time_local] “$request” ‘


 

 

 

 # 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 ‘$status $body_bytes_sent “$http_referer” ‘


 

 

 

 # 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 ‘”$http_user_agent” “$http_x_forwarded_for”‘;




 

 

 

 #access_log 

 logs/access.log 

 main;




 

 

 

 sendfile 

 

 

 

 

 

 

 on;


 

 

 

 #tcp_nopush 

 

 

 

 on;




 

 

 

 #keepalive_timeout 

 0;


 

 

 

 keepalive_timeout 

 65;




 

 

 

 #gzip 

 on;




 

 

 

 server {



 

 

 

 

 

 

 

 listen 

 

 

 

 

 

 80;


 

 

 

 

 

 

 

 server_name 

 localhost;




 

 

 

 listen 80;


 

 

 

 server_name localhost;


 

 

 

 location /{



 

 

 

 proxy_pass http://localhost;


 

 

 

 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_connect_timeout       1;
    proxy_read_timeout          1;
    proxy_send_timeout          1;



 

 

 

 }


 

 

 

 

 

 

 

 #charset koi8-r;




 

 

 

 

 

 

 

 #access_log 

 logs/host.access.log 

 main;




 

 

 

 

 

 

 

 #error_page 

 404 

 

 

 

 

 

 

 

 

 

 

 

 

 /404.html;




 

 

 

 

 

 

 

 # redirect server error pages to the static page /50x.html


 

 

 

 

 

 

 

 #


 

 

 

 

 

 

 

 error_page 

 

 500 502 503 504 

 /50x.html;


 

 

 

 

 

 

 

 location = /50x.html {



 

 

 

 

 

 

 

 

 

 

 

 root 

 

 html;


 

 

 

 

 

 

 

 }




 

 

 

 

 

 

 

 # proxy the PHP scripts to Apache listening on 127.0.0.1:80


 

 

 

 

 

 

 

 #


 

 

 

 

 

 

 

 #location ~ \.php$ {



 

 

 

 

 

 

 

 # 

 

 

 proxy_pass 

 

 http://127.0.0.1;


 

 

 

 

 

 

 

 #}




 

 

 

 

 

 

 

 # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000


 

 

 

 

 

 

 

 #


 

 

 

 

 

 

 

 #location ~ \.php$ {



 

 

 

 

 

 

 

 # 

 

 

 root 

 

 

 

 

 

 

 

 

 

 html;


 

 

 

 

 

 

 

 # 

 

 

 fastcgi_pass 

 

 127.0.0.1:9000;


 

 

 

 

 

 

 

 # 

 

 

 fastcgi_index 

 index.php;


 

 

 

 

 

 

 

 # 

 

 

 fastcgi_param 

 SCRIPT_FILENAME 

 /scripts$fastcgi_script_name;


 

 

 

 

 

 

 

 # 

 

 

 include 

 

 

 

 

 

 

 fastcgi_params;


 

 

 

 

 

 

 

 #}




 

 

 

 

 

 

 

 # deny access to .htaccess files, if Apache’s document root


 

 

 

 

 

 

 

 # concurs with nginx’s one


 

 

 

 

 

 

 

 #


 

 

 

 

 

 

 

 #location ~ /\.ht {



 

 

 

 

 

 

 

 # 

 

 

 deny 

 all;


 

 

 

 

 

 

 

 #}


 

 

 

 }






 

 

 

 # another virtual host using mix of IP-, name-, and port-based configuration


 

 

 

 #


 

 

 

 #server {



 

 

 

 # 

 

 

 listen 

 

 

 

 

 

 8000;


 

 

 

 # 

 

 

 listen 

 

 

 

 

 

 somename:8080;


 

 

 

 # 

 

 

 server_name 

 somename 

 alias 

 another.alias;




 

 

 

 # 

 

 

 location / {



 

 

 

 # 

 

 

 

 

 

 

 root 

 

 html;


 

 

 

 # 

 

 

 

 

 

 

 index 

 index.html index.htm;


 

 

 

 # 

 

 

 }


 

 

 

 #}






 

 

 

 # HTTPS server


 

 

 

 #


 

 

 

 #server {



 

 

 

 # 

 

 

 listen 

 

 

 

 

 

 443;


 

 

 

 # 

 

 

 server_name 

 localhost;




 

 

 

 # 

 

 

 ssl 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 on;


 

 

 

 # 

 

 

 ssl_certificate 

 

 

 

 

 cert.pem;


 

 

 

 # 

 

 

 ssl_certificate_key 

 cert.key;




 

 

 

 # 

 

 

 ssl_session_timeout 

 5m;




 

 

 

 # 

 

 

 ssl_protocols 

 SSLv2 SSLv3 TLSv1;


 

 

 

 # 

 

 

 ssl_ciphers 

 ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;


 

 

 

 # 

 

 

 ssl_prefer_server_ciphers 

 

 on;




 

 

 

 # 

 

 

 location / {



 

 

 

 # 

 

 

 

 

 

 

 root 

 

 html;


 

 

 

 # 

 

 

 

 

 

 

 index 

 index.html index.htm;


 

 

 

 # 

 

 

 }


 

 

 

 #}




}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/163640.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • asp.net UpdatePanel的简单用法「建议收藏」

    asp.net UpdatePanel的简单用法「建议收藏」局部更新是ajax技术的最基本,也是最重要的用法,今天大概把asp.netajax中的局部更新控件updatepanel的用法记录下,大家可以共同探讨UpdatePanel控制页面的局部更新,这个更新功能依赖于scriptManger控件的EnablePartialRendering属性,如果这个属性设置为false局部更新会失去作用(scriptManger控件的EnablePart

  • sql多表联合查询详解_sql多表查询例子

    sql多表联合查询详解_sql多表查询例子sql语句会用到许多查询语句,如果牵扯到多张表的时候一般会需要复杂查询方式:    嵌套查询:   select*frombi_BillItemwhereBillIDin(selectBillIDfrombi_BillwhereIsArchived=’0’andIsCheckOuting=’2′)groupbymenuId,MenuPri…

  • AssertValid函数学习

    AssertValid函数学习转自http://tsitao.blog.163.com/blog/static/29795822006914105840496/VC的调试中,AssertValid和Dump函数的应用CObject

  • recvfrom函数

    recvfrom函数RECV(2) LinuxProgrammer’sManual RECV(2)NAMErecv,recvfrom,recvmsg-receiveamessagefromasocketSYNOPSIS#include<sys/types.h>#include<sys/socket.h>ssize_trecv(intsockfd,void*buf,size_tlen,intflags);

  • 3D游戏模型是怎么制作出来的?[通俗易懂]

    现在游戏建模这个行业非常热门,因此有很多小伙伴梦想成为一名游戏模型师,但是很多都对这个工作需要做什么了解不深,这里我简单介绍一下我从事的3D游戏模型制作。1.我们都知道游戏模型制作肯定是需要建模的,建模是游戏设计中最重要的环节,占整个模型制作的70%,建模的方法很多,游戏模型常用的软件有3DMAX(游戏制作中使用的软件很多都是英文版,建议学习从英文软件开始)建模的难度在所有职业中是最高最全面的,从桌椅到星舰,巨型BOSS等等复杂的模型,模型这方面没有什么多说的,练习是最重要的。具体的方法技巧可.

  • Mysql锁机制简单了解一下

    Mysql锁机制简单了解一下一锁分类(按照锁的粒度分类)Mysql为了解决并发、数据安全的问题,使用了锁机制。可以按照锁的粒度把数据库锁分为表级锁和行级锁。表级锁:Mysql中锁定粒度最大的一种锁,对当前操作的整张表加锁,实现简单,资源消耗也比较少,加锁快,不会出现死锁。其锁定粒度最大,触发锁冲突的概率最高,并发度最低,MyISAM和InnoDB引擎都支持表级锁。行级锁Mysql中锁定粒…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号