从上一节我们知道,当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
11个阶段中经过的模块
下一节开始,将介绍11个阶段中比较重要的模块。
如果您需要转载,可以点击下方按钮可以进行复制粘贴;本站博客文章为原创,请转载时注明以下信息
张柏沛IT技术博客 > Nginx HTTP模块篇 server_name指令和Nginx处理HTTP请求的11个阶段(九)