目录
一、Master&Worker
首先我们需要Nginx中是有两个进程,一个是Master,一个是Worker;字面意思来看master就是主,也就是Nginx的管理员,而Worker就是实际的工作者。master接收到信号,传达给worker,由worker去工作;而一个Nginx中可以有许多个worker。
[root@localhost ~]# cd /usr/local/nginx/sbin/
[root@localhost sbin]# ./nginx
[root@localhost sbin]# ps -ef | grep nginx
root 3353 2456 0 22:33 ? 00:00:00 nginx: master process ./nginx
nobody 3355 3353 0 22:33 ? 00:00:00 nginx: worker process
root 3368 3045 0 22:33 pts/0 00:00:00 grep --color=auto nginx
具体worker如何工作呢?如下图所示 ;首先Client发出请求,请求到达Nginx后由master检测到,master在下发信号给worker,但是一个Nginx中不止一个worker,当worker收到消息后会争抢这个请求,争抢到后再做具体的事情。(Nginx不支持JAVA,所以如果需要使用JAVA,则需要配合使用Tomcat)
优势:
- 可以使用热部署(./nginx -s reload),利用Nginx进行热部署操作。因为一般在实际项目中,一个Nginx服务器中可能会有多个服务在运行,显然不可能停止Nginx。当其中有一个worker已经有任务时,使用重新加载Nginx命令,这样这个有任务的worker不会进行重置,其他没有任务的Nginx将会进行重新加载,当下次有新的任务时其余worker进行争抢。
- 一个Nginx下有多个worker,多个worker之间都是独立的进程,每个worker都互不影响,当一个worker挂掉之后还可以有其他worker进行争抢,实现请求过程,不会造成服务终端,这就大大提升了可靠性。
多少个worker合适?
Nginx 同 redis 类似都采用了 io 多路复用机制,每个 worker 都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话下。每个 worker 的线程可以把一个 CPU 的性能发挥到极致。所以 worker 数和服务器的 CPU 数相等是最为适宜的 。设少了会浪费CPU,设多了会造成 CPU 频繁切换上下文带来的损耗。
设置worker数量:
worker_processes 4
#work 绑定 cpu(4 work 绑定 4cpu)。
worker_cpu_affinity 0001 0010 0100 1000
#work 绑定 cpu (4 work 绑定 8cpu 中的 4 个) 。
worker_cpu_affinity 0000001 00000010 00000100 00001000
连接数worker_connection
这个值是表示每个 worker 进程所能建立连接的最大值,所以,一个 nginx 能建立的最大连接数,应该是 worker_connections * worker_processes。
客户端发送一个请求,占用了 woker 的几个连接数?答案是2 或者 4 个。如果是静态资源,客户端发出请求,而Nginx服务器就可以直接进行回复,所以这是两个连接数;当客户端访问动态资源时,Nginx服务器需要和后方的Tomcat、数据库等其他后端服务器产生交互,这就需要额外的两个连接数。
所以普通的静态访问最大并发数是:worker_connections * worker_processes /2,而如果是 HTTP 作为 Reverse proxy 来说,最大并发数量应该是 worker_connections * worker_processes/4。
二、配置文件
[root@localhost conf]# grep -Ev "^$|#" nginx.conf
worker_processes 1; //worker的数量
events {
worker_connections 1024; //每个worker的最大连接数
}
http {
include mime.types; //http模块为实现服务配合模块,可以包含多个server模块
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name 192.168.73.128;
location /www/ {
root /data/;
index index.html index.htm;
}
location /image/ {
root /data/;
autoindex on;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}