本文介绍了如何将NGINX Plus配置为Web服务器,并包括以下部分:
有关如何调整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}
}
可以server
在http
上下文中添加多个指令以定义多个虚拟服务器。
的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将按照以下顺序搜索名称并使用找到的第一个匹配项来选择一个:
*.example.org
mail.*
如果Host
标题字段与服务器名称不匹配,则NGINX Plus将请求路由到请求到达的端口的默认服务器。缺省服务器是nginx.conf文件中列出的第一个服务器,除非您default_server
在listen
指令中包含参数以明确指定服务器为缺省服务器。
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? {#...
}
为了找到与URI最匹配的位置,NGINX Plus首先将URI与带有前缀字符串的位置进行比较。然后,它使用正则表达式搜索位置。
除非使用^~
修饰符,否则正则表达式将具有更高的优先级。在前缀字符串NGINX Plus中,选择最具体的一个(即最长和最完整的字符串)。下面给出了选择处理请求的位置的确切逻辑:
=
(等号)改性剂限定所述URI的精确匹配和前缀字符串。如果找到完全匹配的内容,搜索将停止。^~
(插入符)修饰符加上最长的匹配前缀字符串,则不检查正则表达式。=
修饰符的典型用例是请求/(正斜杠)。如果对/的请求很频繁,则将其指定为指令的参数可以加快处理速度,因为匹配的搜索会在第一次比较后停止。= /
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变量,您可以使用自定义变量set
,map
和geo
指令。大多数变量是在运行时计算的,并且包含与特定请求有关的信息。例如,$remote_addr
包含客户端IP地址并$uri
保存当前URI值。
某些网站URI要求立即返回带有特定错误或重定向代码的响应,例如当页面被临时或永久移动时。最简单的方法是使用return
指令。例如:
location /wrong/url {return 404;
}
的第一个参数return
是响应代码。可选的第二个参数可以是重定向(用于代码的URL 301
,302
,303
,和307
)或在响应体返回的文本。例如:
location /permanently/moved/url {return 301 http://www.example.com/moved/here;
}
该return
指令可以包含在这两个location
和server
上下文。
通过使用rewrite
伪指令,可以在请求处理期间多次修改请求URI,该伪指令具有一个可选参数和两个必需参数。第一个(必需)参数是请求URI必须匹配的正则表达式。第二个参数是URI,用于替换匹配的URI。可选的第三个参数是一个标志,可以停止对其他rewrite
指令的处理或发送重定向(代码301
或302
)。例如:
location /users/ {rewrite ^/users/(.*)$ /show?user=$1 break;
}
如本示例所示,第二个参数users
通过匹配正则表达式来捕获。
您可以rewrite
在server
和location
上下文中包含多个指令。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
在当前server
或location
上下文中执行指令,但是NGINX Plus搜索与重写的URI匹配的位置,并rewrite
应用新位置中的所有指令(这意味着可以再次更改URI)。break
–与break
指令一样,停止rewrite
在当前上下文中处理指令,并取消对与新URI匹配的位置的搜索。rewrite
新位置中的指令不会执行。
有时,您需要重写或更改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处理期间发生的(例如,404
NGINX 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
如果找不到文件,该伪指令可防止编写错误消息。这里没有必要这样做,因为正确处理了丢失的文件。
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态