将NGINX Plus配置为Web服务器

 2023-09-06 阅读 24 评论 0

摘要:将NGINX Plus配置为Web服务器 本文介绍了如何将NGINX Plus配置为Web服务器,并包括以下部分: 设置虚拟服务器配置位置 位置优先使用变量返回特定状态码重写请求中的URI重写HTTP响应处理错误有关如何调整NGINX Plus和NGINX开源软件的更多信息,请观看我们的

将NGINX Plus配置为Web服务器

本文介绍了如何将NGINX Plus配置为Web服务器,并包括以下部分:

  • 设置虚拟服务器
  • 配置位置
    • 位置优先
  • 使用变量
  • 返回特定状态码
  • 重写请求中的URI
  • 重写HTTP响应
  • 处理错误

有关如何调整NGINX Plus和NGINX开源软件的更多信息,请观看我们的免费网络研讨会,按需安装和调整NGINX。

在较高的级别上,将NGINX Plus配置为Web服务器只是定义它处理的URL以及如何处理这些URL上的HTTP请求资源的问题。在较低级别,该配置定义了一组虚拟服务器,这些虚拟服务器控制对特定域或IP地址的请求的处理。有关配置文件的更多信息,请参见创建NGINX Plus配置文件。

每个用于HTTP流量的虚拟服务器都定义了称为位置的特殊配置实例,这些实例控制对特定URI集的处理。每个位置都定义了自己的情形,即映射到该位置的请求将如何处理。NGINX Plus提供了对该过程的完全控制。每个位置都可以代理请求或返回文件。另外,可以修改URI,以便将请求重定向到另一个位置或虚拟服务器。另外,可以返回特定的错误代码,并且您可以配置特定的页面以与每个错误代码相对应。

 

设置虚拟服务器

NGINX Plus配置文件必须至少包含一个server指令以定义虚拟服务器。当NGINX Plus处理请求时,它首先选择将为请求服务的虚拟服务器。

虚拟服务器由上下文中的server指令定义http,例如:

http {server {# Server configuration}
}

可以serverhttp上下文中添加多个指令以定义多个虚拟服务器。

server配置块通常包括listen指令指定的IP地址和端口(或Unix域套接字和路径)上的服务器侦听请求。IPv4和IPv6地址都被接受;将IPv6地址括在方括号(。

以下示例显示了侦听IP地址127.0.0.1和端口8080的服务器的配置:

server {listen 127.0.0.1:8080;# The rest of server configuration
}

如果省略端口,则使用标准端口。同样,如果省略地址,则服务器将侦听所有地址。如果listen根本不包含该指令,则取决于超级用户特权,“标准”端口为80/tcp,“默认”端口为8000/tcp

如果有多个服务器与请求的IP地址和端口相匹配,则NGINX Plus会根据块Host中的server_name指令测试请求的标头字段server。要使用的参数server_name可以是完整(准确)名称,通配符或正则表达式。通配符是一个字符串,在字符串*的开始,结尾或同时包含和都包含星号()。星号匹配任何字符序列。NGINX Plus对正则表达式使用Perl语法;在其前面加上波浪号(~)。本示例说明了确切的名称。

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

如果多个名称与Host标题匹配,则NGINX Plus将按照以下顺序搜索名称并使用找到的第一个匹配项来选择一个:

  1. 确切的名字
  2. 以星号开头的最长通配符,例如 *.example.org
  3. 以星号结尾的最长通配符,例如 mail.*
  4. 第一个匹配的正则表达式(在配置文件中出现的顺序)

如果Host标题字段与服务器名称不匹配,则NGINX Plus将请求路由到请求到达的端口的默认服务器。缺省服务器是nginx.conf文件中列出的第一个服务器,除非您default_serverlisten指令中包含参数以明确指定服务器为缺省服务器。

server {listen 80 default_server;#...
}

 

配置位置

NGINX Plus可以根据请求URI将流量发送到不同的代理或提供不同的文件。这些块是使用location放置在server指令中的指令定义的。

例如,您可以定义三个location块来指示虚拟服务器将一些请求发送到一个代理服务器,将其他请求发送到另一台代理服务器,并通过从本地文件系统传递文件来满足其余请求。

NGINX Plus测试针对所有location指令的参数请求URI,并应用在匹配位置中定义的指令。在每个location块内,通常可以(有一些例外)放置更多location指令,以进一步优化特定请求组的处理。

注意:在本指南中,位置一词是指单个location上下文。

location伪指令有两种类型的参数:前缀字符串(路径名)和正则表达式。为了使请求URI与前缀字符串匹配,它必须以前缀字符串开头。

以下带有pathname参数的示例位置与以/ some / path /开头的请求URI匹配,例如/some/path/document.html。(它与/ my-site / some / path不匹配,因为/ some / path不在该URI的开头。)

location /some/path/ {#...
}

在正则表达式前加上波浪号(~)表示区分大小写,或在tilde-asterisk(~*)时区分大小写。以下示例匹配在任意位置包含字符串.html.htm的 URI 。

location ~ \.html? {#...
}

 

NGINX位置优先

为了找到与URI最匹配的位置,NGINX Plus首先将URI与带有前缀字符串的位置进行比较。然后,它使用正则表达式搜索位置。

除非使用^~修饰符,否则正则表达式将具有更高的优先级。在前缀字符串NGINX Plus中,选择最具体的一个(即最长和最完整的字符串)。下面给出了选择处理请求的位置的确切逻辑:

  1. 针对所有前缀字符串测试URI。
  2. =(等号)改性剂限定所述URI的精确匹配和前缀字符串。如果找到完全匹配的内容,搜索将停止。
  3. 如果^~(插入符)修饰符加上最长的匹配前缀字符串,则不检查正则表达式。
  4. 存储最长的匹配前缀字符串。
  5. 针对正则表达式测试URI。
  6. 中断第一个匹配的正则表达式并使用相应的位置。
  7. 如果没有正则表达式匹配,请使用与存储的前缀字符串相对应的位置。

=修饰符的典型用例是请求/(正斜杠)。如果对/的请求很频繁,则将其指定为指令的参数可以加快处理速度,因为匹配的搜索会在第一次比较后停止。= /location

location = / {#...
}

一个location环境可以包含定义如何解决的请求指令-要么成为一个静态文件或将请求与代理服务器。在以下示例中,与第一个location上下文匹配的请求是/ data目录中的服务文件,与第二个上下文匹配的请求被传递到托管www.example.com域内容的代理服务器。

server {location /images/ {root /data;}location / {proxy_pass http://www.example.com;}
}

root伪指令指定要在其中搜索要服务的静态文件的文件系统路径。与该位置关联的请求URI被附加到路径中以获得要服务的静态文件的全名。在上面的示例中,响应于对/images/example.png的请求,NGINX Plus提供了文件/data/images/example.png

proxy_pass指令将请求传递到所配置的URL访问的代理服务器。然后,来自代理服务器的响应将被传递回客户端。在上面的示例中,所有带有不以/ images /开头的URI的请求都将传递到代理服务器。

 

使用变量

您可以在配置文件中使用变量,以根据定义的环境使NGINX Plus处理请求有所不同。变量是在运行时计算的命名值,用作指令的参数。变量名称的开头用\(\)(美元)符号表示。变量根据NGINX的状态定义信息,例如当前正在处理的请求的属性。

有一些预定义的变量,如的核心HTTP变量,您可以使用自定义变量setmapgeo指令。大多数变量是在运行时计算的,并且包含与特定请求有关的信息。例如,$remote_addr包含客户端IP地址并$uri保存当前URI值。

 

返回特定状态码

某些网站URI要求立即返回带有特定错误或重定向代码的响应,例如当页面被临时或永久移动时。最简单的方法是使用return指令。例如:

location /wrong/url {return 404;
}

的第一个参数return是响应代码。可选的第二个参数可以是重定向(用于代码的URL 301302303,和307)或在响应体返回的文本。例如:

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

return指令可以包含在这两个locationserver上下文。

 

重写请求中的URI

通过使用rewrite伪指令,可以在请求处理期间多次修改请求URI,该伪指令具有一个可选参数和两个必需参数。第一个(必需)参数是请求URI必须匹配的正则表达式。第二个参数是URI,用于替换匹配的URI。可选的第三个参数是一个标志,可以停止对其他rewrite指令的处理或发送重定向(代码301302)。例如:

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

如本示例所示,第二个参数users通过匹配正则表达式来捕获。

您可以rewriteserverlocation上下文中包含多个指令。NGINX Plus会按指令的执行顺序依次执行它们。选择上下文后,上下文中的rewrite指令server将执行一次。

NGINX处理了一组重写指令后,它将location根据新的URI 选择上下文。如果所选位置包含rewrite指令,则会依次执行它们。如果URI与任何一个都匹配,rewrite则在处理所有定义的指令之后,将开始对新位置的搜索。

以下示例显示rewrite了与return指令结合使用的指令。

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标志,随后的指令(第二个rewrite和该return指令)被跳过,但是NGINX Plus继续处理该请求,该请求现在具有不同的URI。类似地,诸如/ download / some / audio / file之类的URI 被替换为/download/some/mp3/file.ra。如果URI与任何一个rewrite指令都不匹配,NGINX Plus会将403错误代码返回给客户端。

有两个参数可中断rewrite指令的处理:

  • last–停止rewrite在当前serverlocation上下文中执行指令,但是NGINX Plus搜索与重写的URI匹配的位置,并rewrite应用新位置中的所有指令(这意味着可以再次更改URI)。
  • break–与break指令一样,停止rewrite在当前上下文中处理指令,并取消对与新URI匹配的位置的搜索。rewrite新位置中的指令不会执行。

 

重写HTTP响应

有时,您需要重写或更改HTTP响应中的内容,用一个字符串替换为另一个字符串。您可以使用sub_filter指令定义要应用的重写。该指令支持变量和替换链,从而使更复杂的更改成为可能。

例如,您可以更改引用除代理服务器以外的服务器的绝对链接:

location / {sub_filter      /blog/ /blog-staging/;sub_filter_once off;
}

另一个示例将方法从更改http://http_s_://,并将localhost地址从请求标头字段替换为主机名。该sub_filter_once指令告诉NGINX sub_filter在一个位置内连续应用指令:

location / {sub_filter     'href="http://127.0.0.1:8080/'    'href="https://$host/';sub_filter     'img src="http://127.0.0.1:8080/' 'img src="https://$host/';sub_filter_once on;
}

请注意,sub_filter如果sub_filter发生其他匹配,则已经用修改的响应部分将不会再次替换。

 

处理错误

使用该error_page指令,您可以配置NGINX Plus以返回自定义页面以及错误代码,在响应中替换不同的错误代码,或者将浏览器重定向到其他URI。在以下示例中,error_page伪指令指定要返回的页面(/404.html),并附带404错误代码。

error_page 404 /404.html;

请注意,此伪指令并不意味着立即返回错误(return伪指令这样做),而只是指定错误发生时的处理方式。错误代码可能来自代理服务器,也可能是在NGINX Plus处理期间发生的(例如,404NGINX Plus无法找到客户端请求的文件时的结果)。

在以下示例中,当NGINX Plus无法找到页面时,它将代码替换301为代码404,并将客户端重定向到http:/example.com/new/path.html。当客户端仍尝试使用其旧URI访问页面时,此配置很有用。该301代码通知浏览器该页面已永久移动,并且需要在返回时自动用新地址替换旧地址。

location /old/path.html {error_page 404 =301 http:/example.com/new/path.html;
}

以下配置是在找不到文件时将请求传递到后端的示例。由于在error_page指令中的等号后没有指定状态码,因此对客户端的响应具有代理服务器返回的状态码(不一定是404)。

server {...location /images/ {# Set the root directory to search for the fileroot /data/www;# Disable logging of errors related to file existenceopen_file_cache_errors off;# Make an internal redirect if the file is not founderror_page 404 = /fetch$uri;}location /fetch/ {proxy_pass http://backend/;}
}

error_page指令指示NGINX Plus在找不到文件时进行内部重定向。指令$uri的最终参数中的变量error_page保存当前请求的URI,该URI在重定向中传递。

例如,如果未找到/images/some/file,则将其替换为/fetch/images/some/file,并开始对位置的新搜索。结果,请求在第二个location上下文中结束,并被代理到http://backend/

open_file_cache_errors如果找不到文件,该伪指令可防止编写错误消息。这里没有必要这样做,因为正确处理了丢失的文件。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/3495.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息