Nginx 教程:配置 Web 服务器
如何将 NGINX 配置为 Web 服务器,包括以下部分:
- 设置虚拟服务器
- 配置位置 ❀ 返回特定变量状态代码
- 覆盖请求中的 URI
- HTTP 响应重写
- 错误处理
在较高级别上,将 NGINX 配置为 Web 服务器以及它如何处理 Web 服务器处理这些 URL 上的资源时需要了解一些问题'是HTTP请求。在较低级别,配置定义了一组虚拟服务器,用于控制对特定域或 IP 地址的请求的处理。
用于 HTTP 流量的每个虚拟服务器都定义称为位置的特殊配置实例,用于控制特定 URI 集的处理。每个位置都定义了自己的与该位置关联的请求所发生的情况。 NGINX 完全控制这个过程。每个位置都可以代理请求或返回文件。此外,可以更改 URI 以将请求重定向到另一个位置或虚拟服务器。此外,还可以返回特定的错误代码,并且可以配置特定的页面来响应每个错误代码。
1。配置虚拟服务器
NGINX 配置文件必须至少包含一个服务器指令来定义虚拟服务器。当 NGINX 处理请求时,它首先选择服务该请求的虚拟服务器。
虚拟服务器由 http 上下文中的服务器指令定义,例如:
http {
server {
# Server configuration
}
}
更多 server 可以添加 上下文来定义更多虚拟服务器。
server 配置块通常包含一个 listen 指令,用于指定服务器将侦听哪个套接字的 IP 地址和端口(或 Unix 域路径)。 IPv4 和 IPv6 地址均可接受;括起来方括号(
。以下示例显示侦听 IP 地址 127.0.0.1 和端口 8080 的服务器的配置: ♽ 如果省略端口,则省略该端口。同样,如果省略地址,服务器将侦听所有地址。如果不包含侦听指令,则“默认”端口为 80/tcp,“默认”端口为 8000/ tcp,取决于超级用户权限
如果多个服务器与请求的 IP 地址和端口匹配,NGINX 将根据服务器标头字段中的 如果主机与前几个名称匹配,NGINX 将通过按以下顺序搜索名称并使用找到的第一个匹配来选择一个: 如果主机头字段与服务器名称不匹配,NGINX 会将请求定向到请求到达端口的默认服务器。默认服务器是 Nginx虚拟机配置的完整示例。这里我们演示两个虚拟机的配置。对应的域名为: NGINX 可以根据请求 URI 将流量发送到不同的代理或提供不同的文件。这些块是使用放置在 例如您可以定义三个 NGINX 测试根据所有 注意:在本教程中,单词 以下带有 前面带有表示大小写字母的波浪号 ( 为了找到与 URI 最匹配的位置,NGINX 首先将 URI 与前缀字符串的位置进行比较。然后使用正则表达式搜索该位置。 您可以使用配置文件中的变量,使NGINX进程的请求根据定义的情况而有所不同。变量是在运行时计算并用作指令参数的命名值。变量由以其名称开头的 有许多预定义变量作为核心 HTTP 变量,您可以使用 某些站点 URI 必须立即返回带有特定错误或重定向代码的响应,例如当页面临时或永久移动时。最简单的方法是使用命令 返回的第一个参数是响应代码。可选的第二个参数可以是重定向的 URL(代码 return 指令可以包含在 使用 如本示例所示,用户通过匹配正则表达式来捕获第二个参数。 您可以在 以下示例显示了 此示例配置区分两组 URI。诸如 中断处理重写指令有两个参数: 有时您需要重写或更改 HTTP 响应的内容,并将一个字符串替换为另一个字符串。您可以使用 另一个示例将方法从 注意,如果另一个出现sub_filter,如果匹配,则使用 使用 请注意,该指令不会立即返回错误(返回指令会),而只是指定错误发生时如何处理。该错误代码可能来自代理服务器或在 NGINX 处理过程中发生(例如,当 NGINX 找不到客户端请求的文件时,会显示 在以下示例中,当 NGINX 找不到页面时,它会将代码 以下配置是在找不到文件时向后端发送请求的示例。由于 当找不到文件时, 例如,如果 open_file_cache_errors 指令可防止在文件不存在时写入错误消息。由于可以正确处理丢失的文件,因此这不是必需的。servername⸀servername⸀❙ 字段测试请求。servername 的参数可以是完整(精确)名称、通配符或正则表达式。通配符是在开头、结尾或两者都包含星号的字符串 (*);星号匹配任何字符序列。 NGINX 使用 Perl 语法进行正则表达式;在它们之前使用波形符 (~)。这个例子说明了一个确切的名称。 server {
listen 80;
server_name example.org www.example.org;
...
}
*.example.orgmail.*nginx.conf 文件中列出的第一个服务器,除非您在 location = / {
...
}
listen_server 参数来直接侦听服务器。价值。 server {
listen 80 default_server;
...
}
vhost1.com 和 vhost2.com、⸀vhost1 com 站点的主目录为。 /data/www/vhost1 ,vhost2.com网站的主目录位于,例如 ,它与 /data/www/vhost2:❀。配置位置 server 指令内的 location 指令定义的。 location块来指示虚拟服务器向代理服务器发送一些请求,向另一个代理服务器发送其他请求,以及从本地文件系统发送文件。其余请求。 location 指令的参数请求 URI,并使用 location 中定义的匹配指令。在每个 location 块中,通常可以(有一些例外)放置额外的 location 指令来进一步细化特定请求组的处理。 location 指单个 location 上下文。指令location采用两种类型的参数:前缀字符串(路径名)和正则表达式。为了使请求 URI 与前缀字符串匹配,它必须以前缀字符串开头。 路径名 参数的示例位置与以 /some/sti/ 开头的请求 URI 匹配,例如 /my-place/some/path 不匹配,因为 /some/path 没有出现在该 URI 的开头。正则表达式 location /some/path/ {
...
}
~) 或表示大小写字母的波浪号 (~*)。以下示例将包含字符串 .html 或 .html 的 URI 与任何位置进行匹配。 location ~ \.html? {
...
}
除非使用 ^~ 修饰符来为正则表达式提供更高的优先级。在前缀字符串中,NGINX 选择最具体的字符串(即最长且最完整的字符串)。下面给出了选择在何处处理请求的确切逻辑: =(等号)定义 URI 和前缀字符串之间的精确匹配。如果找到完全匹配,则搜索停止。如果 ^~(插入符号)修饰符位于最长匹配前缀字符串之前,则不会检查 = 修饰符的典型用例是请求 /(斜杠)。如果频繁请求 /,请指定 =/ 作为 location 指令的参数,因为搜索将停止匹配过程。 域内容的代理服务器。 location = / {
...
}
location 上下文可以包含定义如何解析请求的指令 - 提供静态文件或将请求转发到代理服务器。在以下示例中,匹配第一个 location 上下文的请求将显示 /data/images 文件夹中的文件,而匹配第二个位置的请求将传递到主机 www 。 example.comserver {
location /images/ {
root /data;
}
location / {
proxy_pass http://www.example.com;
}
}
root 指令指定在其中搜索要提供的静态文件的文件系统路径。与该位置关联的请求 URI 将附加到路径中,以获取要显示的静态文件的全名。上例中,响应/images/logo.png的请求,NGINX在服务器本地实际提供的对应文件为:/data/images/logo.png ❝。指令 server 上下文中包含多个 proxy_pass 使用配置的 URL 将请求发送到访问代理服务器。然后代理服务器的响应被发送回客户端。在上面的示例中,所有对不以 /images/ 开头的 URI 的请求都将转发到代理服务器(即:www.example.com)。 3。使用变量
$(美元)符号表示。变量根据 NGINX 的状态定义信息,例如正在处理的请求的属性。 set、map 和 gege 定义自定义变量 大多数变量在运行时计算,包含与特定请求相关的信息。例如,$remote_addr 包含客户端的 IP 地址,$uri 包含当前 URI 值。 4。返回特定状态代码
return。例如,404 返回未找到的状态代码: location /wrong/url {
return 404;
}
301、302、303 和 307)或响应正文中返回的文本。例如:location /permanently/moved/url {
return 301 http://www.example.com/moved/here;
}
location 和 server 上下文中。 重写 URI 请求
rewrite 指令可以在请求处理过程中多次更改请求 URI,该指令有 1 个可选参数和 2 个参数。第一个(必需)参数是请求 URI 必须匹配的正则表达式。第二个参数是用于替换匹配 URI 的 URI。可选的第三个参数是一个标志,可以停止处理进一步的重写指令或发送重定向(代码301或302)。例如: location /users/ {
rewrite ^/users/(.*)$ /show?user=$1 break;
}
location 和 rewrite 指令。 NGINX 按照指令出现的顺序一一执行。当选择此上下文时,server上下文中的命令rewrite将被执行一次。
NGINX 处理完一组 rewrite 指令后,它会根据新的 URI 选择一个 location 上下文。如果所选的location块包含rewrite指令,则按顺序执行它们。如果 URI 与其中任何一个匹配,则在处理所有定义的 rewrite 指令后,将搜索新的 location 块。 rewrite 指令与 return 指令的组合。 server {
...
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last;
return 403;
...
}
/download/some/media/file 之类的 URI 更改为 /download/some/mp3/file.mp3。由于最后一个标志,后续指令(第二个rewrite和return指令)将被跳过,但NGINX继续处理请求,该请求现在具有不同的URI。同样,诸如 /download/nogle/lyd/fil 之类的 URI 会替换为 /download/nogle/mp3/fil.ra。如果 URI 与 rewrite 指令不匹配,NGINX 将向客户端返回 403 错误代码。last - 在当前服务器或位置上下文中停止执行重写指令,但 NGINX 搜索与重写的 URI 匹配的位置并应用 Any在新位置重写指令(可以再次更改 URI 并继续向下匹配)。 break - 与 break 类似,停止在当前上下文中处理重写指令,并取消搜索与新 URI 匹配的位置。新位置(位置)处的rewrite指令不会执行。 5。重写 HTTP 响应
sub_filter 指令来定义要应用的覆盖。该指令支持变量和替换链,使更复杂的更改成为可能。
例如,您可以更改引用除代理服务器之外的其他内容的绝对链接: location / {
sub_filter /blog/ /blog-staging/;
sub_filter_once off;
}
http:// 更改为 http:// ,并将 localhost 地址替换为请求标头字段中的主机名。指令 sub_filter_once 告诉 NGINX 在某个位置(location)内连续应用 sub_filter。伪命令:location / {
sub_filter 'href="http://127.0.0.1:8080/'%20%20%20%20'href="http://$host/';
sub_filter 'img http://$host/';
sub_filter_once on;
}
sub_filter修改的响应部分将不再被替换。 error_page指令,您可以将NGINX配置为返回自定义页面以及错误代码,替换浏览器对不同URI的响应中的其他错误代码。在以下示例中,error_page 指令指定返回404 页面错误代码 (/404.html) 的页面。 error_page 404 /404.html;
404)。 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 file
root /data/www;
# Disable logging of errors related to file existence
open_file_cache_errors off;
# Make an internal redirect if the file is not found
error_page 404 = /fetch$uri;
}
location /fetch/ {
proxy_pass http://backend/;
}
}
error_page指令指示NGINX进行内部重定向。 error_page指令$uri的最后一个参数包含重定向中发送的当前请求的URI。 /images/some/file不存在,则会被/fetch/images/some/file❀,替换为新的搜索位置位置)开始。最后,请求在第二个 location 上下文中结束,并发送到 http://backend/。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网