高性能Web服务器Nginx的配置与部署研究(3)Nginx请求处理机制
2014-10-22 17:06
776 查看
1. 处理什么样的请求
处理访问到 Nginx 所在 IP 地址的请求,并且这些请求的 HTTP 头信息中的 Host 为所要处理的域名(如下以80端口为例),如下几个 server 就对应响应的请求:server { listen 80; server_name nginx.org www.nginx.org; ... } server { listen 80; server_name nginx.net www.nginx.net; ... } server { listen 80; server_name nginx.com www.nginx.com; ... }
2. 默认 server
如果不主动设置默认server,那么第一个
server就会被当做默认
server。若要主动设置,应该如下配置:
server { listen 80 default_server; server_name nginx.net www.nginx.net; ... }
此项的版本注意事项:
0.8.21 版本之前,使用
default关键词;
从 0.8.21 版本开始,使用
default_server关键词。
另外注意,
default_server是端口的一个属性,不是
server_name的一个属性。
3. 如何处理未定义 host 为 server_name 的请求
比如,如果不想处理 HTTP 请求中没有 HOST 字段的头信息的情况,那么可以如下:server { listen 80; server_name ""; return 444; }
此项的版本注意事项:
0.8.48 之前的版本,如果没有设置
server_name的话,那么会把
server_name设置为本机的 hostname。
0.8.48 开始的版本,如果没有设置
server_name的话,那么会把
server_name设置为
"",所以如果要达到上述代码的效果,在此版本开始可以不设置
server_name。
4. Nginx 的虚拟主机监听
请先看如下配置:server { listen 192.168.1.1:80; server_name nginx.org www.nginx.org; ... } server { listen 192.168.1.1:80; server_name nginx.net www.nginx.net; ... } server { listen 192.168.1.2:80; server_name nginx.com www.nginx.com; ... }
这个应该很好理解,如果
listen的 IP 地址和端口号都吻合了,就看 HTTP 请求中的 HOST 头信息与某个
server_name中的 name 是否吻合。如果
server_name不吻合,就到该端口对应的
default_server那里处理请求,如果
default_server的
server_name也没有与 HOST 头信息吻合,那么就放弃该请求。
特别再次强调,
default_server是端口的属性,而非
server_name的属性。所以可以有如下配置:
server { listen 192.168.1.1:80; server_name nginx.org www.nginx.org; ... } server { listen 192.168.1.1:80 default_server; server_name nginx.net www.nginx.net; ... } server { listen 192.168.1.2:80 default_server; server_name nginx.com www.nginx.com; ... }
5. 一个简单的 PHP 站点的 Nginx 配置
server { listen 80; server_name nginx.org www.nginx.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; } }
Nginx 在匹配
location的时候,不是按照配置代码给出的顺序进行匹配的,而是先按照匹配表达式中的文字字符串(literal string)的明确程度,从最明确的开始匹配。这么说可能有点含混不清,简单说,没有正则规则的匹配表达式,是最明确的。比如如果这个匹配表达式就是一个
“/”或者
“/abc”,那么这就是最明确的。上例中的
"/"就是这个最明确的蚊子字符串(the most specific literal string),其实也是该例中唯一的。所以先从这个
location开始,然后再按照
location的列出顺序,依次匹配,直到出现第一个匹配的
location后停止。如果所有的
location都不匹配,就用第一个找到的最明确的文字字符串来匹配(the most specific literal string)。
6. 待查询的 HTTP 请求
Nginx只处理无查询的HTTP请求,因为查询请求的查询字段的顺序不确定,比如:/index.php?user=john&page=1 /index.php?page=1&user=john
再比如:
/index.php?page=1&something+else&user=john
7. 几个location的例子
例1:
/logo.gif
“/”先被找到,然后匹配
"\.(gif|jpg|png)$",再根据 redirective 找到
root是
/data/www,然后这个请求就被映射到
"/data/www/logo.gif"了,最后文件就被发送给到了客户端。
例2:
/index.php
"/"先被找到,然后匹配
"\.(php)$",然后 request 就被传递给在 9000 端口上监听的 FastCGI 服务器,
"fastcgi_param"directive 设置 FastCGI 的参数
SCRIPT_FILENAME为
"/data/www/index.php",然后FastCGI服务器就执行这个文件。(注意其中
document_root是
/data/www,
fastcgi_script_name是
/index.php。)
例3:
/about.html
"/"先被找到,且只有这一个匹配的。然后根据
root值
/data/www,就找到了文件
/data/www/about.html,然后发送给客户端。
例4:
/
"/"是很复杂的,先找到
"/"这个
location,然后根据
root值
/data/www,看
/data/www/index.php是否存在,如果存在 directive 就在内部重定向到
/index.php,然后 Nginx 根据这个再次搜索
location,重复上面第二个例子。
相关文章推荐
- 高性能Web服务器Nginx的配置与部署研究(3)Nginx的请求处理机制
- 高性能Web服务器Nginx的配置与部署研究
- 高性能Web服务器Nginx的配置与部署研究(4)Nginx常用命令
- 高性能Web服务器Nginx的配置与部署研究(3)Nginx请求处理机制
- 高性能Web服务器Nginx的配置与部署研究(1)Nginx简介及入门示例
- 高性能Web服务器Nginx的配置与部署研究(12)应用模块之Memcached做文件缓存时压缩引起的问题
- 高性能Web服务器Nginx的配置与部署研究(7)核心模块之主模块的非测试常用指令
- 高性能Web服务器Nginx的配置与部署研究(14)平滑升级你的Nginx
- 高性能Web服务器Nginx的配置与部署研究(13)应用模块之Memcached模块+Proxy_Cache双层缓存模式
- 高性能Web服务器Nginx的配置与部署研究(2)Nginx入门级配置与部署及“Hello World”
- 高性能Web服务器Nginx的配置与部署研究(15)Upstream负载均衡模块
- 高性能Web服务器Nginx的配置与部署研究(5)Nginx配置符号
- 高性能Web服务器Nginx的配置与部署研究(2)Nginx入门级配置、部署与“Hello World”
- 高性能Web服务器Nginx的配置与部署研究(10)核心模块之HTTP模块Location相关指令
- 高性能Web服务器Nginx的配置与部署研究(9)核心模块之HTTP模块基本常用指令
- 高性能Web服务器Nginx的配置与部署研究(6)核心模块之主模块的测试常用指令
- 高性能Web服务器Nginx的配置与部署研究(7)核心模块之主模块的非测试常用指令
- 高性能Web服务器Nginx的配置与部署研究(11)应用模块之Memcached模块的两大应用场景
- 高性能Web服务器Nginx的配置与部署研究(11)应用模块之Memcached模块的两大应用场景
- 高性能Web服务器Nginx的配置与部署研究(9)核心模块之HTTP模块基本常用指令