nginx优化
1.nginx隐藏版本号
因为是一个高性能,轻量级的工具吗,更新版本速度很快,功能很强大但是BUG很多,很容易被攻破,所以需要隐藏版本号来减少服务器被攻击的威胁。
隐藏版本号的第一步就是如何查看版本号
curl -I 本机IP
如何修改?
方法一:
在http大模块修改
修改方式:
server_tokensoff
方法二:修改源码文件,然后重写编译安装
vim nginx.h
然后编译安装: make && make install
最后进入 vim nginx.conf
vim /usr/local/nginx/conf/nginx.conf http { include mime.types; default_type application/octet-stream; server_tokens on; ...... }
重起服务即可
nginx日志分割
nginx没有自带的日志分隔功能,所以需要靠运维人员通过脚本实现日志分割
编写脚本:
按照时间来进行分隔,每天都生成一个新的日志
获取日期
d=$(date +%Y-%m-%d)
找到nginx日志的存储位置
dir="/usr/local/nginx/logs"
定义日志分隔
logs_file='/usr/local/nginx/logs/accsee.log'
logs_error='/usr/local/logs/error.log'
定义nginx的pid文件
pid_file='/usr/local/nginx/run/nginx.pid'
if [ ! -d "$dir" ]
then
mkdir -p $dir
fi
移动日志并重命名
mv ${logs_file} ${dir}/access_${d}.log
#mv /usr/local/nginx/logs/access.log /use/local/nginx/logs/access_2.23-10-12.log
mv ${logs_error} ${dir}/error_${d}.log
发送信号给nginx的主进程,让nginx重新生成一个新的日志文件
kill -USR1 $(cat ${pid_file})
USER1 生成一个新的日志 cat /usr/local/nginx/run/nginx.pid
日志清理 日志清理原则:业务日志一般保留30天,数据库日志保留2年,用户信息要加密且永久保存,而且高可用
若最近无重大事项,业务日志保留10天也可以,前提是申请批准
find $dir -mtime +30 -exec rm -rf {} \;
设置权限
chmod 777 /opt/nginxlog.sh
设置定时任务
0 1 * * * /opt/nginxlog.sh
3.nginx网页压缩
在Nginx的ngx_http_gzip_module压缩模块提供对文件内容压缩的功能。进行相关的配置修改,就能实现Nginx页面的压缩,达到节约带宽,提升用户访问速度
gzip on;
开启压缩功
gzip_min_length 1k;
如果文件大小是1k就不进行压缩处理
gzip_comp_level 6;
压缩级别:压缩比率 1-9 1是速度快,压缩比最低,9是速度慢,压缩比最高,默认是1
gzip_vary on;
前端的缓存也可以支持压缩
gzip_types text/plain image/jpg test/css test/xml image/gif;
压缩类型
4.nginx图片的缓存时间
可以在日后访问时,不需要经常的向后台请求,加快访问速度
一般都是针对静态页面,动态页面一般不设置缓存时间
vim nginx.conf
location ~* \.(gif|jpg|jepg|bmp|ico)$ {
root html;
expires 1d;
}
5.nginx连接超时
HTTP有一个KeepAlive模式,它告诉web服务器在处理完一个请求后保持这个TCP连接的打开状态。若接收到来自同一客户端的其它请求,服务端会利用这个未被关闭的连接,而不需要再建立一个连接。
KeepAlive 在一段时间内保持打开状态,它们会在这段时间内占用资源。占用过多就会影响性能。
在企业网站中,为了避免同一个客户长时间占用连接,造成资源浪费,可设置相应的连接超时参数,实现控制连接访问时间。可以修改配置文件 nginx.conf,设置 keepalive_timeout超时。
vim nginx.conf
http {
......
keepalive_timeout 65 180; //设置连接超时时间
client_header_timeout 80;
客户端向服务端发送一个完整request header的超时间,如果客户端在80秒内没有发送一个完整的请求头,nginx将会返回408,request time out
client_body_timeout 80;
客户端于服务器建立连接之后发送request body的超时时间
80秒内客户端没有发送任何内容,nginx 408 request time out
......
}
6.nginx的并发设置
在高并发的场景下,需要nginx启用更多的进程来保证快速响应
根据cpu的核心数,可以调整nginx的工作进程数
查看cpu核数
cat /proc/cpuinfo | grep processor | wc -l
vim nginx.conf
#user nobody;
worker_processes 1;
尽量不要超过8个,8个以上不会对性能提升,会适得其反,一般设置为cpu核数的一半
修改一下进程数和连接数。
worker_process 4;和 event里的 worker_connections 15000;里面的数字相乘就是一共进程数。
二者乘积为最大并发数
绑定cpu:
#user nobody;
worker_processes 1;
worker_cpu_affinity 0001 0010 0100 1000;
把进程绑定到CPU上,减少CPU的切换,提高效率
}
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
time-wait是tcp连接状态的一种状态,不是报错,出现在四次挥手之后
在time_wait这个状态下,tcp处于连接等待状态,等待有一个持续时间,http 1.1 会话保持
1.确保可靠的关闭连接
2.避免连接复用
他在连接正常关闭之后,一段时间之后,它会自动消失,而且占用的资源很少,对服务器影响是有限的。
如果太多,则进内核文件修改
net.ipv4_tcp_syncookies = 1
表示SYN等待队列溢出时,启用cookies处理syn队列
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 最大生命周期60s
nginx的内置变量:打印结果
location / {
root html;
index index.html index.htm;
return 200 "ip:$remote_addr";
}
\n后面可以追加多个
$remote_port #显示客户端的端口号
$url
#显示请求的url
/是nginx的家目录
$host
#显示请求的主机名
proxy_set_header X-Forwarded-for $remote_addr #代理服务器设置这个变量,客户端的真实ip要发送给后端,否则代理服务器地址会被拉入黑名单。
proxy_set_header X-Real-IP $remote_addr #客户端的真实ip,发送给后端,现在所有网站都会要求客户端请求时,加上真实ip。例如:微信,微博,B站,都会显示IP地址。
nginx设置防盗链
准备两台服务器
systemctl stop firewalld
setenforce 0
systemctl restart nginx
test1是主站
test2是副站
vim nginx.conf
server {
listen 80;
server_name www.abc.com;
#charset koi8-r;
charset utf-8;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
location ~* \.(jpg|gif)$ {
root html;
valid_referers none blocked *.abc.com abc.com;
#valid_referers:设置信任的网站,即 abc.com
#none:允许没有http_refer的请求访问资源,请求的url里面可以不包含refer,www.abc.com就可以直接访问 www.abc.com/aaa.jpg
#blocked:请求网站时,前面可以不带协议(http)。
if ( $valid_referer ) {
rewrite ^/ http://www.sbc.com/error.png'
}
#如果连接资源是来自上面valid_referers定义的信任列表,$valid_referer变为true,执行重定向
systemctl restart nginx
vim index.html #写入内容
域名访问一定要做映射!!!
test2:
同样得做映射
访问即可