概述今天我们主要分享如何将NGINX配置为Web服务器,包括以下几个部分:设置虚拟服务器配置位置使用变量返回具体的状态码重写HTTP响应在一个高层,将NGINX配置为Web服务器需要了解一些事情,定义它处理哪些URL以及它如何处理对这些URL上的资源的HTTP请求。在低级别,配置定义了一组虚拟服务器,这些服务器控制对特定域或IP地址的请求处理。每个用于HTTP流量的虚拟服务器都定义了称为位置的特殊配置实例,它控制一组特定URI的处理。每个位置都定义了它自己的映射到该位置的请求会发生什么。NGINX可以完全控制这个过程。每个位置都可以代理一个请求或返回一个文件。此外,可以修改URI,以便将请求重定向到另一个位置或虚拟服务器。此外,可以返回特定的错误代码,并且可以配置特定的页面以对应每个错误代码。1.设置虚拟服务器NGINX配置文件必须包含至少一个服务器指令来定义虚拟服务器。当NGINX处理请求时,它首先选择一个虚拟服务器来为请求提供服务。虚拟服务器由http上下文中的服务器指令定义,例如:http{server{#Serverconfiguration}}可以将多个服务器指令添加到http上下文以定义多个虚拟服务器。服务器配置块通常包含一个listen指令,用于指定服务器侦听请求的IP地址和端口(或Unix域套接字和路径)。IPv4和IPv6地址都被接受;将方括号(.,如果省略一个地址,服务器将监听所有地址。如果没有包含listen指令,则“标准”端口为80/tcp,“默认”端口为8000/tcp,具体取决于超级用户权限。如果大于一台服务器匹配请求的IP地址和端口,NGINX将根据服务器块中的server_name指令测试请求的主机标头字段。server_name的参数可以是完整(准确)名称、通配符或正则表达式。通配符是在开头、结尾或两者都包含星号(*)的字符串;星号匹配任何字符序列。NGINX对正则表达式使用Perl语法;在它们之前使用波浪号()。这个例子说明了一个确切的名字。服务器{listen80;server_nameexample.orgwww.example.org;...}2。配置位置NGINX可以根据请求URI将流量发送到不同的代理或提供不同的文件。这些块是使用放置在服务器指令中的位置指令定义的。例如,您可以定义三个位置块来指示虚拟服务器将一些请求发送到一个代理服务器,将其他请求发送到不同的代理服务器,并通过从本地文件系统传递文件来为其余请求提供服务。NGINX针对所有位置指令的参数测试请求URI,并应用在位置中定义的匹配指令。在每个位置块中,通常可以(有一些例外)放置更多的位置指令以进一步细化对特定请求组的处理。注意:在本教程文章中,位置一词指的是单个位置上下文。location指令采用两种类型的参数:前缀字符串(路径名)和正则表达式。对于匹配前缀字符串的请求URI,它必须以前缀字符串开头。下面这个带有pathname参数的示例位置匹配以/some/path/开头的请求URI,例如/some/path/document.html,它不匹配/my-site/some/path,因为/some/path不在URI出现在开头。location/some/path/{...}正则表达式前面有波浪号(~)用于区分大小写匹配,波浪号(~*)用于不区分大小写匹配。以下示例将包含字符串.html或.html的URI匹配到任何位置。location~\.html?{...}为了找到与URI最匹配的位置,NGINX首先将URI与前缀字符串的位置进行比较。然后用正则表达式搜索位置。位置上下文可以包含定义请求应该如何解析的指令——提供静态文件或将请求传递给代理服务器。在以下示例中,与第一个位置上下文匹配的请求将提供/data/images目录中的文件,与第二个位置匹配的请求将被传递到托管www.example.com域内容的代理服务器。server{location/images/{root/data;}location/{proxy_passhttp://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变量,您可以使用set、map和geo指令定义自定义变量。大多数变量在运行时计算并包含与特定请求相关的信息。例如,$remote_addr包含客户端IP地址,$uri包含当前URI值。4.返回一个特定的状态代码一些网站URI需要立即返回一个特定错误或重定向代码的响应,例如当页面被临时或永久移动时。最简单的方法是使用返回指令。例如返回404状态码未找到:location/wrong/url{return404;}返回的第一个参数是响应码。可选的第二个参数可以是重定向的URL(代码301、302、303和307)或在响应正文中返回文本。例如:location/permanently/moved/url{return301http://www.example.com/moved/here;}返回指令可以包含在位置和服务器上下文中。5.重写HTTP响应有时需要重写或更改HTTP响应中的内容,将一个字符串替换为另一个字符串。可以使用sub_filter指令定义要应用的重写。该指令支持变量和替换链,使更复杂的更改成为可能。例如,可以更改引用除代理服务器以外的其他内容的绝对链接:location/{sub_filter/blog//blog-staging/;sub_filter_onceoff;}另一个示例将方法从http://更改为http://,并从请求的头字段中将本地主机地址替换为主机名。sub_filter_once指令告诉NGINX在一个位置连续应用sub_filter指令:location/{sub_filter'href="http://127.0.0.1:8080/''href="http://$host/';sub_filter'imgsrc="http://127.0.0.1:8080/''imgsrc="http://$host/';sub_filter_onceon;}注意,如果出现另一个sub_filter匹配,response中被sub_filter修改的部分不会被替换再次。
