本系列文章目录


展开/收起

  • Nginx初认识之 Nginx重载配置文件、热部署和更新日志 (一)
  • Nginx初认识之 Nginx搭建静态资源服务器 (二)
  • Nginx初认识之 Nginx搭建反向代理服务器 (三)
  • Nginx初认识之 GoAccess可视化实时监控access.log日志 (四)
  • Nginx初认识之 Nginx支持PHP和TP5项目 (五)
  • Nginx架构篇之 Nginx的进程结构和信号管理 (六)
  • Nginx架构篇之 Nginx和Apache的比较 (七)
  • Nginx HTTP模块篇 Nginx接收HTTP请求的流程 (八)
  • Nginx HTTP模块篇 server_name指令和Nginx处理HTTP请求的11个阶段(九)
  • Nginx HTTP模块篇 realip模块 (十)
  • Nginx HTTP模块篇 rewrite模块 (十一)
  • Nginx HTTP模块篇 limit_conn和limit_req模块 (十二)
  • Nginx HTTP模块篇 access阶段的deny allow auth_basic auth_request指令 (十三)
  • Nginx HTTP模块篇 precontent阶段的try_files和mirror指令 (十四)
  • Nginx HTTP模块篇 content阶段的static模块 (十五)
  • Nginx HTTP模块篇 日志记录之log模块和过滤模块 (十六)
  • Nginx HTTP模块篇 Nginx中的常用变量 (十七)
  • Nginx HTTP模块篇 Nginx防盗链——referer模块 (十八)
  • Nginx优化篇 Nginx+php_fpm使用php及其配置优化 (十九)
  • Nginx优化篇 Linux内核参数优化和nginx配置优化 (二十)
  • Nginx优化篇 Linux内核参数、Nginx配置和php-fpm配置优化汇总 (二十一)
  • Nginx优化篇 ab压力测试和监控 (二十二)
  • Nginx优化篇 nginx+php-fpm压力测试实践 (二十三)



从上一节我们知道,当nginx的HTTP模块解析完了请求报文中的请求行和请求头之后,就会进入处理HTTP请求的11个阶段。

不过在此之前,nginx要先找到是哪一个server配置块对这个请求进行处理。

 

server_name 指令 

该指令可以根据域名决定使用哪个server块的配置。

server_name上下文为http/server/location

server_name 后可以跟多个域名,第一个是主域名

示例:

server_name zbpblog.com www.zbpblog.com     # 指定主域名和www域名

server_name *.zbpblog.com       # 泛域名
server_name www.zbpblog.*       # 泛域名2,泛域名只支持*在最前面或者最后面

server_name ~^www\d+\.zbpblog\.com$;    # 使用正则,在server_name中可以在开头加~表示使用正则

# 使用分组匹配并创建变量
server{
    server_name ~^(www\.)?(\w+)\.com$;
    location / {
        root /var/www/$2;   # 如 www.zbpblog.com 就会指向 /var/www/zbpblog这个目录
    }
}

# 可以给分组匹配中的匹配内容用定义变量名(使用?<变量名>)
server{
    server_name ~^(www\.)?(?<domain>\w+)\.com$;
    location / {
        root /var/www/$domain;
    }
}

server_name .zbpblog.com        # 匹配zbpblog.com和*.zbpblog.com

server_name _       # 匹配所有域名
server_name ""      # 匹配没有Host头部的请求

 

server匹配的优先级:
精确匹配 > *在前的泛域名 > *在后的泛域名 > 按顺序匹配正则域名 > default server

如果一个域名符合多个server_name定义的域名规则,则默认走第一个符合的server_name的server配置块。

default server就是http中listen指定为default的server块或者第一个server块。

 

HTTP处理请求的11个阶段

post_read       # 对应realip模块
 server_rewrite  # 对应rewrite模块
 find_config
 rewrite         # rewrite模块
 post_rewrite    
 preaccess       # limit_conn,limit_req
 access          # auth_basic,access,auth_request模块
 post_access
 precontent      # try_files模块
 content         # index,autoindex,concat模块
 log             # access_log模块

 

post_是在...之后的意思;pre是在...之前的意思。

每一个阶段都有0个到多个模块来处理HTTP请求,每一个模块处理完之后,会把请求往下一个模块传递。这个过程如下:

-->realip-->server级别的rewrite-->find_config-->location级别的rewrite-->limit_req-->limit_conn-->access-->auth_basic-->auth_request-->try_files-->mirrors-->concat-->random_index-->index-->auto_index-->static-->log

nginx 同一个服务器多个域名_Nginx

11个阶段中经过的模块

 

下一节开始,将介绍11个阶段中比较重要的模块。

张柏沛IT技术博客 >

Nginx HTTP模块篇 server_name指令和Nginx处理HTTP请求的11个阶段(九)