server
定义一个server_name
server_name
可以指定一个或多个域名=
# 左匹配
server {
listen 80;
server_name *.nginx-test.com;
root /usr/share/nginx/html/nginx-test/left-match/;
location / {
index index.html;
}
}
# 正则匹配
server {
listen 80;
server_name ~^.*\.nginx-test\..*$;
root /usr/share/nginx/html/nginx-test/reg-match/;
location / {
index index.html;
}
}
# 右匹配
server {
listen 80;
server_name www.nginx-test.*;
root /usr/share/nginx/html/nginx-test/right-match/;
location / {
index index.html;
}
}
# 完全匹配
server {
listen 80;
server_name www.nginx-test.com;
root /usr/share/nginx/html/nginx-test/all-match/;
location / {
index index.html;
}
}
=
当访问 www.nginx-test.com 时,都可以被匹配上,因此选择优先级最高的“完全匹配”;
当访问 mail.nginx-test.com 时,会进行“左匹配”;
当访问 www.nginx-test.org 时,会进行“右匹配”;
当访问 doc.nginx-test.com 时,会进行“左匹配”;
当访问 www.nginx-test.cn 时,会进行“右匹配”;
当访问 fe.nginx-test.club 时,会进行“正则匹配”;
=
=
在一个server中location
配置段可存在多个,用于实现从URI
到文件系统的路径映射;ngnix会根据用户请求的URI
逐个检查配置文件中定义的所有location
,按一定的优化级找出一个最佳匹配,而后应用其配置
=
=
# 根据用户请求的URI进行匹配:
location [ = | ~ | ~* | ^~ ] uri { ... }
= # 用于标准uri前,需要请求字串与uri【精确匹配】,大小敏感,如果匹配成功就停止向下匹配 并立即处理请求
^~ # 用于标准uri前
# 匹配以指定的正则表达式开头的URI
# 不区分字符大小写
~ # 用于标准uri前,
# 表示【包含】正则表达式。并且区分大小写
~* # 用于标准uri前,
# 表示【包含】正则表达式。并且不区分大小写
不带符号 # 匹配使用以此URI开头的URI
\ # 用于标准uri前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号
#》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
# 拿到一个具体的 URI 之后,思考顺序:
1.哪几个 location 能够匹配
2.在匹配的多个 location 中,哪个的优先级最高
#——————————————————————————————————————————————————————————————————————————
# 官方范例:
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
# 效果:
The "/" request will match configuration A # 存疑!!!
the "/index.html" request will match configuration B
the "/documents/document.html" request will match configuration C
the "/images/1.gif" request will match configuration D
the "/documents/1.jpg" request will match configuration E
=
精确匹配一般用于匹配组织的logo等相对固定的URL,匹配优先级最高
# 修改配置
[root@CentOS8 ~]# cat /apps/nginx/conf/conf.d/pc.conf
'具体配置的每一行都必须以分号结尾。。。。
server {
listen 80;
server_name www.magedu.org;
location / {
root /data/nginx/html/pc;
}
location /logo.jpg {
root /data/nginx/images;
index index.html;
}
}
# 将图片文件传到/data/nginx/images,并修改文件名为logo.jpg
[root@CentOS8 ~]# mkdir /data/nginx/images
[root@CentOS8 ~]# mv logo.jpg /data/nginx/images
[root@CentOS8 ~]# ls /data/nginx/images
logo.jpg
# 重载
nginx -s reload
# 测试
Windows宿主机使用管理员身份运行编辑器,修改 hosts文件添加解析记录(取消hosts文件的只读权限)
浏览器访问:http://www.magedu.org/logo.jpg
~
实现区分大小写的模糊匹配
# 修改配置
[root@CentOS8 ~]# cat /apps/nginx/conf/conf.d/pc.conf
server {
listen 80;
server_name www.magedu.org;
location / {
root /data/nginx/html/pc;
}
location ~ /L.?\.jpg { # 匹配字母L开头的jpg图片。。。
# . 是任意单个字符,? 是次数匹配,\ 是转义后面的 .
root /data/nginx/images;
index index.html;
}
}
# 重载
nginx -s reload
# 浏览器访问(下图一)
http://www.magedu.org/logo.jpg
'图片文件名为 logo.jpg ,大小写敏感,因此匹配失败。。。
# 修改文件名再次访问
'注意配置中使用的是【/L.?\.jpg】,因此文件名L后最多再接一个字符,下面改名为LL
[root@CentOS8 ~]# cd /data/nginx/images/
[root@CentOS8 images]# mv logo.jpg LL.jpg
[root@CentOS8 images]# ls
Logo.jpg
# 重载
nginx -s reload
# 再次访问(下图二)
http://www.magedu.org/LL.jpg # 注意指定的URI
~*
用来对用户请求的uri做模糊匹配,无论URI
中都是大写、都是小写或者大小写混合,此模式都会匹配
通常使用此模式匹配用户请求中的静态资源并继续做下一步操作,此方式使用较多
注意: 此方式中,对于Linux文件系统上的文件仍然是区分大小写的。如果磁盘文件不存在,仍会提示404
只是匹配的范围变大了!!!但是还是要根据用户的URI来匹配磁盘的对应文件
# 修改配置
[root@CentOS8 images]# cat /apps/nginx/conf/conf.d/pc.conf
server {
listen 80;
server_name www.magedu.org;
location / {
root /data/nginx/html/pc;
}
location ~* /L.+\.jpg { # 注意次数匹配,本次限定文件名至少2个字符
root /data/nginx/images;
index index.html;
}
}
# 修改文件名
[root@CentOS8 images]# ls
LL.jpg logo.jpg
# 重载
# 访问(准确文件名)
http://www.magedu.org/logo.jpg
http://www.magedu.org/LL.jpg
# 访问(大小写不匹配)
'访问失败404,是因为nginx服务器的资源目录没有有相应的文件。。。
http://www.magedu.org/LOgo.jpg
http://www.magedu.org/ll.jpg
# 加入图片文件 LOgo.jpg、ll.jpg 再次访问
[root@CentOS8 images]# ls
ll.jpg LL.jpg logo.jpg LOgo.jpg
# 访问
http://www.magedu.org/LOgo.jpg
http://www.magedu.org/ll.jpg
无论大小写是否敏感,这是服务器的配置。。。用户发起访问的URI
必须是服务器上存在的文件
# 当配置内容为:
location ~* /L.+\.jpg
'表示匹配所有 L|l 开头的、文件名至少为2个字符 的jpg文件
'因此用户可以访问的目标资源范围变得更大
# 当前拥有的文件
[root@CentOS8 images]# ls
ll.jpg LL.jpg logo.jpg LOgo.jpg
# 用户访问:
'原则:用户发起访问的 URI 必须是服务器文件系统中存在的文件(精确匹配到)
因此此设置之下,用户可以访问的所有目标为:
http://www.magedu.org/logo.jpg
http://www.magedu.org/LL.jpg
http://www.magedu.org/LOgo.jpg
http://www.magedu.org/ll.jpg
# 而如果配置文件是 location ~ /L.+\.jpg
'那么服务器只会去匹配 L 开头的文件
此时用户只能访问:
http://www.magedu.org/LL.jpg
http://www.magedu.org/LOgo.jpg
'这就是大小写敏感对用户访问带来的区别。。。。。。。。。。
=
# 修改配置
[root@CentOS8 ~]# cat /apps/nginx/conf/conf.d/pc.conf
server {
listen 80;
server_name www.magedu.org;
location ^~ /images { '表示匹配以 /images 开头的 URI
root /data/nginx/;
index index.html;
}
location /api {
alias /data/nginx/api;
index index.html;
}
}
# 补充目录,准备数据
[root@CentOS8 ~]# echo "caokunzi images" > /data/nginx/images/index.html
[root@CentOS8 ~]# mkdir /data/nginx/api
[root@CentOS8 ~]# echo "caokunzi api" > /data/nginx/api/index.html
# 重载
nginx -s reload
# 测试
[root@CentOS8 ~]# curl http://www.magedu.org/images/
caokunzi images
[root@CentOS8 ~]# curl http://www.magedu.org/api/
caokunzi api
#-------------------------------------------------------
# 解析
1.访问 /images/
只有第一个location匹配,自然是访问 images/index.html
2.访问 /api/
只有第二个location匹配,alias替换后,实际访问 /data/nginx/api/index.html
=
# 修改配置
[root@CentOS8 ~]# cat /apps/nginx/conf/conf.d/pc.conf
server {
listen 80;
server_name www.magedu.org;
location ~* \.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|wmf|js|css)$ { '限定后缀以表示资源格式
root /data/nginx/static;
index index.html;
}
}
# 准备文件
[root@CentOS8 ~]# ls /data/nginx/static
caokunzi.jpg
# 重载
nginx -s reload
# 访问
http://www.magedu.org/caokunzi.jpg
# 修改配置
[root@CentOS8 ~]# cat /apps/nginx/conf/conf.d/pc.conf
server {
listen 80;
server_name www.magedu.org;
location = /1.jpg {
root /data/nginx/static1;
index index.html;
}
location /1.jpg {
root /data/nginx/static2;
index index.html;
}
location ~* \.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|wmf|js)$ {
root /data/nginx/static3;
index index.html;
}
}
# 准备数据
mkdir -p /data/nginx/static{1,2,3}
[root@CentOS8 ~]# tree /data/nginx/static*
/data/nginx/static
└── caokunzi.jpg
/data/nginx/static1
└── 1.jpg
/data/nginx/static2
└── 1.jpg
/data/nginx/static3
└── 1.jpg
'说明:3个目录下的图片统一使用文件名 1.jpg ,然后用户访问 1.jpg 测试哪个优先匹配
'为分辨实验结果,事先准备好3张不同的图片。。。在图片上做好对应123的标识。。。
# 重载
nginx -s reload
# 访问(下图一)
http://www.magedu.org/1.jpg
'结果 static1 优先匹配
因为 location1 使用了 '=' 精确匹配,因此优先级最高
#--------------------------------------------------
# 修改配置,删除location1
[root@CentOS8 ~]# cat /apps/nginx/conf/conf.d/pc.conf
server {
listen 80;
server_name www.magedu.org;
location /1.jpg {
root /data/nginx/static2;
index index.html;
}
location ~* \.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|wmf|js)$ {
root /data/nginx/static3;
index index.html;
}
}
# 重载
nginx -s reload
# 访问(下图二)
http://www.magedu.org/1.jpg
'结果 static3 优先匹配
因为 '~*' 比 '/1.jpg(不使用符号)'的优先级更高
# 直接匹配网站根会加速Nginx访问处理
location = /index.html {
......;
}
location / {
......;
}
# 静态资源配置方法1
location ^~ /static/ {
......;
}
# 静态资源配置方法2, 应用较多
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
......;
}
# 多应用配置
location ~* /app1 {
......;
}
location ~* /app2 {
......;
}
=
=