nginx的优化,每一个点都是面试题。
bug多。版本更新速度比较快,版本号如果泄露出去,会被别人攻击,
查看版本号的发送1:
2:F12 network中
如何隐藏:1在http全局模块中修改,不在server中也不是location(面试题回答一个即可)
2:修改源码文件,重新编译安装:
vim nginx.h 13行 14行
改了之后重新配置,编译安装 make &&make install
再打开隐藏版本号
基本在安装的第一步就给改了
二,nginx的日志分割:
nginx没有自带的日志分割功能,靠我们运维人员通过脚本实现日志分割。
在opt目录下建一个脚本
安装时间进行分割,每一天都生成一个新的日志。
面试题:问脚本怎么写
1 获取日期
找到nginx日志的存储位置
定义分割的源日志
定义nginx的pid文件
加保险,以防找不到
移动日志并重命名日志文件
发送信号给nginx主进程,让nginx重新生成一个新的日志文件
日志清理 日志清理原则:业务日志一般保留30天。数据库日志,保留两年。用户信息加密,而且要永久保存。高可用。
业务日志如果无重大事项,保留10天之内也可以,但是要申请批准。
赋权然后 指定定时任务
#!/bin/bash
d=$(date +%Y-%m-%d)
dir="/usr/local/nginx/logs"
logs_file='/usr/local/nginx/logs/access.log'
logs_error='/usr/local/nginx/logs/error.log'
pid_file='/usr/local/nginx/run/nginx.pid'
if [ ! -d "$dir" ]
then
mkdir -p $dir
fi
mv ${logs_file} ${dir}/access_${d}.log
mv ${logs_error} ${dir}/error_${d}.log
kill -USRL $(cat ${pid_file})
find $dir -mtime +30 -exec rm -rf {} \;
nginx:
http_gzip_static_module 可以对文件内容和图片进行压缩和
开启压缩功能
gzip_min_lenght 1k;
如果文件大小只有1k,不再进行压缩
gzip_comp_level 6;
压缩级别:压缩比率 1-9 1是速度快,压缩比最低 9压缩的速度最慢,但压缩比最高,一般都设置为6 默认是1
gzip_vary on;
前端得到缓存也可以压缩
gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xml application/xml+rss image/jpg image/jpeg image/png image/gif application/x-httpd-php application/javascript application/json;
一般这么多就足够了 加分号;
可以在日后访问时,不需要经常的向后台请求数据,加快访问速度
一般针对静态页面,动态页面一般不设置。
访问以上的结尾图片进行压缩
面试问会话保持问一般设置60到120(主要)
客户端向服务端发送一个完整的请求的超时时间
如果客户端在80秒内发送一个完整的请求头,那么nginx将会返回408 请求超时
客户端于服务端建立连接之后发送请求体的请求时间,80秒内客户端没有发送任何内容的话,nginx 408 request time out 一般来说设置10秒左右
在高并发的场景下,需要nginx启动更多进程来保证快速响应。
cpu
根据cpu的核心数来调整nginx的进程数
查看cpu核数
生产中一般为系统cpu的一半一般来说4个就足够了,8个以上不会有性能的提升,反而会降低稳定性
修改两个
work_procersses 4;
worker_connections 15000;
数字相乘 单台服务器6万足够了
别忘了修改limits.conf
面试题:修改之后也要修改limits.conf
面试题:任何绑定cpu的命令,把进程绑定绑定到cpu上减少cpu的切换。提高效率。
写在全局配置里 设置绑定要和cpu数一致
time_wait是tcp连接中的一种,不是报错,出现在四次挥手之后。
连接没有关闭,只是没有没有数据连接,tcp处于等待状态,等待有一个持续时间 http1.1会话保持。
1,确保可靠的关闭连接
2,避免连接复用。
他在连接正常关闭之后,一段时间之后,自动消失。而且占用的资源很少,对服务器性能影响有限。
就是让他快速消失 改内核文件
net.ipv4.tcp_syncookies = 1
#表示开SYN cookies
当出现SYN等待队列溢出时,启用cookies处理syn队列,默认是0 。1开启。
net.ipv4.tcp_tw_reuse = 1
#time_wait状态可以重用,一个连接就要占用一个端口,time_wait把所有的端口全部占满了,新的连接请求也不会拒绝。
net.ipv4.tcp_tw_recycle = 1
#让time_wait尽快回收。
net.ipv4.tcp_fin_timeout = 60
# 所有time_wait 最大的生命周期60秒。
$remote_addr 客户端的ip地址
$remote_port 显示客户端的端口号
$uri:显示请求的uri
$host:显示请求的主机名
$request_method:显示请求的方法。
重量的变量配置:
proxy_set_header X-Forwarded-for $remote_addr
代理服务器设置这个变量,客户端的真实IP要发送给后端,否则代理服务器地址会被拉入黑名单。
proxy_set_header X-Real-IP $remote/-addr
客户端的真实ip,发送给后端,现在所有的网站都会要求客户端请求时,加上真实ip。
微信,微博,B站,都会显示ip地址。
防止其他网站盗用图片
nginx1:
valid_referers: 设置信任的网站
kgc.com www.kgc.com
*.kgc.com
none:允许没有http_refer的请求访问资源,请求url里面可以包refer
www.kgc.com/ls.jpg
www.kgc.com = www.kgc.com/ls.jpg
blocked :请求网站时,前面可以不带协议
www.baidu.com
if ( $invalid_referer ) {
rewrite ^/ http://www.kgc.com/error.png;
}
如果连接资源是来自上面valid-referers 定义的信任列表,$valid_referer变为true,执行重定向
rewrite ^/ http://www.kgc.com/error.png;
除了防盗链都会问