再探Nginx【一】

I/O复用

    服务器进程需要一种预先告知能力,使得内核一旦发现进程指定的一个或多个I/O条件就绪,它就通知进程。这个能力就称作I/O复用

select/poll/epoll

  1. select
本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理 
缺点
单个进程可监视的fd数量被限制,即能监听端口的大小有限
# cat /proc/sys/fs/file-max 
对socket进行扫描时是线性扫描,即采用轮询的方法,效率较低 

需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大 

2.poll

本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态
其没有最大连接数的限制,原因是它是基于链表来存储的,但是同样有一个缺点:
大量的fd的数组被整体复制于用户态和内核地址空间之间,而不管这样的复制是不是有意 

poll还有一个特点是“水平触发”,如果报告了fd后,没有被处理,那么下次poll时会再次报告该fd  

3、epoll
支持水平触发和边缘触发,最大的特点在于边缘触发,它只告诉进程哪些fd刚刚变为就需态,并且只会通知一次 
使用“事件”的就绪通知方式,通过epoll_ctl注册fd,一旦该fd就绪,内核就会采用类似callback的回调机制来激活该fd,epoll_wait便可以收到通知 
优点:
没有最大并发连接的限制:能打开的FD的上限远大于1024(1G的内存上能监听约10万个端口)
效率提升:非轮询的方式,不会随着FD数目的增加而效率下降;只有活跃可用的FD才会调用callback函数,即epoll最大的优点就在于它只管理“活跃”的连接,而跟连接总数无关
 内存拷贝,利用mmap()文件映射内存加速与内核空间的消息传递;即epoll使用mmap减少复制开销 

httpd: MPM 多路处理模型

    MPM是Apache2引入的一个概念,就是将结构模块化。把核心任务处理作为一个可插拔的模块,即MPM,使其能针对不同的环境进行优化。在这个情况下,就诞生出了处理模式的概念。处理模式现在分为Prefork、Worker、Event三种。
  1. Prefork 实现了一个非线程型的、预派生的web服务器
  2. Worker 它也使用了多进程,每个进程又有多个线程
  3. event    是worker模式的变种,它把服务进程从连接中分离出来,在开启KeepAlive场合下相对worker模式能够承受的了更高的并发负载

I/O类型:
同步和异步:synchronous, asyncrhonous
关注的是消息通知机制

  1. 同步:调用发出不会立即返回,但一旦返回就可以返回最终结果;
  2. 异步:调用发出之后,被调用方立即返回消息,但返回的非最终结果;被调用者通过状态、通知机制来通知调者,或通过回调函数来处理结果;

阻塞和非阻塞:block, nonblock
关注的是调用等等调用结果(消息、返回值)时的状态

阻塞:调用结果返回之前,调用者(调用线程)会被挂起;调用者只有在得到结果之后才会返回;
非阻塞:调用结果返回之前,调用不会阻塞当前线程;

I/O网络模型

  1. 阻塞blocking IO
  2. 非阻塞nonblocking IO
  3. 多路IO multiplexing
  4. 异步 asynchronous IO
  5. 事件驱动 signal driven IO


基本TCP客户/服务器程序的套接字函数

阻塞:


IO调用过程

IO发生时涉及的对象和步骤:对于一个network IO (这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的process (or thread),另一个就是系统内核(kernel)。当一个read操作发生时,它会经历两个阶段:

  1.   等待数据准备 (Waiting for the data to be ready)
  2.   将数据从内核拷贝到进程中(Copying the data from the kernel to the process)基本TCP客户/服务器程序的套接字函数

当用户进程调用了recvfrom这个系统调用,kernel就开始了IO的第一个阶段:准备数据。对于network io来说,很多时候数据在一开始还没有到达(比如,还没有收到一个完整的UDP包),这个时候kernel就要等待足够的数据到来。而在用户进程这边,整个进程会被阻塞。当kernel一直等到数据准备好了,它就会将数据从kernel中拷贝到用户内存,然后kernel返回结果,用户进程才解除block的状态,重新运行起来。
    所以,blocking IO的特点就是在IO执行的两个阶段(等待数据和拷贝数据两个阶段)都被block了。


应答模型


实际上,除非特别指定,几乎所有的IO接口 ( 包括socket接口 ) 都是阻塞型的。这给网络编程带来了一个很大的问题,如在调用send()的同时,线程将被阻塞,在此期间,线程将无法执行任何运算或响应任何的网络请求。
    一个简单的改进方案是在服务器端使用多线程(或多进程)。多线程(或多进程)的目的是让每个连接都拥有独立的线程(或进程),这样任何一个连接的阻塞都不会影响其他的连接。具体使用多进程还是多线程,并没有一个特定的模式。传统意义上,进程的开销要远远大于线程,所以如果需要同时为较多的客户机提供服务,则不推荐使用多进程;如果单个服务执行体需要消耗较多的CPU资源,譬如需要进行大规模或长时间的数据运算或文件访问,则进程较为安全。

解决机制1-多进程响应



解决机制2-非阻塞


从图中可以看出,当用户进程发出read操作时,如果kernel中的数据还没有准备好,那么它并不会block用户进程,而是立刻返回一个error。从用户进程角度讲 ,它发起一个read操作后,并不需要等待,而是马上就得到了一个结果。用户进程判断结果是一个error时,它就知道数据还没有准备好,于是它可以再次发送read操作。一旦kernel中的数据准备好了,并且又再次收到了用户进程的system call,那么它马上就将数据拷贝到了用户内存,然后返回。

多路复用IO

    Select和epoll
    Select 同步阻塞
    (1)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大
    (2)同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大

    (3)select支持的文件描述符数量太小了,默认是1024

异步



异步模型-epoll

    Epoll
    支持一个进程打开大数目的socket描述符
    IO效率不随FD数目增加而线性下降
    使用mmap加速内核与用户空间的消息传递

    边缘触发和水平触发

Nginx概念

    Nginx(发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引擎Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页伺服器中表现较好.目前中国大陆使用nginx网站用户有:新浪、网易、 腾讯,另外知名的微网志Plurk也使用nginx

Nginx特点

  1. Nginx 是一个很牛的高性能Web和反向代理服务器,它具有很多非常优越的特性:
  2. 在高连接并发的情况下,Nginx是Apache服务器不错的替代品:Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一。能够支持高达 50,000 个并发连接数的响应,感谢Nginx为我们选择了 epoll and kqueue作为开发模型。
  3. Nginx作为负载均衡服务器:Nginx 既可以在内部直接支持 和 PHP 程序对外进行服务,也可以支持作为 HTTP代理服务器对外进行服务。Nginx采用C进行编写,不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多。

Nginx的优点①

1、高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2~3万并发连接数。
2、内存消耗少:在3万并发连接下,开启的10个Nginx 进程才消耗150M内存(15M*10=150M)。
3、配置文件非常简单:风格跟程序一样通俗易懂。

4、成本低廉:Nginx为开源软件,可以免费使用。而购买F5 BIG-IP、NetScaler等硬件负载均衡交换机则需要十多万至几十万人民币

5、支持Rewrite重写规则:能够根据域名、URL的不同,将 HTTP 请求分到不同的后端服务器群组。
6、内置的健康检查功能:如果 Nginx Proxy 后端的某台 Web 服务器宕机了,不会影响前端访问。
7、节省带宽:支持 GZIP 压缩,可以添加浏览器本地缓存的 Header 头。
8、稳定性高:用于反向代理,宕机的概率微乎其微。
9、模块化设计:模块可以动态编译
10、外围支持好:-文档全、二次开发和模块较多
11、支持热部署:可以不停机重载配置文件

12、支持事件驱动、AIO、mmap等性能优化


2009-09-03 14:30,金山游戏《剑侠情缘网络版3》临时维护1小时,大量玩家上官网,论坛、评论、客服等动态应用Nginx服务器集群,每台服务器的Nginx活动连接数达到2.8万,这是本人遇到的Nginx生产环境最高并发值。


Nginx的主要应用类别

1、使用 Nginx 结合FastCGI运行 PHP、JSP 、Perl等程序
2、使用 Nginx 作反向代理、负载均衡、规则过滤
3、使用 Nginx 运行静态HTML页、图片
4、Nginx与其他新技术的结合应用

Nginx的模块与工作原理

  1. Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个location block(location是Nginx配置中的一个指令,用于URL匹配),而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。
  2. Nginx的模块从结构上分为核心模块、基础模块和第三方模块, HTTP模块、EVENT模块和MAIL模块等属于核心模块,HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块属于基本模块,而HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块属于第三方模块,用户根据自己的需要开发的模块都属于第三方模块。正是有了这么多模块的支撑,Nginx的功能才会如此强大。

Nginx的模块从功能上分为三类,分别是

(1) Handlers(处理器模块)。此类模块直接处理请求,并进行输出内容和修改headers信息等操作。handlers处理器模块一般只能有一个。

(2) Filters (过滤器模块)。此类模块主要对其他处理器模块输出的内容进行修改操作,最后由Nginx输出。

(3) Proxies (代理类模块)。就是Nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如fastcgi等操作交互,实现服务代理和负载均衡等功能。下图展示了Nginx的模块下一次常规的HTTP请求和响应的过程。

Nginx的模块直接被编译进Nginx,因此属于静态编译方式。启动Nginx后,Nginx的模块被自动加载,不像在Apache一样,首先将模块编译为一个so文件,然后在配置文件中指定是否进行加载。在解析配置文件时,Nginx的每个模块都有可能去处理某个请求,但是同一个处理请求只能由一个模块来完成。




Nginx arch



HTTP基于TCP套接字通信



基本的Web服务请求步骤



基本功能:

  • 静态资源的web服务器;
  • http协议的反向代理服务器;
  • pop3, smpt, imap4等邮件协议的反向代理;
  • 能缓存打开的文件(元数据)、支持FastCGI(php-fpm), uWSGI(Python Web Framwork)等协议
  • 模块化(非DSO机制),过滤器zip,SSI,SSL;

web服务相关的功能:
虚拟主机(server)、keepalive、访问日志(支持基于日志缓冲提高其性能)、url rewirte、路径别名、基于IP及用户的访问控制、支持速率限制及并发数限制;
……

Nginx的基本架构:
  • master/worker
  • 一个master进程,可生成一个或多个worker进程;
  • 事件驱动:epoll(Linux), kqueue(FreeBSD), /dev/poll(Solaris)
  • 消息通知:select, poll, rt signals
  • 支持sendfile,  sendfile64
  • 支持AIO,mmap

master: 加载配置文件、管理worker进程、平滑升级,...
worker:http服务,http代理,fastcgi代理,...


源码安装

        1:需要gcc,系统自带了,没有的话,需要先安装
2:需要pcre,安装的命令示例如下: yum install pcre*
3:需要zlib,安装的命令示例如下:yum install zlib zlib-devel
4:如果需要支持ssl的话,安装OpenSSL,安装的命令示例如下:

yum install openssl openssl-devel

                 groupadd -r nginx   

          useradd -r -g nginx nginx


5:上http://nginx.org/去下载源码包,然后进行解压安装,示例如下:
(1)先解压源码包,然后进入到这个包里面
(2)安装命令示例如下:
第一步:./configure  --prefix=/usr/common/nginx --with-http_stub_status_module --with-http_ssl_module
如果提示确少啥,就加上相应的选项,比如缺少pcre的话,就加上
--with-pcre=/usr/common/temp/pcre-8.34  (当然我们这里是不缺东西的)

第二步:配置后就依次 make  , make install

编译参数可能会根据版本的不同进行变化,./configure --help查看编译参数列表,常见的选项如下:
--prefix=<path> - 安装路径,如果没有指定,默认为/usr/local/nginx。 
--sbin-path=<path> - nginx可执行命令的文件,如果没有指定,默认为<prefix>/sbin/nginx。 
--conf-path=<path> - 在没有使用-c参数指定的情况下nginx.conf的默认位置,如果没有指定,默认为<prefix>/conf/nginx.conf。 
--pid-path=<path> - nginx.pid的路径,如果没有在nginx.conf中通过“pid”指令指定,默认为<prefix>/logs/nginx.pid。 
--lock-path=<path> - nginx.lock文件路径,如果没有指定,默认为<prefix>/logs/nginx.lock。 
--error-log-path=<path> - 当没有在nginx.conf中使用“error_log”指令指定时的错误日志位置,如果没有指定,默认为<prefix>/logs/error.log。 
--http-log-path=<path> - 当没有在nginx.conf中使用“access_log”指令指定时的访问日志位置,如果没有指定,默认为<prefix>/logs/access.log。 
--user=<user> - 当没有在nginx.conf中使用“user”指令指定时nginx运行的用户,如果没有指定,默认为“nobody”。 
--group=<group> - 当没有在nginx.conf中使用“user”指令指定时nginx运行的组,如果没有指定,默认为“nobody”。 
--builddir=DIR - 设置构建目录。 

--with-rtsig_module - 启用rtsig模块。

--with-select_module –without-select_module - 如果在configure的时候没有发现kqueue, epoll, rtsig或/dev/poll其中之一,select模块始终为启用状态。 
--with-poll_module –without-poll_module - 如果在configure的时候没有发现kqueue, epoll, rtsig或/dev/poll其中之一,poll模块始终为启用状态。 
--with-http_ssl_module - 启用ngx_http_ssl_module,启用SSL支持并且能够处理HTTPS请求。需要OpenSSL,在Debian系统中,对应的包为libssl-dev。 
--with-http_realip_module - 启用ngx_http_realip_module 
--with-http_addition_module - 启用ngx_http_addition_module 
--with-http_sub_module - 启用ngx_http_sub_module 
--with-http_dav_module - 启用ngx_http_dav_module 
--with-http_flv_module - 启用ngx_http_flv_module 
--with-http_stub_status_module - 启用”server status”(服务状态)页 
--without-http_charset_module - 禁用ngx_http_charset_module 
--without-http_gzip_module - 禁用ngx_http_gzip_module,如果启用,需要zlib包。 
--without-http_ssi_module - 禁用ngx_http_ssi_module 
--without-http_userid_module - 禁用ngx_http_userid_module 
--without-http_access_module - 禁用ngx_http_access_module 

--without-http_auth_basic_module - 禁用ngx_http_auth_basic_module 

--without-http_autoindex_module - 禁用ngx_http_autoindex_module 

--without-http_geo_module - 禁用ngx_http_geo_module 

--without-http_map_module - 禁用ngx_http_map_module 
--without-http_referer_module - 禁用ngx_http_referer_module 
--without-http_rewrite_module - 禁用ngx_http_rewrite_module。如果启用,需要PCRE包。 
--without-http_proxy_module - 禁用ngx_http_proxy_module 
--without-http_fastcgi_module - 禁用ngx_http_fastcgi_module 
--without-http_memcached_module - 禁用ngx_http_memcached_module 
--without-http_limit_zone_module - 禁用ngx_http_limit_zone_module 
--without-http_empty_gif_module - 禁用ngx_http_empty_gif_module 
--without-http_browser_module - 禁用ngx_http_browser_module 
--without-http_upstream_ip_hash_module - 禁用ngx_http_upstream_ip_hash_module 
--with-http_perl_module - 启用ngx_http_perl_module 
--with-perl_modules_path=PATH - 为perl模块设置路径 
--with-perl=PATH - 为perl库设置路径 

--http-client-body-temp-path=PATH - 为http连接的请求实体临时文件设置路径,如果没有指定,默认为<prefix>/client_body_temp 

--http-proxy-temp-path=PATH - 为http代理临时文件设置路径,如果没有指定,默认为<prefix>/proxy_temp 
--http-fastcgi-temp-path=PATH - 为http fastcgi临时文件设置路径,如果没有指定,默认为<prefix>/fastcgi_temp 
--without-http - 禁用HTTP服务 
--with-mail - 启用IMAP4/POP3/SMTP代理模块 
--with-mail_ssl_module - 启用ngx_mail_ssl_module 
--with-cc=PATH - 设置C编译器路径 
--with-cpp=PATH - 设置C预处理器路径 
--with-cc-opt=OPTIONS - 变量CFLAGS中附加的参数,用于FreeBSD中的PCRE库,同样需要指定–with-cc-opt=”-I /usr/local/include”,如果我们使用select()函数则需要同时增加文件描述符数量,可以通过–with-cc-opt=”-D FD_SETSIZE=2048”指定。 
--with-ld-opt=OPTIONS - 通过连接器的附加参数,用于FreeBSD中的PCRE库,同样需要指定–with-ld-opt=”-L /usr/local/lib”。 
--with-cpu-opt=CPU - 指定编译的CPU,可用的值为: pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64 

--without-pcre - 禁用PCRE库文件,同时将禁用HTTP rewrite 模块,如果要在”location”指令中使用正则表达式,同样需要PCRE库。

--with-pcre=DIR - 设置PCRE库源文件路径。 
--with-pcre-opt=OPTIONS - 在编译时为PCRE设置附加参数。 
--with-md5=DIR - 设置md5库源文件路径。 
--with-md5-opt=OPTIONS - 在编译时为md5设置附加参数。 
--with-md5-asm - 使用md5汇编源。 
--with-sha1=DIR - 设置sha1库源文件路径。 
--with-sha1-opt=OPTIONS - 在编译时为sha1设置附加参数。 
--with-sha1-asm - 使用sha1汇编源。 
--with-zlib=DIR - 设置zlib库源文件路径。 
--with-zlib-opt=OPTIONS - 在编译时为zlib设置附加参数。 
--with-zlib-asm=CPU - 为指定的CPU使用zlib汇编源进行优化,可用值为: pentium, pentiumpro。 
--with-openssl=DIR - 设置openssl库源文件路径。 
--with-openssl-opt=OPTIONS - 在编译时为openssl设置附加参数。 
--with-debug - 启用debug记录。 

--add-module=PATH - 增加一个在PATH中的第三方模块。 


./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx  --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-debug


测试配置文件:

安装路径下的/nginx/sbin/nginx -t
启动:
安装路径下的/nginx/sbin/nginx
停止
安装路径下的/nginx/sbin/nginx -s stop
或者是: nginx -s quit 
重启
安装路径下的/nginx/sbin/nginx  -s reload
查看进程
ps -ef |grep nginx 


安装过后,如果从外面访问不了,多半是被防火墙挡住了,可以关闭掉防火墙:

/sbin/service iptables stop


默认启动Nginx时,使用的配置文件是: 安装路径/conf/nginx.conf 文件
可以在启动nginx的时候,通过-c来指定要读取的配置文件
常见的配置文件有如下几个:
nginx.conf:应用程序的基本配置文件 
mime.types:MIME类型关联的扩展文件
fastcgi.conf:与fastcgi相关的配置
proxy.conf:与proxy相关的配置
sites.conf:配置Nginx提供的网站,包括虚拟主机
Nginx的进程结构
启动Nginx的时候,会启动一个Master进程,这个进程不处理任何客户端的请求,主要用来产生worker进程,一个worker进程用来处理一个request。

Nginx模块分为:核心模块、事件模块、标准Http模块、可选Http模块、邮件模块、第三方模块和补丁等


Nginx基本模块:所谓基本模块,指的是Nginx默认的功能模块,它们提供的指令,允许你使用定义Nginx基本功能的变量,在编译的时候不能被禁用,包括:
核心模块:基本功能和指令,如进程管理和安全
事件模块:在Nginx内配置网络使用的能力
配置模块:提供包含机制
常见的核心模块指令,大部分都是放置在配置文件的顶部
具体的指令,请参看nginx的官方文档,非常详细,参见:
http://nginx.org/en/docs/ngx_core_module.html
还有下面这个网站,也是非常不错的:
http://www.howtocn.org/nginx:directiveindex
常见的events模块指令,大部分都是放置在配置文件的顶部

具体的指令,在上面那个文档里面,命令的context为events的就是events模块指令,只能在events里面使用


核心模块指令,重点看看:error_log、include、pid、user、worker_cpu_affinity、worker_processes
error_log
日志有6个级别:debug|info|notice|warn|error|crit
Nginx支持将不同的虚拟主机的日志记录在不同的地方,如下示例:
http{
error_log logs/http_error.log error;
server{
server_name one;
access_log logs/one_access.log;
error_log logs/one_error.log error;
}
server{
server_name two;
access_log logs/two_access.log;
error_log logs/two_error.log error;
}

}


注意:error_log off不是禁用日志,而是创建一个名为off的日志,要禁用日志,可以这么写:error_log /dev/null crit;

日志模块指令,几个都看看

事件模块指令,重点看看:use和worker_connections



Nginx的HTTP配置主要包括三个区块,结构如下:
http {  //协议级别
    include       mime.types;
    default_type  application/octet-stream;
    keepalive_timeout  65;
gzip  on;
    server {  //服务器级别
        listen       80;
        server_name  localhost;


        location / {  //请求级别
            root   html;
            index  index.html index.htm;
        }
    }
}


Nginx的HTTP核心模块,包括大量的指令和变量,大都很重要,具体参见:

http://nginx.org/en/docs/http/ngx_http_core_module.html


Location区段,通过指定模式来与客户端请求的URI相匹配,基本语法如下:
location [=|~|~*|^~|@] pattern{……}
1:没有修饰符 表示:必须以指定模式开始,如:
 server {
        server_name  www.magedu.com;
        location  /abc {
            ……
        }
    }
那么,如下是对的:
http://www.magedu.com/abc
http://www.magedu.com/abc?p1=11&p2=22
http://www.magedu.com/abc/

http://www.magedu.com/abcde 


2:= 表示:必须与指定的模式精确匹配,如:
 server {
        server_name  www.magedu.com;
        location = /abc {
            ……
        }
    }
那么,如下是对的:
http://www.magedu.com/abc
http://www.magedu.com/abc?p1=11&p2=22
如下是错的:
http://www.magedu.com/abc/

http://www.magedu.com/abcde 


3:~ 表示:指定的正则表达式要区分大小写,如:
 server {
        server_name  www.magedu.com;
        location ~ ^/abc$ {
            ……
        }
    }
那么,如下是对的:
http://www.magedu.com/abc
http://www.magedu.com/abc?p1=11&p2=22
如下是错的:
http://www.magedu.com/ABC
http://www.magedu.com/abc/

http://www.magedu.com/abcde 


4:~* 表示:指定的正则表达式不区分大小写,如:
 server {
        server_name  www.magedu.com;
        location ~* ^/abc$ {
            ……
        }
    }
那么,如下是对的:
http://www.magedu.com/abc
http://www.magedu.com/ABC
http://www.magedu.com/abc?p1=11&p2=22
如下是错的:
http://www.magedu.com/abc/

http://www.magedu.com/abcde 


5:^~ 类似于无修饰符的行为,也是以指定模式开始,不同的是,如果模式匹配,那么就停止搜索其他模式了。
6:@ :定义命名location区段,这些区段客户段不能访问,只可以由内部产生的请求来访问,如try_files或error_page等
 (location =) > >(location ^~ 路径) >(location ~* 正则) >(location 路径)
查找顺序和优先级
1:带有“=“的精确匹配优先
2:带有“^~”修饰符的,开头匹配
3:带有“~” 或“~*” 修饰符的,如果正则表达式与URI匹配

4:没有修饰符的,如果指定字符串与URI开头匹配


location  = / {
  # 只匹配 / 的查询.
  [ configuration A ]
}
location  / {
  # 匹配任何以 / 开始的查询,但是正则表达式与一些较长的字符串将被首先匹配。
  [ configuration B ]
}
location ^~ /images/ {
  # 匹配任何以 /images/ 开始的查询并且停止搜索,不检查正则表达式。
  [ configuration C ]
}
location ~* \.(gif|jpg|jpeg)$ {
  # 匹配任何以gif, jpg, or jpeg结尾的文件,但是所有 /images/ 目录的请求将在Configuration C中处理。
  [ configuration D ]
}
各请求的处理如下例:
■/ → configuration A 
■/documents/document.html → configuration B 
■/images/1.gif → configuration C 
■/documents/1.jpg → configuration D 

猜你喜欢

转载自blog.csdn.net/shangyuanlang/article/details/80942678