1、nginx.conf文件的结构
nginx.conf一共由三部分组成,分别为全局块、events块和http块。在http块中又包含http全局块、多个server块。每个server块中又包含server全局块和多个location块。在同一配置块中嵌套的配置块、各个之间不存在次序关系。
配置文件支持大量可配置指令,绝大多数指令不是特定属于某一个块的。同一个指令放在不同层级的块中,其作用域也不同,一般情况下,高一级块中的指令可以作用于自身所在的块和此块包含的所有低层级块。如果某个指令在两个不同层级的块中同时出现,则采用“就近原则”,即以较低层级块中的配置为准。
2、配置运行Nginx服务器用户(组)
用于配置运行Nginx服务器用户(组)的指令是user,其语法格式为:
user user [group];
user:指定可以运行Nginx服务器的用户。
group:可选项,指定可以运行Nginx服务器的用户组。
只有被设置的用户或者用户组成员才有权限启动Nginx进程,如果是其他用户尝试启动Nginx进程,将会报错。
如果希望所有用户都可以启动Nginx进程,有两种办法:一是将此指令行注释掉;二是将用户(和用户组)设置为nobody。user指令只能在全局快中配置。
3、配置允许生成的worker process数
配置允许生成的worker process数的指令是worker_processes,其语法格式为:
worker_processes number | auto;
number:指定Nginx进程最多可以产生的worker process数。
auto:设置此值,Nginx进程将自动检测。
此指令只能在全局块中设置。
4、配置Nginx进程PID存放路径
Nginx进程作为系统的守护进程运行,我们需要在某文件中保存当前运行程序的主进程号。Nginx支持对它的存放路径进行自定义配置,指令是pid,其语法格式为:
pid file;
其中,file指定存放路径和文件名称。
配置文件默认将此文件存放在Nginx安装目录logs下,名字为nginx.pid。path可以是绝对路径,也可以是以Nginx安装目录为根目录的相对路径。此指令只能在全局块中进行配置。
5、配置错误日志的存放路径
在全局块、http块和server块中都可以对Nginx服务器的日志进行相关配置。使用的指令是error_log,其语法结构为:
error_log file | stderr [debug | info | notice | warn | error | crit | alert | emerg];
从语法结构可以看到,Nginx服务器的日志支持输出到某一个固定的文件file或者输出到标准错误输出stderr;日志级别是可选项,由低到高分为debug、info、notice、warn、error、crit、alert、emerg等。需要注意的是,设置某一级别后,比这一级别高的日志也会被记录。
6、配置文件的引入
在一些情况下,我们可能需要将其他的Nginx配置或者第三方模块的配置引用到当前的主配置文件中。Nginx提供了include指令来完成配置文件的引入,其语法结构为:
include file;
其中,file是要引入的配置文件,它支持相对路径。此指令可以放在配置文件的任意地方。
7、设置网络连接的序列化
为了解决某一时刻只有一个网络连接到来时,多个睡眠进程同时被唤醒的问题,Nginx配置中包含了这样一条指令accept_mutex,当其设置为开启的时候,将会对多个Nginx进程接收连接进行序列化,防止多个进程对连接的争抢。其语法结构为:
accept_mutex on | off;
此指令默认为开启(on)状态,其只能在events块中进行配置。
8、设置是否允许同时接收多个网络连接
每个Nginx服务器的worker process都有能力同时接收多个新到达的网络连接,但是这需要在配置文件中进行设置,其指令为multi_accept,语法结构为:
multi_accept on | off;
此指令默认为关闭(off)状态,即每个worker process一次只能接收一个新到达的网络连接。此指令只能在events块中进行配置。
9、事件驱动模型的选择
Nginx服务器提供了多种事件驱动模型来处理网络消息。配置文件中为我们提供了相关的指令来强制Nginx服务器选择哪种事件驱动模型进行消息处理,指令为use,语法结构为:
use method;
其中,method可选择的内容有:select、poll、kqueue、epoll、rtsig、/dev/poll以及eventport。此指令只能在events块中进行配置。
10、配置最大连接数
指令worker_connections主要用来设置允许每一个worker process同时开启的最大连接数。其语法结构为:
worker_connections number;
此指令的默认设置为512.此指令只能在events块中进行配置。
11、定义MIME-Type
我们知道,在常用的浏览器中,可以显示的内容有HTML、XML、GIF及Flash等种类繁多的文本、媒体等资源,浏览器为区分这些资源,需要使用MIME Type。换言之,MIME Type是网络资源的媒体类型。Nginx服务器作为Web服务器,必须能够识别前端请求的资源类型。
在默认的Nginx配置文件中,我们看到在http全局块中有以下两行配置:
include mime.types;
default_type application/octet-stream;
第一行从外部引入mime.types文件,其包含了浏览器能够识别的MIME类型以及对应于相关类型的文件后缀名。
第二行中使用指令default_type配置了用于处理前端请求的MIME类型,其语法结构为:
default_type mime-type;
其中,mime-type为mime.types文件中定义的MIME-Type,如果不加此指令,默认值为text/plain。此指令还可以在http块、server块或者location块中进行配置。
12、自定义服务日志
在全局块中,我们介绍过error_log指令,其用于配置Nginx进程运行时的日志存放和级别,此处所指的日志与常规的不同,它是指记录Nginx服务器提供服务过程应答前端请求的日志,我们将其称为服务日志以示区分。
Nginx服务器支持对服务日志的格式、大小、输出等进行配置,需要使用两个指令,分别为access_log和log_format指令。
access_log指令的语法结构为:
access_log path [format [buffer=size]];
path:配置服务日志的文件存放的路径和名称。
format:可选项,自定义服务日志的格式字符串,也可以通过“格式串的名称”使用log_format指令定义好的格式。“格式串的名称”log_format指令中定义。
size:配置临时存放日志的内存缓存区大小。
此指令可以在http块、server块或者location块中进行设置。
如果要取消记录服务日志的功能,则使用:
access_log off;
和access_log联合使用的另一个指令是log_format,它专门用于定义服务日志的格式,并且可以为格式字符串定义一个名字,以便access_log指令可以直接调用。其语法格式为:
log_format name string ... ;
name:格式字符串的名字,默认的名字为combined。
string:服务日志的格式字符串。在定义过程中,可以使用Nginx配置预设的一些变量获取相关内容,变量的名称使用双引号括起来,string整体使用单引号括起来。
13、配置允许sendfile方式传输文件
在Apache、lighttd等Web服务器配置中,都有和sendfile相关的配置,这里主要学习一下配置sendfile传输方式的相关指令sendfile和sendfile_max_chunk以及它们的语法结构:
sendfile on | off;
用于开启或者关闭使用sendfile()传输文件,默认值为off,可以在http块、server块或者location块中进行配置。
sendfile_max_chunk size;
其中,size值如果大于0,Nginx进程的每个worker process每次调用sendfile()传输的数据量最大不能超过这个值;如果设置为0,则无限制,默认值为0。此指令可以在http块、server块或location块中配置。
14、配置连接超时时间
与用户建立会话连接后,Nginx服务器可以保持这些连接打开一段时间,指令keepalive_timeout就是用来设置此时间的,其语法结构是:
keepalive_timeout timeout [header_timeout];
timeout:服务器端对连接的保持事件。默认值为75S。
header_timeout:可选项,在应答报文头部的Keep-Alive域设置超时事件:"Keep-Alive: timeout=header_timeout"。
此指令可以在http块、server块或location块中配置。
15、单连接请求数上限
Nginx服务器端和用户端建立会话连接后,用户端通过此连接发送请求。指令keepalive_requests用于限制用户通过某一连接向Nginx服务器发送请求的次数。其语法结构为:
keepalive_requests number;
此指令还可以出现在server块和location块中,默认设置为100。
16、配置网络监听
配置监听使用指令listen,其配置方法主要有三种,我们先分别介绍三种配置的语法结构,然后统一介绍涉及的相关变量和标识符。
第一种配置监听的IP地址,语法结构为:
listen address[:port] [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [deferred] [accept_filter=filter] [bind] [ssl];
第二种配置监听端口,其语法结构是:
listen port [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [deferred] [accept_filter=filter] [bind] [ipv6only=on|off] [ssl];
第三种配置UNIX Domain Socket(一种在原有Socket框架上发展起来的IPC机制,用于在单个主机上执行客户/服务器通信),其语法结构为:
listen unix:path [default_server] [backlog=number] [rcvbuf=size] [sndbuf=size] [deferred] [accept_filter=filter] [bind] [ssl];
address:IP地址,如果是IPv6的地址,需要使用中括号括起来。
port:端口号,如果只定义了IP地址没有定义端口号,就使用80端口。
path:socket文件路径。
default_server:标识符,将此虚拟主机设置为address:port的默认主机。
setfib=number:Nginx-0.8.44中使用这个变量为监听socket关联路由表,目前只对FreeBSD起作用,不常用。
backlog=number:设置监听函数listen()最多允许多少网络连接同时处于挂起状态,在FreeBSD中默认为-1,其他平台默认为511.
rcvbuf=size:设置监听socket接收缓存区大小。
sndbuf=size:设置监听socket发送缓存区大小。
deferred:标识符,将accept()设置为Deferred模式。
accept_filter=filter:设置监听端口对请求的过滤,被过滤的内容不能被接收和处理。本指令只在FreeBSD和NetBSD 5.0+平台下有效。filter可以设置为dataready和httpready。
bind:标识符,使用独立的bind()处理此address:port;一般情况下,对于端口相同而IP地址不同的多个连接,Nginx服务器将只使用一个监听命令,并使用bind()处理端口相同的所有连接。
ssl:标识符,设置会话连接使用SSL模式进行,此标识符和Nginx服务器提供的HTTPS服务有关。
listen指令的使用看起来比较复杂,但其实在一般的使用过程中,相对来说比较简单,默认的设置为:
listen *:80 | *:8000;
17、基于名称的虚拟主机配置
这里的“主机”,就是指此server块对外提供的虚拟主机。设置了主机的名称并配置好DNS,用户就可以使用跟这个名称向此虚拟主机发送请求了。配置主机名称的指令为server_name,其语法结构为:
server_name name ... ;
对于name来说,可以只有一个名称,也可以有多个名称并列,之间用空格隔开。
18、基于IP的虚拟主机配置
Linux操作系统支持IP别名的添加。配置基于IP的虚拟主机,即为Nginx服务器提供的每台虚拟主机配置一个不同的IP,因此需要将网卡设置为同时能够监听多个IP地址,在Linux平台中可以使用ifconfig工具为同一块网卡添加多个IP别名。
为网卡设置好别名以后,就可以为Nginx服务器配置基于IP的虚拟主机了。使用的指令和配置基于名称的虚拟主机的指令是相同的,即server_name,语法结构也相同。而且不需要考虑通配符或者正则表达式的问题。
19、配置location块
在Nginx的官方文档中定义的location的语法结构为:
location [= | ~ | ~* | ^~] uri {...}
其中,uri变量是待匹配的请求字符串,可以是不含正则表达式的字符串,也可以是包含正则表达式的字符串。为了下文叙述方便,我们约定,不含正则表达式的uri称为“标准uri”,使用正则表达式的uri称为“正则uri”。
其中方括号里的部分,是可选项,用来改变请求字符串与uri的匹配方式。在不添加此选项时,Nginx服务器首先在server块的多个location块中搜索是否有标准uri和请求字符串匹配,如果有多个可以匹配,就记录匹配度最高的一个。然后,服务器再用location块中的正则uri和请求字符串匹配,当第一个正则uri匹配成功,结束搜索,并使用这个location块处理此请求;如果正则匹配全部失败,就使用刚才记录的匹配度最高的location块处理此请求。
“=”:用于标准uri前,要求请求字符串与uri严格匹配。如果已经匹配成功,就停止继续向下搜索并立即处理此请求。
“~”:用于表示uri包含正则表达式,并且区分大小写。
“~*”:用于表示uri包含正则表达式,并且不区分大小写。
“^~”:用于标准uri前,要求Nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配。
20、配置请求的根目录
Web服务器接收到网络请求后,首先要在服务器端指定目录中寻找请求资源。在Nginx服务器中,指令root就是用来配置这个根目录的,其语法结构为:
root path;
其中,path为Nginx服务器接收到请求以后查找资源的根目录路径。path变量中可以包含Nginx服务器预设的大多数变量,只有$decument_root和$realpath_root不可以使用。
此指令可以在http块、server块或者location块中配置。由于使用Nginx服务器多数情况下要配置多个location块对不同的请求分别做出处理,因此该指令通常在location块中进行配置。
21、更改location的URI
在location块中,除了使用root指定指明请求处理根目录,还可以使用alias指令改变location接收到的URI的请求路径,其语法结构为:
alias path;
其中,path即为修改后的根路径。
22、设置网站的默认首页
指令index用于设置网站的默认首页,它一般可以有两个作用:一是用户在发出请求访问网站时,请求地址可以不写首页名称;二是可以对一个请求,根据其请求内容而设置不同的首页。该指令的语法结构为:
index file ... ;
其中,file变量可以包括多个文件名,其间使用空格分隔,也可以包含其他变量。此变量默认为“index.html”。
23、设置网站的错误页面
如果用户端尝试查看网页时遇到问题,服务器会将HTTP错误从网站发送到Web浏览器。如果无法显示网页,Web浏览器会显示网站发送的实际错误网页或Web浏览器内置的友好错误消息。Nginx服务器支持自定义错误网页的显示内容。可以通过这一功能在网站发生错误时为用户提供人性化的错误显示页面。
一般来说,HTTP 2XX代表请求正常完成,HTTP 3XX代表网站重定向,HTTP 4XX代表客户端出现错误,HTTP 5XX代表服务器端出现错误。
Nginx服务器设置网站错误页面的指令为error_page,其语法结构为:
error_page code ... [=[response]] uri
code:要处理的HTTP错误代码。
response:可选项,将code指定的错误代码转化为新的错误代码response。
uri:错误页面的路径或者网站地址。如果设置为路径,则是以Nginx服务器安装路径下的html目录为根目录的相对路径;如果设置为网址,则Nginx服务器会直接访问该网址获取错误页面,并返回给用户端。
此指令可以在http块、server块和location块中配置。
24、基于IP配置Nginx的访问权限
Nginx配置通过两种途径支持基本访问权限的控制,其中一种是由HTTP标准模块ngx_http_access_module支持的,其通过IP来判断客户端是否对Nginx的访问权限,这里有两个指令需要我们学习。
allow指令,用于设置允许访问Nginx的客户端IP,语法结构为:
allow address | CIDR | all;
address:允许访问的客户端IP,不支持同时设置多个。如果有多个IP需要设置,需要重复使用allow指令。
CIDR:允许访问的客户端CIDR地址,例如:202.80.18.23/25,前面是32为IP地址,后面“/25”代表该IP地址中前25为是网络部分,其余位代表主机部分。
all:代表允许所有客户端访问。
另一个指令是deny,作用刚好和allow指令相反,它用于设置禁止访问Nginx的客户端IP,语法结构为:
deny address | CIDR | all;
这两个指令可以在http块、server块或者location块中配置。
25、基于密码配置Nginx的访问权限
Nginx还支持基于HTTP Basic Authentication协议的认知。该协议是一种HTTP性质的认知办法,需要识别用户名和密码,认证失败的客户端不拥有访问Nginx服务器的权限。该功能由HTTP标准模块ngx_http_auth_basic_module支持,这里有两个指令需要学习。
auth_basic指令,用于开启或者关闭该功认证功能,语法结构为:
auth_basic string | off;
string:开启该认证功能,并配置验证时的指示信息。
off:关闭该认证功能。
auth_basic_user_file指令,用于设置包含用户名和密码信息的文件路径,语法结构为:
auth_basic_user_file file;
其中,file为密码文件的绝对路径。