03 Nginx虚拟主机&图片服务器&访问日志
2020年11月4日 study
2021年5月12日 review
01 Nginx虚拟主机
搭建前端静态服务器
- 什么是虚拟主机?
指在一台物理主机服务器上划分出多个磁盘空间,每个磁盘空间都是一个虚拟主机,每个虚拟主机都可以对外提供Web服务,并且互不干扰,就类似虚拟机。
利用虚拟主机可以把多个不同域名的网站部署在同一台服务器上,节省了服务器硬件成本和相关的维护费用。
(注意:修改配置文件之前,做好备份,以免配置出错可以回滚。)

- Nginx虚拟主机配置
nginx.conf中的一个server就是一个虚拟主机;
在win10下,进入C:\Windows\System32\drivers\etc,修改hosts文件:
47.115.23.41 dawson.com
47.115.23.41 rose.com
通过域名进行区分,不在location进行区分;
server {
listen 80;
server_name dawson.com;
location / {
root html;
index xdclass.html;
}
}
server {
listen 80;
server_name rose.com;
location / {
root html;
index xdclass.html;
}
}
复制nginx/html/下的index.html,命名为xdclass.html,并修改内容(cp index.html xdclass.html)
则访问47.115.23.41、dawson.com、rose.com都能得到:

之后访问便会提示未备案(可能是出于安全问题)

02 图片服务器
图片服务器:学JavaWeb、node、或者其他基础Web项目,基本都是图片上传到项目本身,这个是实际项目中很少用;公司一般会使用图片服务器或者云厂商提供的CDN。
前端提交图片 -> 后端处理 -> 存储到图片服务器 -> 拼接好访问路径存储到数据库 和 返回前端;

- 本地图片上传到usr/local/software/img,配置专属访问路径
注意:location后面的路径可以写成/app/img或者/app/img/,都能访问成功;但是要确保alias后面的路径/usr/local/software/img/是正确的,如果写成usr/local/software/img/则不行;
server {
listen 80;
server_name 47.115.23.41;
location /app/img {
alias /usr/local/software/img/;
}
}

注意:
- 在location / 中配置
root目录; - 在location /path中配置
alias虚拟目录,目录后面的"/"符号一定要带上;
03 Nginx访问日志access.log
3.1 Nginx访问日志的用处
用处:
- 统计站点访问IP来源、某个时间段的访问频率;
- 查看访问最频的页面、HTTP响应状态码、接口性能;
- 接口秒级访问量、分钟访问量、小时和天访问量;
- ...
默认配置:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main; # main 就是上面的模板名称
案例:
122.70.148.18 - - [04/Aug/2020:14:46:48+0800] "GET /user/api/v1/product/order/query_state?product_id=1&token=xdclasseyJhbGciOJEHTTP/1.1"
200 48 "https://xdclass.net/"
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/84.0.4147.89 Safari/537.36"
默认配置解析:
$remote_addr # 对应的是真实日志里的 122.70.148.18,即客户端的 IP。
$remote_user # 对应的是第二个中杠"-",没有远程用户,所以用"-"填充。
[$time_local] # 对应的是 [04/Aug/2020:14:46:48+0800]。
"$request" # 对应的是 "GET /user/api/v1/product/order/query_state?product_id=1&token=xdclasseyJhbGciOJEHTTP/1.1"。
$status # 对应的是 200 状态码,200 表示正常访问。
$body_bytes_sent # 对应的是 48 字节,即响应 body 的大小。
"$http_referer" # 对应的是 "https://xdclass.net/",若是直接打开域名浏览的时,referer 就会没有值,为"-"。
"$http_user_agent" # 对应的是 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/84.0.4147.89 Safari/537.36"。
"$http_x_forwarded_for" # 对应的是"-"或者空。
3.2 Nginx站点访问量、高频URL统计
access_temp.log示例:(head -n 100 filename,查看前100条数据;head filename,查看前10条数据)

预备Linux命令
awk:是文本处理工具,默认按照空格切分,$N是第切割后第N个,从1开始;sort:命令用于将文本文件内容加以排序,-n按照数值排,-r按照倒序来排;案例的sort -n是按照第一列的数值大小进行排序,从小到大,倒序就是sort -rn;uniq:去除重复出现的行列,-c在每列旁边显示该行重复出现的次数。
需求1:查看访问最频繁的前5个IP
awk '{print $1}' access_temp.log | sort -n | uniq -c | sort -rn | head -n 5

需求2:统计访问最多的URL前5名
cat access_temp.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -5

用需求1的方法也能得到一样的结果
awk '{print $7}' access_temp.log | sort -n | uniq -c | sort -rn | head -n 5

3.3 自定义日志格式,统计接口响应耗时
日志格式增加$request_time
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" $request_time';
server {
listen 80;
server_name 47.115.23.41;
location / {
root html;
index xdclass.html;
}
access_log logs/time_access.log main;
}
访问47.115.23.41/xxx/xxx,可以得到time_access.log日志示例:

- 统计耗时接口,列出传输时间超过5秒的接口
cat time_access.log | awk '($NF > 5){print $7}' | sort -n | uniq -c | sort -rn


浙公网安备 33010602011771号