nginx篇 — 术语和配置http监听(http,server,server_name,listen,location)

nginx配置文件的一些术语

nginx由模块组成,这些模块被配置文件中指定的指令控制。

指令的分类

指令又分为简单指令块指令

  1. 简单指令

简单指令由名称和被空格分隔参数组成,并且以为;结尾。 如listen 80; 就是一个简单指令。

  1. 块指令

块指令和简单指令结构相似,但其是由一组被{}括起来的附加指令结束。如http { }就是一个块指令。

上下文

出现在配置文件中,并且在任何上下文之外的指令,被认为是位于主上下文中。比如eventshttp指令。http指令中还会存在server指令,server指令中还有location指令,因此server存在于http上下文中,location存在于server上下文中。

注释

由#开头的行被认为是注释

查看日志

nginx的访问日志和错误日志一般在/usr/local/nginx/logs 或者 /var/log/nginx.具体可以查看配置文件

image.png

配置处理一个请求

nginx可以通过http上下文来配置转发http请求。如下为nginx的默认配置文件

image.png

其中比较重要的是

  1. http{}上下文,有关http请求的配置都会被配置到这里
  2. include /etc/nginx/conf.d/*.conf; 这句的意思是将/etc/nginx/conf.d目录下的所有conf文件中的配置包含进来。一般nginx还有个default.conf配置文件位于该路径下,具体配置如下:

image.png

由上面可知通过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为普通字符串前缀。

普通字符串特殊情况

  1. 假如你定义的location前缀没有以/结尾,比如location /example {}, nginx会将请求/example/example/都匹配上该规则
  2. 假如你定义的location前缀以/结尾,比如location /example/ {}, nginx只会将请求/example/匹配上该规则
  3. 要想将/example和/example/分别处理,可以定义两个location,如

image.png

正则表达式

形如 ~ /example~* /example为正则表达式前缀

  1. ~ 表示大小写敏感
  2. ~* 表示大小写不敏感

nginx匹配location步骤

  1. nginx会先去查找非正则表达式,找到非正则表达式中最长符合条件的规则,暂时保存下来
  2. nginx按照正则表达式在配置文件中出现的位置,逐条匹配正则表达式,直到找到匹配的规则
  3. 若正则表达式中没有找到匹配的规则,则使用非正则表达式中满足的规则。

image.png
我们在浏览器中访问以下路径和结果分别为

image.png

image.png

以/testPage为例分析如下:

  1. nginx先找非正则表达式location,找到/testPage,暂时保存下拉
  2. nginx找正则表达式location,找到~ /testPage,满足规则停止搜索,因此~ /testPage规则被应用,而不会再查找~* testpage

监听80端口例子

通过上面对一些指令的了解,我们可以通过以下例子来了解nginx的一个http监听过程。

前提准备

  1. 在/etc/nginx/cong.d/目录下,新建cusDefault.conf文件
  2. 新建/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;
  }
  
}

该文件作用大致如下:

  1. 我们使用server指定配置了两个虚拟服务器。
  2. 使用listen指定监听了80端口。
  3. 使用server_name指定让nginx根据请求头中的Host字段来判断被哪个server处理。

nginx如何处理一个请求

当我们按如上步骤配置nginx之后,分别在浏览器中访问

  1. http://localhost/
  2. http://127.0.0.1/

nginx处理过程大致如下:

  1. nginx接收到请求后,它会先拿请求的端口号和配置文件中的listen字段进行比较,此处两个server都指定了80端口,两个server都匹配。
  2. 接下来,nginx会根据请求头中的Host字段来跟配置文件中的server_name字段进行比较,因此http://localhost/匹配了第一个server,http://127.0.0.1/匹配了第二个server。结果截图如下:

image.png

image.png

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYwnY674' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片