Nginx主要用于配置Web服务器。抽象来说,把Nginx配置成Web服务器就是定义要处理哪些URL,以及如何处理这些URL对应的请求。具体来说,一些虚拟服务器被定义为控制具有特定IP和域名的请求。
更具体地说,Nginx通过定义一系列位置来控制uri的选择。每个位置定义了映射到自身的请求的处理场景:返回文件或代理请求,或者根据不同的错误代码返回不同的错误页。此外,根据URI的不同,请求还可以被重定向到其他服务器或位置。
设置虚拟服务器
听着:
Nginx配置文件包含至少一个用于定义虚拟服务器的服务器命令。当请求到来时,Nginx将首先选择一个虚拟服务器来处理请求。
虚拟服务器是在服务器的http上下文中定义的:
注意:在http中可以定义多个服务器。
服务器配置块使用listen命令监听本地IP和端口号(包括Unix域套接字和路径),支持IPv4和IPv6,IPv6地址需要用方括号括起来:
按照上面的配置,如果不写端口号,默认使用端口80;不写IP就监听本机所有IP。
服务器名称:
如果多个服务器的监听IP和端口号相同,Nginx会在请求头中传递主机。
与server_name定义的主机名进行比较,来选择合适的虚拟服务器处理请求:server_name的参数可以是:
1.完整的主机名,例如api.lufficc.com。
2.它包含通配符(包括*),如:*.luffcc.com或api。*.
3.正则表达式,以~开头。
通配符只能在开头或结尾,并且只能与一个相邻..Www。*.example.org和w*.example.org都无效。但是,您可以使用正则表达式来匹配这些名称,例如~www\..+\.示例\。org$和~w.*\。示例\。org$。和*可以匹配多个部分。*.example.org这个名字不仅符合www.example.org,也符合www.sub.example.org。
对于正则表达式:Nginx使用的正则表达式与Perl编程语言(PCRE)使用的正则表达式兼容。要使用正则表达式,它必须以~开头。
命名正则表达式可以捕获变量,然后使用:
括号()之间的匹配内容也可以后面用引用,表示上面第二个()中的内容。因此,上述内容也可以写成:
服务器名称的示例:
同样,如果有多个名称与主机头匹配,Nginx将按以下顺序被选中:
1.完整的主机名,例如api.lufficc.com。
2.以*开头的最长通用名,如:*.luffcc.com。
3.以*结尾的最长通用名,如api。*.
4.第一个匹配的正则表达式。(按照配置文件中的顺序)
即优先级:api.lufficc.com>:*.luffICC.com>;api。*>规律性。
如果主机头与任何server_name都不匹配,Nginx会将请求路由到默认的虚拟服务器。虚拟服务器是指:nginx.conf文件中或用default_server显式声明的第一台服务器:
配置位置
匹配URI和位置参数
选择服务器后,Nginx会根据URIs选择合适的位置来决定是请求还是返回文件。
位置指令接受两种类型的参数:
1.前缀字符串(路径名)
2.正则表达式
对于前缀字符串参数,URIs必须严格使用它。例如,对于/some/path/参数,它可以匹配/some/path/document.html,但不匹配/my-site/some/path,因为/my-site/some/path不是以/some/path/开头的
对于正则表达式,以~开头表示区分大小写,以~*开头表示不区分大小写。请注意。在路径中应该写成\..例如,匹配以结尾的URI的位置。html或者。htm:
正则表达式优先于前缀字符串。如果找到匹配的前缀字符串,正则表达式搜索将继续,但如果前缀字符串以~开头,则不会再次检查正则表达式。
具体搜索匹配过程如下:
1.将URI与所有前缀字符串进行比较。
2.=修饰符表示URI必须等于前缀字符串(不是开头,而是等于)。如果找到了,搜索就会停止。
3.如果找到的最长前缀匹配字符串以~开头,则不再搜索正则表达式匹配。
4.存储匹配的最长前缀字符串。
5.测试并比较URIs和正则表达式。
6.找到第一个匹配的正则表达式后停止。
7.如果没有匹配的正则表达式,则使用对应于存储在4中的前缀字符串的位置。
=修饰符的优先级最高。如果网站首页被频繁访问,我们可以专门定义一个位置来减少搜索匹配的次数(因为找到带=decoration的匹配位置搜索就会停止),提高速度:
静态文件和代理
位置还定义了如何处理匹配的请求:返回静态文件或者将它们交给代理服务器进行处理。在以下示例中,第一个位置返回/data目录中的静态文件,第二个位置将请求传递给https://lufficc.com域名服务器进行处理:
root指令定义静态文件的根目录,它与URI拼接在一起形成最终的本地文件路径。如果请求/images/example.png,它将被拼接并返回到本地服务器文件/data/data/images/example.png。
proxy_pass指令将请求传递给URL指向的代理服务器。让将响应从代理服务器转发到客户端。在上面的示例中,所有不是以/images/开头的URIs请求都将被传递到代理服务器进行处理。
比如我设置proxy_pass为https://www.baidu.com/,我访问http://search.lufficc.com/会得到和百度首页一样的响应(页面)(感兴趣的童鞋可以自己试试搜索功能,和百度的没什么区别):
使用变量
您可以使用变量让Nginx以不同的方式处理不同的请求。变量在运行时计算,并用作指令的参数。变量由以$开头的符号表示。变量Nginx根据状态定义信息,比如当前处理的请求的属性。
有许多预定义的变量,比如核心的HTTP变量。您也可以使用set、map和geo命令来定义自定义变量。大多数变量在运行时被计算,并且包含与特定请求相关的信息。例如,$remote_addr包含客户端IP地址,而$URI保存当前的URI值。
一些常用的变量如下:
一个简单的应用是使用路径信息从http重定向到https:
返回特定的状态代码
如果您网站上的某些资源被永久删除,最快捷、最简洁的方法是使用return命令直接返回:
return的第一个参数是响应代码。可选的第二个参数可以是重定向的URL(对应于代码301、302、303和307)或响应正文中返回的文本。例如:
返回指令可以包含在位置和服务器上下文中:
或者:
错误处理
error_page命令可以配置特定错误代码的错误页面或重定向到另一个页面。当发生404错误时,下面的示例将返回/404.html页。
error_page命令定义了如何处理错误,所以它不会直接返回,而return会立即返回。当代理服务器或Nginx处理相应的错误代码时,会返回相应的错误页面。
在下面的例子中,当Nginx找不到页面时,它会用代码301替换代码404,并将客户端重定向到http://example.com/new/path.html.。这个配置很有用。例如,当客户端仍然试图使用旧的URI访问页面时,301代码通知浏览器该页面已被永久删除,需要自动替换为返回的新地址。
重写URIs
重写指令可以多次修改请求的URI。rewrite的第一个参数是URI需要匹配的正则表达式,第二个参数是要替换的URI。第三个参数是可选的,指示重定向代码(301或302)是否可以重写或返回。例如:
您可以在服务器和位置的上下文中包含多个重写指令。Nginx按照指令出现的顺序逐一执行指令。当选择服务器时,服务器中的重写命令将被执行一次。
Nginx处理一组重写指令后,根据新的URI选择位置。如果所选位置仍然包含重写指令,它们将被依次执行。如果URI匹配全部,则在处理完所有定义的重写指令后,搜索新的位置。
以下示例将rewrite指令与return指令一起使用:
将/download/some/media/file等URI更改为/download/some/mp3/file.mp3,由于最后一个标志,后续指令(第二个重写指令和返回指令)被跳过,但Nginx继续用更改后的URI处理请求。同样,URIs如/download/some/audio/file被替换为/download/some/mp3/file.ra,如果URI与重写指令不匹配,Nginx会向客户端返回403错误代码。
last和break的区别是:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)