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

posted @ 2021-05-12 19:46  ddhhdd  阅读(134)  评论(0)    收藏  举报