? 在开始处理一个http请求时,nginx会取出header头中的Host变量,按优先级与nginx.conf中的每个server_name进行匹配,以此决定到底由哪一个server来处理这个请求。优先级匹配结果如下:
*.oldboy.com
www.oldboy.comwww.oldboy.*
www.oldboy.com www.oldboy.cnlisten port default_server;
的server块listen port default_server;
的server块,那么将选择匹配listen端口的第一个server块注意:建议配置相同端口,不同域名,这样不会出现域名访问冲突。
创建配置文和站点文件测试
[root@web01 ~]# cat > /etc/nginx/conf.d/server.conf << EOF
server {
listen 80;
server_name linux.test.com;
location / {
root /code;
index server1.html;
}
}
server {
listen 80;
server_name *.test.com;
location / {
root /code;
index server2.html;
}
}
server {
listen 80;
server_name linux.test.*;
location / {
root /code;
index server3.html;
}
}
server {
listen 80;
server_name ~^linux\.(.*)\.com\$;
location / {
root /code;
index server4.html;
}
}
server {
listen 80 default_server;
server_name localhost;
location / {
root /code;
index server5.html;
}
}
EOF
[root@web01 ~]# echo linux.test.com > /code/server1.html
[root@web01 ~]# echo *.test.com > /code/server2.html
[root@web01 ~]# echo linux.test.* > /code/server3.html
[root@web01 ~]# echo ‘~^linux\.(.*)\.com$‘ > /code/server4.html
[root@web01 ~]# echo default_server > /code/server5.html
重载添加host解析
[root@web01 ~]# systemctl reload nginx
[root@web01 ~]# echo 10.0.0.7 linux.test.com www.test.com linux.test.cn linux.aaa.com aaa.test.aaa >> /etc/hosts
访问测试
[root@web01 ~]# curl linux.test.com
linux.test.com
[root@web01 ~]# curl www.test.com
*.test.com
[root@web01 ~]# curl linux.aaa.com
~^linux\.(.*)\.com$
[root@web01 ~]# curl aaa.test.aaa
default_server
# 注释掉default_server,重载再测试
[root@web01 ~]# systemctl reload nginx
[root@web01 ~]# curl aaa.test.aaa
linux.test.com
Nginx
使用Location
可以控制访问网站的路径
官方文档:http://nginx.org/en/docs/http/ngx_http_core_module.html#location
Location语法示例
Syntax: location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
Default: —
Context: server, location
uri是用户请求的字符串,即域名后面的web文件路径。
Location正则匹配可以使用测试判断语句
-f # 是否存在文件 -d # 是否存在目录 -e # 是否存在文件或目录 -x # 文件是否可执行
Location语法优先级顺序
匹配符 | 匹配规则 | 优先级 |
---|---|---|
= | 精确匹配,并停止搜索,不再向下匹配。 | 1 |
^~ | 匹配以某个字符串开头的查询,并停止搜索,不再向下匹配。 | 2 |
~ | 区分大小写的正则匹配 | 3 |
~* | 不区分大小写的正则匹配 | 4 |
!~ | 区分大小写不匹配的正则匹配 | 5 |
!~* | 不区分大小写不匹配的正则匹配 | 6 |
/ | 匹配任何以指定模式开始的查询,正则表达式与较长的字符串优先。 | 7 |
验证配置:
server {
listen 80;
location =/ {
return 200 "location =/";
}
location ^~/ {
return 200 "location ^~/";
}
location ~/ {
return 200 "location ~/";
}
location ~*/ {
return 200 "location ~*/";
}
#location / {
# return 200 "location /"; # 和^~语法重复,先注释下
#}
}
!~
和!~*
属于排除法,符合匹配规则时不会匹配到,也就是轮到它了也不会执行里面的语句。
验证测试:
从上往下依次测试,测试一次注释掉一级,重载Nginx:systemctl reload nginx
# 优先级最高精确匹配=
[root@web01 ~]# curl 127.0.0.1
location =/
# 注释掉=,重载Nginx
[root@web01 ~]# curl 127.0.0.1
location ^~/
# 注释掉^~,去掉/的注释,重载Nginx
[root@web01 ~]# curl 127.0.0.1
location ~/
# 注释掉~,重载Nginx
[root@web01 ~]# curl 127.0.0.1
location ~*/
Location应用场景
# 通用匹配,任何请求都会匹配到
location / {
...
}
# 严格区分大小写,匹配以.php结尾的都走这个location
location ~ \.php$ {
...
}
# 不区分大小写匹配,只要用户访问.jpg,gif,png,js,css 都走这条location
location ~* \.png$ {
...
}
# 实现资源动静分离
location ~ \.(php|jsp|asp) {
root /opt/dynamic;
}
location ~* \.(jpg|gif|html|txt|js|css)$ {
root /opt/static;
}
root的处理结果是:root路径+location路径
alias的处理结果是:使用alias定义的路径
location /img/ {
alias /var/www/; # 实际路径是/var/www/
}
location ~* /img/(.+\.(gif|png|jpeg)) { # location用正则表达式则必须包含捕获语句(也就是括号())
alias /usr/local/images/$1; # alias则必须要引用这些捕获值
}
location /img/ {
root /var/www; # 实际路径是/var/www/img/
}
location /test/ {
proxy_pass http://127.0.0.1:8080; # 实际将请求转发到http://127.0.0.1:8080/test/
}
location /test/ {
proxy_pass http://127.0.0.1:8080/; # 实际将请求转发到http://127.0.0.1:8080/
}
server {
listen 80;
server_name image.oldboy.com;
location / {
root /code;
}
location ~* ^.*\.(png|jpg|gif)$ {
alias /code/images/;
}
}
一台服务器配置多个网站,如果配置都写在nginx.conf主配置文件中,会导致nginx.conf主配置文件变得非常庞大而且可读性非常的差。那么后期的维护就变得麻烦。
假设现在希望快速的关闭一个站点,该怎么办?
inlcude /etc/nginx/online/*.conf; # 线上使用的配置
mv /etc/nginx/online/test.conf /etc/nginx/offline/ # 保留配置,不启用(下次使用再移动到online中)
Include还可以包含其他经常重复的配置文件,比如
inlcude /etc/nginx/conf.c/*.conf; # 四层负载的配置文件
inlcude fastcgi_params; # fastcgi的配置参数,默认在/etc/nginx/下
inlcude rewrite.conf; # rewrite的配置参数
... ...
方便其他配置文件调用。
WEB服务-Nginx之5-Server和Location和Include
原文:https://www.cnblogs.com/backups/p/nginx5.html