[后端]nginx配置文件详解

[后端]nginx配置文件详解,第1张

一个典型的nginx配置文件是由一系列的server块组成。而每个server块是有一系列的location块组成。server块是nginx从逻辑上划分出来的一个个的虚拟服务器,可以从逻辑上认为你的服务器变成多个了。block块定义了一个url路径该如何定位到正式的文件。总体来说,nginx处理一个请求的时候,先根据(ip地址,port端口,domain域名)来确定下由哪一个server块来进行处理,然后server块再根据请求的地址来进行location块的挑选,location块内部的规则最终确定下这个请求怎么返回(直接返回文件内容,还是映射成其他请求,还是传给其他服务执行)。

如果我们访问链接 http://lab.example.com:80/cs/image.jpg 那么就会由第一个server的第二个location来处理。流程是什么样的呢:

这样就完成了一个完整的链接请求。

server块最重要的两个属性是listen和server_name。当请求来临时,listen属性先用来匹配,如果匹配到唯一server块那么就是这个server块进行服务(就不用考虑server_name是否匹配上了);如果匹配不是唯一的,那么就继续使用server_name进行匹配。

当两个表达带通配符的形式相同的时候,匹配最长的那个。

语法中的optional_modifier是描述符,location_match是具体匹配的串形式,如果描述符是正则的一种,那么就会以正则的方式来对待location_match,否则以普通方式用location_match来当前缀匹配。

|类型|含义|匹配方式|优先级|例子|

|:--|:--|:--|:--|

|(none)|最普通的前缀匹配|前缀方式匹配|4|location / {}|

|=|要求绝对相等|前缀方式匹配|1|location = /image {}|

|~|区分大小写的正则匹配|正则方式匹配|3|location ~ .(jpe?g)$ {}|

|~ |不源毁塌区分大小写的正则匹配|正则方式匹配|3|location ~ .(jpe?g)$ {}|

|^~|高优先级的前缀匹雹圆配|前缀方式匹配|2|location ^~ /page {}|

如果我们要匹配\big\middle\small的话,是不会匹配到 location ^~ \big\middle {...} 这条规则的,因为当=规则匹配结束没找到之后,就回去找(none)和^~中匹配最长的一条,这时候最长的是(none)的 location \big\middle\small {...} ,然后在进行正则匹配,发现没有满足的,于是就取(none)的这一条了。这一点要注意。

在上述步骤后,我们知道一个请求具体定位到location的过程,现在来继续探究location之后的相应处理。首先是location中的资源应该对应在哪一个服务器目录中余燃呢?这就需要root属性来指定了。

root属性可以定义在server块中,也可以定义在location块中。如果声明在server块中那么所有的location都会继承这个定义。同时若location中也定义了root属性,那么以location中的定义为主。

举个例子

如果访问/cs/vr/audio.mp3,那么就会对应到服务器上的/share/usr/cs/vr/audio.mp3的资源

如果访问/eg/file/new.pdf,那么就会对应到服务器上的/var/www/html/eg/file/new.pdf的资源

再比如用nginx上架设codeigniter框架,我们需要重写url那么我们这样

那么这样,对于一个非.php的文件,都为在第一个location中重写成/index.php?$uri的形式重写进行一次搜索。这时候必然被第二个location接收(前缀匹配的更长嘛),这样就完成了codeigniter的定位。

比如我们访问 ci.example.com/hello 就会被重定向到访问var/www/example/index.php?hello同时被pass给php的cgi进行处理。

Understanding Nginx Server and Location Block Selection Algorithms

how-to-configure-nginx

参考资料1

参考资料2

参考资料3

主配置文件 /etc/nginx/nginx.conf 。

配置文件中的 path,既可以是绝对路径也可以是相对路径,相对路径相对 /usr/share/nginx 目录。

通过 default_server 参数,指定当前 server 为对应 IP:PORT 对的默认服务器。当一个请求匹配到 IP:PORT,但是 Host 字段不匹配任何一个 server_name,则应用默认服务器 server。假设 http://www.lishiqing.com 请源轮仔求的 IP:PORT 为 192.168.100.104:80,但是没有对应的 server_name 匹配 www.lishiqing.com ,则应用默认服务器。

如果没有一个 listen 指令具有 default_server 参数,则具有 IP:PORT 对的第一个 server 将是该 IP:PORT 对的默认服务器。

以下配置忽略 server_name,所有指向 192.168.100.105 的域名都能应用该 server

以下配置访问 lishiqing.com 应用默认 server,也就是第一个 server

参考资料

location 指令可以跟字符串,也可以跟正则表达式

location string_path {} 区分大小写的字符串

location = string_path {} 严格匹配字符串

location ~ reg_path {} 区分大小写的正则表达式

location ~* reg_path {} 不区分大小写的正则表达式

http://lishiqing.com/shop/images/1.png 这个请求的 query 为 /shop/images/1.png 。

当 location 后面是字符串的时候,如果某个请求的 query 以该字符串开头,则匹配该 location,比如 /shop/images/1.png 的请求匹配 location /shop {} ,也匹配 location / {} ,但是不匹配 location /blog 。

当 location 后面是正则表达式的时候,如果某个请求的 query 匹配该正则表达式,则匹配该 location,比如 /shop/images/1.png 的请求匹配 location ~ \.(jpg|jpeg|png)$ {} 。

如果某个 query 匹配多个字符串的 location,那么应用匹配度最高的一个 location,与 location 的顺序无关。比如 /shop/images/1.png 的请求匹配 location / {} 和 location /shop {} ,但是应用 location /shop {} 。

如果某个 query 匹配多个正则表达式的 location,那么按照 location 的顺序应用第一个匹配的 location。比如雹汪 /shop/images/1.png 的请求匹配 location ~ \.(jpg|jpeg|png)$ {} 和 location ~ .*/images/.* {} ,但是应用第一个匹配的 location ~ \.(jpg|jpeg|png)$ {} 。因为在 query 在检查正则表达式的时候,遇见第一匹配的 location 就停止继续查找了。

如果某个 query 既匹配某个字符串的 location,又匹配某个正则表达式的 location,那么应用正则表达式的 location,与顺序无关。比如 /shop/images/1.png 的请求匹配 location /shop {} 和 location ~ \.(jpg|jpeg|png)$ {} ,但是会应用 location ~ \.(jpg|jpeg|png)$ {} 。这是因为某个请求会先检查跟着字符串的 location,不管是桐行否找到匹配的字符串 location,都会继续按照顺序查找跟着正则表达式 location,因此正则表达式的优先级高于字符串。如果找到了匹配的正则表达式,则立即停止查找,应用该 location,如果没找到匹配的正则表达式,则应用刚才找到的匹配度最高的字符串 location。

location = string_path {} 为严格匹配,query 必须与 string_path 完全一致才能匹配。如果 query 与某个 = string_path 匹配,则立即停止查找,应用该 location。意味着不会去查找正则表达式 location。比如 /shop/images/1.png 匹配 location = /shop/images/1.png {} ,不匹配 location = /shop {} 和 location = /shop/images 。一般用来设置 location = / {} 来匹配 / 的 query,因为 / 的 query 会很频繁,因此将 location = / {} 放在第一条 location 可以提高匹配查询的效率。

location ^~ string_path {} 这种字符串匹配的优先级高于正则表达式,当某个 query 匹配该 location 的时候,不会继续查找正则表达式的 location 了。比如 /shop/images/1.png 的 query 满足 location ^~ /shop {} 和 location ~ \.(jpg|jpeg|png)$ {} ,但是会应用 location ^~ /shop {} 。

总结:

worker_processes 1

pid /usr/local/nginx/logs/nginx.pid

worker_rlimit_nofile 65535

events {

#使用epoll的I/O 模型。linux建议epoll,FreeBSD建厅物圆议采用kqueue,window下不指定。

use epoll

}

http {

#设定mime类型蚂稿,类型由mime.type文扮塌件定义

include mime.types

}

https://blog.csdn.net/liuchang19950703/article/details/110792007


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/8204452.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存