http - 负载均衡(nginx,tomcat)

概述:跨多个应用程序实例的负载平衡是一种常用的技术,用于优化资源利用率、最大化吞吐量、减少延迟和确保容错配置。

一,均衡算法

a. Round Robin : 对缩放有的backend轮训发送请求,算是最简单的方式了,也是默认的分配方式;

b.Least Connections(least_conn) : 跟踪和backend当前的活跃连接数目,最少的连接数目说明这哥backend负载最轻,将请求分配给他,这种方式会考虑到配置种每个upstream分配的weight权重信息;

c.Least Time(least_time): 请求会分配给响应最快和活跃连接树最少的backend;

d.IP Hash(ip_hash):对请求来源IP地址计算hash值,IPv4会考虑前3哥octed,IPv6会考虑所有的地址位,然后根据得到的hash值通过某种映射分配的backend;

e. Generic Hash(hash): 以用户自定义资源(比如URL)的方式计算hash值完成分配,其可选consistent关键字支持一致性hash特性.

niginx- 配置文件中:

upstream backend {
    least_conn; #这里是选择的方法
    server backend1.example.com; #如果有不用的就在后加 down
    server backend2.example.com;
}

http - 负载均衡(nginx,tomcat)_第1张图片

这里简述一下配置流程 :

  1. 准备好nginx,tomcat。
  2. 修改niginx配置文件 nginx.conf
  3. 修改tomcat server.xml,端口号要对应. ,以及应用程序目录指向,如: 多个tomcat都指向通一个目录
  4. 访问域名 www.xxx.com 时,nginx就会分发处理请求到对应的Tomcat。–实现减轻压力

Nginx 修改主要是这两个地方:

 #服务器的集群  
    upstream  tomcat-cluster {  #服务器集群名字   
        server    127.0.0.1:18080  weight=1;#服务器配置   weight是权重的意思,权重越大,分配的概率越大。  
        server    127.0.0.1:28080  weight=2;  
    }
 #当前的Nginx的配置 
    server {
        listen       80;		#监听80端口,可以改成其他端口 
        server_name  www.xxx.com; #当前服务的域名

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
		
		location / {
            proxy_pass http://tomcat-cluster; #这里的名字就是服务器集群名字
			proxy_redirect default;
        }

这里贴上个 nginx 配置说明:


#user  nobody;
worker_processes  1;	#工作进程的个数,一般与计算机的cpu核数一致

#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; #默认文件类型

    #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; #on 为开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。  
	#tcp_nopush     on;							
    

    #keepalive_timeout  0; #长连接超时时间,单位是秒  
    keepalive_timeout  65;

    #gzip  on;			   #启用Gizp压缩
	
	 #服务器的集群  
    upstream  netitcast.com {  #服务器集群名字   
        server    127.0.0.1:18080  weight=1;#服务器配置   weight是权重的意思,权重越大,分配的概率越大。  
        server    127.0.0.1:28080  weight=2;  
    }
	
	 #当前的Nginx的配置 
    server {
        listen       80;		#监听80端口,可以改成其他端口 
        server_name  localhost; #当前服务的域名

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
		
		location / {
            proxy_pass http://netitcast.com;
			proxy_redirect default;
        }

        #location / {
        #    root   html;
        #    index  index.html index.htm;
        #}

        #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 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

Tomcat配置说明

<Server>  
    #<Server>元素是整个配置文件的根元素,<Service>元素则代表一个Engine元素以及一组与之相连的Connector元素。(唯一一个最外层的元素), 一个Server元素中可以有一个或多个Service元素。
	#提供:一个接口让客户端能够访问到这个Service集合

	<Service>
	#一个Service可以包含多个Connector,但是只能包含一个Engine;其中Connector的作用是从客户端接收请求,Engine的作用是处理接收进来的请求。

		<Connector/> 
        #<Connector>代表了外部客户端发送请求到特定Service的接口;同时也是外部客户端从特定Service接收响应的接口。
	#Connector的主要功能,是接收连接请求,创建Request和Response对象用于和请求端交换数据;
	#然后分配线程让Engine来处理这个请求,并把产生的Request和Response对象传给Engine。
	
	#通过配置Connector,可以控制请求Service的协议及端口号。在第一部分的例子中,Service包含两个Connector:
1 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
2 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />1)通过配置第1个Connector,客户端可以通过8080端口号使用http协议访问Tomcat。
其中,protocol属性规定了请求的协议,port规定了请求的端口号,redirectPort表示当强制要求https而请求是http时,重定向至端口号为8443的Connector,connectionTimeout表示连接的超时时间。
在这个例子中,Tomcat监听HTTP请求,使用的是8080端口,而不是正式的80端口;实际上,在正式的生产环境中,Tomcat也常常监听8080端口,而不是80端口。这是因为在生产环境中,很少将Tomcat直接对外开放接收请求,而是在Tomcat和客户端之间加一层代理服务器(如nginx),用于请求的转发、负载均衡、处理静态文件等;通过代理服务器访问Tomcat时,是在局域网中,因此一般仍使用8080端口。
(2)通过配置第2个Connector,客户端可以通过8009端口号使用AJP协议访问Tomcat。AJP协议负责和其他的HTTP服务器(如Apache)建立连接;在把Tomcat与其他HTTP服务器集成时,就需要用到这个连接器。之所以使用Tomcat和其他服务器集成,是因为Tomcat可以用作Servlet/JSP容器,但是对静态资源的处理速度较慢,不如Apache和IIS等HTTP服务器;因此常常将Tomcat与Apache等集成,前者作Servlet容器,后者处理静态资源,而AJP协议便负责Tomcat和Apache的连接。Tomcat与Apache等集成的原理如下图(图片来源)<Connector/>

		#容器的功能是处理Connector接收进来的请求,并产生相应的响应。Engine、Host和Context都是容器,但它们不是平行的关系,而是父子关系:
		#Engine包含Host,Host包含Context。一个Engine组件可以处理Service中的所有请求,一个Host组件可以处理发向一个特定虚拟主机的所有请求,一个Context组件可以处理一个特定Web应用的所有请求。			
		<Engine>
Engine组件在Service组件中有且只有一个;Engine是Service组件中的请求处理组件。Engine组件从一个或多个Connector中接收请求并处理,并将完成的响应返回给Connector,最终传递给客户端。	<Engine name="Catalina" defaultHost="localhost">

			<Host>
Host是Engine的子容器。Engine组件中可以内嵌1个或多个Host组件,每个Host组件代表Engine中的一个虚拟主机。Host组件至少有一个,且其中一个的name必须与Engine组件的defaultHost属性相匹配。
---
Host组件代表的虚拟主机,对应了服务器中一个网络名实体(如”www.test.com”,或IP地址”116.25.25.25);为了使用户可以通过网络名连接Tomcat服务器,这个名字应该在DNS服务器上注册。
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">

name属性:指定虚拟主机的主机名,一个Engine中有且仅有一个Host组件的name属性与Engine组件的defaultHost属性相匹配;一般情况下,主机名需要是在DNS服务器中注册的网络名,但是Engine指定的defaultHost不需要,原因在前面已经说明。

unpackWARs指定:了是否将代表Web应用的WAR文件解压;如果为true,通过解压		    	后的文件结构运行该Web应用,如果为false,直接使用WAR文件运行Web应用。

                 Host的autoDeploy和appBase属性:与Host内Web应用的自动部署有关;此外,本例中没有出现的xmlBase和deployOnStartup属性,也与Web应用的自动部署有关;将在下一节(Context)中介绍。

			<Context  /> 
 Context元素代表在特定虚拟主机上运行的一个Web应用。 
Context元素最重要的属性是docBase和path,此外reloadable属性也比较常用。
docBase指定了该Web应用使用的WAR包路径,或应用目录。
--自动部署时不需要指定,会自动去扫描.
--在自动部署场景下(配置文件位于xmlBase中),不能指定path属性
path指定了访问该Web应用的上下文路径

reloadable属性指示tomcat是否在运行时监控在WEB-INF/classes和WEB-INF/lib目录下class文件的改动。如果值为true,那么当class文件改动时,会触发Web应用的重新加载。
在开发环境下,reloadable设置为true便于调试;
但是在生产环境中设置为true会给服务器带来性能压力,因此reloadable参数的默认值为false<Context docBase="D:\Program Files\app1.war" reloadable="true"/>

			</Host>


		</Engine>

	</Service>

</Server>

你可能感兴趣的:(服务器,服务器,Nginx,负载均衡)