nginx日志切割、location匹配标识、优化

1. nginx日志切割

nginx日志

[root@localhost ~]# ls /usr/local/nginx/logs/access.log 
/usr/local/nginx/logs/access.log

默认情况下 一条日志信息的大小 如下 195字节

[root@localhost ~]# tail -n1 /usr/local/nginx/logs/access.log | wc -c
195

打开nginx的日志格式

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
    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;
[root@localhost ~]# nginx

在这里插入图片描述
日志格式中 各项的含义

  • time_local: 访问的时间与时区,比如18/Jul/2012:17:00:01 +0800,时间信息最后的"+0800"表示服务器所处时区位于UTC之后的8小时
  • $status:记录请求返回的http状态码,比如成功是200。
  • $body_bytes_sent:发送给客户端的文件主体内容的大小,比如899,可以将日志每条记录中的这个值累加起来以粗略估计服务器吞吐量
  • $remote_addr:远程客户端的IP地址。
  • $request:请求的URI和HTTP协议,这是整个PV日志记录中最有用的信息,记录服务器收到一个什么样的请求
  • $http_referer:记录从哪个页面链接访问过来的(请求头Referer的内容 )
  • $http_user_agent:客户端浏览器信息(请求头User-Agent的内容 )
  • $http_x_forwarded_for:客户端的真实ip,通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通 过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加 x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
  • $remote_user:远程客户端用户名称,用于记录浏览者进行身份验证时提供的名字,如登录百度的用户名abc1234d,如果没有登录就是空白。

日志信息的级别

级别:debug info notice (warn error crit) alert emerg
warn error crit是生产环境中常用的三个级别

  • debug 调试信息
  • info 一般信息
  • notice 注意
  • warn 经过
  • error 错误信息
  • crit 极其严重的信息
  • alert 警告
  • emerg 突发状况信息

再次访问nginx 并查看现在 一条日志的大小

[root@localhost ~]# tail -n1 /usr/local/nginx/logs/access.log | wc -c
199

日志切割的计算
一般 日志文件达到1G左右 就会对其进行切割 把切割的日志进行备份处理

单条日志 199字节 如果是日访问量100万的企业

一天的日志 大小是: 199 x 1 000 000 = 199 000 000 B

1G = 1024 M = 1024 x 1024 K = 1024 x 1024 x 1024 B

计算产生1G数据 需要的天数: (1024 x 1024 x 1024)/199 000 000 ≈ 5.39

这里 直接按照6天计算 也就是说 大概6天 需要对日志进行一次切割

可以使用shell脚本+crontab 完成日志的自动切割

编写日志切割脚本

[root@localhost ~]# mkdir /usr/local/nginx/script
[root@localhost ~]# vim /usr/local/nginx/script/cut_log.sh
#!/bin/bash
CMD=/usr/local/nginx/sbin/nginx
LOGDIR=/usr/local/nginx/logs
LOG=access.log
FORMAT=$(date +%Y%m%d)
[ -d $LOGDIR ] && cd $LOGDIR || exit 1
[ -f $LOG ] || exit 1
mv $LOG access-$FORMAT.log
$CMD -s reload
[root@localhost ~]# chmod +x /usr/local/nginx/script/cut_log.sh
[root@localhost ~]# ls /usr/local/nginx/logs/
access.log  error.log  nginx.pid
[root@localhost ~]# chmod +x /usr/local/nginx/script/cut_log.sh
[root@localhost ~]# ls /usr/local/nginx/logs/
access.log  error.log  nginx.pid
[root@localhost ~]# /usr/local/nginx/script/cut_log.sh
[root@localhost ~]# ls /usr/local/nginx/logs/         
access-20200520.log  access.log  error.log  nginx.pid
[root@localhost ~]# cat /usr/local/nginx/logs/access.log 
[root@localhost ~]# 

如上 日志切割成功 新的日志文件内容为空

下边结合crontab 进行计划任务 每6天切割一次

[root@localhost ~]# crontab -e
* * */6 * * /usr/local/nginx/script/cut_log.sh 
[root@localhost ~]# crontab -l
* * */6 * * /usr/local/nginx/script/cut_log.sh 

2. location匹配标识

关于url中的目录

http://127.0.0.1
http://127.0.0.1/
http://127.0.0.1/index.html

http://127.0.0.1/     /代表的是网页根目录
/usr/local/nginx/html/    是nginx网页根目录
index.html是默认的网页 如果访问根目录 并且根目录下有index.html
访问的url 后可以不写index.html  直接用http://127.0.0.1/ 

http://127.0.0.1/abc/  访问根目录下abc目录的index.html

location匹配标识
说的是location 和 { 之间的内容 默认是/

/document/index.html
~   区分大小写
~*  不区分大小写
!   取反
^~  在进行常规字符串匹配后,不进行正则表达式检查
\   转义字符
$   以...结尾

举例

location / {
  return 401;
  }
location = / {       #精确匹配
  return 402;
  }
location /document/ {     #路径匹配
  return 403;
  }
location ^~/images/ {           #优先路径匹配
  return 404;
  }
location ~*\.(jpg|png|jpeg)$ {  #部分匹配
  return 405;
  };

3. nginx优化

1)隐藏服务器版本号

访问出错是 页面会显示nginx的版本号

在这里插入图片描述

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
        location / {
            root   html;
            index  index.html index.htm; #在默认的location里加入server_tokens
            server_tokens off;
        }
[root@localhost ~]# nginx -s reload

再次访问错误页面 如下

在这里插入图片描述

2) 更改nginx的用户和组

用户和组 可以在configure的时候指定 也可以后期自行调节

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
user  nginx nginx;
3) 设置并发处理量

worker_process 1;
最好和网站用户数量或者CPU相关
几个核 设置成几
高并发情况下 设置为核心数的2倍

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
worker_processes  2;
[root@localhost ~]# nginx -s reload
[root@localhost ~]# ps -elf | grep nginx | grep -v grep
1 S root       1644      1  0  80   0 -  5151 sigsus 16:56 ?        00:00:00 nginx: master process nginx
5 S nginx      4838   1644  0  80   0 -  5258 ep_pol 19:20 ?        00:00:00 nginx: worker process
5 S nginx      4839   1644  0  80   0 -  5258 ep_pol 19:20 ?        00:00:00 nginx: worker process
4) worker_cpu_affinity 设置cpu掩码 防止资源分配不均

worker_cpu_affinity 0001 0010 0100 1000;CPU掩码
这是四核的,如果是2核 01 10;
绑定CPU 把进程绑定到核心上
写在main区域 默认参数没有 因为默认是没有的

linux查看核心数:
cat /proc/cpuinfo | grep processor | wc -l

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf    
worker_cpu_affinity 01 10;
[root@localhost ~]# nginx -s reload
5) 模型优化:

nginx 采用epoll模型
nginx 可以用的模型kqueue(BSD系统) select poll epoll(Linux系统 内核版本必须大于2.6)

在events 里写 可以使用相应的模型
use 模型; use epoll;

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf    
events {
    worker_connections  1024;
    use epoll;
}
6) 关于最大访问量

worker_connections 单个进程允许的客户端的最大链接数
worker_connections × worker_process =最大访问量

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf    
events {
    worker_connections  10240;
    use epoll;
}
[root@localhost ~]# nginx -s reload  
7) 进程最大打开文件数(系统文件描述符)

worker_rlimit_nofile 65535; 全局配置项

配置worker进程最大打开文件数量需要系统也进行相关调整

查看系统允许打开的文件最大数:
cat /proc/sys/fs/file-max

通过ulimit临时修改系统文件描述符(不要大于系统极限)

[root@localhost ~]# ulimit -HSn 65535
[root@localhost ~]# ulimit -n
65535
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf    
worker_rlimit_nofile 65535;
[root@localhost ~]# nginx -s reload
8) 开启文件高效传输 sendfile on;

可以放在 http、server、location
开启文件的高效传输 开启这个 需要两个东西的帮助
tcp_nopush on;
tcp_nodelay on;

tcp_nopush的作用:激活或禁用Linux上的tcp_cork socket模块 可以减少网络报文段数量
tcp_nodelay的作用:tcp_nodelay 提高I/O性能

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf    
    sendfile        on;
    tcp_nopush     on;
    tcp_nodelay    on;
[root@localhost ~]# nginx -s reload  
9) 连接超时 keepalive_timeout项

keepalive_timeout 50; 默认为65s
作用域:可以设置在 http server location
(1)将无用的连接设置为超时,可以保护服务器资源
(2)当链接很多时,及时断掉已经建立好但又长时间不操作的连接,减少对服务器资源的浪费
(3)当有黑客攻击或者用户恶意攻击时,大量服务器资源被消耗,这时,可以断开占用资源的链接
(4)LNMP环境中,如果用户请求了动态服务,nginx就会用fastcgi去链接PHP,再通过PHP连接数据库, 此时需要设置超时时间,如果fastcgi超过超时时间仍然未响应,则断开,防止资源一直被占用

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf    
    keepalive_timeout  30;
[root@localhost ~]# nginx -s reload  
10) 几个关于请求的超时时间

作用域:http server location
(1)client_header_timeout 15; 默认60 设置读取客户端请求头部数据的超时时间 如果超时 客户端会报 408 request timeout
(2)client_body_timeout 15; 默认 60
(3)send_timeout 25; 默认60 服务器端传输http相应信息到客户端的超时时间
(4)client_max_body_size 8m; 默认是1M 设置上传文件大小的限制 上传过大 保错 413

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf    
    #keepalive_timeout  0;
    keepalive_timeout  30;
    client_header_timeout 15;
    client_body_timeout 15;
    send_timeout 25;
    client_max_body_size 8m;
[root@localhost ~]# nginx -s reload  
11) 关于压缩 gzip

(1)关于压缩的说明

  • 纯文本内容压缩比高,例如: html/js/css/xml/shtml等
  • 格式被压缩的纯文本格式必须大于1K 如果被压缩的文本小于1k 压缩反而是其占用空间变大
  • 图片、视频(流媒体)等尽量不要压缩,这些文件大多是压缩过的

(2)配置项

gzip on;
gzip_min_length 1k; 设置被压缩的页面最小字节数,0表示不管页面大小直接压缩
gzip_buffers 4 16k; 表示申请4个单位16k的内存作为压缩缓冲区
gzip_http_version 1.1;仅对指定版本的http请求的响应 进行压缩,通常取值1.1
gzip_comp_level 2; 表示压缩比,介于1和9之间,1 压缩比例小,处理最快,9压缩比例大,传输最快
gzip_types  text/css html;压缩的类型
gzip_vary on;表示是否添加"Vary: Accept-Encoding"响应头

压缩的文件类型 不可以乱写 可以看mime.types 与里边的相对应

[root@localhost ~]# cat /usr/local/nginx/conf/mime.types

types {
    text/html                             html htm shtml;
    text/css                              css;
    text/xml                              xml;
    image/gif                             gif;
    image/jpeg                            jpeg jpg;
    application/javascript                js;
    application/atom+xml                  atom;
    application/rss+xml                   rss;

    text/mathml                           mml;
    text/plain                            txt;
    text/vnd.sun.j2me.app-descriptor      jad;
    text/vnd.wap.wml                      wml;
    text/x-component                      htc;

    image/png                             png;
    image/tiff                            tif tiff;
    image/vnd.wap.wbmp                    wbmp;
    image/x-icon                          ico;
    image/x-jng                           jng;
    image/x-ms-bmp                        bmp;
    image/svg+xml                         svg svgz;
    image/webp                            webp;

    application/font-woff                 woff;
    application/java-archive              jar war ear;
    application/json                      json;
    application/mac-binhex40              hqx;
    application/msword                    doc;
    application/pdf                       pdf;
    application/postscript                ps eps ai;
    application/rtf                       rtf;
    application/vnd.apple.mpegurl         m3u8;
    application/vnd.ms-excel              xls;
    application/vnd.ms-fontobject         eot;
    application/vnd.ms-powerpoint         ppt;
    application/vnd.wap.wmlc              wmlc;
    application/vnd.google-earth.kml+xml  kml;
    application/vnd.google-earth.kmz      kmz;
    application/x-7z-compressed           7z;
    application/x-cocoa                   cco;
    application/x-java-archive-diff       jardiff;
    application/x-java-jnlp-file          jnlp;
    application/x-makeself                run;
    application/x-perl                    pl pm;
    application/x-pilot                   prc pdb;
    application/x-rar-compressed          rar;
    application/x-redhat-package-manager  rpm;
    application/x-sea                     sea;
    application/x-shockwave-flash         swf;
    application/x-stuffit                 sit;
    application/x-tcl                     tcl tk;
    application/x-x509-ca-cert            der pem crt;
    application/x-xpinstall               xpi;
    application/xhtml+xml                 xhtml;
    application/xspf+xml                  xspf;
    application/zip                       zip;

    application/octet-stream              bin exe dll;
    application/octet-stream              deb;
    application/octet-stream              dmg;
    application/octet-stream              iso img;
    application/octet-stream              msi msp msm;

    application/vnd.openxmlformats-officedocument.wordprocessingml.document    docx;
    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet          xlsx;
    application/vnd.openxmlformats-officedocument.presentationml.presentation  pptx;

    audio/midi                            mid midi kar;
    audio/mpeg                            mp3;
    audio/ogg                             ogg;
    audio/x-m4a                           m4a;
    audio/x-realaudio                     ra;

    video/3gpp                            3gpp 3gp;
    video/mp2t                            ts;
    video/mp4                             mp4;
    video/mpeg                            mpeg mpg;
    video/quicktime                       mov;
    video/webm                            webm;
    video/x-flv                           flv;
    video/x-m4v                           m4v;
    video/x-mng                           mng;
    video/x-ms-asf                        asx asf;
    video/x-ms-wmv                        wmv;
    video/x-msvideo                       avi;
}
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
    gzip  on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 2;
    gzip_types  text/css html;
    gzip_vary on;
[root@localhost ~]# nginx -s reload  
12) 缓存项 expires

允许通过nginx配置文件控制http的expires和cache-control响应头部内容,告诉客户端浏览器是否缓存和缓存多久

优点:

  • 可以减低网站的带宽,节约成本
  • 加快用户访问速度,提升用户体验
  • 服务器访问量降低,服务器的压力减轻

实例:

location ~ ^/(images|javascript|flash|media|static)/ {
    expires 360d;
}

访问网站/images/ ....等目录里的内容时  响应的内容 都缓存360天
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
        location ~ ^/(images|javascript|flash|media|static)/ {
            expires 360d;
        }
        location / {
            root   html;
            index  index.html index.htm;
            ... ...
[root@localhost ~]# nginx -s reload  
13) 防盗链

就是某些不合法的网站未经许可,通过在其自身网站程序非法调用其他网站的资源,然后在自己的网站上显示这些调用的资源,造成其他网站的带宽吃紧,服务器压力过大甚至宕机。
作用域:location
解决方案
1、根据http中的referer来实现防盗链 referer可以检测访问的来源网站
2、通过cookie实现防盗链
3、通过加密变化访问路径实现

location ~* \.(jpg|gif|swf|flv|wma|wmv|mp3)$ {
    valid_referers none blocked *.test.com test.com;
    if ($invalid_referer) {
    rewrite ^/ http://www.test.com/error.png;
    }
}

参数释义:

  • none : 允许没有http_referer的请求访问资源 例如:直接输入网址进行访问;
  • blocked : 允许不是http://开头的,不带协议的请求访问资源,例如curl kugou.com;
  • http_referer:referer的意思简言之,HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。

防盗链操作演示
因为教学环境用到的是虚拟机 不具备公网ip 所以 公网客户端无法访问到 这里转化一下 将自己的域名设置为www.test.com 如果是自己网站跳转过来的请求就允许 其他地方来的就认为是非法的

修改配置

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
        server_name  www.test.com; #修改域名
在默认的location上边 添加一个location
        location ~* \.(png|gif|swf|flv|wma|wmv|mp3)$ {
            valid_referers none blocked *.test.com test.com;
            if ($invalid_referer) {
            rewrite ^/ http://www.test.com/error.jpg;
            }
        }

准备图片并配置hosts

[root@localhost ~]# cp /root/jenkins.png /usr/local/nginx/html/
[root@localhost ~]# cp /root/error.jpg /usr/local/nginx/html/
[root@localhost ~]# vim /etc/hosts
192.168.20.130 www.test.com

启动nginx(已经启动则reload)

[root@localhost ~]# nginx

访问测试:
如果是图形化界面的系统 可以直接使用firefox访问 firefox http://www.test.com/jenkins.png 效果如下图
在这里插入图片描述

如果不是图形化界面 可以使用curl 看一下访问状态 如下 状态码是200 表示通过本机(www.test.com)访问服务器的png图片 可以正常访问 不会被当做非法请求

[root@localhost ~]# curl -I http://www.test.com/jenkins.png
HTTP/1.1 200 OK
Server: nginx/1.15.4
Date: Thu, 21 May 2020 09:43:11 GMT
Content-Type: image/png
Content-Length: 266806
Last-Modified: Thu, 21 May 2020 09:39:14 GMT
Connection: keep-alive
ETag: "5ec64c42-41236"
Accept-Ranges: bytes

另开一个虚拟机 安装web服务器 nginx httpd均可 这里安装httpd 比较快

安装httpd 设置域名 并在hosts文件里做解析

[root@localhost ~]# yum -y install httpd
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf 
ServerName www.example.com
[root@localhost ~]# vim /etc/hosts
192.168.20.130 www.test.com
192.168.20.129 www.example.com

为httpd编辑页面

[root@localhost ~]# vim /var/www/html/test.html
<!DOCTYPE html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <title>Document</title>
 </head>
 <body>
  <img src="http://www.test.com/jenkins.png">
 </body>
</html>

启动httpd

[root@localhost ~]# systemctl start httpd

在192.168.20.129主机上进行访问测试 firefox http://www.example.com/test.html

在这里插入图片描述

如上图 可以发现 test.html中盗取jenkins.png图片失败 跳转到了我们制定的error.jpg图片

14) nginx降权

关于nginx降权的内容 之前的文章写过 这里不做赘述

nginx降权的理论和操作 https://blog.csdn.net/weixin_43557605/article/details/101419699

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值