Code前端首页关于Code前端联系我们

Nginx 教程:配置 Web 服务器

terry 2年前 (2023-09-28) 阅读数 57 #未命名

如何将 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 将根据服务器标头字段中的 servername⸀servername⸀❙ 字段测试请求。servername 的参数可以是完整(精确)名称、通配符或正则表达式。通配符是在开头、结尾或两者都包含星号的字符串 (*);星号匹配任何字符序列。 NGINX 使用 Perl 语法进行正则表达式;在它们之前使用波形符 (~)。这个例子说明了一个确切的名称。

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

如果主机与前几个名称匹配,NGINX 将通过按以下顺序搜索名称并使用找到的第一个匹配来选择一个:

  1. 精确名称(完整的精确名称)
  2. 带有星号 最长的通配符,开头如:*.example.org
  3. 以星号结尾的最长通配符,如:mail.*
  4. 第一个匹配的正则表达式(如配置文件中的顺序所示) )

如果主机头字段与服务器名称不匹配,NGINX 会将请求定向到请求到达端口的默认服务器。默认服务器是 nginx.conf 文件中列出的第一个服务器,除非您在

location = / {
    ...
}

  • 默认服务器中包含 listen_server 参数来直接侦听服务器。价值。
    server {
        listen    80    default_server;
        ...
    }
    

    Nginx虚拟机配置的完整示例。这里我们演示两个虚拟机的配置。对应的域名为: vhost1.comvhost2.com⸀vhost1 com 站点的主目录为。 /data/www/vhost1 vhost2.com网站的主目录位于/data/www/vhost2:❀。配置位置

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

    例如您可以定义三个location块来指示虚拟服务器向代理服务器发送一些请求,向另一个代理服务器发送其他请求,以及从本地文件系统发送文件。其余请求。

    NGINX 测试根据所有 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? {
        ...
    }
    

    为了找到与 URI 最匹配的位置,NGINX 首先将 URI 与前缀字符串的位置进行比较。然后使用正则表达式搜索该位置。
    除非使用 ^~ 修饰符来为正则表达式提供更高的优先级。在前缀字符串中,NGINX 选择最具体的字符串(即最长且最完整的字符串)。下面给出了选择在何处处理请求的确切逻辑:

    1. 测试所有 URI 的前缀字符串。修饰符
    2. =(等号)定义 URI 和前缀字符串之间的精确匹配。如果找到完全匹配,则搜索停止。如果 ^~(插入符号)修饰符位于最长匹配前缀字符串之前,则不会检查
    3. 正则表达式。
    4. 存储最长的匹配前缀字符串。
    5. 根据正则表达式测试 URI。
    6. 打破第一个匹配的正则表达式并使用相应的位置。
    7. 如果没有正则表达式匹配,则使用与存储的前缀字符串对应的位置。

    = 修饰符的典型用例是请求 /(斜杠)。如果频繁请求 /,请指定 =/ 作为 location 指令的参数,因为搜索将停止匹配过程。

    location = / {
        ...
    }
    

    location 上下文可以包含定义如何解析请求的指令 - 提供静态文件或将请求转发到代理服务器。在以下示例中,匹配第一个 location 上下文的请求将显示 /data/images 文件夹中的文件,而匹配第二个位置的请求将传递到主机 www 。 example.com

    域内容的代理服务器。

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

    root 指令指定在其中搜索要提供的静态文件的文件系统路径。与该位置关联的请求 URI 将附加到路径中,以获取要显示的静态文件的全名。上例中,响应/images/logo.png的请求,NGINX在服务器本地实际提供的对应文件为:/data/images/logo.png ❝。指令

    proxy_pass 使用配置的 URL 将请求发送到访问代理服务器。然后代理服务器的响应被发送回客户端。在上面的示例中,所有对不以 /images/ 开头的 URI 的请求都将转发到代理服务器(即:www.example.com)。

    3。使用变量

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

    有许多预定义变量作为核心 HTTP 变量,您可以使用 setmap 和 gege 定义自定义变量 大多数变量在运行时计算,包含与特定请求相关的信息。例如,$remote_addr 包含客户端的 IP 地址,$uri 包含当前 URI 值。

    4。返回特定状态代码

    某些站点 URI 必须立即返回带有特定错误或重定向代码的响应,例如当页面临时或永久移动时。最简单的方法是使用命令return。例如,404 返回未找到的状态代码:

    location /wrong/url {
        return 404;
    }
    

    返回的第一个参数是响应代码。可选的第二个参数可以是重定向的 URL(代码 301302303307)或响应正文中返回的文本。例如:

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

    return 指令可以包含在 locationserver 上下文中。

    重写 URI 请求

    使用 rewrite 指令可以在请求处理过程中多次更改请求 URI,该指令有 1 个可选参数和 2 个参数。第一个(必需)参数是请求 URI 必须匹配的正则表达式。第二个参数是用于替换匹配 URI 的 URI。可选的第三个参数是一个标志,可以停止处理进一步的重写指令或发送重定向(代码301302)。例如:

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

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

    您可以在 location

    server 上下文中包含多个 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;
        ...
    }
    

    此示例配置区分两组 URI。诸如 /download/some/media/file 之类的 URI 更改为 /download/some/mp3/file.mp3。由于最后一个标志,后续指令(第二个rewritereturn指令)将被跳过,但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 响应

    有时您需要重写或更改 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,如果匹配,则使用sub_filter修改的响应部分将不再被替换。

    1. 错误处理

    使用error_page指令,您可以将NGINX配置为返回自定义页面以及错误代码,替换浏览器对不同URI的响应中的其他错误代码。在以下示例中,error_page 指令指定返回404 页面错误代码 (/404.html) 的页面。

    error_page 404 /404.html;
    

    请注意,该指令不会立即返回错误(返回指令会),而只是指定错误发生时如何处理。该错误代码可能来自代理服务器或在 NGINX 处理过程中发生(例如,当 NGINX 找不到客户端请求的文件时,会显示404)。

    在以下示例中,当 NGINX 找不到页面时,它会将代码 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/

    open_file_cache_errors 指令可防止在文件不存在时写入错误消息。由于可以正确处理丢失的文件,因此这不是必需的。

  • 版权声明

    本文仅代表作者观点,不代表Code前端网立场。
    本文系作者Code前端网发表,如需转载,请注明页面地址。

    热门