Nginx的基本配置
这是一篇关于Nginx基本配置的Blog
Nginx基本配置的位置
默认的Nginx服务器配置文件都存放在安装目录conf中,主配置文件名为nginx.conf。
nginx.conf文件的结构
nginx.conf一共由三部分组成,分别为全局块、events块和http块。在http块中,又包含http全局块、多个server块。每个server块中,可以包含server全局块和多个location块。在同一配置块中嵌套的配置块,各个之间不存在次序关系。
- 全局块
- 全局块是默认配置文件从开始到events块之间的一部分内容,主要设置一些影响Nginx服务器整体运行的配置指令,因此,这些指令的作用域是Nginx服务器全局。
- 通常包括配置运行Nginx服务器的用户(组)、允许生成的worker process数、Nginx进程PID存放路径、日志的存放路径和类型以及配置文件引入等。
- events块
- events块涉及的指令主要影响Nginx服务器与用户的网络连接。常用到的设置包括是否开启对多worker process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型处理连接请求,每个worker process可以同时支持的最大连接数等。这一部分的指令对Nginx服务器的性能影响较大,在实际配置中应该根据实际情况灵活调整。
- http块
- http块是Nginx服务器配置中的重要部分,代理、缓存和日志定义等绝大多数的功能和第三方模块的配置都可以放在这个模块中。
- http块中可以包含自己的全局块,也可以包含server块,server块中又可以进一步包含location块,在本书中我们使用“http全局块”来表示http中自己的全局块,即http块中不包含在server块中的部分。
- 可以在http全局块中配置的指令包括文件引入、MIME-Type定义、日志自定义、是否使用sendfile传输文件、连接超时时间、单连接请求数上限等。
- server块
- 每一个http块都可以包含多个server块,而每个server块就相当于一台虚拟主机,它内部可有多台主机联合提供服务,一起对外提供在逻辑上关系密切的一组服务(或网站)。
- 和http块相同,server块也可以包含自己的全局块,同时可以包含多个location块。在server全局块中,最常见的两个配置项是本虚拟主机的监听配置和本虚拟主机的名称或IP配置。
- location块
- 每个server块中可以包含多个location块。从严格意义上说,location其实是server块的一个指令,这些location块的主要作用是,基于Nginx服务器接收到的请求字符串,对除虚拟主机名称之外的字符串进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能都是在这部分实现。许多第三方模块的配置也是在location块中提供功能。
Nginx服务基本配置
全局块配置
- 配置运行Nginx服务器用户(组)
- 语法:user username[groupname];
- 默认:user nobody nobody;
- 只有被设置的用户或者用户组成员才有权限启动Nginx进程,如果是其他用户(test_user)尝试启用Nginx进程,就会报错。默认是表示所有用户都可以启动,还有如果注释掉也是所有用户都能启动。
- 配置允许生成的worker process数
- 语法:worker_processes number;
- 默认:worker_processes 1;
- worker process是Nginx服务器实现并发处理服务的关键所在。从理论上来说,worker process的值越大,可以支持的并发处理量也越多,但实际上它还要受到来自软件本身、操作系统本身资源和能力、硬件设备(如CPU和磁盘驱动器)等的制约。
- 是否以守护进程方式运行Nginx
- 语法:daemon [on | off];
- 默认:daemon on;
- 守护进程(daemon)是脱离终端并且在后台运行的进程。它脱离终端是为了避免进程执行过程中的信息在任何终端上显示,这样一来,进程也不会被任何终端所产生的信息所打断。
- 配置Nginx进程PID存放路径
- 语法:pid path/file;
- 默认:pid logs/nginx.pid;
- 配置文件默认将此文件存放在Nginx安装目录logs下,名字为nginx.pid。path可以是绝对路径,也可以是以Nginx安装目录为根目录的相对路径。在指定[path]的时候,一定要包括文件名,如果只设置了路径,没有设置文件名,则会报错。
- 配置错误日志的存放路径
- 语法:error_log/path/file level;
- 默认:error_log logs/error.log error;
- 在全局块、http块和server块中都可以对Nginx服务器的日志进行相关配置。这里首先介绍全局块下日志的存放配置,后两种情况的配置基本相同,只是作用域不同。
- /path/file也可以是/dev/null,这样就不会输出任何日志了,这也是关闭error日志的唯一手段;/path/file也可以是stderr,这样日志会输出到标准错误文件中。
- level是日志的输出级别,取值范围是debug、info、notice、warn、error、crit、alert、emerg,从左至右级别依次增大。当设定为一个级别时,大于或等于该级别的日志都会被输出到/path/file文件中,小于该级别的日志则不会输出。例如,当设定为error级别时,error、crit、alert、emerg级别的日志都会输出。如果设定的日志级别是debug,则会输出所有的日志,这样数据量会很大,需要预先确保/path/file所在磁盘有足够的磁盘空间。
- 此指令可以在全局块、http块、server块以及location块中配置。
- 嵌入其他配置文件
- 语法:include/path/file;
- include配置项可以将其他配置文件嵌入到当前的nginx.conf文件中,它的参数既可以是绝对路径,也可以是相对路径(相对于Nginx的配置目录,即nginx.conf所在的目录),参数的值可以是一个明确的文件名,也可以是含有通配符*的文件名,同时可以一次嵌入多个配置文件。
events块配置
- 设置网络连接的序列化
- 语法:accept_mutex [on | off]
- 默认:accept_mutext on;
- accept_mutex是Nginx的负载均衡锁,这把锁可以让多个worker进程轮流地、序列化地与新的客户端建立TCP连接。防止多个进程对连接的争抢,当某一个worker进程建立的连接数量达到worker_connections配置的最大连接数的7/8时,会大大地减小该worker进程试图建立新TCP连接的机会,以此实现所有worker进程之上处理的客户端请求数尽量接近。
- accept锁默认是打开的,如果关闭它,那么建立TCP连接的耗时会更短,但worker进程之间的负载会非常不均衡,因此不建议关闭它。
- 设置是否允许同时接收多个网络连接
- 语法:multi_accept[on | off];
- 默认:multi_accept off;
- 每个Nginx服务器的worker process都有能力同时接收多个新到达的网络连接,但是这需要在配置文件中进行设置,此指令默认为关闭(off)状态,即每个worker process一次只能接收一个新到达的网络连接。
- 事件驱动模型的选择
- 语法:use[kqueue | rtsig | epoll | /dev/poll | select | poll | eventport];
- 默认:Nginx会自动使用最适合的事件模型。
- 对于Linux操作系统来说,可供选择的事件驱动模型有poll、select、epoll三种。epoll当然是性能最高的一种。
- 每个worker的最大连接数
- 语法:worker_connections number;
- 指令worker_connections主要用来设置允许每一个worker process同时开启的最大连接数。
- 此指令的默认设置为512。
- 指定Nginx worker进程可以打开的最大句柄描述符个数
- 语法:worker_rlimit_nofile limit;
- 限制信号队列
- 语法:worker_rlimit_sigpending limit;
- 绑定Nginx worker进程到指定的CPU内核
- 语法:worker_cpu_affinity cpumask[cpumask…]
- 为什么要绑定worker进程到指定的CPU内核呢?假定每一个worker进程都是非常繁忙的,如果多个worker进程都在抢同一个CPU,那么这就会出现同步问题。反之,如果每一个worker进程都独享一个CPU,就在内核的调度策略上实现了完全的并发。
- 注意:worker_cpu_affinity配置仅对Linux操作系统有效。Linux操作系统使用sched_setaffinity()系统调用实现这个功能。
- SSL硬件加速
- 语法:ssl_engine device;
- 如果服务器上有SSL硬件加速设备,那么就可以进行配置以加快SSL协议的处理速度。用户可以使用OpenSSL提供的命令来查看是否有SSL硬件加速设备:
openssl engine -t
- Nginx worker进程优先级设置
- 语法:worker_priority nice;
- 默认:worker_priority 0;
- 在Linux或其他类UNIX操作系统中,当许多进程都处于可执行状态时,将按照所有进程的优先级来决定本次内核选择哪一个进程执行。进程所分配的CPU时间片大小也与进程优先级相关,优先级越高,进程分配到的时间片也就越大。
http块
- 配置了用于处理前端请求的MIME类型
- 语法:default_type mine-type;
- mime-type为types块中定义的MIME-type,如果不加此指令,默认值为text/plain。此指令还可以在http块、server块或者location块中进行配置。
- 自定义服务日志
- Nginx服务器支持对服务日志的格式、大小、输出等进行配置,需要使用两个指令,分别是access_log和log_format指令。
- 语法:access_log path [format [buffer=size ] ];
- 默认:access_log logs/access.log combined;
- 此指令可以在http块、server块或者location块中进行设置。combined为log_format指令默认定义的日志格式字符串的名称。
- 和access_log联合使用的另一个指令是log_format,它专门用于定义服务日志的格式,并且可以为格式字符串定义一个名字,以便access_log指令可以直接调用。
- 语法:log_format name string …;
- name,格式字符串的名字,默认的名字为combined。
- string,服务日志的格式字符串。在定义过程中,可以使用Nginx配置预设的一些变量获取相关内容,变量的名称使用双引号括起来,string整体使用单引号括起来。
- 此指令只能在http块中进行配置。
- 配置允许sendfile方式传输文件
- 语法:sendfile on [| off];
- 默认:sendfile on;
- 此指令用于开启或者关闭使用sendfile()传输文件,默认值为off,可以在http块、server块或者location块中进行配置。
- 配置连接超时时间
- 语法:keepalive_timeout timeout header_timeout;
- timeout,服务器端对连接的保持时间。默认值为75s。
- header_timeout,可选项,在应答报文头部的Keep-Alive域设置超时时间:“Keep-Alive:timeout= header_timeout”。
- 此指令可以在http块、server块或location块中配置。
- 单连接请求数上限
- 语法:keepalive_requests number;
- 此指令还可以出现在server块和location块中,默认设置为100。
配置server块
- 监听端口
- 语法:listen address:port default[(deprecated in0.8.21) |default_server | backlog=num | rcvbuf=size | sndbuf=size | accept_filter=filter | deferred | bind | ipv6only=on | off | ssl];
- 默认:listen 80;
- listen参数决定Nginx服务如何监听端口。在listen后可以只加IP地址、端口或主机名,非常灵活。
- 主机名称
- 语法:server_name name …;
- 默认:server_name “”;
- server_name后可以跟多个主机名称,如server_name www.123.com、download.ab.com。
- location
- 语法:location = [| ~ | ~* | ^~ | @ /uri/ {…}];
- location会尝试根据用户请求中的URI来匹配上面的/uri表达式,如果可以匹配,就选择location{}块中的配置来处理用户请求。
- 以root方式设置资源路径
- 语法:root path;
- 默认:root html;
- 此指令还可以出现在server块、location块和http块。
- 访问首页
- 语法:index file…;
- 默认:index index.html;
- 有时,访问站点时的URI是/,这时一般是返回网站的首页,而这与root和alias都不同。这里用ngx_http_index_module模块提供的index配置实现。index后可以跟多个文件参数,Nginx将会按照顺序来访问这些文件。
配置location块
- 以alias方式设置资源路径
- 语法:alias path;
- alias也是用来设置文件资源路径的,它与root的不同点主要在于如何解读紧跟location后面的uri参数,这将会致使alias与root以不同的方式将用户请求映射到真正的磁盘文件上。
- 按HTTP方法名限制用户请求
- 语法:limit_except method…{…}
- Nginx通过limit_except后面指定的方法名来限制用户请求。方法名可取值包括:GET、HEAD、POST、PUT、DELETE、MKCOL、COPY、MOVE、OPTIONS、PROPFIND、PROPPATCH、LOCK、UNLOCK或者PATCH。
- 注意,允许GET方法就意味着也允许HEAD方法。
- DNS解析地址
- 语法:resolver address…;
- 设置DNS名字解析服务器的地址。
- 此指令还可以出现在server块和http块。
- DNS解析的超时时间
- 语法:resolver_timeout time;
- 默认:resolver_timeout 30s; -此指令还可以出现在server块和http块。
- 返回错误页面时是否在Server中注明Nginx版本
- 语法:server_tokens [on | off];
- 默认:server_tokens on;
- 表示处理请求出错时是否在响应的Server头部中标明Nginx版本,这是为了方便定位问题。
- 此指令还可以出现在server块和http块。
结束语
以上就是Nginx的一些基本配置,其中有一些配置并没有归纳在上面。