资讯专栏INFORMATION COLUMN

Nginx配置浅析

娣辩孩 / 1200人阅读

摘要:选择以结尾的进行匹配,并优先选择最长的。排序对匹配过程也有一定的影响,因为在匹配到最长最精确的之后就会停止匹配。将所有非正则表达式的与请求的进行对比。结束当前的指令。返回一个状态码为的永久重定向。

Nginx是Igor Sysoev用C语言编写的一个web服务器,通常用于负载均衡、反向代理和HTTP缓存等。Nginx用异步的事件驱动(event-driven)的方式来处理请求,因此负载能力很强。

Nginx使用Block(如 server block, location block)来组成配置文件的层级结构,并在接收到客户端请求之后根据请求的域名(domain name)端口(port)IP地址判断处理该请求的server block,然后根据请求的资源URI决定处理该请求的location block

Server Block

管理员可以定义多个server block作为不相关的虚拟web服务器实体,然后通过listenserver_name决定处理请求的server block

listen指令

Nginx首先会检查请求的IP地址和端口,并根据所有server block建立一个列表来处理请求。每个server block中的listen定义了这个server block能处理的IP和端口(root用户运行默认为0.0.0.0:80,非root用户运行的为0.0.0.0:8080)

listen后可以指定:

IP:port的IP地址和端口

仅IP(端口将默认为80)

仅port,将监听所有接口的这个port

到某个Unix socket的路径(在服务器间转发请求的时候会用到)

在将listen的值与请求进行匹配之前,Nginx会先将listen的值中所缺省的部分补充完整。然后将优先匹配准确的IP,如果不存在完全准确匹配的IP才会匹配到0.0.0.0,如果有多个IP:port匹配度相同,Nginx将会继续检查server_name

server_name指令

Nginx将server_name与请求头中的Host进行匹配,匹配的顺序:

优先选择第一个精确匹配到的block。

server {
    listen 80;
    server_name host.example.com;
    ...
}

选择以*开头的进行匹配,并优先选择最长的。

server {
    listen 80;
    server_name *.example.com;
    ...
}

选择以*结尾的进行匹配,并优先选择最长的。

server {
    listen 80;
    server_name www.example.*;
    ...
}

选择以~开头的用正则表达式进行匹配,并优先选择第一个。

server {
    listen 80;
    server_name ~^(www|host).*.example.com$;
    ...
}

如果以上规则都无法匹配,则选择default_server定义的默认的server_block(每个server_block只能有一个default_server),默认的default_serverlocalhost

server {
    listen 80 default_server;
    server_name _;
    ...
}

Location Block

location blockserver block的一部分,决定了如何处理请求的URI,格式:

location [modifier] location_match {
    ...
}
modifier

modifier是一个可选的参数,决定了如何解析后面的location matchmodifier可选的值有:

(none)

前缀匹配, 如

location /site {
    ...
}

将匹配以/site开头的URI

=(equal sign)

完整匹配,如

location = /page {
    ...
}

将匹配/page,而不会响应/page/index.html的请求

~(tilde)

大小写敏感的正则匹配, 如

location ~ .(jpe?g|png|gif|ico)$ {
...
}

将匹配以.jpg/.jpeg/.png/.gif/.ico结尾的URI, 但不会响应.JPG

~*(tilde + asterisk)

大小写无关的正则匹配, 如

location ~* .(jpe?g|png|gif|ico)$ {
    ...
}

.jpg.JPG都会匹配

^~(carat + tilde)

非正则匹配,如

location ^~ /page {
    ...
}

能够匹配/page/index.html

匹配顺序

Nginx优先选择正则表达式进行匹配,但是使用=^~这两个modifier可以覆盖这一特性。排序对匹配过程也有一定的影响,因为Nginx在匹配到最长最精确的location之后就会停止匹配。

将所有非正则表达式的location_match与请求的URI进行对比。

modifier=的进行完整匹配。

选择最长location_match前缀进行匹配,如果modifier^~则匹配成功。

进行正则表达式匹配

用其他前缀匹配

其他指令

index

语法:index file ...; 默认为index index.html;

index指令指定了被作为index的文件,比如上面的index.html

但是在下面这种情况下,对/index.html的请求将会被第二个location block处理,因为第一个与/index.html并不是完全匹配。

location = / {
    index index.html;
}

location / {
    ...
}

try_files

root /var/www/main;
location / {
    try_files $uri $uri.html $uri/ /fallback/index.html;
}

location /fallback {
    root /var/www/another;
}

/page的请求将会首先进入第一个location, 然后尝试在/var/www/main 下依次查找page, page.html, page/,如果都没有找到的话将会被重定向到/fallback/index.html,并由第二个location提供/var/www/another/fallback/index.html

rewrite

通过Perl兼容的正则表达式改变请求的URI,语法:rewrite regex replacement [flag];

flag的值可以是:

last

结束当前的rewrite指令,并用修改过的URI去匹配其他的location block

break

结束当前的rewrite指令。

redirect

当替换的URI(replacement)不以 “http://”, “https://”, “$scheme”开头时进行状态码为302的暂时性的重定向。

permanent

返回一个状态码为301的永久重定向。

error_page

root /var/www/main;

location / {
    error_page 404 /another/whoops.html;
}
 
location /another {
    root /var/www;
}

除了/another之外的请求都会在/var/www/main查找请求的资源,如果没有找到相关资源将会重定向到/another/whoops.html,由第二个location block处理,查找/var/www/another/whoops.html

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/40550.html

相关文章

  • Nginx源码分析】Nginx中http2浅析

    摘要:主要涉及到的协议以及的处理流程。并且中必须建立在协议之上。所以对协议的服务发起请求时,一般浏览器会建立条连接,并行的去请求不同的资源。表明该字段是否使用了编码。 运营研发 张仕华 本文通过一个小例子串一遍nginx处理http2的流程。主要涉及到http2的协议以及nginx的处理流程。 http2简介 http2比较http1.1主要有如下五个方面的不同: 二进制协议 http1....

    孙吉亮 评论0 收藏0
  • 【整理总结】负载均衡浅析

    摘要:负载均衡算法轮询,加权轮询。参考三负载均衡负载均衡由服务提供厂商提供。之后,集群内再采用其他的负载均衡方案。参考五负载均衡工作在层,它会与分别建立连接,需要维护这两个连接的状态。 运营研发团队 施洪宝 一. 基础知识 1.1 基础 什么是负载均衡? 当单机提供的并发量不能满足需求时,我们需要多台服务器同时服务。当客户请求到达时,如何为客户选择最合适的服务器?这个问题就是负载均衡问题。...

    idealcn 评论0 收藏0
  • 浅析微信支付:如何使用沙箱环境测试

    摘要:本文是浅析微信支付系列文章的第十篇,主要讲解如何使用沙箱环境来测试微信支付。图为微信支付仿真测试系统后简称仿真系统的简化原理图。沙箱说明微信支付沙箱环境,是提供给微信支付商户的开发者,用于模拟支付及回调通知。 本文是【浅析微信支付】系列文章的第十篇,主要讲解如何使用沙箱环境来测试微信支付。 浅析微信支付系列已经更新十篇了哟~,没有看过的朋友们可以看一下。 浅析微信支付:下载对账单和资...

    骞讳护 评论0 收藏0
  • 浅析PHP的输出缓冲控制

    摘要:默认为是一个回调函数,将脚本的所有输出,用所定义的函数进行处理。在输出缓冲区的回调函数中使用这些函数,会导致未定义的错误。 简介 PHP有输出时,可以用输出控制函数来控制输出 缓冲阶段 ob_start(),将内部缓冲区(buffer)打开。当PHP遇到echo,printf等输出语句时, PHP就会将要输出的数据放入缓冲区(buffer)中,等待输出。而只有当缓冲区满了或者php运行...

    wangjuntytl 评论0 收藏0

发表评论

0条评论

娣辩孩

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<