负载均衡的基本概念
负载平衡(loadbalancing)是一种计算机网络技术,用来在多个计算机(计算机集群)、网络连接、cpu、磁盘驱动器或其他资源中分配负载,以达到最佳化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。
使用带有负载平衡的多个服务器组件,取代单一的组件,可以通过冗余提高可靠性。负载平衡服务通常是由专用软体和硬件来完成。
负载平衡最重要的一个应用是利用多台服务器提供单一服务,这种方案有时也称之为服务器农场。通常,负载平衡主要应用于web网站,大型的internetrelaychat网络,高流量的文件下载网站,nntp(networknewstransferprotocol)服务和dns服务。现在负载平衡器也开始支持数据库服务,称之为数据库负载平衡器。
对于互联网服务,负载平衡器通常是一个软体程序,这个程序侦听一个外部端口,互联网用户可以通过这个端口来访问服务,而作为负载平衡器的软体会将用户的请求转发给后台内网服务器,内网服务器将请求的响应返回给负载平衡器,负载平衡器再将响应发送到用户,这样就向互联网用户隐藏了内网结构,阻止了用户直接访问后台(内网)服务器,使得服务器更加安全,可以阻止对核心网络栈和运行在其它端口服务的攻击。
当所有后台服务器出现故障时,有些负载平衡器会提供一些特殊的功能来处理这种情况。例如转发请求到一个备用的负载平衡器、显示一条关于服务中断的消息等。负载平衡器使得it团队可以显著提高容错能力。它可以自动提供大量的容量以处理任何应用程序流量的增加或减少。
下面我们就来看一下如何搭建具备负载均衡能力的nginx+tomcat服务器组合:
0.前期准备
使用debian环境。安装nginx(默认安装),一个web项目,安装tomcat(默认安装)等。
1.一份nginx.conf配置文件
#定义nginx运行的用户和用户组如果对应服务器暴露在外面的话建议使用权限较小的用户防止被入侵
#nginx进程数,建议设置为等于cpu总核心数
error_log/var/log/nginx/error.loginfo;
#一个nginx进程打开的最多文件描述数目建议与ulimit-n一致
#如果面对高并发时注意修改该值ulimit-n还有部分系统参数而并非这个单独确定
worker_rlimit_nofile65535;
default_typeapplication/octet-stream;
access_log/var/log/nginx/access.log;
error_log/var/log/nginx/error.log;
gzip_min_length1k;#最小1k
gzip_typestext/plainapplication/x-javascripttext/cssapplication/xmlapplication/javascript;
upstreamstatic.zh-jieli.com{
server127.0.0.1:808weight=1;
#server192.168.8.203:8080;
proxy_set_headerhost$host;
proxy_set_headerx-real-ip$remote_addr;
proxy_set_headerx-forwarded-for$proxy_add_x_forwarded_for;
client_body_buffer_size128k;
proxy_busy_buffers_size64k;
proxy_cache_key'$host:$server_port$request_uri';
proxy_temp_file_write_size64k;
proxy_temp_path/dev/shm/jielierp/proxy_temp_path;
proxy_cache_path/dev/shm/jielierp/proxy_cache_pathlevels=1:2keys_zone=cache_one:200minactive=5dmax_size=1g;
proxy_ignore_headersx-accel-expiresexpirescache-controlset-cookie;
server_nameerp.zh-jieli.com;
indexindex;#默认主页为/index
location~.*\.(js|css|ico|png|jpg|eot|svg|ttf|woff){
proxy_cache_valid2003043025d;
proxy_cache_key'$host:$server_port$request_uri';
add_headerx-cache'$upstream_cache_statusfrom$host';
#所有静态文件直接读取硬盘
#root/var/lib/tomcat7/webapps/jielierp/web-inf;
#其他页面反向代理到tomcat容器
location~.*\.(js|css|ico|png|jpg|eot|svg|ttf|woff){
#所有静态文件直接读取硬盘
root/var/lib/tomcat7/webapps/jielierp/web-inf;
}
基本配置这个文件,就可以实现负载了。但是里面的各种关系要了解就比较麻烦了。
2.基础讲解
现在假使有一台电脑192.168.8.203这台电脑,上面部署了tomcat,里面8080端口有j2ee的服务,通过浏览器可以正常浏览网页。现在有一个问题tomcat是一个比较全面的web容器,对静态网页的处理,应该是比较费资源的,特别是每次都要从磁盘读取静态页面,然后返回。这中间会消耗tomcat的资源,可能会使那些动态页面解析性能影响。秉承linux哲学,一个软件只做一件事的原则。tomcat就应该只处理jsp动态页面。这里就用到以前了解的nginx来进行反向代理。第一步代理,实现动静网页分离。这个很简单的。
worker_rlimit_nofile65535;
default_typeapplication/octet-stream;
proxy_set_headerhost$host;

proxy_set_headerx-forwarded-for$proxy_add_x_forwarded_for;
client_body_buffer_size128k;
proxy_busy_buffers_size64k;
location~.*\.(js|css|ico|png|jpg|eot|svg|ttf|woff){
worker_rlimit_nofile65535;
default_typeapplication/octet-stream;
proxy_set_headerhost$host;
proxy_set_headerx-real-ip$remote_addr;
proxy_set_headerx-forwarded-for$proxy_add_x_forwarded_for;
client_body_buffer_size128k;
proxy_busy_buffers_size64k;
location~.*\.(js|css|ico|png|jpg|eot|svg|ttf|woff){
}
修改nginx的配置文件/etc/nginx/nginx.conf默认有个配置文件的。其实大部分都差不多,关键还是server段的设置。这里我设置server段如上所示,其他段复制就可以了。server段里面的解释如下:第35行为监听本机80端口。37-39行表示默认主页,这里的默认主页我是index.jsp对应到我项目中是一个index。这里根据需要可以改为
indexindex.jspindex.htmlindex.htmindex.php
具体可参考其他文章。关键的第40行,这个是正则匹配,网上也有很多介绍。这里匹配我项目中用到的所有静态网页后缀。第41行是代理地址。这里我代理到我的web应用中。expires30d缓存为30天,这里的缓存是对应到前端页面,用户的cache-control字段,
第44行中那个正则是匹配无后缀的页面。我项目中jsp页面是无后缀的。这里可以根据需要进行修改。同样代理到192.168.8.203:8080这里。到这里你可能会问,我艹,这有毛意思啊?当然不是这样了。简单的实现静动分离,我们可以把第41行进行修改,改为
root/var/lib/tomcat7/webapps/jielierp/web-inf
表示不代理,直接从本地磁盘拿。通过查tomcat日志可以看到静态页面是没有访问到的。但这样又有一个问题。这样的灵活性不好,对下面要讲到的内存缓存和集群部署来说都是不友好的,所以又有了下面的这种写法。再写一个server段。
location~.*\.(js|css|ico|png|jpg|eot|svg|ttf|woff){
#所有静态文件直接读取硬盘
root/var/lib/tomcat7/webapps/jielierp/web-inf;
gzip_min_length1k;#最小1k
gzip_typestext/plainapplication/x-javascripttext/cssapplication/xmlapplication/javascript;
proxy_cache_key'$host:$server_port$request_uri';
proxy_temp_file_write_size64k;
proxy_temp_path/dev/shm/jielierp/proxy_temp_path;
proxy_cache_path/dev/shm/jielierp/proxy_cache_pathlevels=1:2keys_zone=cache_one:200minactive=5dmax_size=1g;
proxy_ignore_headersx-accel-expiresexpirescache-controlset-cookie;
location~.*\.(js|css|ico|png|jpg|eot|svg|ttf|woff){
proxy_cache_valid2003043025d;
proxy_cache_key'$host:$server_port$request_uri';
add_headerx-cache'$upstream_cache_statusfrom$host';
}
经过这两个的配置就基本能实现了,这里说几个注意项,也是困扰我很久的问题。上面第一段代码第6行,proxy_ignore_headers如果web项目中的html的head头里面指定
<metahttp-equiv="pragma"content="no-cache">
<metahttp-equiv="cache-control"content="no-cache">
<metahttp-equiv="expires"content="0">
这些不缓存的话,就要加上proxy_ignore_headers的配置项了。还有一点就是/dev/shm下面的文件系统权限默认只给root用户,所以要chmod777-r/dev/shm这样不是很安全的做法,如果实际上线可以给定某个用户组,关于用户组的设置是配置的第一行
userwwwwww;
上面第二段代码的第6行是增加一个header字段方便查看是否击中缓存。
我们rm-rf/dev/shm/jielierp/proxy_*下面的所有文件(注意这里如果是进行多次测试的话要nginx-sreload重新读取配置或重启服务,因为你rm-rf只是删除了缓存文件,但是缓存的结构信息还在nginx进程里面,结构还在,如果不重启的话,是会出现访问不到的)
所以要记得重启哦。下面是运行效果
第二次访问,在浏览器中ctrl+shift+r强制刷新
到这里就可以看到效果了。我们查看一下/dev/shm这个里面
到这里已经快结束了。最后也是比较关键的一个技术点,就是集群,集群,集群。这个就要用到upstream了,看到最开头的配置文件了吗,就是那个
server127.0.0.1:808weight=1;
server192.168.8.203:808weight=1;
#server192.168.8.203:8080;
}
到这里就结束了。把上面各个部分根据自己需求配置起来就可以实现单机房负载均衡了。上面这种做法有一个缺点就是在前面的那一台nginx如果当机,后面所以机器就失去了被访问的能力了,所以需要在前面实现多个nginx多机房的负载。关于这个就是另外一个话题了。目前还没有研究。以后有机会再说了。
上面动态服务器组如果是那种需要保存用户状态的话,会有问题,就是session问题,比如我在server1进行登录后,下一次动态服务器组进行轮询后可能分配到server2,就会造成要重新登录。治标的办法是,配置轮询规则,根据用户请求的ip进行hash,然后分配对应的服务器。具体配置如下:
server192.168.0.203:8080;
}
这样就可以实现一个用户对应一个服务器节点。这样就不会有重复登录的问题。另一种治本的办法是,利用缓存系统进行session的统一存储管理。
以上就是Debian下搭建Nginx和Tomcat服务器实现负载均衡的方法的详细内容,更多请关注主机测评网其它相关文章!
本文来源:国外服务器--debian搭建web服务器
本文地址:https://www.idcbaba.com/guowai/2791.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 1919100645@qq.com 举报,一经查实,本站将立刻删除。



