目录
一、 Nginx的优化
1.1 配置Nginx隐藏版本号
隐藏Nginx版本号,避免安全漏洞泄漏
查看Nginx的版本号
可以使用 Fiddler 工具抓取数据包。
查看 Nginx版本,也可以在 CentOS 中使用
命令 curl -I http://192.168.91.140 查看
1.2 Nginx隐藏版本号的方法
隐藏Nginx 版本号有两种方式,第一种是修改Nginx 源码文件,指定不显示版本号,第二种是修改Nginx 的主配置文件。
1.2.1 修改配置文件法
vim /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
default_type application/octet-stream;
#20行左右;添加;关闭版本号
server_tokens off;
......
}
systemctl restart nginx
curl -I http://192.168.111.30
重启服务,访问网站使用curl -I命令检测
1.2.2 修改配置文件方式,重新编译安装
vim /opt/nginx-1.20.02/src/core/nginx.h
#define NGINX_VERSION "1.1.1" #修改版本号
#define NGINX_VER "IIS" NGINX_VERSION #修改服务器类型
cd /opt/nginx-1.20.02/ 进入到nginx-1.20.02目录下
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
make 进行编译
##把/usr/local/nginx/sbin目录下的ngonx移到/usr/local/nginx目录下
做个备份,以防新的文件不能使用,可以回滚
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/
##查看
ls /usr/local/nginx
##把objs目录下的nginx 移到 /usr/local/nginx/sbin目录下
cp objs/nginx /usr/local/nginx/sbin/
##查看
ls /usr/local/nginx/sbin/
vim /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
default_type application/octet-stream;
server_tokens on; ###开启版本信息后重启fuwu
......
}
systemctl restart nginx.service
curl -I http://192.168.111.30
##重启服务,进行测试
1.3 修改用户与组
Nginx 运行是进程需要有用户和组的支持,用以实现对网站文件读取是进行访问控制。
修改Nginx 用户和组有梁种方法,一种就是在编译安装时指定用户和组,另一种时修改配置文件指定的用户和组。
1.3.1 编译安装时更改
请看之前博客中的编译安装Nginx
cd /opt/nginx-1.12.0/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \ ##指定用户名
--group=nginx \ ##指定组名
--with-http_stub_status_module
make && make install
1.3.2 修改配置文件
vim /usr/local/nginx/conf/nginx.conf
#取消注释,修改用户为nginx,组为 nginx
user nginx nginx;
systemctl restart nginx
#主进程由root创建,子进程由nginx创建
ps aux | grep nginx
1.4 配置Nginx网页缓存时间
1、当nginx将网页数据返回给客户端后,可设置缓存的时间,以方便在日后进行相同内容的请求时直接返回,避免重复请求,加快了访问速度。
2、一般针对静态网页设置,对动态网页不设置缓存时间
3、设置方法
在主配置文件的location段加入expires参数
vim /usr/local/nginx/conf/nginx.conf
http {
......
server {
......
location / {
root html;
index index.html index.htm;
}
location ~ \.(gif|jpg|jepg|png|bmp|ico)$ { #加入新的 location,以图片作为缓存对象
root html;
expires 1d; #指定缓存时间,1天
}
......
}
}
systemctl restart nginx
在Linux系统中,打开火狐浏览器,右击点查看元素
选择 网络 ---> 选择 HTML、WS、其他
访问 http://192.168.111.40 ,双击200响应消息查看响应头中包含 Cahce-Control:max-age=86400 表示缓存时间是 86400 秒。也就是缓存一天的时间,一天之内浏览器访问这个页面,都是用缓存中的数据,而不需要向 Nginx 服务器重新发出请求,减少了服务器的使用带宽。
cd /usr/local/nginx/html
先将game.jpg文件传到/usr/local/nginx/html目录下
vim index.html
......
<img src="huoche.jpg"/> #网页中插入图片
</body>
</html>
1.5 实现Nginx的日志切割
1、随着Nginx运行时间增加,日志也会增加。太大的日志文件对监控是一个大灾难。所以需要定期进行日志文件的切割
2、Nginx自身不具备日志分割处理的功能,但可以通过Nginx信号控制功能的脚本实现日志的自动切割(Kill -HUP cat /xxx/log/nginx.pid #平滑重启nginx,类似reload)
-QUIT :结束进程;-USR1:日志分割;-USR2:平滑升级
3、通过Linux的计划任务周期性地进行日志切割
4、编写脚本进行日志切割示例
[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
error_log logs/error.log info;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main; ###去除前面#号
[root@localhost ~]# nginx -t ###检查配置文件是否正确
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost ~]# vim 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 -HUP $(cat $pid_path) ###生成新的日志
find $logs_path -mtime +30 | xargs rm -rf ###删除30天前的日志(xargs用来传递参数)
[root@localhost ~]# chmod +x fenge.sh
[root@localhost ~]# ./fenge.sh
[root@localhost ~]# cd /var/log/nginx/
[root@localhost nginx]# ll
总用量 44
-rw-r--r--. 1 root root 44866 10月 16 15:11 test.com-access.log-20201015 ###运行之后生成昨天的日志
crontab -e
0 1 * * * /opt/logfenge.sh##设置周期性计划任务
扩展:
在linux操作系统中,每个文件都有很多的时间参数,其中有三个比较主要,分别是ctime,atime,mtime
ctime(status time):
当修改文件的权限或者属性的时候,就会更新这个时间,ctime并不是create time,更像是change time,
只有当更新文件的属性或者权限的时候才会更新这个时间,但是更改内容的话是不会更新这个时间。
atime(accesstime):
当使用这个文件的时候就会更新这个时间
mtime(modification time):
当修改文件的内容数据的时候,就会更新这个时间,而更改权限或者属性,mtime不会改变,这就是和ctime的区别
1.6 配置Nginx实现连接超时
HTTP有一个KeepAlive模式,它告诉web服务器在处理完一个请求后保持这个TCP连接的打开状态。若接收到来自客户端的其它请求,服务端会利用这个未被关闭的连接,而不需要再建立一个连接。
KeepAlive 在一段时间内保持打开状态,它们会在这段时间内占用资源。占用过多就会影响性能。
vi /usr/local/nginx/conf/nginx.conf
#keepalive_timeout 0;
keepalive_timeout 65 180;
client_header_timeout 80; ##等待客户端发送请求头的超时时间 超时会发送408错误
client_body_timeout 80; ##设置请求体的读超时时间
systemctl restart nginx.service
keepalive_timeout
指定KeepAlive的超时时间(timeout)。
指定每个TCP连接最多可以保持多长时间,服务器将会在这个时间后关闭连接。
Nginx的默认值是65秒,有些浏览器最多只保持60秒,所以可以设定为60秒。
若将它设置为0,就禁止了keepalive连接。
第二个参数(可选的)指定了在响应头Keep-Alive:timeout=time中的time值。
这个头能够让一些浏览器主动关闭连接,这样服务器就不必去关闭连接了。
没有这个参数,Nginx不会发送Keep-Alive响应头。
client_header_timeout
客户端向服务端发送一个完整的request header的超时时间。
如果客户端在指定时间内没有发送一个完整的reguest header,Nginx返回HTTP 408(Request Timed out)。
client_body_timeout
指定客户端与服务端建立连接后发送request body的超时时间。
如果客户端在指定时间内没有发送任何内容,Nginx返回HTTP 408(Request Timed Out)。
在浏览器上查看:
1.7 更改Nginx运行进程数
在高并发场景,需要启动更多的Nginx进程以保证快速响应,以处理用户的请求,避免造成阻塞
更改进程数的配置方法:
修改配置文件,修改进程配置参数
修改配置文件的worker_processes参数
—般设为CPU的个数或者核数
在高并发情况下可设置为CPU个数或者核数的2倍
增加进程数,可减少了系统的开销,提升了服务速度
使用ps aux查看运行进程数的变化情况
cat /proc/cpuinfo | grep -c "physical id" #统计CPU核数
ps aux | grep nginx
默认情况,Nginx的多个进程可能跑在一个CPU上,可以分配不同的进程给不同的CPU处理,充分利用硬件多核多CPU
在一台4核物理服务器,进行配置,将进程进行分配
#修改配置文件,这里了解一下即可
vim /usr/local/nginx/conf/nginx.conf
#第3行;修改为核数相同或者2倍
worker_processes 4;
#添加;设置每个进程由不同cpu处理,进程数配2 4 6 8分别为0001 0010 0100 1000
worker_cpu_affinity 0001 0010 0100 1000;
systemctl restart nginx
1.8 配置Nginx实现网页压缩功能
Nginx的ngx_http_gzip_module压缩模块提供对文件内容压缩的功能;
允许Nginx服务器将输出内容在发送客户端之前进行压缩,以节约网站带宽,提升用户访问的体验,默认已安装;可在配置文件中加入相应的压缩功能参数对压缩性能进行优化
压缩功能参数:
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压缩的页面
vim /usr/local/nginx/conf/nginx.conf
gzip on; #取消注释,开启gzip压缩功能
gzip_min_length 1k; #最小压缩文件大小
gzip_buffers 4 64k; #压缩缓冲区,大小为4个64k缓冲区
gzip_http_version 1.1; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
gzip_comp_level 6; #压缩比率
gzip_vary on; #支持前端缓存服务器存储压缩页面
gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xml application/xml+rss image/jpg image/jpeg image/png image/gif
application/x-httpd-php application/javascript application/json;
#压缩类型,表示哪些网页文档启用压缩功能
cd /usr/local/nginx/html
先将图片文件传到/usr/local/nginx/html目录下
vim index.html
......
#网页中插入图片
<img src="huoche.jpg"/>
systemctl restart nginx.service
在Linux系统中,打开火狐浏览器,右击点查看元素选择网络--->选择HTML、ws、其他
访问http://192.168.111.40,双击200响应消息查看响应头中包含Content-Encoding: gzip
二、配置防盗链
在企业网站服务中,一般都要配置防盗链功能,以避免网站内容被非法盗用,造成经济损失
Nginx防盗链功能也非常强大。默认情况下,只需要进行简单的配置,即可实现防盗链处理
vim /usr/local/nginx/conf/nginx.conf
http {
......
server {
......
location ~*\.(jpg|gif|swf)$ {
valid_referers *.jzm.com jzm.com;
if ( $invalid_referer ) {
rewrite ^/ http://www.jzm.com/error.png;
#return 403;
}
}
......
}
}
systemctl restart nginx
--------------解释--------------
~* \.(jpg|gif|jepg|bmp|ico)$ :这段正则表达式表示匹配不区分大小写,以.jpg 或.gif或.swf结尾的文件;
valid_referers:设置信任的网站,可以正常使用图片;
none:允许没有http_refer的请求访问资源(根拼Referer的定义,它的作用是指示一个请求是从哪里链接过来的,如果直接在浏览器的地址栏中输入一个资源的URL地址,那么这种请求是不会包含Referer字段的),如http://www.jzm.com/caocao.jpg
我们使用 http://www.jzm.com访问显示的图片,可以理解成http://www.jzm.com/caocao.jpg 这个请求是从http://www.jzm.com这个链接过来的。
blocked:允许不是http://开头的,不带协议的请求访问资源;
if语句:链接来源域名不在valid_referers所列出的列表中,$invalid_referer为true,则执行后面的操作,即进行重写或返回403页面。
cd /usr/local/nginx/html
将caocao.jpg、error.png文件传到/usr/local/nginx/html目录下
vim index.html
......
<img src="huoche.jpg"/>
</body>
</html>
echo "192.168.111.40 www.jzm.com" >> /etc/hosts
echo "192.168.111.30 www.daotu.com" >> /etc/hosts
2. 盗链网站主机(192.168.111.30)
#先安装nginx服务
cd /usr/local/nginx/html
vim index.html
......
<img src="http://www.jzm.com/huoche.jpg"/>
</body>
</html>
echo "192.168.111.40 www.jzm.com" >> /etc/hosts
echo "192.168.111.30 www.daotu.com" >> /etc/hosts
3.在盗图网站主机上进行浏览器验证
三、fpm参数优化
1、Nginx 的 PHP 解析功能实现如果是交由 FPM 处理的,为了提高 PHP 的处理速度,可对
FPM 模块进行参数跳转。
2、FPM 优化参数:
pm 使用哪种方式启动 fpm 进程,可以说 static 和 dynamic,前者将产生固定数量的 fpm 进程,后者将以动态的方式产生 fpm 进程
pm.max_children :static 方式下开启的 fpm 进程数
pm.start_servers :动态方式下初始的 fpm 进程数量
pm.min_spare_servers :动态方式下最大的 fpm 空闲进程数
pm.max_spare_servers :动态方式下最大的 fpm 空闲进程数
3、优化原因:服务器为云服务器,运行了个人论坛,内存为1.5G,fpm进程数为20,内存消耗近1G,处理比较慢
4、优化参数调整
FPM启动时有5个进程,最小空闲2个进程,最大空闲8个进程,最多
可以有20个进程存在
vim /usr/local/php/etc/php-fpm.conf
pid = run/php-fpm.pid
vim /usr/local/php/etc/php-fpm.d/www.conf
--96行--
pm = dynamic #fpm进程启动方式,动态的
--107行--
pm.max_children=20 #fpm进程启动的最大进程数
--112行--
pm.start_servers = 5 #动态方式下启动时默认开启的进程数,在最小和最大之间
--117行--
pm.min_spare_servers = 2 #动态方式下最小空闲进程数
--122行--
pm.max_spare_servers = 8 #动态方式下最大空闲进程数
kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid` #重启php-fpm
netstat -anpt | grep 9000
四、总结
1. Nginx 优化:
配置nginx影藏版本号;
修改nginx用户和组;
配置nginx网页缓存时间
配置nginx实现连接超时
更改nginx工作进程数
配置nginx实现网页压缩功能
实现nginx的日志切割
2. Nginx 防盗链