实验环境;
1,redhat6.5系统,IP 192.168.30.15 ,安装nginx-1.12.0 ;
2,Windows7系统客户机,IP 192.168.30.66 安装Fiddler抓包工具。
1,隐藏版本号
在生产环境中,需要隐藏nginx的版本号,以避免泄露nginx的版本,使×××者不能针对特定版本进行×××。在隐藏版本之前可以使用Fiddler工具抓取数据包,查看nginx版本。
隐藏版本有两种方法;
(1)修改配置文件
将nginx的配置文件中的server_tokens 选项值设置为off,如果没有该选项,加上即可。
vim /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
default_type application/octet-stream;
server_tokens off; #隐藏版本号
....
}
再次从客户机浏览器访问,并使用抓包工具Fiddler抓取数据
(2)nginx源码文件nginx-1.12.0/src/core/nginx.h包含了版本信息,可以随意设置,然后重新编译安装,即隐藏了版本信息
vim /opt/nginx-1.12.0/src/core/nginx.h #编辑源码文件
#define NGINX_VERSION "1.1.0" #修改版本号
#define NGINX_VER "IIS" NGINX_VERSION #修改服务器类型
killall -9 nginx
cd ~/nginx-1.12.0/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
make && make install #关闭nginx服务,重新编译安装
再次从客户机浏览器访问,并使用抓包工具Fiddler抓取数据
2,配置网页缓存时间
当nginx将网页数据返回给客户机后,可设置缓存的时间,以方便日后进行相同内容的请求时直接返回,避免重复请求,加快访问速度,一般只针对静态资源进行设置。
(1)以图片作为缓存对象,将图片game.jpg放到nginx工作目录/usr/local/nginx/html下,在客户机浏览器访问http://192.168.30.15/game.jpg,用Fiddler进行抓包 ,查看相应报文,没有图片缓存的信息
mv error.png /usr/local/nginx/html/ #将事先准备的图片移到nginx站点目录下
(2)修改nginx的配置文件,在新的location段加入expires参数,指定缓存的时间,1d表示一天
vim /usr/local/nginx/conf/nginx.conf
...................
location / {
root html;
index index.html index.htm;
}location ~\.(gif|jpg|jepg|png|bmp|ico)$ { #加入新的location
root html;
expires 1d; #指定缓存时间
}
(3)重启nginx服务后,访问http://192.168.30.15/game.jpg网址进行抓包 ,响应报文中含有expires参数
3,日志切割
随着nginx运行时间的增加,产生的日志也会增加,为了方便掌握nginx的运行状态,需要时刻关注nginx日志文件。太大的日志文件对监控是一个大灾难,非常不便于分析排查,因此需要定期地进行日志文件的切割。
(1)首先编写脚本/opt/fenge.sh,把nginx的日志文件/usr/local/nginx/logs/access.log移动到目录/var/log/nginx下面,以当前时间作为日志文件的名称;
然后用kill -USR1创建新的日志文件/usr/local/nginx/logs/access.log,最后删除30天之前的日志文件
vim /opt/fenge.sh
#!/bin/bash
#Filename:fenge.sh
d=$(date -d "-1 day" "+%y%m%d") #只显示一天前时间
logs_path="/var/log/nginx"
pid_path="/usr/local/nginx/logs/nginx.pid"
[ -d $logs_path ] || mkdir -p $logs_path #创建日志文件目录
mv /usr/local/nginx/logs/access.log ${logs_path}/test.com-access.log-$d #移动并重命名日志文件
kill -USR1 $(cat $pid_path) #重建新日志文件
find $logs_path -mtime +30 | xargs rm -rf #删除30天之前的文件
chmod +x fenge.sh
(2)执行脚本,测试日志文件是否被分割
cd /opt/
./fenge.sh #执行脚本
ls /var/log/nginx/
test.com-access.log-180715 #按日期分割了日志脚本cat /usr/local/nginx/logs/access.log #原来的日志文件重新创建
(2)设置crontab任务,定期执行脚本,自动进行日志分割
crontab -e
0 1 * * * /opt/fenge.sh #每天的凌晨1点执行切割脚本,进行日志分割
4,设置连接超时
在企业网络中,为了避免同一个客户长时间占用连接,造成资源浪费,可设置相应的连接超时参数,实现对连接访问的控制。修改配置文件,设置keepalive_timeout 超时时间
vim /usr/local/nginx/conf/nginx.conf
.................
keepalive_timeout 65 180;
..............
#180:客户端超时时间
#65:服务器超时时间
访问网址抓取数据报文,响应头中显示了超时时间是180秒
5,配置网页压缩
nginx的ngx_http_gzip_module压缩模块提供了对文件内容压缩的功能,允许nginx服务器将输出内容发送到客户端之前进行压缩,以节约网站的带宽,提升用户的访问体验。默认nginx已经安装该模块,只需要在配置文件中加入相应的压缩功能参数对压缩性能进行优化即可
vim /usr/local/nginx/conf/nginx.conf
添加如下内容:
gzip on; #开启gzip压缩输出
gzip_buffers 4 64k; #表示申请4个单位为64kb的内存作为压缩结果流缓存,
gzip_http_version 1.1; #设置识别http协议版本,默认值为1.1
gzip_comp_level 2; #指定gzip压缩比,1,最小处理速度最快;9最大,传输速度快,但处理速度慢,使用默认值即可
gzip_min_length 1k; #设置允许压缩的页面最小字节数
gzip_vary on; #该选项可以让前端的缓存服务器缓存经过gzip压缩的页面
gzip_types text/plain text/javascript application/x-javascript text/csstext/xml application/xml application/xml+rss test/jpg test/png; #压缩类型,对哪些网页文档启用压缩功能
6,配置防盗链
在企业网站服务中,一般都要配置防盗链功能,以避免网站内容被非法盗用,造成经济损失,也避免不必要的带宽浪费。Nginx的防盗链功能非常强大,在默认情况下,只需要进行很简单的配置,即可实现防盗链处理。
需要准备两台主机模拟盗链,主机配置如下;
IP地址 域名 用途 系统
192.168.30.15 www.accp.com 源主机 redhat6.5
192.168.30.66 www.test.com 盗链主机 Windows7
(1)修改Windows的hosts文件,设置域名和IP映射关系,
192.168.30.15 www.accp.com
192.168.30.66 www.test.com
(2)打开IIS 信息管理,创建一个盗链网站www.test.com,并在盗链网页站点目录下编写盗链页面index.html
(4)把图片game.jpg放到源主机的站点目录/usr/local/nginx/html下,并编写网页文档index.html
mv ~/game.jpg /usr/local/nginx/html/
echo "<h1>this is accp web <img src="game.jpg"/></h1>">index.html
(5)在客户端的浏览器分别访问盗链网站www.test.com和源主机的网站www.accp.com,查看盗链成功
(6)配置nginx防盗链
nginx的防盗链原理是加入location项,用正则表达式过滤图片类型文件,对于信任的网址可以正常访问使用,对于不信任的网址则返回相应的错误图片。在源主机的配置文件nginx.conf加入以下设置;
vim /usr/local/nginx/conf/nginx.conf
添加如下内容:
location ~*\.(jpg|gif|swf)$ {
valid_referers none blocked *.accp.com accp.com;
if ( $invalid_referer ) {
rewrite / http://www.accp.com/error.png;
}
}
下面分析一下这段代码:
~* \.(jpg|gif|swf)$:这段正则表达式表示匹配不区分大小写,以.jpg或 .gif 或 .swf结尾的文件;
valid_referers:设置信任的网站,可以正常使用图片;
none:浏览器中referer为空的情况,就是直接在浏览器访问图片;
blocked:浏览器中referer不为空的情况,但是值被代理或被防火墙删除了,这些值不以http://或https://开头
后面的网址或者域名:referer中包含相关字符串的网址。
if语句:如果链接的来源域名不在valid_referers所列出的列表中,$invalid_referer为1,则执行后面的操作,即进行重写或返回403页面。
(7)把图片error.png放到源主机的站点目录下
mv ~/error.png /usr/local/nginx/html/
killall -1 nginx
(8)重启服务器,重新访问盗链网站www.test.com,显示的是被重写的图片,再访问源主机的网页www.accp.com则显示正常图片,说明防盗链配置成功