测试环境均为本地,测试软件为:php
nginx-1.6.0,apache-tomcat-7.0.42-1,apache-tomcat-7.0.42-2,apache-tomcat-7.0.42-3
html
利用nginx作负载均衡,三台tomcat作WEB具体业务处理。前端
nginx配置nginx.conf:node
#Nginx所用用户和组,window下不指定 #user niumd niumd; #user nobody; #工做的子进程数量(一般等于CPU数量或者2倍于CPU) worker_processes 2; #错误日志存放路径 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #指定pid存放文件 #pid logs/nginx.pid; events { #使用网络IO模型linux建议epoll,FreeBSD建议采用kqueue,window下不指定。 #use epoll; #容许最大链接数 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; access_log logs/access.log; client_header_timeout 3m; client_body_timeout 3m; send_timeout 3m; client_header_buffer_size 1k; large_client_header_buffers 4 4k; sendfile on; tcp_nopush on; tcp_nodelay on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; include gzip.conf; upstream localhost { #根据ip计算将请求分配各那个后端tomcat,许多人误认为能够解决session问题,其实并不能。 #同一机器在多网状况下,路由切换,ip可能不一样 server localhost:18081; server localhost:18082; server localhost:18083; #根据IP作分配策略 ip_hash; } #down 表示单前的server暂时不参与负载 #weight 默认为1.weight越大,负载的权重就越大。 #max_fails :容许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误 #fail_timeout:max_fails 次失败后,暂停的时间。 #backup: 其它全部的非backup机器down或者忙的时候,请求backup机器。因此这台机器压力会最轻。 #nginx 的 upstream目前支持 4 种方式的分配 #1)、轮询(默认) 每一个请求按时间顺序逐一分配到不一样的后端服务器,若是后端服务器down掉,能自动剔除。 #2)、weight 指定轮询概率,weight和访问比率成正比,用于后端服务器性能不均的状况。 #2)、ip_hash 每一个请求按访问ip的hash结果分配,这样每一个访客固定访问一个后端服务器,能够解决session的问题。 #3)、fair(第三方)按后端服务器的响应时间来分配请求,响应时间短的优先分配。 #4)、url_hash(第三方) server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { proxy_pass http://localhost; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; #容许客户端请求的最大单文件字节数 client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数, proxy_connect_timeout 90; #nginx跟后端服务器链接超时时间(代理链接超时) proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时) proxy_read_timeout 90; #链接成功后,后端服务器响应时间(代理接收超时) proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小 proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k如下的话,这样设置 proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2) proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传 } #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; # } #} }
<?xml version='1.0' encoding='utf-8'?> <Server port="18001" shutdown="SHUTDOWN"> <Connector port="18081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="18441" /> <Connector port="18021" protocol="AJP/1.3" redirectPort="18441" /> <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1"> </Service> </Server>
<?xml version='1.0' encoding='utf-8'?> <Server port="18002" shutdown="SHUTDOWN"> <Connector port="18082" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="18442" /> <Connector port="18022" protocol="AJP/1.3" redirectPort="18442" /> <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1"> </Service> </Server>
<?xml version='1.0' encoding='utf-8'?> <Server port="18003" shutdown="SHUTDOWN"> <Connector port="18083" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="18443" /> <Connector port="18023" protocol="AJP/1.3" redirectPort="18443" /> <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1"> </Service> </Server>
分别启动三台tomcat,访问到地址依次是:http://localhost:18081;http://localhost:18082;http://localhost:18083linux
而后启动nginx,访问地址是:http://localhostnginx
(cmd下面运行nginx.exe,关闭cmd下面运行nginx -s stop)git
这样子根据客户端IP作负载均衡的同步策略已基本可知足需求,可是考虑到客户端多网卡或者客户端访问不一样的服务器时产生session不一样步的问题,须要使用memcached作session同步策略,后续我会跟上配置文档。github
附:如下是来自于互联网的三中方法:
一、不用session,经过cookie等方式绕过session 。
貌似这种方式仍是会存在问题,假如客户端禁用cookie怎么办。
二、应用服务器自行实现共享
如单点登陆,采用中央认证服务器;或者memcache来存放后端服务器须要使用的公共数据。我曾经就有程序采用本地ehcache+memcache来缓存数据,其中ehcache缓存一些与他机无关的数据,memcache缓存一些公共数据,但这样每每也容易出现问题。
三、ip_hash方式解决session共享
nginx中的ip_hash技术可以将某个ip的请求定向到同一台后端,这样一来这个ip下的某个客户端和某个后端就能创建起稳固的session,ip_hash是在upstream配置中定义的, 配置方式样例:
upstream backend {
server 127.0.0.1:8080 ;
server 127.0.0.1:9090 ;
ip_hash;
}
ip_hash是容易理解的,可是由于仅仅能用ip这个因子来分配后端,所以ip_hash是有缺陷的,不能在一些状况下使用:
(1)/ nginx不是最前端的服务器。ip_hash要求nginx必定是最前端的服务器,不然nginx得不到正确ip,就不能根据ip做hash。譬如使用 的是squid为最前端,那么nginx取ip时只能获得squid的服务器ip地址,用这个地址来做分流是确定错乱的。
(2)/ nginx的后端还有其它方式的负载均衡。假如nginx后端又有其它负载均衡,将请求又经过另外的方式分流了,那么某个客户端的请求确定不能定位到同一 台session应用服务器上。这么算起来,nginx后端只能直接指向应用服务器,或者再搭一个squid,而后指向应用服务器。最好的办法是用 location做一次分流,将须要session的部分请求经过ip_hash分流,剩下的走其它后端去。
(3) upstream_hash(这种方式没有尝试过)
web
下面是从网络上整理的关于nginx与apache的对比:apache
一、nginx与apache优缺点对比
nginx相对于apache的优势: (1)轻量级,一样起web 服务,比apache占用更少的内存及资源 (2)抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能 (3)高度模块化的设计,编写模块相对简单 (4)社区活跃,各类高性能模块出品迅速啊 apache 相对于nginx 的优势: (1)rewrite:比nginx 的rewrite 强大 (2)动态页面:模块超多,基本想到的均可以找到 (3)少bug ,nginx 的bug 相对较多 (4)超稳定 存在就是理由,通常来讲,须要性能的web 服务,用nginx 。若是不须要性能只求稳定,那就apache 吧。 后者的各类功能模块实现得比前者,例如ssl 的模块就比前者好,可配置项多。这里要注意一点,epoll(freebsd 上是 kqueue )网络 IO 模型是nginx 处理性能高的根本理由,但并非全部的状况下都是epoll 大获全胜的,若是自己提供静态服务的就只有寥寥几个文 件,apache 的select 模型或许比epoll 更高性能。固然,这只是根据网络IO 模型的原理做的一个假设,真正的应用仍是须要实测了再说 的。 二、做为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发链接,体现更高的效率,这点 使 Nginx 尤为受到虚拟主机提供商的欢迎。在高链接并发的状况下,Nginx是Apache服务器不错的替代品: Nginx在美国是作虚拟主机生 意的老板们常常选择的软件平台之一. 可以支持高达 50,000 个并发链接数的响应, 感谢Nginx为咱们选择了 epoll and kqueue 做为开发模型. Nginx 做为负载均衡服务器: Nginx 既能够在内部直接支持 Rails 和 PHP 程序对外进行服务, 也能够支持做为 HTTP代理 服务器对外进行服务. Nginx采用C进行编写, 不管是系统资源开销仍是CPU使用效率都比 Perlbal 要好不少. 做为邮件代理服务器: Nginx 同时也是一个很是优秀的邮件代理服务器(最先开发这个产品的目的之一也是做为邮件代理服务器), Last.fm 描述了成功而且美妙的使用经验. Nginx 是 一个安装很是的简单 , 配置文件很是简洁(还可以支持perl语法), Bugs 很是少的服务器: Nginx 启动特别容易, 而且几乎能够作到 7*24不间断运行,即便运行数个月也不须要从新启动. 你还可以不间断服务的状况下进行软件版本的升级 . 三、Nginx 配置简洁, Apache 复杂 Nginx 静态处理性能比 Apache 高 3倍以上 Apache 对 PHP 支持比较简单,Nginx 须要配合其余后端用 Apache 的组件比 Nginx 多 如今 Nginx 才是 Web 服务器的首选 四、最核心的区别在于apache是同步多进程模型,一个链接对应一个进程;nginx是异步的,多个链接(万级别)能够对应一个进程 五、nginx处理静态文件好,耗费内存少.但无疑apache仍然是目前的主流,有不少丰富的特性.因此还须要搭配着来.固然若是能肯定nginx就适合需求,那么使用nginx会是更经济的方式. apache有先天不支持多核心處理負載雞肋的缺點,建議使用nginx作前端,後端用apache。大型網站建議用nginx自代的集群功能 六、 从我的过往的使用状况来看,nginx的负载能力比apache高不少。最新的服务器也改用nginx了。并且nginx改完配置能-t测试一下配置有没有问题,apache重启的时候发现配置出错了,会很崩溃,改的时候都会很是当心翼翼如今看有好多集群站,前端nginx抗并发,后端apache集群, 配合的也不错。 七、nginx处理动态请求是鸡肋,通常动态请求要apache去作,nginx只适合静态和反向。 八、從我個人的經驗來看,nginx是很不錯的前端服務器,負載性能很好,在老奔上開nginx,用webbench模擬10000個靜態文件請求绝不吃力。apache對php等語言的支持很好,此外apache有強大的支持網路,發展時間相對nginx更久. 九、 Nginx优于apache的主要两点: (1).Nginx自己就是一个反向代理服务器 (2).Nginx支持7层负载均衡;其余的固然,Nginx可能会比 apache支持更高的并发,可是根据NetCraft的统计,2011年4月的统计数据,Apache依然占有62.71%,而Nginx是 7.35%,所以总得来讲,Aapche依然是大部分公司的首先,由于其成熟的技术和开发社区已经也是很是不错的性能。 十、你对web server的需求决定你的选择。大 部分状况下nginx都优于APACHE,好比说静态文件处理、PHP-CGI的支持、反向代理功能、前端Cache、维持链接等等。在 Apache+PHP(prefork)模式下,若是PHP处理慢或者前端压力很大的状况下,很容易出现Apache进程数飙升,从而拒绝服务的现象。 十一、能够看一下nginx lua模块:https://github.com/chaoslaw...apache比nginx多的模块,可直接用lua实现apache是最流行的,why?大多数人懒得更新到nginx或者学新事物 十二、对于nginx,我喜欢它配置文件写的很简洁,正则配置让不少事情变得简单运行效率高,占用资源少,代理功能强大,很适合作前端响应服务器 1三、Apache在处理动态有优点,Nginx并发性比较好,CPU内存占用低,若是rewrite频繁,那仍是Apache吧