nginx网页优化
一、隐匿版本号
1.1概述
nginx版本号直接显现,容易造成安全隐患,所以需要隐藏Nginx版本号,避免出现安全漏洞。
1.2Nginx隐藏版本号的方法
- 方法一:修改 Nginx的主配置文件
- 方法二:修改Nginx源码文件,指定不显示版本号
[root@localhost ~]# curl -I localhost ##可以查看版本号等详细信息
HTTP/1.1 200 OK
Server: nginx/1.15.9
……省略部分
1.2.1方法一
[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
default_type application/octet-stream;
server_tokens off; ###插入这段字,隐匿服务器版本(on为开启,off为关闭)
……省略部分
[root@localhost~]# systemctl restart nginx ###重启Nginx服务
[root@localhost ~]# curl -I 127.0.0.1 ##再次查看,版本已经被隐匿
HTTP/1.1 200 OK
Server: nginx
……省略部分
1.2.2方法二
Nginx源码文件nginx-1.15.9/src/core/nginx.h中包含了版本信息,可以随意设置,
然后重新编译安装,隐藏版本信息。
[root@localhost core]# vi /opt/nginx-1.15.9/src/core/nginx.h
……省略部分
#define NGINX_VERSION "1.1" ##直接修改版本号
#define NGINX_VER "IIS" NGINX_VERSION ##直接修改服务器信息
……省略部分
[root@localhost nginx-1.15.9]#
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module
[root@localhost nginx-1.15.9]# make && make install
[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
##我们需要展示修改过的服务器版本信息,因此需要开启展示功能
http {
include mime.types;
default_type application/octet-stream;
server_tokens on;
……省略部分
[root@localhost nginx-1.15.9]# curl -I 127.0.0.1
HTTP/1.1 200 OK
Server: IIS1.1 //变成了自己设置的版本
……省略部分
二、修改nginx用户与组
2.1概述
- Nginx运行时进程需要有用户与组的支持,用以实现对网站文件读取时进行访问控制。
- 主进程由root创建,子进程由指定的用户与组创建。Nginx默认使用nobody 用户帐号与组帐号,一般也要进行修改。
2.2修改Nginx用户与组的两种方法
- 在编译安装时指定用户与组
- 修改配置文件指定用户与组。
2.2.1编译安装时指定用户与组参数
[root@localhost opt]# cd nginx-1.15.9/
[root@localhost nginx-1.15.9]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \ ##指定用户
--group=nginx \ ##指定组账号
--with-http_stub_status_module
2.2.2修改Nginx配置文件
[root@localhost conf]# cd /usr/local/nginx/conf/
[root@localhost conf]# vi nginx.conf
……省略部分
user nginx nginx; ###修改用户为nginx,组为nginx (#user nobody;原本是指定nobody)
……省略部分
Nginx查看进程运行情况,主进程由root帐户创建,子进程则由Nginx创建。
[root@localhost conf]# ps aux |grep nginx
root 14576 0.0 0.0 21538 764 ? Ss 23:33 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 14577 0.0 0.0 23468 1766 ? S 23:33 0:00 nginx: worker process
root 14864 0.0 0.0 113758 983 pts/1 S+ 23:55 0:00 grep --color=auto nginx
三、配置网页缓存
在主配置文件/nginx.conf中http{}区域内新建一个location区域,配置图片缓存时间
[root@localhost conf]# vi /usr/local/nginx/conf/nginx.conf
location ~\.(gif|jpg|jepg|png|bmp|ico)$ {
root html;
expires 1d; 缓存1天
}
四、连接超时
4.1概述
- 在企业网站中,为了避免同一个客户长时间占用连接,造成资源浪费,可设置相应的连接超时参数,实现控制连接访问时间。可以修改配置文件nginx.conf,设置keepalive_timeout超时时间。
- keepalive_timeout第一个参数指定了与client的keep-alive连接超时时间,服务器将会在这个时间后关闭连接。可选的第二个参数指定了在响应头KeepAlive_timeout=time中的time值。这个头能够让一些浏览器主动关闭连接,这样服务器就不必要去关闭连接了。没有这个参数,nginx不会发送 Keep-Alive响应头。
- 访问网址抓取数据报文,响应头中显示了超时时间是180秒。一般只设置Keepalive_timeout参数即可。
- 同时在优化后可能还会增加其它超时参数,比如Client_header_timeout参数,指定等待客户端发送请求头的超时时间,Client_body_timeout指定请求体读超时时间
4.2修改配置
[root@localhost conf]# vi /usr/local/nginx/conf/nginx.conf
http {
……省略部分
#keepalive_timeout 0;
keepalive_timeout 65 180; ##默认65秒,设置超时时间180s
client_header_timeout 80;
client_body_timeout 80;
……省略部分
4.3抓包测试
访问http://20.0.0.12,抓包看报文,分析keepalivetimeout超时时间
五、网页压缩
5.1概述
- Nginx的ngx_http_gzip_module压缩模块提供了对文件内容压缩的功能,允许Nginx服务器将输出内容发送到客户端之前进行压缩,以节约网站的带宽,提升用户的访问体验,
- 默认Nginx已经安装该模块,只需要在配置文件中加入相应的压缩功能参数对压缩性能进行优化即可。
[root@localhost conf]# vi /usr/local/nginx/conf/nginx.conf
gzip on; ##找到gzip on,去掉前面的注释开启压缩功能
gzip_buffers 4 64k; //表示申请4个单位为16k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果;
gzip_http_version 1.1;
gzip_comp_level 6; //用来指定gzip压缩比,1压缩比最小,处理速度最快;9压缩比最大,传输速度快,但处理速度最慢,使用默认即可;
gzip_min_length 1k; //用于设置允许压缩的页面最小字节数;
gzip_vary on;
gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xml application/xml+rss; //压缩类型,是对哪些网页文档启用压缩功能;
5.2抓包测试
能看到gzip格式
六、防盗链
正版原网站(20.0.0.12)
[root@localhost html]# vi /usr/local/nginx/html/index.html ##制作一个正版网页
<html><body><h1>I'm true</h1>
<img src="abc.png" height=250 weight=250 />
</body></html>
登入20.0.0.12测试
盗版网站(20.0.0.22)
[root@localhost html]# vi /var/www/html/index.html
<html><body><h1>I'm not true</h1>
<img src="http://20.0.0.12/abc.png" height=250 weight=250 />
</body></html>
登入20.0.0.22测试
到nginx服务器配置防盗链
[root@localhost html]# vim /usr/local/nginx/conf/nginx.conf
location ~*\.(jpg|gif|swf)$ {
valid_referers none blocked *.test.com test.com;
if ($invalid_referer) {
rewrite ^/https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=2135575968,1508481517&fm=15&gp=0.jpg; ;
}
}
再次访问http://20.0.0.22,图片发生改变,防盗链有效
盗链可耻
七、通过脚本日志分割
随着Nginx运行时间的增加,产生的日志也会逐渐增加,为了方便掌握Nginx的运行状态,需要时刻关注Nginx日志文件。太大的日志文件对监控是一个大灾难,不便于分析排查,需要定期的进行日志文件的切割。
7.1编写脚本/opt/rizhifenge.sh
把Nginx的日志文件/usr/local/nginx/logs/access.log 移动到,目录/var/log/nginx下面,以当前时间做为日志文件的名称,然后用kill-USR1创建新的日志文件/usr/local/nginx/logs/access.log,最后删除30天之前的日志文件。
[root@www logs]# vi/opt/rizhifenge.sh
#!/bin/bash
#Filename: rizhifenge.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 ]ll mkdir -p $logs_path ####创建日志文件目录
mv /usr/local/nginx/logs/access.log ${logs_path}/51xit.top-access.log-$d
###移动并重命名日志文件
kill-USR1 $(cat $pid path) ####重建新日志文件
find $logs_path -mtime +30 |xargs rm -rf ####删除30天之前的日志文件
7.2执行/opt/rizhifenge.sh,测试日志文件是否被切割
[root@www logs]# chmod +x/opt/rizhifenge.sh ####添加权限
[root@www logs]# /opt/rizhifenge.sh ###执行分割脚本
[root@www ~]#ls /var/log/nginx
51xit.top-access.log-20201104 ###按日期分割了日志文件
八、进程优化
[root@localhost proc]# cd /proc/
[root@localhost proc]# ls ##/proc/目录下cpuinfo和meminfo可以查看CPU和缓存信息
cpuinfo meminfo ……省略部分
processor : 0 ##从0开始数,有一个CPU核心就有一个processor
……省略部分
power management:
processor : 1
……省略部分
power management:
processor : 2
……省略部分
power management:
[root@localhost proc]# cat /proc/cpuinfo |grep -c "processor" ##可以查看CPU核心数
3
[root@localhost proc]# ps aux |grep nginx ##查看进程开启情况,一个root主进程,一个子进程
root 12872 0.0 0.0 20556 668 ? Ss 05:52 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 12873 0.0 0.0 23040 1684 ? S 05:52 0:00 nginx: worker process
[root@localhost proc]# vi /usr/local/nginx/conf/nginx.conf
……省略部分
worker_processes 3; ##进程数改为3,工作进程数默认为1,
worker_cpu_affinity 001 010 100; ##插入这行字段,配置负载均衡,没有闲置的cpu核心
……省略部分
events {
worker_connections 1024; ##每个工作进程可以建立的连接数
}
[root@localhost proc]# systemctl restart nginx ##重启生效
[root@localhost proc]# ps aux |grep nginx ##查看到一个root主进程,三个子进程
root 14059 0.0 0.0 20556 660 ? Ss 07:20 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 14060 0.0 0.0 23040 1432 ? S 07:20 0:00 nginx: worker process
nginx 14061 0.0 0.0 23040 1432 ? S 07:20 0:00 nginx: worker process
nginx 14062 0.0 0.0 23040 1432 ? S 07:20 0:00 nginx: worker process
九、FPM动态进程配置方法
Pm.max_children 指定启动的进程数量最大的数量,同时也是活着的(注意:“活着"不等于"工作中”,“杀死"不等于"空闲”)
Pm.start.servers 动态方式下初始的ftpm 进程数量,启动时创建的子进程数量
Pm.min_spare_servers 动态方式下最小的fpm“空闲”子进程的最小数量;状态(等待处理),如果“空闲”进程的数量的值小于这个值,那么将创建一些子节点。
Pm.max_spare_servers 动态方式下最大的空闲进程数;状态(等待处理)。如果“空闲”进程的数量大于这个数字,那么多出的一些子进程会被杀死。
假设场景:现有云服务器,运行了个人论坛,内存为1.5G,fpm进程数为20,内存消耗近1G,处理比较慢,对参数进行优化处理。
示例
root@www etc]# cd /usr/local/php/etc/php-fpm.d
[root@www etc]# vi www.conf
pm=dynamic ##动态方式
pm.max_children=20
pm.start_servers=5
pm.min_spare_servers=2
pm.max_spare_servers=8
pm.process_idle_timeout=500