提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
在生产环境中,需要隐藏Nginx的版本号,以避免泄漏Nginx的版本,使攻击者不能针对特定版本进行攻击。
一、Nginx的性能优化
1、查看方法
1.CentOS中使用命令curl
curl -I http://192.168.35.40 查看的是头部信息
2.浏览器查看
可以直接在浏览器(谷歌)——>F12——>network——>右击页面,选择重新加载——>选择Name内的请求——>选择headlers——>查看版本
在隐藏前,可以使用Fidler工具抓取数据包,查看Nginx版本,也可以在 -I ip地址查看头部信息隐藏Nginx版本号
2、隐藏Nginx版本号
- 修改 Nginx源码文件,指定不显示版本号
vim /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
default_type application/octet-stream;
server_tokens off; ##添加, 关闭版本号
systemctl restart nginx
curl -I http://192.168.35.40 #查看版本号
- 修改Nginx的主配置文件
src:基本所有的配置看到src就是放源码的位置
vim /opt/nginx-1.15.9/src/core/nginx.h
#define nginx_version 1015009
#define NGINX_VERSION "1.1.1" #将原始的1.15.9修改为1.1.1
#define NGINX_VER "apache/" NGINX_VERSION #将原始的Nginx修改为apache
cd /opt/nginx-1.15.9
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module ##重新编译安装
make && make install
vim /usr/local/nginx/conf/nginx.conf中的版本号重新打开
http {
include mime.types;
default_type application/octet-stream;
server_tokens on; ##打开
systemctl restart nginx
curl -I http://192.168.35.40
3、修改用户和组
- Nginx运行时进程需要有用户与组的支持以实现对网站文件读取时进行访问控制
Nginx默认使用nobody用户账号与组账号 - 修改的方法
- 编译安装时指定用户与组
- 修改配置文件指定用户与组
3.1、编译时指定用户与组
即在编译时指定用户与组
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
3.2、修改配置文件指定用户与组
若没有安装前创建用户,则在此服务中默认使用的是nobody
vim /usr/local/nginx/conf/nginx.conf
user nginx nginx; ##将前面的#注释掉,然后修改用户与组为nginx
worker_processes 1;
systemctl restart nginx
ps aux | grep nginx #查看用户与组是否修改成功
4、设置缓存时间
- 当Nginx将网页数据返回给客户端后,可设置缓存的时间,以方便在日后进行相同内容的请求时直接返回,避免重复请求,加快了访问速度
- 一般针对静态网页设置,对动态网页不设置缓存时间;因为动态页面是一直交互的状态,若是设置动态页面缓存时间会一直占用网页的缓存空间
4.1、设置方法
修改配置文件,在http段、或者server段、 或者location段加入对特定内容的过期参数
vim /usr/local/nginx/conf/nginx.conf
location / {
root html;
index index.html index.htm;
}
location ~ \.(gif|jpg|jepg|bmp|ico) $ { ##加入新的location,添加图片识别
root html;
expires 1d; ##设置缓存时间为1天
}
systemctl restart nginx
上传本宫.jpg图片、修改站点文件
cd /usr/local/nginx/html
vim index.html
14 <h1>Welcome to nginx!</h1>
15 <img src="qq.jpg"/> ##14行下面插入一行识别图片
页面查看缓存
网页测试
二、Nginx日志分割
- 随着Nginx运行时间增加,日志也会增加。为了方便掌握Nginx运行状态,需要时刻关注Nginx日志文件
- 太大的日志文件对监控是一个大灾难
- 定期进行日志文件的切割(固定点——>时间戳)
- Nginx自身不具备日志分割处理的功能,但可以通过Nginx信号控制功能的脚本实现日志的自动切割
- 通过Linux的计划任务周期性地进行日志切割
1、编写脚本进行日志切割的思路
- 编写脚本进行日志切割的思路
- 设置时间变量
- 设置保存日志路径
- 将目前的日志文件进行重命名
- 重建新日志文件
- 删除时间过长的日志文件
- 设置cron任务,定期执行脚本自动进行日志分割
2、实操
- 创建脚本
vim /opt/fg.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" ##nginx的进程文件存放位置
[ -d $logs_path ] || mkdir -p $logs_path ##判断是否目录,不就创建目录
mv /usr/local/nginx/logs/access.log ${logs_path}/test.com-access.log-$d ##移动访问日志到log_path,并命名test.com;脚本执行后创建日志进行命令(时间戳的方式来标记唯一性)
kill -HUP $(cat $pid_path) ##给nginx发送信号进行reload,从而生成新的access日志
find $logs_path -mtime +30 | xargs rm -rf ##删除30天之前的日志
date -d “-1 day” “+%Y%m%d” ##唯一性区分
date -d "+1 (second minute hour day month year) ##后一秒/分/时/天/日/月/年
kill -QUIT 5410 :结束进程 -HUP 平滑重启类似reload -USR1 日志分隔 -USR2 平滑升级
- 给与权限执行分割
cd /opt
chmod +x fg.sh
./fg.sh
ls /var/log/nginx ##查看日志分割
date -s 20210624 ##修改时间,再次执行脚本
./fg.sh
ls /var/log/nginx
crontab -e ##周期任务定时执行
0 1 * * * /opt/fg.sh
3、时间参数
- 在linux操作系统中,每个文件都有很多的时间参数,其中有三个比较主要,分别是ctime,atime,mtime
在windows下一个文件有三种时间属性:- 创建时间
- 修改时间
- 访问时间
- 相似的在Linux下一个文件也有三种时间属性:(与windows不同的是linux没有创建时间,而多了个访问时间)
- 访问时间(access time 简写为atime):(access time)显示的是文件中的数据【最后被访问的时间】,比如系统的进程直接使用或通过一些命令和脚本间接使用(执行一些可执行文件或脚本)
- 修改时间(modify time 简写为mtime):(modify time)显示的是文件内容被修改的最后时间,比如用vi编辑、echo >> > 、sed -i 时就会被改变。(也就是Block的内容)
- 状态修改时间(change time 简写为ctime):(change time)显示的是文件的权限、拥有者、所属的组、链接数发生改变时的时间。当然当内容改变时也会随之改变
(即inode内容发生改变和Block内容发生改变时)
三、实现连接超时
1、超时参数
- 为避免同一客户端长时间占用连接,造成资源浪费,可设置相应的连接超时参数,实现控制连接访问时间
- 超时参数
- Keepalive_ timeout ##设置连接保持超时时间
- Client header_ timeout ##指定等待客户端发送请求头的超时时间
- Client_ body_ timeout ##设置请求体读超时时间
- Nginx 使用 keepalive_timeout 来指定 KeepAlive 的超时时间(timeout)
- 指定每个 TCP 连接最多可以保持多长时间。Nginx 的默认值是 65 秒,有些浏览器最多只保持 60 秒,若将它设置为 0,就禁止了 keepalive 连接
2、参数配置
vim /usr/local/nginx/conf/nginx.conf
http {
...
keepalive_timeout 100;
client_header_timeout 80; #等待客户端发送请求头的超时时间 超时会发送408错误
client_body_timeout 80; #设置客户端发送请求体超时时间
...
}
五、更改进程数
1、参数详解
- 修改配置文件的worker_ processes参数
- 一般设为CPU的个数或者核数
- 在高并发情况下可设置为CPU个数或者核数的2倍
- 增加进程数,可减少了系统的开销,提升了服务速度
- 使用ps aux查看运行进程数的变化情况
- 默认情况,Nginx的多个进程可能跑在一个CPU上, 可以分配不同的进程给不同的CPU处理,充分利用硬件多核多CPU
- 在一台4核物理服务器, 进行配置,将进程进行分配
2、配置参数
cat /proc/cpuinfo | grep -c "physical" ##cpu核数
ps aux | grep nginx ##一个主进程中包含一个子进程
vim /usr/local/nginx/conf/nginx.conf
worker_processes 2; ##修改为核数相同或者2倍;2核cpu,开启2个进程
worker_cpu_affinity 01 10; ##设置每个进程由不同cpu处理,进程数配为2时为0001、0010、0100、1000
//
PS:
01表示启用第一个CPU内核,10表示启用第二个CPU内核
worker_cpu_affinity 01 10;表示开启两个进程,第一个进程对应着第一个CPU内核,第二个进程对应着第二个CPU内核。
//
worker_processes 4; ##2核cpu,开启4个进程
worker_cpu_affinity 01 10 01 10;
PS:开启了四个进程,它们分别对应着开启2个CPU内核
//
worker_processes 4; ##4个cpu,开启4个进程
worker_cpu_affinity 0001 0010 0100 1000;
ps:0001表示启用第一个CPU内核,0010表示启用第二个CPU内核,依此类推
六、网页压缩功能
- Nginx的ngx_ http_ gzip_module压缩模块提供对文件内容压缩的功能
- 允许Nginx服务器将输出内容在发送客户端之前进行压缩,以节约网站带宽,提升用户的访问体验,默认已经安装
- 可在配置文件中加入相应的压缩功能参数对压缩性能进行优化
1、压缩功能参数
- gzip on:开启gzip压缩输出
- gzip_min_length 1k: 设置允许压缩的页面最小字节数
- 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 text/plain:压缩类型,对哪些网页文档启用压缩功能
- gzip_vary on:让前端缓存服务器缓存经过gzip压缩的页面
2、参数配置
vim /usr/local/nginx/conf/nginx.conf
gzip on; #开启gzip压缩功能
gzip_min_length 1k; #压缩阈值
gzip_buffers 4 16k; #buffer 大小为4个16k缓冲区大小
gzip_http_version 1.1; #压缩版本(默认不设置)
gzip_comp_level 6; #压缩比率,最小为1,处理速度快,传输速度慢,9最大压缩比,处理速度慢,传输速度快(建议5-6)
gzip_types text/plain application/x-javascript text/css image/jpg image/jpeg image/png image/gif application/xml text/javascript application/x-httpd-php application/javascript application/json;
gzip_disable "MSIE [1-6]\."; #配置禁用gzip条件,支持正则,表示ie6以下不启用gzip
gzip_vary on; #支持前端缓存服务器存储压缩页面
cd /usr/local/nginx/html/ ##首页中插入cat.jpg图片进行测试
vim index.html
<h1>Welcome to nginx!</h1>
<img src="qq.jpg"/> #插入一行
systemctl restart nginx
这时需要清除缓存,不然无法打开图片
访问http://192.168.35.40/qq.jpg
F12——>刷新——>查看gzip
七、盗链与防盗链
1、盗链
准备三台机器
盗链端: 192.168.35.40 nginx服务
服务端:192.168.35.10 nginx服务
win10 : 192.168.35.100 #指向服务端DNS /hosts
win10 : 192.168.35.100 #指向服务端DNS /hosts
------------------------------------------服务端添加映射----------------------------------------------
vim /etc/hosts ##
192.168.35.10 www.zyt.com
------------------------------------------盗链端添加映射----------------------------------------------
vim /etc/hosts
192.168.35.40 daolian
192.168.35.10 www.zyt.com
C:\WINDOWS\System32\drivers\etc ##win10 添加映射;打开目录位置
PS:首次更改需要修改权限:属性——》安全——》高级——》更改为所有权限
cd /usr/local/nginx/html/
vim index.html
<h1>Welcome to nginx!</h1> ##server端修改index.html.插入图片
<img src="qq.jpg"/>
使用win10 访问192.168.35.10 server端测试
cd /usr/local/nginx/html/ ##设置盗链(在盗链端上)
[root@nginx html]# ls
50x.html index.html
[root@nginx html]# vim index.html ##情况内容添加以下两行
<h1>Welcome to nginx!</h1>
<img src="http://www.zyt.com/qq.jpg"/>
在win10主机中访问192.168.35.40 盗链网站,仍能访问出结果
2、防盗链
意思就是若访问的是以zyt.com结尾的可以访问,否则访问的是error的图片
vim nginx.conf ##修改server端主机的nginx 配置文件
location ~*\.(jpg|gif|swf)$ { ##添加location字段
valid_referers none blocked *.zyt.com zyt.com; ##只允许来源为本地的访问源进行访问
if ( $invalid_referer ) {
rewrite ^/ http://www.zyt.com/error.png;
}
}
上传error.png文件至/usr/local/nginx/html
##win10访问 www.zyt.com (服务端)和192.168.226.134 (盗链端)
访问域名即可
访问ip非域名就是error的图片
- 防盗链设置参数详细说明:
- valid_referers:设置信任的网站,即能引用相应图片的网站(白名单)
- none:浏览器中 Referer为空的情况,就是直接在浏览器访问图片
- blocked:referer不为空的情况,但是值被代理或防火墙删除了,这些值不以http://或者https://开头
后面的网址或者域名:referer中包含相关字符串的网址
- if语句:如果链接的来源域名不在 valid_referers所列出的列表中, $invalid_referer为1,则执行后面的操作,即进行重写或返回403页面
八、FPM模块参数优化
1、FPM参数介绍(为了nginx支持PHP)
-
Nginx的PHP解析功能实现如果是交由FPM处理的,为了提高PHP的处理速度,可对FPM模块进行参数的调整
FPM模块参数调整,要根据服务器的内存与服务负载进行调整- 启动fpm进程方式(通过pm参数指定):
- static:将产生固定数量的fpm进程
- dynamic:将以动态的方式产生fpm进程
- 启动fpm进程方式(通过pm参数指定):
-
FPM优化参数讲解
- Static的方式的参数
- pm.max_children:指定启动的进程数量
- Dynamic方式的参数
- pm.max_children:指定启动的进程数量最大的数量
- pm.start_servers:动态方式下初始的m进程数量
- pm.min_spare_servers:动态方式下最小的fpm空闭进程数
- pm.max_spare_servers:动态方式下最大的fpm空闭进程
- Static的方式的参数
2、具体配置
cd /usr/local/php/etc/
vim php-fpm.conf
pid = run/php-fpm.pid
----------------------------->添加以下内容<--------------------------------------
pm = dynamic ##将以动态的方式产生fpm进程
pm.max_children=20 ##static模式下空闲进程数上限,大于下面的值
pm.start_servers = 5 ##动态方式下默认开启的进程数,在最小和最大之间
pm.min_spare_servers = 2 ##动态方式下最少空闲进程数
pm.max_spare_servers = 8 ##动态方式下最大空闲进程数
九、总结
本章主要讲解了nginx的优化,包含:Nginx的隐藏版本号、缓存时间、日志分割、连接超时、更改进程数、网页压缩功能、盗链、防盗链;fpm参数优化