3. Nginx web server配置

图片 1

原标题:nginx 1.17.7 主线版发布 来源:开源中国nginx
会同时维护着两个分支,分别为 mainline 主线版和 stable 稳定版。不过在
nginx
中,“稳定”指的是功能和更新频率,它与软件质量无关。稳定分支在其生命周期中从不接收新功能,并且通常仅接收一个或两个更新,用于修复严重的错误。nginx
1.17.7(mainline version)发布了,此版本主要是修复
bug,变更内容如下:Bugfix:如果在配置中使用了带有空替换字符串的”rewrite”指令,则可能在启动或重新配置期间发生分段错误Bugfix:如果将”break”指令与”alias”指令或带有
URI 的”proxy_pass”指令一起使用,则可能在 worker
进程中发生分段错误Bugfix:如果请求 URI 被重写为包含空字符的
URI,则”Location”的响应 header
行可能包含垃圾Bugfix:使用”error_page”指令返回重定向时,带有正文的请求会被错误处理;该错误在
0.7.12 中出现过Bugfix:使用 HTTP/2 时出现 socket 泄漏的情况Bugfix:在
SSL 连接中处理流水线请求时可能会发生超时; 该错误在 1.17.5
中出现过Bugfix: in the ngx_http_dav_module.下载地址 | 更新说明

编译自:
nginx-web-server

添加虚拟服务器

Nginx配置文件中至少包含一条定义虚拟服务器的server指令。当Nginx处理一个请求时,第一个被选中的虚拟服务器将用于处理该请求。

虚拟服务器通过http指令中的server指令来定义,示例如下:

http {
    server {
        # 服务器配置
    }
}

http中可以包含多条server指令来定义多个虚拟服务器。

通常server指令中会包含一条listen指令,用于指定该虚拟服务器将要监听的IP地址和端口。示例如下:

server {
    listen 127.0.0.1:8080;
    # 其他配置
}

如果不填写端口,则采用标准端口。如果不填写ip地址,则监听所有地址。如果缺少整条listen指令,则标准端口是80/tcp,默认端口是8000/tcp,由超级用户的权限决定。

如果有多个server配置了相同的ip地址和端口,Nginx会匹配server_name指令与请求头部的host字段。server_name指令的参数可以是精确的文本、通配符或正则表达式。通配符可以在字符串的头部、尾部或两端包含**可以匹配任意字符。Nginx采用Perl格式的正则表达式,以~开头。以下是一个精确匹配的例子:

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

如果有多个server_name匹配host字段,Nginx根据以下规则选择第一个相匹配的server处理请求:

  1. 精确匹配
  2. *开始的最长通配符,如*.example.org
  3. *结尾的最长通配符,如mail.*
  4. 第一个匹配的正则表达式(根据在配置文件中出现的先后顺序)

如果找不到任何与host字段相匹配的server_name,Nginx会根据请求端口将其发送给默认的server。默认server就是配置文件中第一个出现的server,也可以通过default_server指定某个server为默认server,如下所示:

server {
    listen      80 default_server;
    ...
}
  • Bugfix:如果在配置中使用了带有空替换字符串的”rewrite”指令,则可能在启动或重新配置期间发生分段错误

  • Bugfix:如果将”break”指令与”alias”指令或带有 URI
    的”proxy_pass”指令一起使用,则可能在 worker 进程中发生分段错误

  • Bugfix:如果请求 URI 被重写为包含空字符的 URI,则”Location”的响应
    header 行可能包含垃圾

  • Bugfix:使用”error_page”指令返回重定向时,带有正文的请求会被错误处理;该错误在
    0.7.12 中出现过

  • Bugfix:使用 HTTP/2 时出现 socket 泄漏的情况

  • Bugfix:在 SSL 连接中处理流水线请求时可能会发生超时; 该错误在
    1.17.5 中出现过

  • Bugfix: in the ngx_http_dav_module.

目录

配置Location指令

Nginx根据URL将请求发送给不同的代理,或处理不同的文件请求。由server指令中的location指令配置规则。

比如,可以为虚拟服务器配置三个location指令,将一些请求发送给代理服务器#1,将另外一些请求发送给代理服务器#2,再由本地文件系统处理剩余请求。

Nginx会将请求的URL匹配所有的location指令,请执行匹配location中的指令。每个location指令中通常还会包含多条更为精细匹配的location指令。

location指令包含两类参数:前缀字符串正则表达式。请求要匹配前缀字符串的话,必须以前缀字符串开始。

以下例子中location参数匹配以/some/path/开始的请求URI,如/some/path/document.html(不匹配/my-site/some/path,因为/some/path不在起始位置)。

location /some/path/ {
    ...
}

~用于匹配区分大小写的正则表达式,~*用于匹配不区分大小写的正则表达式。下面例子匹配任意包含.html.htm的URI。

location ~ .html? {
    ...
}

Nginx先匹配前缀字符串,然后再匹配正则表达式。正则表达式拥有较高优先级,除非使用^~修饰符。在所有前缀字符串中,Nginx会挑选最精确的那个,也就是最长最匹配的那个。详细匹配过程如下:

  1. 匹配所有前缀字符串;
  2. 如果有一个=定义的精确匹配前缀字符串,停止继续匹配;
  3. 如果^~在最长匹配的前缀字符串之前,将忽略正则表达式;
  4. 存储最长的匹配前缀字符串;
  5. 匹配正则表达式;
  6. 找到第一个相匹配的正则表达,停止匹配过程,并执行该location指令;
  7. 如果没有正则表达式匹配,则使用第4部存储的最长前缀字符串;

=修饰符的典型应用是匹配
/请求。针对频繁访问/的情况,将location参数设置为= /可以加速处理过程,因为整个匹配过程在第一条之后就结束了。

location = / {
    ...
}

location指令内可以配置如何处理请求:处理静态文档或将请求转发给代理服务器。在下面的例子中,匹配第一个location的请求可以访问/data目录的文件,匹配第二个location的请求将被转发到www.example.com服务器。

server {
    location  {
        root /data;
    }

    location / {
        proxy_pass http://www.example.com;
    }
}

其中root指令指定了静态文件的文件系统路径,将与请求URI一起构成静态文件的完全路径。在上述例子中,请求xample.png将返回服务器上位于/dataxample.png的文件。

proxy_pass指令将请求转发到代理服务器,并将代理服务器的响应返回给客户端。在上述例子中,所有不是以“开头的URI请求都将被转发到代理服务器。

下载地址 | 更新说明

  • 建立虚拟服务器
  • 配置 location
  • 使用变量
  • 返回指定的状态码
  • URI 重写
  • 对 HTTP Response 进行重写
  • 处理错误

使用变量

通过在配置文件中使用变量,可以让Nginx以不同的方式处理请求。变量的值在运行时计算获得,并可作为参数传递给指令。变量必须以$开头。变量基于Nginx的状态定义信息,如正被处理请求的属性。

Nginx包含许多预设的变量,如core HTTP变量集,也可以使用setmapgeo指令来自定义变量。大多数变量都在运行时计算值,这些值一般都包含某个请求的相关信息。如$remote_addr包含了IP地址,而uri则包含了当前访问的URI

这里有一个视频,有兴趣可以看看:nginx
安装与调优,其中讲述了以下主题:

返回指定状态码

有些网站在处理错误或重定向时,会要求立即返回一个状态码。最简单的方式就是使用return指令,如下所示:

location /wrong/url {
    return 404;
}

return指令的第一个参数是一个状态码。第二个是可选参数,可以是重定向的URL(当状态码是301、302、303和307时),也可以是返回的文本信息。示例如下:

location /permanently/moved/url {
    return 301 http://www.example.com/moved/here;
}

locationserver中都可以包含return指令。

  • nginx 怎样使你的应用能更快响应、具有更好的伸缩性、更快、更安全?
  • 如何安装 nginx
  • 为 nginx 调整操作系统参数

重写请求中的URI

在处理请求过程中,可以通过rewrite指令重复修改请求的URI。rewrite指令包含2个必填参数和1个可选参数。第一个参数是请求URI必须匹配的正则表达式。第二个参数是要替换的目标URI。第三个为可选参数,可以是一个是否继续执行后续rewrite指令的标记,也可以发送一个重定向指令(状态码是301或302)。示例如下:

location /users/ {
    rewrite ^/users/(.*)$ /show?user=$1 break;
}

locationserver中都可以包含多个rewrite指令。Nginx从上到下依次磁性rewrite指令,每次进入server指令块时,rewrite指令都会被执行一次。

Nginx执行完一系列rewrite指令后,根据最新的URI来选择location指令。如果location中也包含rewrite指令,它们也将被依次执行,执行完毕后将重新选择location

下面是一个rewritereturn联合一起使用的例子。

server {
    ...
    rewrite ^(/download/.*)/media/(.*)..*$ $1/mp3/$2.mp3 last;
    rewrite ^(/download/.*)/audio/(.*)..*$ $1/mp3/$2.ra  last;
    return  403;
    ...
}

这个例子用于区分两套不同的URI。类似于/download/some/media/file的URI将被改写为/download/some/mp3/file.mp3。由于最后的标识last,Nginx将忽略随后的两条指令,然后以新的URI继续处理请求。同样地,类似于/download/some/audio/file的URI将被改写为/download/some/mp3/file.ra。如果请求URI都不匹配上述两条rewrite指令,Nginx将返回403错误代码。

rewrite指令可以包含以下两种参数,用于中断处理过程:

  • last –
    停止执行当前serverlocation中的rewrite指令,并以新的URI查找新的location;
  • break –
    停止执行当前上下文环境内的rewrite指令,并不以新的URI查找新的location;

发表评论

电子邮件地址不会被公开。 必填项已用*标注