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