nginx转发请求过程
server {
listen 80;
server_name example.org www.example.org;
...
}
server {
listen 80;
server_name example.net www.example.net;
...
}
server {
listen 80;
server_name example.com www.example.com;
...
}
这种配置情况下,第一个server就是默认配置。请求通过Header中的"Host"来匹配到对应的服务,如果没有匹配到任何server_name,则路由到默认server(第一个server)处理。
default_server
通过给listen
增加 default_server
参数明确指定哪个server是默认server(default_server
参数从0.8.21版本开始有效)。注意:default_server
是用作用于端口的,而不是server_name
的
server {
listen 80 default_server;
server_name example.net www.example.net;
...
}
防止使用未定义的的sever name处理请求
可以定义一个server_name
属性为空的server来处理没有Host的请求(从0.8.48版本开始,server_name
默认是"",之前的版本默认是hostname)。
server {
listen 80;
server_name "";
return 444;
}
这个配置标识请求Header中Host为空时,会返回“444”响应码,然后关闭链接。
基于名称和IP的组合server
server {
listen 192.168.1.1:80;
server_name example.org www.example.org;
...
}
server {
listen 192.168.1.1:80;
server_name example.net www.example.net;
...
}
server {
listen 192.168.1.2:80;
server_name example.com www.example.com;
...
}
请求Header中的Host匹配到server_name
后,会转发到IP+端口上,如果为匹配到server_name
,如前面所述,会转发到第一个server来处理请求,当然也可以通过default_server
属性来指定端口的默认server。
简单配置实例
server {
listen 80;
server_name example.org www.example.org;
root /data/www;
location / {
index index.html index.php;
}
location ~* \.(gif|jpg|png)$ {
expires 30d;
}
location ~ \.php$ {
fastcgi_pass localhost:9000;
fastcgi_param SCRIPT_FILENAME
$document_root$fastcgi_script_name;
include fastcgi_params;
}
}
如上配置,处理请求流程如下:
- 请求“
/logo.gif
”,首先匹配到"/",然后匹配正则表达式“\.(gif|jpg|png)$
”,匹配成功,因此进入“\.(gif|jpg|png)$
”的location,使用指令“root /data/www
”处理请求,请求映射到“/data/www/logo.gif
”文件上返回给客户端; - 请求“
/index.php
”,首先匹配到"/",然后匹配正则表达式“\.(php)$
”,匹配成功,因此进入“\.(php)$
”的location,请求转发到FastCGI服务器监听的localhost:9000上,fastcgi_param指令会将FastCGI的SCRIPT_FILENAME参数设置为“/data/www/index.php
”,然后FastCGI服务器执行这个文件。$document_root
参数会设置为root指令的值,$fastcgi_script_name
会设置为请求的URI,这里就是“/index.php
”; - 请求“
/about.html
”,首先匹配到“/”,其他匹配都不成功,因此由“/”的location来处理,使用指令“root /data/www
”将请求映射到/data/www/about.html
文件返回给客户端。 - 请求“
/
”的处理会比较复杂,“/”只会匹配到“/”,因此由“/”的location来处理,index指令会通过“root /data/www
”指令验证index参数中的文件是否存在。如果/data/www/index.html
存在,则转发到/data/www/index.html
;如果/data/www/index.html
不存在/data/www/index.php
存在,则内部转发到/index.php
,nginx会再次搜索配置的locations,如同客户端发起新的请求一样,那么请求将会如第二条所述,最终由FastGCI服务器处理;
总结
请求进来时,nginx会按照如下步骤来匹配请求(匹配请求只用URI不带参数的部分)
- 在配置的
location
列表中搜索URI不带参数的最完整字符串,逐渐减短匹配串,最长的成功匹配将会被选择并保存; - 根据配置顺序匹配正则表达式,匹配成功则停止;
- 如果正则表达式匹配成功,则使用正则表达式匹配成功的
location
,否则使用第一步匹配到的location
。
其他文章列表
spring web service系列1
spring web service系列2
spring web service系列3
maven配置文件settings.xml详解
Nginx中的负载均衡算法
Nginx upstream指令配置说明
Nginx中虚拟服务器server指令配置说明
Nginx中proxy_pass/proxy_redirect/proxy_set_header配置说明
Nginx中ngx_http_core_module相关指令配置说明
Java自带JVM监控工具jstat使用详细说明
Java自带JVM监控工具jps使用详细说明
Java自带故障分析工具jmap工具使用说明
Java自带故障分析工具jhat工具使用说明
网友评论