nginx用处

  • 直接作为http server(代替tomcat,apache等服务器);
  • 另外一个最主要的功能就是作为反向代理服务器实现负载均衡

环境

  1. nginx部署在windows上,另外两台tomcat,地址为localhost:80
  2. nginx下载地址http://nginx.org/en/download.html
  3. 两个tomcat分布部署在虚拟机上,假设他们的ip是192.168.155.1:80192.168.155.2:80,分别有路劲service1\index.htmlservice2\index.html,里面的内容只要好鉴别是哪个tomcat下的资源就行了
  4. 先可以启动tomcat,访问相应的地址试试,能不能访问

配置

针对不同请求 负载均衡

下载好nginx之后,修改conf\nginx.conf

`
    # ~表示根据正则匹配url,以下的效果是,当url包含service1,nginx会将请求给192.168.155.1:80处理
    location ~ /service1/ {
        proxy_pass    http://192.168.155.1:80;
    }        
    #当url包含service2,nginx会将请求给192.168.155.2:80处理
    location ~ /service2/ {
        proxy_pass    http://192.168.155.2:80;
    }
`

启动nginx,这也就实现了最简单的负载均衡

例如:请求http://localhost/service1/index.html,在nginx容器下没有service1/index.html的路劲,nginx就是根据上面的配置,将请求交给http://192.168.155.1:80处理

访问同一请求 负载均衡

即用户访问同一请求时,配置多台tomcat,由nginx随机将请求分给某一个tomcat

在nginx.conf的http模块中添加,服务器集群server cluster

`
    upstream interestCluster {
          server 192.168.155.1:80;
          server 192.168.155.2:80;
    }
`

在server模块中定义,负载均衡

`
    location ~ /service1/ {
      proxy_pass http://interestCluster ; #跟上面的集群名字一样
      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;
    }
`

以上配置,到达的效果就是,当你访问http://localhost/service1/index.html,在nginx容器下没有service1/index.html的路劲,nginx就是根据上面的配置,将请求交给http://192.168.155.1:80或者时http://192.168.155.2:80处理

以上配置两个tomcat均衡,你可以根据自己服务器硬件配置,来配置权重,继续修改nginx.conf

`
    upstream interestCluster {
          server 192.168.155.1:80;
          server 192.168.155.2:80 weight=2;
    }
`

即有三分之二的概率用到192.168.155.2,有三分之一的概率用到192.168.155.1

异常处理

worker_connections are not enough

从异常可以看出来,这是连接不够而引发的,通常我们会增大worker_processes参数,但是worker_processes与worker_connections 设置好合适大小,可以提示nginx处理性能,非常重要。

引用作者的原话

As a general rule you need the only worker with large number of worker_connections, say 10,000 or 20,000.
However, if nginx does CPU-intensive work as SSL or gzipping and you have 2 or more CPU, then you may
set worker_processes to be equal to CPU number.
Besides, if you serve many static files and the total size of the files is bigger than memory, then you may
increase worker_processes to utilize a full disk bandwidth.
Igor Sysoev
翻译:
一般一个进程足够了,你可以把连接数设得很大。(worker_processes: 1,worker_connections: 10,000)
如果有SSL、gzip这些比较消耗CPU的工作,而且是多核CPU的话,可以设为和CPU的数量一样。(worker_processes: CPU核心数)
或者要处理很多很多的小文件,而且文件总大小比内存大很多的时候,也可以把进程数增加,以充分利用IO带宽(主要似乎是IO操作有block)

worker_processes,工作进程数

  1. 默认:worker_processes: 1

  2. 调大:worker_processes: CPU核心数,(双核4线程,可以设置为4)
    worker_connections,单个工作进程可以允许同时建立外部连接的数量
    数字越大,能同时处理的连接越多

  3. 默认:worker_connections: 1024

  4. 调大:worker_connections: 100000,(调大到10万连接)

worker_connections解析

  1. connections不是随便设置的,而是与两个指标有重要关联,一是内存,二是操作系统级别的“进程最大可打开文件数”。
  2. 内存:每个连接数分别对应一个read_event、一个write_event事件,一个连接数大概占用232字节,2个事件总占用96字节,那么一个连接总共占用328字节,通过数学公式可以算出100000个连接数大概会占用 31M = 100000 * 328 / 1024 / 1024,当然这只是nginx启动时,connections连接数所占用的nginx。
  3. 进程最大可打开文件数:进程最大可打开文件数受限于操作系统,可通过 ulimit -n 命令查询,以前是1024,现在是65535,
    nginx提供了worker_rlimit_nofile指令,这是除了ulimit的一种设置可用的描述符的方式。 该指令与使用ulimit对用户的设置是同样的效果。此指令的值将覆盖ulimit的值,如:worker_rlimit_nofile 20960;
    设置ulimits:ulimit -SHn 65535
1
2
3
4
5
6
7
8
9
10
worker_processes 2; 
worker_rlimit_nofile 65535;
#pid logs/nginx.pid;
events {
worker_connections 65535;
}

http {
...
}

通过 ps -elf | grep nginx 找到 nginx 的worker进程ID
通过 cat /proc/31613/limits 查看,其中2291是worker进程ID,请注意其中的Max open files
nginx
从上面的分析可以看出nginx占用内存小,处理性能高,通过提高服务器的配置,Nginx可以应对更大的连接数