13 Nginx 常见问题


多Server优先级

1
同一IP 按照server文件名,顺序匹配

多Location优先级

1
一个server出现多个location

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@Nginx conf.d]# cat testserver.conf 
server {
listen 80;
server_name 192.168.69.113;
root /soft;
index index.html;

location = /code1/ {
rewrite ^(.*)$ /code1/index.html break;
}

location ~ /code* {
rewrite ^(.*)$ /code3/index.html break;
}

location ^~ /code {
rewrite ^(.*)$ /code2/index.html break;
}

}
1
2
3
4
5
6
7
8
9
10
[root@Nginx conf.d]# curl http://192.168.69.113/code1/
<h1>Code 1</h1>

//注释掉精确匹配=, 重启Nginx
[root@Nginx ~]# curl http://192.168.69.113/code1/
<h1>Code 2</h1>

//注释掉^~, 重启Nginx
[root@Nginx ~]# curl http://192.168.69.113/code1/
<h1>Code 3</h1>
1
2
3
4
5
location 优先级
= 精确匹配
^~ 以什么开头
~ 匹配区分大小写
~* 不区分大小写

try_files的使用

1
nginx的try_files按顺序检查文件是否存在
1
2
3
4
5
6
7
location /{
try_files $uri $uri/ /index.php;
}

# 1.检查用户请求的uri内容是否存在本地,存在则解析
# 2.将请求加/, 类似于重定向处理
# 3.最后交给index.php处理
1
2
3
4
5
6
7
8
9
# 演示环境准备
[root@Nginx ~]# echo "Try-Page" > /soft/code/index.html
[root@Nginx ~]# echo "Tomcat-Page" > /soft/app/apache-tomcat-9.0.7/webapps/ROOT/index.html

//启动tomcat
[root@Nginx ~]# sh /soft/app/apache-tomcat-9.0.7/bin/startup.sh
//检查tomcat端口
[root@Nginx ~]# netstat -lntp|grep 8080
tcp6 0 0 :::8080 :::* LISTEN 104952/java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 配置Nginx的tryfiles
[root@Nginx ~]# cat /etc/nginx/conf.d/try.conf
server {
listen 80;
server_name 192.168.69.113;
root /soft/code;
index index.html;
location / {
try_files $uri @java_page;
}
location @java_page {
proxy_pass http://127.0.0.1:8080;
}
}

//重启Nginx
[root@Nginx ~]# nginx -s reload
1
2
3
4
5
6
7
8
9
10
# 测试tryfiles
[root@Nginx ~]# curl http://192.168.69.113/index.html
Try-Page

//将/soft/code/index.html文件移走
[root@Nginx ~]# mv /soft/code/{index.html,index.html_bak}

//发现由Tomcat吐回了请求
[root@Nginx ~]# curl http://192.168.69.113/index.html
Tomcat-Page

root与alias区别

1
2


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# root 路径配置
[root@Nginx ~]# mkdir /local_path/code/request_path/code/ -p
[root@Nginx ~]# echo "Root" > /local_path/code/request_path/code/index.html

//Nginx的root配置
[root@Nginx ~]# cat /etc/nginx/conf.d/root.conf
server {
listen 80;
index index.html;
location /request_path/code/ {
root /local_path/code/;
}
}

//请求测试
[root@Nginx conf.d]# curl http://192.168.69.113/request_path/code/index.html
Root

//实际请求本地文件路径为
/local_path/code/'request_path/code'/index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# alias路径配置
[root@Nginx ~]# mkdir /local_path/code/request_path/code/ -p
[root@Nginx ~]# echo "Alias" > /local_path/code/index.html

//配置文件
[root@Nginx ~]# cat /etc/nginx/conf.d/alias.conf
server {
listen 80;
index index.html;
location /request_path/code/ {
alias /local_path/code/;
}
}

//测试访问
[root@Nginx ~]# curl http://192.168.69.113/request_path/code/index.html
Alias

//实际访问本地路径
/local_path/code/'index.html'
1
2
root  会帮你拼接
alias 直接替换路径

获取用户真实IP

1
2
$remote_addr    # 只能获取到最近一台服务器访问IP
x_forwarded_for # 头部信息容易被篡改

http返回状态码

1
2
3
4
5
6
7
8
9
10
200 正常请求
301 永久跳转
302 临时跳转
400 请求参数错误
401 账户密码错误(authorization required)
403 权限被拒绝(forbidden)
404 文件没找到(Not Found)
413 用户上传文件大小限制(Request Entity Too Large)
502 后端服务无响应(boy gateway)
504 后端服务执行超时(Gateway Time-out)

网站访问原理

1
2
3
4
5
网站相关术语: 
如果一栋大厦里所有工作人员通过1个IP公网接口上网, 总共100个设备, 当所有人同时请求一个网站, 并且刷新了5次, 那么请求pv、ip、uv分别是多少
pv:页面浏览量 500
uv:唯一设备 100
ip:唯一出口 1

1
2
3
4
5
6
piwiki 开源统计
百度统计
站长分析
谷歌统计
公司开发写的统计脚本
awk 统计 取值-排序-去重-统计-html文件

网站访问流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1.DNS流程
1.查询本地Hosts
2.请求本地localDNS 请求根
3.返回对应的IP
2.HTTP连接
1.建立TCP三次握手,发送请求内容, 请求头、请求的行、请求的主体
2.将请求传递给负载均衡, 负载均衡做对应的调度
3.如果请求的是静态页面, 那么调度至对应的静态集群组即可
4.如果请求的是动态页面, 将请求调度至动态集群组
1.如果仅仅是请求页面, 可能会经过Opcache缓存返回
2.如果请求页面需要查询数据库, 或者是往数据库插入内容
3.检查对应的操作是查询还是写入, 如果是查询数据库
4.检查查询的内容是否有被缓存, 如有缓存则返回
5.检查查询语句, 将查询结果返回
6.内存缓存Redis缓存对应的查询结果
7.返回对应客户端请求的内容至于WEB节点
8.WEB节点收到请求后返回内容至负载均衡
9.负载均衡返回客户端内容, TCP四次断开
3.HTTP断开连接

如何优化 Nginx

Nginx架构总结

基于Nginx中间件的架构