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:

同样得做映射

访问即可