一. nginx.conf 文件结构概述
在第一篇中讲到nginx的安装,安装完后,默认的nginx服务器配置文件都存在安装目录conf中,主配置文件名为nginx.conf。下面是我linux系统安装nginx的目录信息:
[root@xuegod64 nginx]# pwd /usr/local/nginx [root@xuegod64 nginx]# ls client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp
下面将说明nginx.conf原始文件中,各条语句的生效范围,对指令作用域有一个初步的了解。在nginx.conf文件结构中,最外层的花括号将内容整体分为两部分(event、http)。nginx.conf一共由三部分组成,分别为全局块、events块、http块。 在http块中,又包含http全局块、多个server块。每个server块中,可以包含server全局块和多个location块。在同一配置块中嵌入的配置块,各个之间不存在次序关系。
配置文件支持大量可配置的指令,绝大多数指令不是特定属于某一块的。同一个指令放在不同层级的块中,其作用域也不同。一般情况下,高一级块中的指令可以作用于自身所在的块和此块包含的所有低层级块。 如果某个指令在两个不同层级的块中同时出现,则采用"就近原则,即以较低层级的块中的配置为准。
下面是一个nginx.conf简单的配置示例:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#user nobody; user nginx nginx; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; #以上是全局块 events { worker_connections 1024; } #以上是events块 #最后是http块,里面包括location块 http { include mime.types; default_type application/octet-stream; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; if ($request_uri ~* \.html$) { proxy_pass http://htmlservers; } if ($request_uri ~* \.aspx$){ proxy_pass http://aspxservers; } proxy_pass http://picservers; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } upstream htmlservers{ server 192.168.2.50:80; server 192.168.2.51:80; } upstream aspxservers{ server 192.168.2.50:80; server 192.168.2.51:80; } upstream picservers{ server 192.168.2.50:80; server 192.168.2.51:80; } }
1. 全局块
全局块是默认配置文件从开始到events块之间的一部份内容,主要设置一些影响nginx服务器整体运行的配置指令,因此这些指令作用域是nginx服务器全局。通常包括配置运行nginx服务器的用户(组),允许生成的worker process数、nginx进程pid存放路径、日志的存放路径和类型以及配置文件引入等。
2. events块
events块涉及的指令主要影响nginx服务器与用户的网络连接,常用到的设置包括是否开启对多worker process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型处理连接请求,每个worker process可以同时支持的最大连接数。这一块对nginx服务器的性能影响较大,应该根据实际情况灵活调整。
3. http块
http块是nginx服务器配置中重要部分,代理、缓存和日志定义等绝大多数的功能和第三方模块的配置都可以放在这个模块中。可以在http全局块中配置的指令包括文件引入、mime-type定义、日志自定义、是否使用sendfile转输文件、连接超时时间、单连接请求数上限等。
4.server块
配置虚拟主机的相关参数,一个http中可以有多个server。server块和"虚拟主机"的概述有密切联系,虚拟主机又称虚拟服务器或虚拟机。例如使用VMware来虚拟一个主机。对外表现为多个服务器。从用户角度来看,一台虚拟主机和一台独立的硬件主机是完全一样的。前面提过每一个http块可以包含多个server块,而每个server块就相当于一台虚拟主机,它内部可有多台主机联合提供服务,一起对外提供在逻辑上关系密切的一组服务(或网站)。
和http块相同,server块也可以包含自己的全局块,同时可以包含多个location块,在server全局块中,最常见的两个配置项是本虚拟主机的监听配置和本虚拟主机的名称或ip配置。
5. location块
用于配置请求的路由,以及各种页面的处理情况。每个server块中可以包含多个location块,location是server块的一个指令,由于在整个nginx配置中起着重要的作用,而且许多功能上灵活性往往在location指令的配置中体现出来,所以单独列为一个"块"。 这些location块的主要作用是,基于nginx服务器接收到的请求字符串(例如:server_name 或 url_string),对除虚拟主机名称(或ip) 之外的字符串如url_stirng进行匹配,对特定的请求进行处理。地址定向、数据缓存、和应答控制等功能都是在这部分实现,许多第三方模块的配置也是在location块中提供功能。
二. 全局块指令配置
2.1 运行Nginx服务器用户(组) user指令
该指令配置属于全局块,在文件的第一行,默认是user nobody。该user指令的语法格式为:
user 用户 [用户组];
用户:是指定可以运行nginx服务器的用户。用户组:是可选项,指定可以运行nginx服务器的用户组。只有被设置的用户或者用户组成员才有权限启动nginx进程。如果希望所有用户可以启动Nginx进程,可以注释掉user指令。下面是user指令,指定nginx用户和nginx用户组。第一行#表示已注释,不生效。
#user nobody;
user nginx nginx;
在nginx.conf配置文件中,每一条指令配置都必须以分号结束。
2.2 允许生成的工作进程数 worker_processes指令
worker process是nginx服务器实现并发处理服务(网站)的关键所在。理念上讲,值越大,可以支持的并发处理量也越多。但实现受限于软件本身、操作系统资源。一般建议启动的工作进程数,通常设置成和cpu核数相等。该worker process指令的语法格式为:
worker_processes number | auto;
number:指定nginx进程最多可以产生的进程数。auto:自动检测。下面是worker_processes指令,指定一个进程数:
worker_processes 1;
当启动nginx服务器后,可以查看nginx服务器除了主进程master process之处,还生成了一个worker process:
[root@xuegod64 nginx]# ps -ef | grep nginx root 5454 1 0 1月03 ? 00:00:00 nginx: master process ./nginx -c /usr/local/nginx/conf/nginx.conf nginx 5455 5454 0 1月03 ? 00:00:00 nginx: worker process root 19141 2678 1 10:34 pts/0 00:00:00 grep --color=auto nginx
2.3 nginx进程存放路径 PID指令
nginx进程作为系统的守护进程运行,需要在某文件中保存当前运行程序的主进程号。nginx支持对它的存放路径进行自定义配置。该pid指令语法格式为:
pid file;
file:指定存放路径和文件名称。配置文件默认将此文件存放在nginx安装目录logs下,名字为nginx.pid。file可以是相对路径,注意file除了路径一定要指定文件名。下面是pid指令的配置路径存放于安装目录logs文件夹下:
pid logs/nginx.pid;
2.4 错误日志的存放路径 error_log指令
在全局块、http块、server块都可以对nginx服务器的日志进行相关配置。这里首先介绍全局块下日志的存放配置,另二块配置基本相同,只是作用域不同。该error_log指令语法格式为:
error_log file | level [debug | info |notice |warn | error| crit | alert| emerg];
nginx服务器日志支持输出到某一固定的文件file 以及level日志级别。日志的级别是可选项,由低到高,级别越高记录的信息越少, 比如设置了warn级别后,级别为warn、error、crit、alert、emerg的日志都会被记录下来。生产场景一般是 warn | error | crit 这三个级别之一。下面看一个配置实例,也是nginx默认的日志存放路径和默认日志级别设置:
error_log logs/error.log error;
注意指定的文件对于运行nginx进程的用户具有写权限,否则在启动ningx进程时会报错(/nginx/logs/error.log permission denied)。
三. events块指令配置
3.1 最大连接数worker_connections指令
该指令用来设置允许每一个worker process同时开启的最大连接数。number默认值是1024。这个number不仅仅包括和前端用户建立的连接数,而是包括所有可能的连接数。该worker_connections指令语法格式为:
worker_connections number;
3.2 事件驱动模型 use指令
nginx服务器提供了多种事件驱动模型来处理网络消息,可以使用user指令来指定某一事件驱动模型。后面再详细介绍。 user指令语法结构为:
use select | poll | kqueue | epoll | rtsig | /dev/poll | eventport;
3.3 是否允许同时接收多个网络连接 multi_accept 指令
每个nginx服务器的worker_process都有能力同时接收多个新到达的网络连接,但是这需要在配置文件中进行设置,默认是关闭。当指令默认为关闭状态,即每个worker_process一次只能接收一个新到达的网络连接。 该multi_accept 指令语法结构为:
multi_accept on | off
3.4 设置网络连接的序列化 accept_mutex指令
这里涉及到一个名词"惊群"。惊群(thundering herd problem) 大意是:当某一时候只有一个网络连接到来时,多个睡眠进程会被同时叫醒,但只有一个进程可获得连接。如果每次唤醒的进程数目太多,会影响一部分系统性能。在nginx服务器的多进程下,有可能出现这样的问题。
为了解决这样的问题,nginx配置中包含了这样一条指令accept_mutex。当设置为开启的时候会对多个nginx进程接收连接进行序列化,防止多个进程对连接的争抢。默认为开启状态。其语法结构为:
accept_mutex on | off;
本篇最后先展示nginx.conf配置文件的全局块和event块的指令条数示例:
user nginx nginx; worker_processes 1; pid logs/nginx.pid; error_log logs/error.log error; #制定日志路径,级别。这个设置可以放入全局块,http块,server块 events { accept_mutex on; #默认为on multi_accept on; #默认为off use epoll; #事件驱动模型 worker_connections 1024; #最大连接数 }
参考文献:
Nginx高性能Web服务器详解