Nginx的信号
1)、TERM、INT 快速关闭
2)、QUIT从容关闭
3)、HUP平滑重启,重新加载配置文件
4)、USR1 重新打开日志文件
5)、USR2 平滑升级可执行程序
KILL 9 强制终止,直接杀
虚拟主机
虚拟主机使用的是特殊的软硬件技术,它把一台运行在因特网上的服务器主机分成一台台“虚拟”的主机,每台虚拟主机都可以是一个独立的网站,可以具有独立的域名,具有完整的Intemet服务器功能(WWW、FTP、Email等),同一台主机上的虚拟主机之间是完全独立的。从网站访问者来看,每一台虚拟主机和一台独立的主机完全一样。
利用虚拟主机,不用为每个要运行的网站提供一台单独的Nginx服务器或单独运行一组Nginx进程。虚拟主机提供了在同一台服务器、同一组Nginx进程上运行多个网站的功能。
配置方式
- 基于域名的虚拟主机
- 基于ip的虚拟主机
- 基于端口的虚拟主机
基于域名的虚拟主机
server {
#监听端口 80
listen 80;
#监听域名abc.com;
server_name abc.com;
location / {
# 相对路径,相对nginx根目录。也可写成绝对路径
root abc;
# 默认跳转到index.html页面
index index.html;
}
}
基于端口的虚拟主机配置
server {
listen 2022;
server_name abc.com;
location / {
root /home;
index index.html;
}
}
基于IP地址虚拟主机配置
server {
listen 80;
server_name 192.168.197.142;
location / {
root ip;
index index.html;
}
}
Location规则
Location规则
符号 | 含义 |
= | = 开头表示精确匹配 |
^~ | ^~开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格) |
~ | ~ 开头表示区分大小写的正则匹配 |
~* | ~* 开头表示不区分大小写的正则匹配 |
!~和!~* | !~和!~*分别为区分大小写不匹配及不区分大小写不匹配的正则 |
/ | 用户所使用的代理(一般为浏览器) |
$http_x_forwarded_for | 可以记录客户端IP,通过代理服务器来记录客户端的ip地址 |
$http_referer | 可以记录用户是从哪个链接访问过来的 |
location和rewrite进阶
nginx运行阶段: rewrite 阶段、access 阶段以及 content 阶段
不按代码顺序执行,是按阶段执行,顺序如下:
先执行命中的所有rewrite层指令(下面的set),再执行access,再执行content(下面的echo)
语法:
location = / {
set $a 32;
echo $a;
set $a 64;
echo $a;
}
server {
listen 80;
server_name test.enjoy.com;
location = / {
set $a 32;
echo $a;
set $a 64;
echo $a;
}
}
负载均衡location规则:
upstream nginx {
#ip_hash;
server 192.168.46.133:8081 weight=2;
server 192.168.46.133:8082 weight=1;
}
server {
listen 80;
server_name www.enjoy.com;
location /ss {
root html/static/;
index index.html index.htm;
}
location /rout {
rewrite ^/rout/(.*) /static/$1.html break;
root html/;
index index.html index.htm;
}
location /examples {
proxy_pass http://192.168.46.133:8081;
}
location /examples1 {
proxy_pass http://nginx;
}
}
#location指令优先级验证:
# =精准匹配,最优,匹配就直接返回
# ^~,空 为一般匹配,收集所有匹配,取最长匹配执行(此时不返回,还会执行下面的正则匹配)
# ~,~* 为正则匹配,按顺序依次匹配,命中即返回(可能会覆盖普通匹配)
server {
listen 80;
server_name location.enjoy.com;
#精准匹配测试
#第1,2条虽然匹配,但第三条是精准匹配,出第三条结果
#测试路径/equal/a/b/c
location ~ /equal/* {#被命中,但被下面的推断:location = /equal/a/b/c
return 400;
}
location /equal/a/b {#被命中,但被下面的推断:location = /equal/a/b/c
return 401;
}
location = /equal/a/b/c {#被命中,直接执行,不等待
return 402;
}
#普通匹配测试
#第1,2条虽然匹配,第三条匹配更长,出第三条结果
#测试路径/match/a/b/c
location /match/a {#被命中,但不是最长
return 412;
}
location /match/a/b {#被命中,但不是最长
return 413;
}
location /match/a/b/c {#被命中,且最长
return 414;
}
location /match/a/b/c/d {#不命中
return 415;
}
#正则匹配覆盖普通匹配测试
#会覆盖普通匹配,不会覆盖=和^~
location =/re/a.js {#访问/re/a.js,不会被后面的正则覆盖
echo 'match =';
}
location ^~ /re/a/b {#访问/re/a/b开头的路径,不会被后面的正则覆盖
echo 'math ^~/re/a/b*';
}
location /re/a.htm {#访问/re/a.htm,会被后面的正则覆盖
echo 'match /re/a.htm';
}
location ~ /re/(.*)\.(htm|js|css)$ {#覆盖/re/a.htm路径
echo "cover /re/$1.$2";
}
#正则匹配成功一条后,便不再走其它正则
#最长正则匹配是第三个,但匹配第一个后便不往下走
#测试路径/rex/a/b/c.htm
location ~ /rex/.*\.(htm|js|css)$ {#覆盖/re/a.htm路径
echo "match first";
}
location ~ /rex/a/(.*)\.(htm|js|css)$ {#覆盖/re/a.htm路径
echo "match second";
}
location ~ /rex/a/b/(.*)\.(htm|js|css)$ {#覆盖/re/a.htm路径
echo "match third";
}
#index处理
#location.enjoy.com/static方式无法访问
#location.enjoy.com/static/方式可访问到c页面
location /static/ {
root html;
index c.html;
}
}
#nginx执行过程验证
server {
listen 80;
server_name process.enjoy.com;
#后台服务原始路径:172.17.0.4:8081/nginx/enjoy/getInfo
#无/,访问路径:http://process.enjoy.com/nginx/enjoy/getInfo
location /nginx/enjoy { #匹配路径/nginx/enjoy,剩余路径/getInfo
proxy_pass http://172.17.0.4:8081;#此处未关闭,传递整个路径/nginx/enjoy/getInfo到目标ip:port
# proxy_pass http://172.17.0.4:8081/nginx/enjoy;
}
#有/,访问路径:http://process.enjoy.com/dynamic/nginx/enjoy/getInfo
location /dynamic {#匹配路径/dynamic,剩余路径/nginx/enjoy/getInfo
proxy_pass http://172.17.0.4:8081/;#此处关闭,只传递/nginx/enjoy/getInfo到目标ip:port
}
#访问路径:http://process.enjoy.com/static/a.html ---b.html/c.html
location /static {#匹配路径/static,剩余路径/a.html
# root html/;#root声明,在html文件夹,查找/static/a.html文件
}
#访问路径:http://process.enjoy.com/target/a.html ---b.html/c.html
location /target {#匹配路径/target,剩余路径/a.html
alias html/static/;##alias声明,在html/static/文件夹,查找a.html文件
}
}
Nginx执行过程
url = 域名+端口+path+param 匹配过程:
1、域名(ip)+端口 ----》定位虚拟机
2、path与location部分匹配, path = 匹配path + 剩余path
3、root:在目录里找path1+path2路径 alias:在目录里找path2路径 若url以/结尾,认为是目录,执行index;否则认为path路径到达文件
4、 proxy_pass=http://172.17.0.4:8081/ proxy_pass= ip:port/