Nginx是目前应用广泛的web服务负载均衡器,相较于Apache来讲nginx属于轻量级的web负载均衡器,运行过程中占用更少内存及资源。nginx能够支持上万并发,这得益于nginx处理请求是异步非阻塞型的,而apache 则是阻塞型,在高并发下nginx仍 能保持较低的资源消耗,其中核心区别于apache同步多进程模型连接对应进程;nginx异步多连接(万级别)对应进程。nginx确实在某些方面性能上优于Apache,尤其是在处理静态文件上,Nginx 静态处理性能比 Apache 高 3倍上,但这并不是说nginx已经完全超越Apache,Apache仍有他无法取代的优点,比如Apache的稳定性要远高于nginx,Apache组件比nginx要多。所以对于两者的选择要根据实际情况来定,如果对性能要求或需要处理大量静态资源则使用nginx,如果对稳定性要求高或处理大量动态请求则推荐Apache。闲话不多说了,下面介绍下如何安装配置nginx。
1.首先下载nginx,官方下载地址:http://nginx.org/en/download.html
2.将下载好的压缩包解压到安装目录。
3.首先检查默认配置是否有问题,打开命令行窗口,进入到nginx的HOME目录,输入nginx.exe -t 命令,如果出现如图所示则说明nginx.conf配置文件没有问题
4.接下来需要修改该配置文件,让他真正实现负载均衡了,下面是修改后的配置文件内容
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream aaa{
server 192.168.0.37:8009 weight=10; #真实服务器A(sxwgf-PC)
#server 115.183.28.98:7071 weight=10;
server 192.168.0.37:8006 weight=1; #真实服务器B(hzdk-vpc)
}
server { #Nginx代理服务器
listen 8088;
server_name localhost www.ha97.com ha97.com;
location / {
root html;
index index.html index.htm;
#proxy_pass http://www.kuqin.com;
proxy_pass http://aaa;
proxy_redirect default;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
#图片缓存时间设置
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 10d;
}
#JS和CSS缓存时间设置
location ~ .*\.(js|css)?$
{
expires 1h;
}
}
}
观察上面的配置文件需要注意的地方有以下几点:
1.tomcat集群名称一定要与代理服务器的dialing路径一样,也就是nginx代理服务器的proxy_pass一定要与upstream名称相同。
2.在tomcat集群中server定位一定要遵循ip+端口形式,否则检测将不会通过。
3.worker_processes的值应设为小于等于CPU总核心数,决定着nginx启动的进程数目
4.worker_connections为单个进程最大连接数(最大连接数=连接数*进程数)
5.upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
一切准备完毕之后测试下实验成果,本人属于懒人,姑且开启两个版本的tomcat(tomcat6和tomcat7)通过其不同的展现页面来区分nginx将请求分配到了哪个物理服务器上,根据以上配置多次请求localhost:8088/这个地址依次出现如下两幅画面:
上图表示访问到的是tomcat7,下图表示访问到的是tomcat6
由此说明我们配置的nginx实现负载均衡的效果实现了,那么究竟为啥nginx的性能就要比Apache高呢?我们知道线程执行过程中有五种状态,分别是:就绪,运行,阻塞,就绪,死亡。当一个线程启动(调用start方法后)之后进入就绪状态等待获取cpu资源,而一旦该线程获取了cpu资源之后变灰处于运行状态执行run方法,当处于运行状态的线程等待I/O资源或执行sleep方法后就会暂时让出cpu资源进入阻塞状态,当该线程重新获取到了I/O资源或sleep结束后线程便重新进入就绪状态进入就绪队列等待cpu,得到cpu资源后继续运行直到线程结束。而当web服务器如处理大量请求时,会频繁进行磁盘IO读写操作,CPU轮训时会使运行状态的请求进入“阻塞”状态,这就是阻塞产生的原因,nginx独特的master/worker模式很好的解决了并发问题。它的核心思想是,系统有两个进程协作工作:Master进程,负责接收和分配任务;Worker进程,负责处理子任务。当Worker进程将子任务处理完成后,结果返回给Master进程,由Master进程做归纳汇总,最后得到最终的结果。同一时刻只有一个worker建立连接,用到了锁的概念来保证只有一个worker处理请求。采用多线程好处,如果一个worker挂掉,对于其他没有影响。