赞
踩
NGINX主配置文件 /etc/nginx/nginx.conf 是一个纯文本类型的文件,整个配置文件是以区块的形式组织,通常每一个区块以一对大括号{}来表示开始与结束。
提示:若编译安装则nginx.conf 位于编译时所指定目录。
我是手动编译安装的,在安装时设置安装文件的路径(将软件安装在:/opt/software/nginx-1.18.0/target目录下),所以配置文件为:/opt/software/nginx-1.18.0/target/conf/nginx.conf
NGINX通过将一个请求的URL与LOCATION进行比对判断,决定将该请求使用到哪个LOCATION对应的策略进行处理,可以把LOCATION理解为URL路由,或者当成URL的分发处理器。
1. 全局配置,用来配置对整个 server 都有效的参数,主要设置一些影响NGINX服务器整体运行的配置指令。主要包括配置运行NGINX服务器的用户(组)、允许生成的 worker process 数、进程 PID 存放路径、日志存放路径、类型以及配置文件的引入等。
2. EVENTS层,涉及的指令主要影响NGINX服务器与用户的网络连接。主要包括配置是否开启对多 worker process 下的网络连接进行序列化、是否允许同时接收多个网络连接、选取哪种事件驱动模型来处理连接请求、每个 worker process 可以同时支持的最大连接数等。
3. HTTP层,包括全局层和多个SERVER块。全局块层主要包括配置文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。提示:通常SERVER块配置在独立的:/opt/software/nginx-1.18.0/target/conf/*.conf中,通过引用的方式,在HTTP层调用。
4. SERVER块也被叫做“虚拟主机”部分,它描述的是一组根据不同 server_name 指令逻辑分割的资源,这些虚拟服务器响应HTTP 请求,因此都包含在 http 部分。最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。一个SERVER块可以配置多个LOCATION块。
ROOT指令,用于设置请求的根目录,允许NGINX将传入的请求映射到文件系统。
SERVER块可以包含多个LOCATION块,LOCATION指令用于匹配URI,语法:
location [ = | ~ | ~* | ^~] uri {
... ;
}
location @name {
... ;
}
= # 普通字符串匹配,精确且严格匹配,第一个被处理,匹配到即停止搜索;
^~ # 普通字符串匹配,按最长匹配执行,匹配到即停止搜索,不匹配其它LOCATION选项,一般用来匹配目录;
空 # 普通字符串匹配,按最长匹配执行,匹配到不停止搜索,还要继续看有没有匹配的正则表达式,
# 例如:location /abc {};
~ # 波浪线,正则匹配,区分大小写;
~* # 波浪线带星,正则匹配,不区分大小写(*表示大小写不敏感,不用区分大小写);
@ # "@" 定义一个命名的 location, 不参与匹配, 在内部重定向时使用,
# 一般用在其他的指令中, 例如:error_page, try_files;
location = / {
# 只精确匹配"/".
[ configuration A ]
}
location = /login {
# 只精确匹配"/login".
[ configuration A+ ]
}
location / {
# 匹配任何请求, 因为所有请求都是以"/"开始
# 但是更长字符匹配或者正则表达式匹配会优先匹配
[ configuration B ]
}
location ^~ /images/ {
# 匹配任何以 /images/ 开始的请求, 并停止匹配其它LOCATION块
[ configuration C ]
}
location ~* .(gif|jpg|jpeg)$ {
# 匹配以 gif, jpg, or jpeg结尾的请求
# 但是所有 /images/ 目录的请求将由 [Configuration C]处理
[ configuration D ]
}
请求URI例子:
/ -> 符合[ configuration A ]
/doc/index.html -> 符合[ configuration B ]
/images/1.gif -> 符合[ configuration C ]
/documents/1.jpg ->符合[ configuration D ]
location / {
# 网站根目录
root /usr/share/nginx/html;
# 定义首页文件的名称
index index.html index.htm;
# 禁止访问的IP地址
deny 192.168.22.101;
# 允许访问的IP地址
allow 192.168.33.104;
...;
}
对于请求URI结尾是否带有/,一般的处理逻辑如下:
但是:
对于LOCATION指令中的URI来说,如果URI的结尾带有/,并且LOCATION要执行的命令是proxy_pass、fastcgi_pass、uwsgi_pass、scgi_pass、memcached_pass、grpc_pass之一时:
location /images/{
proxy_pass http://www.baidu.com
}
对于这种情况,NGINX不管images命名的文件或目录存不存在,如果访问请求为:http://blog.baidu.com/images,则NGINX会将请求重定向到:http://blog.baidu.com/images/。所以如果这两种请求对应不同的处理,就要明确增加不带/结尾的LOCATION指令,如:
location /images {
proxy_pass http://www.baidu.com
}
location /images/ {
proxy_pass http://www.google.com
}
# 1. 先写精准匹配的匹配规则
location = / {
# 只精确匹配"/".
# 一般首页会非常频繁, 所以设置精准匹配, 提高匹配效率。
[ configuration A ]
}
location = /login {
# 只精确匹配"/login".
# 登录等也会非常频繁, 所以设置精准匹配, 提高匹配效率。
[ configuration A+ ]
}
# 2. 再写排除正则的匹配规则
location ^~ /images/ {
# 匹配任何以 /images/ 开始的请求, 并停止匹配其它LOCATION块
# 排除正则匹配可以配置给一般路径资源, 这样可以提高匹配效率, 因为一旦命中下面的3.(正则的匹配规则) 就不会执行了
[ configuration C ]
}
# 3. 再写正则的匹配规则
location ~* .(gif|jpg|jpeg)$ {
# 匹配以 gif, jpg, or jpeg结尾的请求
# 但是所有 /images/ 目录的请求将由 [Configuration C]处理
# 一般配置给一些特殊路径的资源或者后缀, 可以有多条正则, 越精确的放到前面, 因为正则一旦命中,
# 直接下面的正则就不匹配了
[ configuration D ]
}
# 4. 最后写默认的根路径匹配
location / {
# 匹配任何请求, 因为所有请求都是以"/"开始
# 但是更长字符匹配或者正则表达式匹配会优先匹配, 上面的都不命中的URI, 全部都走这里
[ configuration B ]
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。