高性能Web服务器Nginx的配置与部署研究(3)Nginx请求处理机制
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的配置与部署研究(13)应用模块之Memcached模块+Proxy_Cache双层缓存模式
通过<高性能Web服务器Nginx的配置与部署研究——(11)应用模块之Memcached模块的两大应用场景>一文,我们知道Nginx从Memcached读取数据的方式,如果命中,那么效率 ...
- 高性能Web服务器Nginx的配置与部署研究(7)核心模块之主模块的非测试常用指令
1. error_log 含义:指定存储错误日志的文件 语法:error_log <file> [debug|info|notice|warn|error|crit] 缺省:${prefi ...
- 高性能Web服务器Nginx的配置与部署研究(4)Nginx常用命令
1. 启动 Nginx poechant@ubuntu:sudo ./sbin/nginx 2. 停止 Nginx poechant@ubuntu:sudo ./sbin/nginx -s stop ...
- 高性能Web服务器Nginx的配置与部署研究系列(1)-- 入门 hello work
简介: Nginx 是一个基于 BSD-like 协议.开源.高性能.轻量级的HTTP服务器.反向代理服务器以及电子邮件(SMTP.POP3.IMAP)服务器.Nginx 是由一个俄罗斯的名叫“Igo ...
- 高性能Web服务器Nginx的配置与部署研究(11)应用模块之Memcached模块的两大应用场景
一.应用场景1 最近在一个项目中,用到了Nginx的Memcached模块,所以就在这个系列教程中提前把Memcached模块拿出来写了.另外发现最近我的 博客文章频频被很多用采集器的网站拿走,帮我发 ...
- 高性能Web服务器Nginx的配置与部署研究(2)Nginx入门级配置与部署及“Hello World”
1. Nginx 程序包 目前最新的开发版本时1.1.12: Linux/Unix:nginx-1.1.12.tar.gz Windows:nginx-1.1.12.zip 我们可以下载稳定版尝试: ...
- 高性能Web服务器Nginx的配置与部署研究(1)Nginx简介及入门示例
概述 从这篇博文起,将带领读者们一起领略Nginx的强大. Nginx 是做什么用的?我相信很多朋友都已经使用过,如果你没有,那么你一定知道以下这些名称之一:Apache,Lighttpd,Tomca ...
- 高性能Web服务器Nginx的配置与部署研究(15)Upstream负载均衡模块
Nginx 的 HttpUpstreamModule 提供对后端(backend)服务器的简单负载均衡.一个最简单的 upstream 写法如下: server backend1.example.co ...
- 高性能Web服务器Nginx的配置与部署研究(14)平滑升级你的Nginx
1.概述(可以直接跳过看第2部分) Nginx方便地帮助我们实现了平滑升级.其原理简单概括,就是: (1)在不停掉老进程的情况下,启动新进程. (2)老进程负责处理仍然没有处理完的请求,但不再接受处理 ...
随机推荐
- nginx 使用ctx实现数据共享,修改上下文
环境: init_worker_by_lua, set_by_lua, rewrite_by_lua, access_by_lua, content_by_lua, header_filter_by_ ...
- 查找大文件 & 索引节点(inode)爆满 解决办法
经常遇到磁盘满或者文件节点满的情况,整理如下 查找大文件 查找超过某个大小的文件, 如1G find . -type f -size +1G 查找文件大小的时候,现实文件属性 find . -type ...
- 一张elixir生产环境部署的图
- caddy quic 协议试用&& 几个问题
备注: caddy 具体的安装就不介绍,quic 协议也不介绍了 1. 启用协议,比较简单 /usr/local/bin/caddy -log stdout -quic -conf=/et ...
- cargo rust 包管理工具
1. 安装 yum 或者官方提供的包,比较简单 curl -sSL https://static.rust-lang.org/rustup.sh | sh 2. 帮助命令 cargo --help U ...
- c/c++中system函数在Linux和windows下区别
windows 在windows下的system函数中命令可以不区别大小写! 功 能: 发出一个DOS命令 #include <stdlib.h> int system(char *com ...
- bower.json 的版本范围
bower.json 的版本范围 有小伙伴问 ~2.2.0 什么意思. 而且在git 的tags 中没有了 2.2.0 版本,怎么样? 实际上 ~2.2.0 的意思是 >=2.2.0 <2 ...
- 笔记:Node.js 的 Buffer 缓冲区
笔记:Node.js 的 Buffer 缓冲区 node.js 6.0 之前创建的 Buffer 对象使用 new Buffer() 构造函数来创建对象实例,但权限很大,可以获得敏感信息,所以建议使用 ...
- Mock&Spring集成
Mock&Spring集成 常规Mock单元测试 请参考上一篇文档Mock mock框架的功能性对比 http://jmockit.github.io/MockingToolkitCompar ...
- *.app 无法打开或已损坏解决办法
1.系统偏好设置... -> 安全性与隐私-->修改为任何来源 2.如果没有任何来源 ,打开终端执行:sudo spctl --master-disable