目录
一、隐藏版本号
在生成环境中,需要隐藏Nginx的版本号,以避免泄漏Nginx的版本,使攻击者不能针对特定版本进行攻击。在隐藏前,可以使用Fiddle工具抓取数据包,查看Nginx版本,也可以在CeniOS中使用命令curl -I http://192.168.10.30/查看。
方法一:修改配置文件
[root@server ~]# curl -I http://192.168.10.30/ ##查看版本号
HTTP/1.1.200 OK
Server:nginx/1.6.3
[root@server ~]# vi /usr/local/nginx/conf/index.conf
...
http {
...
server_tokens off; ##关闭版本号
...
}
[root@server ~]# nginx -t ##检测语法
[root@server ~]# systemctl restart nginx
[root@server ~]# curl -I http://192.168.10.30/ ##查看版本号
配置前
配置后
方法二:修改源码文件
[root@server ~]# vi /usr/local/nginx/conf/index.conf
...
http {
...
server_token off; ##关闭版本号
...
}
[root@server ~]# vi /opt/nginx-1.12.0/src/core/nginx.h ##源码文件
# define nginx_version 101012000
# define NGINX_VERSION "1.1.1" #修改版本号
# define NGINX_VER "IIS/" NGINX_VERSION
[root@server ~]# make && make install
[root@server ~]# systemctl restart nginx
[root@server ~]# curl -I http://192.168.10.30/ ##查看版本号
配置后
二、修改Nginx用户和组
- Nginx运行时进程需要有用户与组的支持,用以实现对网站文件读取时进行访问控制,主进程由root创建,子进程由指定的用户与组创建。Nginx默认使用nobody用户账户与组账户,一般也要进行修改。
- 修改Nginx用户与组由两种方法:
1.在编译安装时指定用户与组
2.配置文件指定用户与组。
方法一:在编译安装时指定用户与组
[root@server nginx-1.12.2]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \ ##指定用户名是nginx
--group=nginx \ ##指定用户组名是nginx
--with-http_stub_status_module
[root@server nginx-1.12.2]# make && make install
方法二:配置文件指定用户与组
[root@server ~]# vi /usr/local/nginx/conf/index.conf
...
user nginx nginx; ##去掉前面#号,把nobody修改用户名为nginx,组为nginx
...
[root@server ~]# ps aux | grep nginx
三、网页缓存
- 当Nginx将网页数据返回给客户,可设置缓存的时间,以方便日后进行相同内容的请求时直接返回,避免重复请求,加快访问速度
- 一般只针对静态资源进行设置,对动态网页不用设置缓存时间。
1.以图片作为缓存对象,服务aa.jpg图片加入到/usr/local/nginx/html/index.html,访问http://192.168.10.30/index.html,用fiddle工具进行抓包
[root@server ~]# vi /usr/local/nginx/html/index.html
<img scr="aa.jpg" /> ##加入aa.jpg图片
2.修改Nginx的配置文件,在新location段加入expires参数,指定缓存的时间,1d表示一天。
[root@server ~]# vi /usr/local/nginx/conf/nginx.conf
...
location / {
root html;
index index.html index.html;
}
location ~ \.(gif|jpg|jepg|png|bmp|ico)$ { ##插入
root html;
expires 1d; #代表缓存时间1天
}
.........................................................
3.访问http://192.168.10.30/index.html,用fiddle工具进行抓包,响应头部中含有Expires
四、日志分割
- 随着Nginx运行时间的增加,产生的日志也会增加,为了方便掌握Nginx的运行状态,需要时刻关注Nginx日志文件。太大的日志文件对监控是一个大灾难,非常不便于分析排查,因此需要定期地进行日志文件的切割。
- Nginx没有类似Apache的cronlog日志分割处理功能,但可以通过Nginx的信号控制功能脚本来实现日志的自动切割,并将脚本加入到Linux的计划任务中,让脚本在每天的固定时间执行,便可实现日志切割功能。
- 编写脚本进行日志切割的思路
设置时间变量
设置保存日志路径
将目前的日志文件进行重命名
重建新日志文件
删除时间过长的日志文件
设置cron任务,定期执行脚本自动进行日志分割
步骤
1.编写脚本fenge.sh
[root@server ~]# vi 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
2.执行fenge.sh,测试日志文件是否分割
[root@server ~]# chmod +x fenge.sh
[root@server ~]# ./fenge.sh
[root@server ~]# ls /var/log/nginx
test.com-access.log-20201130
[root@server ~]# cd /usr/local/nginx/logs/
[root@server ~]# ls -lh
3.设置crontab任务
[root@server ~]# crontab -e
0 1 * * * /usr/bin/sh /root/fenge.sh ##每天的凌晨1:00分执行/root/fenge.sh脚本,进行日志分割。
五、Nginx连接超时
在企业网站中,为了避免同一个客户长时间占用连接,造成资源浪费,可设置相应的连接超时参数,实现对连接访问时间的控制。可以修改配置文件nginx.conf,设置keepalive_timeout超时时间。
一般只设置keepalive_timeout参数即可。
[root@server ~]# vi /usr/local/nginx/conf/nginx.conf
http {
...
keepalive_timeout 65 180; ##第一个数表示服务器主动关闭进程超时时间,第二个数表示客户机浏览器主动关闭时间
client_header_timeout 80; ##等待客户端发送请求头的超时时间,超时显示408错误
client_body_timeout 90; ##设置客户端发送请求体超时时间
...
六、Nginx运行进程数更改
- 在高并发环境中,需要更多的Nginx进程以保证快速响应,用以处理用户的请求,避免造成阻塞。
- 更改进程数的配置方法
1.修改配置文件,修改配置进程参数work_processes
一般设为cpu的个数或者核数
在高并发情况下可设置为cpu个数或核数的两倍
2.增加进程数,可减少系统的开销,提升了服务的速度
3.使用ps aux命令可以查看Nginx运行进程的个数。
[root@server ~]# cat /proc/cpuinfo | grep -c "physical"
2
[root@server ~]# ps aux | grep nginx
root 101041 0.0 0.0 20500 728 ? Ss 18:42 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 101042 0.0 0.0 22948 1648 ? S 18:42 0:00 nginx: worker process
[root@server ~]# vi /usr/local/nginx/conf/nginx.conf
worker_processes 4; ##可设置为cpu核数个数或核数的两倍
worker_cpu_affinity 0001 0010 0100 1000;
七、Nginx网页压缩
- Nginx的ngx_http_gzip_module压缩模块提供了对文件内容压缩的功能,允许Nginx服务器将输出内容发送到客户端之前进行压缩,以节约网站的宽带,提升用户的访问体验。默认Nginx已经安装该模块,只需要在配置文件中加入相应的压缩功能参数对压缩性能进行优化即可。
- 压缩功能参数
gzip on:开启gzip压缩输出
gzip_min_length 1k:用于设置允许压缩的页面最小字节数
gzip_buffers 4 16k:表示申请4个单位为16KB的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。
gzip_http_version 1.1:用来设置识别http协议版本,默认是1.1,目前大部分浏览器已经支持gzip解压,但处理很慢,也比较消耗服务器CPU资源。
gzip_comp_level 2:用来指定gzip压缩比,压缩比1最小,处理速度最快;压缩比9最大,传输速度快,但处理速度最慢,使用默认即可。
gzip_types text/plain:压缩类型,是指对哪些网页文档启用压缩功能
gzip_vary on:该选项可以让前端的缓存服务器缓存经过gzip压缩的页面
[root@server ~]# vi /usr/local/nginx/conf/nginx.conf
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_types text/plain text/css text/html text/javascript application/x-javascript application/json application/xml application/x-httpd-php image/jpg image/jpeg image/png image/gif;
gzip_disable "MSIE [1-6] \.";
gzip_vary on;
在Nginx工作目录建立一个超过1KB大小的html文件,然后访问网址抓取数据。
八、Nginx防盗链
在企业网站服务中,一般都要配置防盗链功能,以避免网站内容被非法盗用,造成经济损失,也避免不必要的带宽浪费。Nginx的防盗链功能非常强大,在默认情况下,只需要进行很简单的配置,即可实现防盗链处理。
1.防盗链
需要准备两台主机模拟盗链
IP地址 | 域名 | 用途 |
---|---|---|
192.168.10.30 | www.aa.com | 源主机 |
192.168.10.50 | www.bb.com | 盗链主机 |
要求源主机和盗链主机Apache工作正常,www.aa.com和www.bb.com能正常访问
盗链主机配置
在盗链主机上安装Apache(使用yum安装即可),在index.html写入网页内容
[root@server ~]# vi /var/www/html/index.html
<html><body>this is my web!!!<img src="http://192.168.10.30/aa.png"/></body></htmll> ##加入盗取的图片
[root@server ~]# vi /etc/hosts
192.168.10.30 www.aa.com
192.168.10.50 www.bb.com
源主机上配置(注意:两张图片的格式不能相同)
准备两张图:aa.jpg和error.png(注意:两张图片的格式不能相同)
[root@server ~]# vi /usr/local/nginx/conf/nginx.conf
location ~*\.(jpg|gif|swf)$ {
valid_referers none blocked *.aa.com aa.com 192.168.10.30;
if ($invalid_referer) {
rewrite ^/ http://192.168.10.30/error.png;
}
}
[root@server ~]# vi /usr/local/nginx/html/index.html
<img src="aa.jpg"/> ##加入图片
[root@server ~]# vi /etc/hosts
192.168.10.30 www.aa.com
192.168.10.50 www.bb.com
访问http://192.168.10.30/或www.aa.com
访问http://192.168.10.50/或www.bb.com,会无法盗取图片
九、Nginx FPM参数优化
- Nginx的PHP解析功能实现如果是交往由FPM处理的,为了提高PHP的处理速度,可对FPM模块进行参数的调整。
- 首先安装FPM模块的PHP环境,保证PHP可以正常运行。
- FPM进程有两种启动方式,由pm参数指定,分别是status和dynamic,前者将产生固定数据的fpm进程,后者将以动态的方式产生fpm进程。
- static方式可以使用pm.max_children指定启动的进程数量。dynamic方式的参数则要根据服务器的内存与服务负载进行调整
dynamic方式的参数
pm.max_children | 指定启动的进程的最大的数量 |
---|---|
pm.start.servers | 动态方式下初始的ftpm进程数量 |
pm.min_spare_servers | 动态方式下最小的fpm空闲进程数 |
pm_max_spare_servers | 动态方式下最大的fpm空闲进程数 |
[root@server ~]# /usr/local/php/sbin/php-fpm -c /usr/local/php/lib/php.ini
[root@server ~]# netstat -anpt | grep 9000
[root@server ~]# vi /usr/local/php/etc/php-fpm.d/www.conf
pm = dynamic
pm.max_children=20 #static模式下空闲进程数上限,大于下面的值
pm.start_servers = 5 #动态方式下默认开启的进程数,在最小和最大之间
pm.min_spare_servers = 2 #动态方式下最少空闲进程数
pm.max_spare_servers = 8 #动态方式下最大空闲进程数