nginx配置文件的一些术语
nginx由模块组成,这些模块被配置文件中指定的指令
控制。
指令的分类
指令又分为简单指令
和块指令
- 简单指令
简单指令由名称
和被空格分隔
的参数
组成,并且以为;
结尾。 如listen 80;
就是一个简单指令。
- 块指令
块指令和简单指令结构相似,但其是由一组被{}
括起来的附加指令结束。如http { }
就是一个块指令。
上下文
出现在配置文件中,并且在任何上下文之外的指令,被认为是位于主上下文
中。比如events
和http
指令。http指令中还会存在server
指令,server指令中还有location
指令,因此server存在于http上下文中,location存在于server上下文中。
注释
由#开头的行被认为是注释
查看日志
nginx的访问日志和错误日志一般在/usr/local/nginx/logs
或者 /var/log/nginx
.具体可以查看配置文件
配置处理一个请求
nginx可以通过http上下文来配置转发http请求。如下为nginx的默认配置文件
其中比较重要的是
http{}
上下文,有关http请求的配置都会被配置到这里include /etc/nginx/conf.d/*.conf;
这句的意思是将/etc/nginx/conf.d
目录下的所有conf文件中的配置包含进来。一般nginx还有个default.conf配置文件位于该路径下,具体配置如下:
由上面可知通过nginx转发一个http请求比较重要的指令有http
,server
,location
。
http指令
该指令用来指定http服务器的上下文,即server
,location
等指令应该在该上下文中。
server指令
server指令用来配置虚拟服务器。一个http上下文中,可以拥有多个server上下文。
server_name 指令
server_name指令用来指定需要监听的虚拟服务器域名。
listen 指令
listen指令用来指定能被服务器接受的ip地址和端口号,其值可以是ip地址+端口号,也可以是单独指定Ip地址或端口号。
location指令
location指令用来指定需要应用到某uri前缀的配置,其值可以为普通字符串(url中某段符合规则即可)或正则表达式(根据正则表达式规则)或精准匹配(整个url要符合规则,并不包含查询串部分)。
精准匹配
location 用=
表示精准匹配,精准匹配是最先被查找的规则,如location = / {}
优先于location / {}
普通字符串
形如/example
为普通字符串前缀。
普通字符串特殊情况
- 假如你定义的location前缀没有以
/
结尾,比如location /example {}
, nginx会将请求/example
和/example/
都匹配上该规则 - 假如你定义的location前缀以
/
结尾,比如location /example/ {}
, nginx只会将请求/example/
匹配上该规则 - 要想将/example和/example/分别处理,可以定义两个location,如
正则表达式
形如 ~ /example
和 ~* /example
为正则表达式前缀
~
表示大小写敏感~*
表示大小写不敏感
nginx匹配location步骤
- nginx会先去查找非正则表达式,找到非正则表达式中最长符合条件的规则,暂时保存下来
- nginx按照正则表达式在配置文件中出现的位置,逐条匹配正则表达式,直到找到匹配的规则
- 若正则表达式中没有找到匹配的规则,则使用非正则表达式中满足的规则。
如
我们在浏览器中访问以下路径和结果分别为
以/testPage为例分析如下:
- nginx先找非正则表达式location,找到
/testPage
,暂时保存下拉 - nginx找正则表达式location,找到
~ /testPage
,满足规则停止搜索,因此~ /testPage
规则被应用,而不会再查找~* testpage
监听80端口例子
通过上面对一些指令的了解,我们可以通过以下例子来了解nginx的一个http监听过程。
前提准备
- 在/etc/nginx/cong.d/目录下,新建cusDefault.conf文件
- 新建/ndata/www1/和/ndata/www2/目录,在这两个目录下分别新建index.html文件,内容分别为“This is the index html from /ndata/www1/”,“This is the index html from /ndata/www2/”。
cusDefault.conf内容如下
server {
listen 80;
server_name localhost;
root /ndata/www1/;
location / {
index index.html;
}
}
server {
listen 80;
server_name 127.0.0.1;
root /ndata/www2/;
location / {
index index.html;
}
}
该文件作用大致如下:
- 我们使用
server
指定配置了两个虚拟服务器。 - 使用
listen
指定监听了80端口。 - 使用
server_name
指定让nginx根据请求头中的Host
字段来判断被哪个server
处理。
nginx如何处理一个请求
当我们按如上步骤配置nginx之后,分别在浏览器中访问
http://localhost/
http://127.0.0.1/
nginx处理过程大致如下:
- nginx接收到请求后,它会先拿请求的端口号和配置文件中的listen字段进行比较,此处两个
server
都指定了80端口,两个server都匹配。 - 接下来,nginx会根据请求头中的
Host
字段来跟配置文件中的server_name字段进行比较,因此http://localhost/
匹配了第一个server,http://127.0.0.1/
匹配了第二个server。结果截图如下: