1 隐藏版本号*
方法一 :在http
模块中添加行
#隐藏版本号
server_tokens off;
方法二 :修改版本信息
进入源码安装包
cd /安装包根目录/src/core
vim nginx.h
解注释以下行并修改
define NGINX_VERSION "Don't you guess!"
difine NGINX_VER "Gotcha!/" NGINX_VERSION
回到安装包根目录,重新编译安装
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
make -j 4 && make install
2 更改用户和组
vim nginx
#文件开头修改如下
user nginx nginx;
解释:表示主进程master会由root创建,子进程会由nginx创建,前一个是所有者,后一个是所在组。
3 设置页面的缓存时间
主要是针对动态页面的设置
设置图片的缓存:
vim nginx
location ~\.(gif|jpg|png)$ {root html;#设置图片的缓存时间expires 1d;
}
解释:location ~ {...}
表示正则匹配,\.(gif|jpg|png)$
表示以.jpg .gif .png
结尾的文件;expires 1d
表示缓存时间1天。
4 日志分割*
Apache是自带日志分割的,按天来进行日志收集。如access-2024-07-03.log
。
Nginx不会自动分割,需要人为设置。以下是一种简单的日志分 割:
vim nginx-logs.sh
#!/bin/bash
#指定分割前一天的日志
day=$(date -d "-1 day" "+%Y%m%d")
logs_path="/usr/local/nginx/logs/"
#指定pid文件的位置
pid_path="/usr/local/nginx/run/nginx.pid"
mv /usr/local/nginx/logs/access.log ${logs_path}access-${day}.log
mv /usr/local/nginx/logs/error.log ${logs_path}error-${day}.log
#重新创建一个新的日志,主要用于日志分割
kill -USR1 $(cat $pid_path)
#加上日志清理,清理30天以上的日志
find $logs_path -mtime +30 -exec rm -rf {} \;#退出脚本,赋权,并创建定时任务,每天0点1分执行
chmod 777 nginx-logs.sh
crontab -e
0 0 * * * /usr/local/nginx/logs/nginx-logs.sh
5 绑定CPU*
在nginx.conf
中worker process 2
表示进程有2个,这个和CPU数挂钩。如果不绑定CPU的话,进程可能会在两个CPU之间来回切换使用,浪费资源。
所以要让进程绑定CPU,避免进程切换。
vim nginx.conf
#在http模块中添加行
worker_cpu_affinity 0001 0010 0100 1000;
#0001 0010 0100 1000 分别表示cpu 1 2 3 4
注意:绑定cpu要写在http模块中。
6 连接超时
Nginx配置文件中,keepalive_timeout
表示请求完成之后的连接保持时间,单位秒,一般60-120秒。其他超时设置如下:新增以下行
client_header_timeout 10;
客户端发送一个完整的请求头的超时时间,10秒之内没有发送一个完整的请求头,Nginx返回408:request timeout
client_body_timeout 5;
客户端和服务端建立连接之后,发送请求体的超时时间。客户端在5秒内没有发送任何内容,Nginx同样返回408
7 配置页面压缩
在nginx.conf
中,gzip on
是启用页面压缩
具体配置:
gzip on;
#最小的压缩文件,小于等于1k的文件就不压缩了
gzip_min_length 1k;
#设置压缩的缓冲区,4个,每个缓冲区大小64k
gzip_buffers 4 64k;
#压缩比例1-9,数字越小,压缩的比率越小,速度越块;数字越大,比率越大,速度越慢
gzip_comp_level 6;
#支持压缩的类型
gzip_types ...(图片文字都行,如text/plain image/gif)
8 回收TIME_WAIT*
TIME_WAIT是TCP连接中的一种状态,出现在四次挥手之后。处于等待状态,双方不再发送数据。
TIME_WAIT所占用的系统资源很小,数量较少时,完全可以忽略不计;然而数量很多时,就会有一定影响。所以对有需要的场景,需要在断开连接后,尽快结束TIME_WAIT状态,回收系统资源。
netstat -n | awk '/^tcp/ {++s[$NF]} END{for (a in s) print a s[a]}}'
统计当前系统的连接状态。
在系统内核文件中进行设置:
vim /etc/sysctl.conf
- 防止tcp的半连接队列溢出,可以达到服务端在收到tcp的syn(同步)请求时能快速响应:
net.ipv4.tcp_syncookies=1
- 允许复用TIME_WAIT状态的连接,新的连接可以直接使用TIME_WAIT状态的端口。可以提高连接的重用率。
net.ipv4.tcp_tw_reuse=1
- 可选项,老版本的配置,时间戳戳记也可以进行连接复用,基本不用了
net.ipv4.tcp_tw_recycle=1
- 控制TIME_WAIT状态的持续时间,持续65秒。注意:不是立即把TIME_WAIT的连接收回,而是尽可能地把TIME_WAIT的状态进行回收:把没用的、空闲的进行回收
net.ipv4.tcp_fin_timeout=65
9 防盗链
在location模块中做以下配置:
location ~* \.(jpg|gif|png)$ {valid_referers none blocked *.ykw.com ykw.com;#允许ykw.com的网址访问图片if ( $invalid_referer ) {#对不满足条件(非ykw.com)的访问,执行以下操作rewrite ^/ http://www.ykw.com/error.html;#重定向到指定的URL的提示图片}
}