一、Nginx服务优化
1.隐藏版本号
在生产环境中,需要隐藏 Nginx 的版本号,以避免泄漏 Nginx 的版本,使攻击者不能针对特定版本进行攻击。在隐藏版本号之前,可以使用 命令 curl -I http://192.168.0.102/查看。
[root@www ~]# curl - http://192.168.0.101
HTTP/1.1 200 OK
Server: nginx/1.12.0 //版本号
隐藏 Nginx版本号有两种方式,第一种是修改 Nginx的主配置文件,第二种是修改 Nginx源码文件,指定不显示版本号。
(1)修改配置文件方式
将 Nginx 主配置文件中的 server tokens 选项值设置为 off,如没有该配置项,加上即可。
[root@www ~]# cd /usr/local/nginx/conf
[root@www ~]# vim nginx.conf
http {
include mime.types;
default type application/octet-stream;
server_tokens off; //关闭版本号
...... //省略内容
再次访问网址,只显示Nginx,版本号已经隐藏。
[root@www conf]# systemctl restart nginx
[root@www conf# curl - http://192.168.0.102/
HTTP/1.1 200 OK
Server: nginx
(2)设置版本信息
Nginx 源码文件 nginx-1.12.0/src/core/nginx.h 包含了版本信息,可以随意设置,然后重新编译安装,隐藏版本信息。
[root@www ~## vim nginx-1.12.0/src/core/nginx.h //编辑源码文件
#defne NGINX VERSION "1.1.1" //修改版本号
#define NGINX VER "IIS" NGINX VERSION //修改服务器类型
[root@www ~]# cd nginx-1.12.0/
[root@www nginx-1.12.0]#./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && make && make install
[root@www nginx-1.12.0]# cd /usr/localnginx/conf/
[root@www conf# vim nginx.conf
http {
include mime.types;
default_type application/octet-stream;
server_tokens on; //打开版本号 on
[root@www conf]#systemctl restart nginx
[root@www conf]# curl -l http://192.168.0.102/
HTTP/1.1 200 OK
Server: llS1.1.1 //显示设置的信息
2.修改用户与组
Nginx 运行时进程需要有用户与组的支持,用以实现对网站文件读取时进行访问控制。主进程由 root 创建,子进程由指定的用户与组创建。Nginx 默认使用 nobody 用户帐号与组帐号,一般也要进行修改。
修改 Nginx 配置文件 nginx.conf 指定用户与组。
[root@www nginx-1.12.0# cd /usr/localnginx/conf
[root@www conf]# vim nginx.conf
user nginx nginx; //修改用户为 nginx ,组为 nginx
重启 Nginx 服务并查看进程运行情况,从执行结果中可以得出Nginx 服务的主进程由root 帐户创建,子进程则由 nginx 创建。
3.配置网页缓存时间
当 Nginx 将网页数据返回给客户端后,可设置缓存时间,以便在日后进行相同内容的请求时直接返回,以避免重复请求,加快访问速度。缓存时间一般针对静态资源进行设置,对动态网页不用设置缓存时间。
以图片作为缓存对象,复制logo.jpg图片到Nginx的工作目录,访问http://192.168.0.101/logo.jpg,使用火狐浏览器右键点击“査看元素”->“网络"->“消息头"可以看到响应报文中没有图片的缓存信息。
修改 Nginx 的配置文件,在新 location 段加入 expires 参数,指定缓存的时间,1d表示一天。
[root@www conf]# vim nginx.conf
location / {
root html;
index index.html index.htm;
}
location ~.(gif|jepg|png)$ {
root html;
expires 1d;
}
重启 Nginx 服务后,可以看到响应报文中含有 Expires 参数,其中的 Cahce-Control:max-age=86400 表示缓存时间是 86400秒,也就是缓存一天的时间,一天之内浏览器访问这个页面,都是用缓存中的数据,而不需要向 Nginx 服务器重新发出请求,减少了服务器的使用带宽。
4.日志切割
随着 Nginx 运行时间的增加,产生的日志也会逐渐增加,为了方便掌握 Nginx 的运行状态,需要时刻关注 Nginx 日志文件。太大的日志文件对监控是一个大灾难,不便于分析排查,需要定期的进行日志文件的切割。
Nginx 没有类似 Apache 的 cronlog 日志分割处理功能,但是可以通过 Nginx 的信号控制功能脚本来实现日志的自动切割,并将脚本加入到 Linux 的计划任务中,让脚本在每天的固定时间执行,便可实现日志切割功能。下面是具体操作步骤。
编写脚本/optfenge.sh,把 Nginx的日志文件/usr/local/nginx/logs/access.log 移动到目录/var/og/nginx 下面,以当前时间做为日志文件的名称,然后用 kill -USR1 创建新的日志文件/usr/local/nginx/logs/access.log,最后删除 30 天之前的日志文件。
[root@www logs]# vi /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 Slogs_path ]|| mkdir -p $logs_path //创建日志文件目录
mv /usr/local/nginx/logs/access.log ${logs path}/testcom-access.log-$d
//移动并重命名日志文件
kill -USR1 $(cat $pid path) //重建新日志文件
find $logs_path -mtime +30 |xargs rm -rf //删除 30 天之前的日志文件
执行/optfenge.sh,测试日志文件是否被切割。
5.设置连接超时
在企业网站中,为了避免同一个客户长时间占用连接,造成资源浪费,可设置相应的连接超时参数,实现控制连接访问时间。可以修改配置文件 nginx.conf,设置 keepalive_timeout超时时间。
[root@www conf]# vi nginx.conf
http {
#keepalive timeout 0;
keepalive timeout 65 180; //默认是 65 秒,设置超时是 180秒
keepalive timeout 第一个参数指定了与客户端的 keep-alive 连接超时时间,服务器将会在这个时间后关闭连接。可选的第二个参数指定了在响应头Keep-Alive: timeout=time中的 time值。这个头能够让一些浏览器主动关闭连接,这样服务器就不必去关闭连接了。没有这个参数,Nginx 不会发送 Keep-Alive 响应头。
除 Keepalive_timeout 参数之外,还可以增加其它超时参数,比如Client_header_timeout 参数可用于指定等待客户端发送请求头的超时时间、Client_body_timeout 参数可用于指定请求体读超时时间。
二、Nginx深入优化
1.更改进程数
在高并发环境中,需要启动更多的Nginx进程以保证快速响应,用以处理用户的请求,避免造成阻塞。使用 ps aux 命令查看 Nginx 运行进程的个数。从命令执行结果可以看出master process 是 Nginx 的主进程,开启了1个;worker process 是子进程,子进程也是开启了 1个。
修改 Nginx 的配置文件的 worker_processes 参数,一般设为 CPU 的个数或者核数,在高并发的情况下可设置为 CPU 个数或者核数的2倍,可以査看 CPU 的核数以确定参数。
默认情况下,Nginx 的多个进程可能更多的跑在一颗 CPU 上。为了充分利用硬件多核多 CPU,可以分配不同的进程给不同的 CPU 处理。在一台4核 CPU 服务器上,可以设置每个进程分别由不同的 CPU 核心处理,达到 CPU 的性能最大化。
2.配置网页压缩
Nginx 的 ngx_http_gzip_module 压缩模块提供了对文件内容压缩的功能,允许 Nginx服务器将输出内容发送到客户端之前进行压缩,以节约网站的带宽,提升用户的访问体验。默认 Nginx 已经安装该模块,只需要在配置文件中加入相应的压缩功能参数对压缩性能进行优化即可。
gzipon:开启 gzip 压缩输出;
gzip_min length1k:用于设置允许压缩的页面最小字节数;
gzip_buffers 4 16k:表示申请 4个单位为 16k 的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储 gzip 压缩结果;
gzip_http_version 1.0:用于设置识别 http 协议版本,默认是 1.1,目前大部分浏览器已经支持 gzip 解压,但处理较慢,也比较消耗服务器 CPU 资源;
gzip_comp_level 2:用来指定 gzip 压缩比,1 压缩比最小,处理速度最快:9 压缩比最大,传输速度快,但处理速度最慢,使用默认即可;
gzip_types textplain:压缩类型,是对哪些网页文档启用压缩功能:
gzip_vary on:选项可以让前端的缓存服务器缓存经过 gzip 压缩的页面。
修改Nginx的配置文件,加入压缩功能参数。
3.配置防盗链
在企业网站服务中,一般都要配置防盗链功能,以避免网站内容被非法盗用,造成经济损失,也避免了不必要的带宽浪费。Nginx的防盗链功能也非常强大,在默认情况下,只需要进行很简单的配置,即可实现防盗链处理。
(1)准备环境
防盗链需要准备两台主机模拟盗链。修改两台主机和访问网址主机的hosts文件。
[root@www conf]# vi /etc/hosts
192.168.0.101 www.benet.com
192.168.0.102 www.test.com
在盗链主机(test.com)的工作目录编写盜链页面 index.html,盗取源主机(benet.com)的图片。
[root@localhost ~]# cd /usr/local/nginx/html/[root@localhost html]# vi index.html<!DOCTYPE html>
<html>
<head>
<p><em>Thank you for using nginx.</em></p>
<img src="http://www.benett.com/logo.jpg"/>
</body>
</html>
访问盗链的网页 http://www.test.com/index.html 查看是否盗链成功。
(2)配置Nginx防盗链
Nginx 的防盗链原理是加入location 项,用正则表达式过滤图片类型文件,对于信任的网址可以正常使用,不信任的网址返回相应的错误图片。在源主机(benet.com)的配置文件中加入以下代码:
[root@www html]# cd /usr/local/nginx/conf
[root@www conf]# vi nginx.conf
location ~*\.(gif|jpg|png|jpeg)${
valid referers *.bt.com bt.com;
if ($invalid referer) {
rewrite ^/ http://www.bt.com/error.png;
}
}
下面分析一下这段代码:
~*\.(jpglgiflsw)$:这段正则表达式表示匹配不区分大小写,以jpg 或.gif 或.swf 结尾的文件;
Valid_referers:设置信任的网站,可以正常使用图片;
后面的网址或者域名:referer 中包含相关字符串的网址;
if语句:如果链接的来源域名不在 valid——referers所列出的列表中,$invalid_referer 为1,则执行后面的操作,即进行重写或返回 403 页面。
把图片 error.png 放到源主机(benet.com)的工作目录下。
重启服务器,重新访问 http:/www.test.com/index.htm,显示的是被重写的图片,如图6.7所示,说明防盗链配置成功。