运行中nginx进程间的关系
在正式提供产品的环境下,部署nginx都是使用master进程来管理多个worker进程.
一般情况下,worker进程都与服务器上的核数相等,每一个worker进程都是繁忙的,它们真正的提供互联网服务.
而master进程则很清闲,只负责监控管理worker进程.
worker进程之间通过共享内存,原子操作等一系列进程之间的通讯来实现负载均衡
共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
部署后nginx进程之间的关系,如下图所示:
那么为什么要按照master-worker方式配置多个进程:有两点
1.master进程可以是唯一的,只专注于管理真正提供服务的worker进程
2.多个worker进程提高了服务的健壮性,还充分利用现有的smp架构(堆成多处理架构),从而实现真正的多核并发处理
那么为什么worker进程设计的与cpu核数一致吶,先要看看apache与nginx有什么不同之处:
apache一个进程处理一个请求,在大并发量的情况下,只能加大进程或者线程数,通常一台服务器几百个进程,大量进程切换带来无谓的系统资源消耗
nginx一个worker进程可处理的请求数只限制在内存的大小,不同的worker进程处理并发请求没有同步锁限制,worker进程不会睡眠,故设置worker进程与cpu核数一致,进程间切换代价是最小的.(即cpu是8核,worker进程设置为8个.)(补充知识:进程与CPU调度的关系,单个核心处理多个进程的时候,是排队处理的,所以将Worker进程数量设置超过核心数是没有太大意义的,会导致进程间切换额外开销)
Nginx配置的通用语法
nginx的配置文件其实是普通的文本文件,例:
user nobody; worker_processes 8; error_log varlog/nginx/error.log error; #pid logs/nginx.pid; events { use epoll; worker_connections 50000; } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr [$time_local] "$request" ' '$status $bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access.log main buffer=32k; … }
块配置项
块配置项由一个块配置项名和一对大括号组成。
events {… } http { upstream backend { server 127.0.0.1:8080; } gzip on; server { … location /webstatic { gzip off; } } }
块配置项可以嵌套。内层块直接继承外层块,例如,上例中,server块里的任意配置都是基于http块里的已有配置的。
当内外层块中的配置发生冲突时,究竟是以内层块还是外层块的配置为准,取决于解析这个配置项的模块,例如,上例
在http模块中已经打开了“gzip on;”,但其下的location/webstatic又把gzip关闭
了:gzip off;,最终,在/webstatic的处理模块中,gzip模块是按照gzip off来处理请求的。
配置项的语法格式
配置项名 配置项值 1 配置项值 2 … ;
配置项名后面用空格隔开---多项配置项值之间亦用空格隔开
注意:如果配置项值中包括语法符号,比如空格符,那么需要使用单引号或双引号
括住配置项值,否则Nginx会报语法错误。例如:
log_format main '$remote_addr - $remote_user [$time_local] "$request" ';
配置项的注释
如果有一个配置项暂时需要注释掉,那么可以加“#”注释掉这一行配置。例如:
#pid logs/nginx.pid;
配置项的单位
空间大小表示:
K或者k千字节(KiloByte,KB)。
M或者m兆字节(MegaByte,MB)。
例如:
gzip_buffers 4 8k; client_max_body_size 64M;
当指定时间时,可以使用的单位包括:
·ms(毫秒),s(秒),m(分钟),h(小时),d(天),w(周,包含7天),
M(月,包含30天),y(年,包含365天)。
例如:
expires 10y; proxy_read_timeout 600; client_body_timeout 2m;