在正式提供服务的产品环境下,部署Nginx时都是使用一个master进程来管理多个worker 进程,一般情况下,worker进程的数量与服务器上的CPU核心数相等。每一个worker进程都是工作的,它们在提供互联网服务,master进程则只有一个任务,那就是负责监控管理worker 进程。worker进程之间通过共享内存、原子操作等一些进程间通信机制来实现负载均衡等功能。
由于master进程不会对用户请求提供服务,只用于管理真正提供服务的worker进程, 所以master进程可以是唯一的,它仅专注于自己的管理工作,为管理员提供命令行服务, 包括诸如启动服务、停止服务、重载配置文件、平滑升级程序等。master进程需要拥有较大 的权限,例如,通常会利用root用户启动master进程。worker进程的权限要小于或等于master 进程,这样master进程才可以完全地管理worker进程。当任意一个worker进程出现错误从而导致coredump时,master进程会立刻启动新的worker进程继续服务。
多个worker进程处理互联网请求不但可以提高服务的健壮性(一个worker进程出错后,其他worker进程仍然可以正常提供服务),最重要的是,这样可以充分利用现在常见的SMP多核架构,从而实现微观上真正的多核并发处理。因此,用一个进程(master进程)来处理互联网请求肯定是不合适的。另外,为什么要把worker进程数量设置得与CPU核心数量一致呢?这正是Nginx与Apache服务器的不同之处。在Apache上每个进程在一个时刻只处理一个请求,因此,如果希望Web服务器拥有并发处理的请求数更多,就要把Apache的进程或线程数设置得更多,通常会达到一台服务器拥有几百个工作进程,这样大量的进程间切换将带来无谓的系统资源消耗。而Nginx则不然,一个worker进程可以同时处理的请求数只受限于内存大小,而且在架构设计上,不同的worker进程之间处理并发请求时几乎没有同步锁的限制,worker进程通常不会进入睡眠状态,因此,当Nginx上的进程数与CPU核心数相等时(最好每一个worker进程都绑定特定的CPU核心),进程间切换的代价是最小的。
在这里插入图片描述
是否以守护进程方式运行Nginx
语法: daemon on|off;
默认: daemon on;
守护进程(daemon)是脱离终端并且在后台运行的进程。脱离终端是为了避免进程执行过程中的信息在任何终端上显示,这样一来,进程也不会被任何终端所产生的信息所打断。Nginx毫无疑问是一个需要以守护进程方式运行的服务,因此,默认都是以这种方式运行的。
不过Nginx还是提供了关闭守护进程的模式,之所以提供这种模式,是为了方便跟踪调 试Nginx,毕竟用gdb调试进程时最烦琐的就是如何继续跟进fork出的子进程了。
是否以master/worker方式工作
语法: master_process on|off;
默认: master_process on;
error日志的设置
语法: error_logpathfile level;
默认: error_log logs/error.log error;
是否处理几个特殊的调试点
语法: debug_points[stop|abort]
这个配置项也是用来帮助用户跟踪调试Nginx的。它接受两个参数:stop和abort。通常不会使用这个配置项。
仅对指定的客户端输出debug级别的日志
语法: debug_connection[IP|CIDR]
这个配置项实际上属于事件类配置,因此,它必须放在events{…}中才有效。它的值可 以是IP地址或CIDR地址。
限制coredump核心转储文件的大小
语法: worker_rlimit_core size;
指定coredump文件生成目录
语法: working_directory path;
worker_processes 4; worker_cpu_affinity 1000 0100 0010 0001;
注意 worker_cpu_affinity配置仅对Linux操作系统有效。Linux操作系统使用 sched_setaffinity()系统调用实现这个功能。
openssl engine -t
静态Web服务器的主要功能由ngx_http_core_module模块(HTTP框架的主要成员)实现, 当然,一个完整的静态Web服务器还有许多功能是由其他的HTTP模块实现的。
所有的HTTP配置项都必须直属于http块、server块、location块、upstream块或if块等 (HTTP配置项自然必须全部在http{}块之内,这里的“直属于”是指配置项直接所属的大括号 对应的配置块),同时,在描述每个配置项的功能时,会说明它可以在上述的哪个块中存 在,因为有些配置项可以任意地出现在某一个块中,而有些配置项只能出现在特定的块中。
Nginx为配置一个完整的静态Web服务器提供了非常多的功能,下面会把这些配置项分为以下8类进行详述:虚拟主机与请求的分发、文件路径的定义、内存及磁盘资源的分配、网络连接的设置、MIME类型的设置、对客户端请求的限制、文件操作的优化、对客户端请求的特殊处理。
由于IP地址的数量有限,因此经常存在多个主机域名对应着同一个IP地址的情况,这时 在nginx.conf中就可以按照server_name(对应用户请求中的主机域名)并通过server块来定义 虚拟主机,每个server块就是一个虚拟主机,它只处理与之相对应的主机域名请求。这样, 一台服务器上的Nginx就能以不同的方式处理访问不同主机域名的HTTP请求了。
监听端口
语法: listen port
默认 80
配置块: server
backlog=num :表示TCP中backlog队列的大小。默认为–1,表示不予设置。在TCP建 立三次握手过程中,进程还没有开始处理监听句柄,这时backlog队列将会放置这些新连接。 可如果backlog队列已满,还有新的客户端试图通过三次握手建立TCP连接,这时客户端将会 建立连接失败。
rcvbuf=size:设置监听句柄的SO_RCVBUF参数。
sndbuf=size:设置监听句柄的SO_SNDBUF参数。
accept_filter: 设置accept过滤器,只对FreeBSD操作系统有用。
deferred:在设置该参数后,若用户发起建立连接请求,并且完成了TCP的三次握手, 内核也不会为了这次的连接调度worker进程来处理,只有用户真的发送请求数据时(内核已 经在网卡中收到请求数据包),内核才会唤醒worker进程处理这个连接。这个参数适用于大 并发的情况下,它减轻了worker进程的负担。当请求数据来临时,worker进程才会开始处理 这个连接。只有确认上面所说的应用场景符合自己的业务需求时,才可以使用deferred配置。
bind:绑定当前端口/地址对,如127.0.0.1:8000。只有同时对一个端口监听多个地址时 才会生效。
ssl:在当前监听的端口上建立的连接必须基于SSL协议。
主机名称
server_name name[…];
默认: server_name"";
配置块: server
server_name后可以跟多个主机名称,如server_name www.a.com、 www.b.com;
在开始处理一个HTTP请求时,Nginx会取出header头中的Host,与每个server中的 server_name进行匹配,以此决定到底由哪一个server块来处理这个请求。有可能一个Host与 多个server块中的server_name都匹配,这时就会根据匹配优先级来选择实际处理的server块。 server_name与Host的匹配优先级如下:
1)首先选择所有字符串完全匹配的server_name,如www.a.com
2)其次选择通配符在前面的server_name,如*.a.com
3)再次选择通配符在后面的server_name,如www.a.* 。
4)最后选择使用正则表达式才匹配的server_name,如~^.testweb.com$。
如果Host与所有的server_name都不匹配,这时将会按下列顺序选 择处理的server块。
1)优先选择在listen配置项后加入[default|default_server]的server块
2)找到匹配listen端口的第一个server块
如果server_name后跟着空字符串(如server_name""