Nginx服务优化与防盗链

简介

  • 在企业信息化应用环境中,服务器的安全性和响应速度需要根据实际情况进行相应参数配置,以达到最优的用户体验;
  • 默认的Nginx安装参数只能提供最基本的服务,还需要调整如网页缓存时间、连接超时、网页压缩等相应参数,才能发挥出服务器的最大作用。

1.Nginx 常规服务优化

1.1 隐藏 Nginx版本号

  • 目的:在生产环境中,需要隐藏Ngnx的版本号,以避免安全漏洞的泄漏。

1.1.1 查看版本号方法

  • 使用fdde工具在 Windows客户端查看 Nginx版本号
  • 在 Centos系统中使用“curl -l 网址”命令查看

示例:

centos系统查看版本号的命令

[root@server ~]# curl -I http://192.168.140.15
HTTP/1.1 200 OK
Server: nginx/1.12.2		'//显示版本号'
Date: Tue, 01 Dec 2020 18:46:49 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 612
Last-Modified: Tue, 01 Dec 2020 11:32:17 GMT
Connection: keep-alive
ETag: "5fc629c1-264"
Accept-Ranges: bytes

1.1.2 Nginx隐藏版本号的方法

  • 修改Nginx源码文件,指定不显示版本号;
  • 修改Nginx主配置文件。

1)修改主配置文件的方式如下:

[root@server ~]# vim /usr/local/nginx/conf/nginx.conf 
...	//省略部分信息
http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens off;	'//关闭版本号'
    ...
}
[root@server ~]# nginx -t	//检查nginx语法
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@server ~]# systemctl stop nginx
[root@server ~]# systemctl start nginx
[root@server ~]# curl -I http://192.168.140.15
HTTP/1.1 200 OK
Server: nginx		'//不显示版本号'
Date: Tue, 01 Dec 2020 18:51:45 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 612
Last-Modified: Tue, 01 Dec 2020 11:32:17 GMT
Connection: keep-alive
ETag: "5fc629c1-264"
Accept-Ranges: bytes

注意:若php配置文件中配置了 fastcgi_ param SERVER SOFTWARE 选项,则编辑 php-fpm 配置文件,将 fastcgi_param SERVER SOFTWARE 对应的值修改为

fastcgi_param SERVER_SOFTWARE nginx

2)修改Nginx源码文件

  • 由于Nginx源码文件 nginx-1.12.2/src/core/nginx.h 包含了版本信息,故更改设置参数后,重新编译安装,即可隐藏版本信息。
[root@server ~]# vi nginx-1.12.2/src/core/nginx.h
...
#define nginx_version      1548023		//发行时间
#define NGINX_VERSION      "1.1.7"		//发行版本号
#define NGINX_VER          "IIS/" NGINX_VERSION	//搭建服务所使用的软件
[root@server ~]# cd nginx-1.12.2/
[root@server nginx-1.12.2]# ./configure --prefix=/usr/local/nginx \
--user=nginx --group=nginx --with-http_stub_status_module
[root@server nginx-1.12.2]# make && make install
[root@server nginx-1.12.2]# cd
[root@server ~]# vim /usr/local/nginx/conf/nginx.conf 
...	//省略部分信息
http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens on;	'//确认版本号开启,如未开启,开启后需重启nginx服务'
    ...
}
[root@server ~]# curl -I http://192.168.140.15
HTTP/1.1 200 OK
Server: IIS/1.1.7		//显示更改搭建服务的软件,及版本号
Date: Tue, 01 Dec 2020 19:13:14 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 612
Last-Modified: Tue, 01 Dec 2020 11:32:17 GMT
Connection: keep-alive
ETag: "5fc629c1-264"
Accept-Ranges: bytes
...

在这里插入图片描述

1.2 修改Nginx用户与组

  • Nginx运行时进程需要有用户与组的支持,以实现对网站文件读取时进行访问控制;
  • Nginx默认使用 nobody用户账号与组账号,一般也要进行修改。

修改的方法:

  • 编译安装时指定用户与组;
  • 修改配置文件时指定用户与组。

1.2.1 编译安装时指定用户与组

创建用户账号与组账号,如 nginx
在编译安装时–user与- -group指定Nginx服务的运行用户与组账号
[root@server ~]# cd nginx-1.12.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

1.2.2 修改配置文件时指定用户与组

  • 新建用户账号,如nginx
  • 修改主配置文件user选项,指定用户账号与组账号
  • 重启nginx服务,使配置生效
  • 使用ps aux命令查看nginx的进程信息,验证运行用户中改变效果
[root@server ~]# vi /usr/local/nginx/conf/nginx.conf
user  nginx nginx; 
worker_processes  1;                 
...
[root@server ~]# systemctl stop nginx
[root@server ~]# systemctl start nginx
[root@server ~]# ps aux | grep nginx
root      63459  0.0  0.0  20500   620 ?        Ss   03:13   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx     63460  0.0  0.0  23028  1644 ?        S    03:13   0:00 nginx: worker process
root      63600  0.0  0.0 112676   984 pts/0    S+   03:27   0:00 grep --color=auto nginx

1.3 配置Nginx网页缓存时间

  • 当Nginx将网页数据返回给客户端后,可设置缓存的时间,以方便在日后进行相同内容的请求时直接返回,避免重复请求,加快了访问速度;
  • 一般针对静态网页设置,对动态网页不设置缓存时间;
  • 可在 Windows客户端中使用 fiddler查看网页缓存时间。

设置方法

可修改配置文件,在http段、或者 server段、或者 location段加入对特定内容的过期参数。

1.3.1 以图片作为缓存对象

  • 首先需要添加图片到/usr/local/nginx/html/中,然后创建图片链接
[root@server ~]# cd /usr/local/nginx/html/
[root@server1 html]# vi index.html 
<html><body>
...
<img src="hh.jpg" width="600" height="300" />	//添加图片
</body>
</html>
  • 在浏览器上访问,效果如下

在这里插入图片描述

1.3.2 配置方法

  • 修改Nginx的配置文件,在新的 location 段加入 expires 参数,指定缓存的时间。
[root@server ~]# vim /usr/local/nginx/conf/nginx.conf
...	//添加以下模块,指定缓存时间
location ~\.(gif|jpg|jepg|png|bmp|ico)$ {
    root html;
    expires 1d;		'//1d表示1天'
} 
...
  • 检查nginx语法,重启服务
[root@server ~]# nginx -t
[root@server ~]# systemctl stop nginx
[root@server ~]# systemctl start nginx
  • 访问网站抓包,如图

初始状态
在这里插入图片描述
当出现图片缓存时
在这里插入图片描述

1.4 Nginx的日志切割

1.4.1 为什么要进行日志分割

  • 随着 Nginx运行时间增加,日志也会增加。为了方便掌握 Nginx运行状态,需要时刻关注Ngnx日志文件;
  • 太大的日志文件对监控是一个大灾难。

1.4.2 定期进行日志文件的切割

  • Nginx自身不具备日志分割处理的功能,但可以通过Nginx信号控制功能的脚本实现日志的自动切割,并通过Lnux的计划任务周期性地进行日志切割。

1.4.3 编写脚本进行日志切割的思路

  • 设置时间变量
  • 设置保存日志路径
  • 将目前的日志文件进行重命名
  • 重建新的日志文件
  • 删除时间过长的日志文件
  • 设置cron任务,定期执行脚本自动进行日志分割

1.4.4 脚本配置参数解析

  • 时间变量
[root@server ~]# date "+%Y%m%d"   	//查看当前日期时间
[root@server ~]# date "+%Y-%m-%d" 	//查看当前的年月日
[root@server ~]# date -d "-1 day" "+%Y-%m-%d"   //查看昨天日期
[root@server ~]# date -d "+1 day" "+%Y-%m-%d"   //查看明天日期

在这里插入图片描述
补充

date -d "-1 month" "+%Y-%m-%d"	//查看上个月昨天的日期
date -d "+1 year" "+%Y-%m-%d"	//查看明年明天的日期
  • 查看进程号
[root@server ~]# cd /usr/local/nginx/logs/
[root@server logs]# ls -lh
[root@server logs]# cat nginx.pid 	//当前nginx运行时产生的进程号
63844

在这里插入图片描述

  • 时间参数的介绍(ctime、atime、mtime)
1)modification time --- mtime
当修改文件的内容数据的时候,就会更新这个时间,而更改权限或者属性,mtime不会
改变,这就是和ctime的区别。
(2)change time --- ctime
当修改文件的权限或者属性的时候,就会更新这个时间,ctime并不是createtime,
更像是change time。 
只有当更新文件的属性或者权限的时候才会更新这个时间,但是更改内容的话是不会
更新这个时间。
(3)accesstime --- atime
当使用这个文件的时候就会更新这个时间。
  • 查看文件的最近状态
[root@server ~]# stat initial-setup-ks.cfg 

在这里插入图片描述

  • -exec 和 xargs参数解析

(1) -exec

find /root -size 10M -exec rm -rf {} ;			'//删除,find找到的内容作为后面rm删除的对象'
find /root -name tom_rename -exec mv {} /tmp ;	'//移动'
find /root -name tom -exec mv {} tom_rename ;	'//重命名'

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(2) xarges

find /root -name Tom | xargs rm -rf					'//删除'
find /root -name RABBIT_NEW | xargs -I 8 mv 8 /tmp	'//移动'
find /root -name RABBIT | xargs -I - mv - RABBIT_NEW	'//重命名'
注意:如果你需要查找的位置就在当前path(目录),那么系统默认就是" find . "

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

语法结构分析:

-exec参数后面跟的是命令,它的终止是以;为结束标志的。
{}代表前面find找出来的文件名,\代表换行符,是立即执行的意思。
xargs这个参数就是强力的意思,如果前面的输出结果包含空格或制表符也会被强力执行

1.4.5 编写运行脚本

[root@server ~]# vi fenge.sh
#!/bin/bash
# 日志分割
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}/aa.com.access.log-$d
		'//移动并重命名日志文件'
kill -HUP $(cat $pid_path)	
		'//当服务重新加载后,会重新生成一个新的日志文件,以便后续的日志分割操作'
find $logs_path -mtime +30 | xargs rm -rf		'//强力删除30天之前的日志文件'
[root@server ~]# which sh     '//查看sh的绝对路径'
/usr/bin/sh
[root@server ~]# crontab -e  '//设置 crontab 任务,定期执行脚本自动进行日志分割'
0 1 * * * /usr/bin/sh /root/fenge.sh		'//每天凌晨一点执行脚本,进行日志分割'

在这里插入图片描述

  • 运行进行日志分割检测,在浏览器上访问IP地址产生日志文件
[root@server ~]# cd /var/log/nginx/
[root@server nginx]# ls -lh

在这里插入图片描述

扩展

kill -QUIT  	//结束进程   
kill -HUP   	//平滑重启类似reload
kill -USR1  	//日志分隔
kill -USR2  	//平滑升级

2.Nginx深入优化

2.1 配置Nginx实现连接超时

  • 为避免同一客户端长时间占用连接,造成资源浪费,可设置相应的连接超时参数,实现控制连接访问时间。

  • 超时参数

Keepalive_time			//设置连接保持超时时间
Client_header_timeout	//指定等待客户端发送请求头的超时时间
Client_body_timeout		//设置请求体读超时时间

2.1.1 请求头解析(header)

请求头header一般用来存放一些cookie, token信息;
请求体body一般用来存储post的参数和参数数据。
  • Cookie
    1)Cookie是一个保存在客户机中的简单的文本文件,这个文件与特定的 Web. 文档关联在一起,保存了该客户机访问这个Web文档时的信息,
    2)当客户机再次访问这个Web文档时这些信息可供该文档使用。由于“Cookie”具有可以保存在客户机上的神奇特性,因此它可以帮助我们实现记录用户个人信息的功能,而这一切都不必使用复杂的CGI等程序。

  • Token
    1)Token的引入:Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在这样的背景下,Token便应运而生。
    2)Token的定义: Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。
    3)使用Token的目的:Token的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。

2.1.2 配置连接超时命令

  • 修改nginx主配置文件
[root@server ~]# vi /etc/nginx.conf 
...
Keepalive_time 65 180;		//设置连接保持超时时间
Client_header_timeout 80;	//设置请求头超时时间
Client_body_timeout 80;		//设置请求体超时时间
...
[root@server ~]# 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@server ~]# systemctl stop nginx
[root@server ~]# systemctl start nginx

2.1.3 验证结果

  • 在浏览器中访问,抓包查看
    在这里插入图片描述

2.2 更改进程数

2.2.1 查看CPU或者核数

[root@server ~]# cat /proc/cpuinfo | grep -c "physical" 
4

2.2.2 修改nginx主配置文件

[root@server ~]# vi /etc/nginx.conf
user  nginx nginx;
worker_processes  8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
...
events {
    use epoll;
    worker_connections  4096;
}
...	//省略部分信息
[root@server ~]# ulimit -n 65535 >> /etc/rc.d/rc.local 
[root@server ~]# ulimit -n
65535
[root@server ~]# 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@server ~]# systemctl stop nginx.service 
[root@server ~]# systemctl start nginx.service

在这里插入图片描述

2.2.3 查看运行进程数的变化情况

[root@server ~]# ps aux | grep nginx
root      63986  0.0  0.1 126368  1876 pts/0    S+   08:20   0:00 vi /etc/nginx.conf
root      65253  0.0  0.0  20500   692 ?        Ss   10:09   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx     65254  0.0  0.1  24260  2728 ?        S    10:09   0:00 nginx: worker process
nginx     65255  0.0  0.1  24260  2728 ?        S    10:09   0:00 nginx: worker process
nginx     65256  0.0  0.1  24260  2728 ?        S    10:09   0:00 nginx: worker process
nginx     65257  0.0  0.1  24260  2728 ?        S    10:09   0:00 nginx: worker process
nginx     65258  0.0  0.1  24260  2728 ?        S    10:09   0:00 nginx: worker process
nginx     65259  0.0  0.1  24260  2728 ?        S    10:09   0:00 nginx: worker process
nginx     65260  0.0  0.1  24260  2728 ?        S    10:09   0:00 nginx: worker process
nginx     65261  0.0  0.1  24260  2728 ?        S    10:09   0:00 nginx: worker process
root      65295  0.0  0.0 112676   980 pts/1    S+   10:11   0:00 grep --color=auto nginx

在这里插入图片描述

2.3 配置网页压缩

  • Nginx的ngx_htto_gzip_ module压缩模块提供对文件内容压缩的功能;
  • 允许Nginx服务器将输出内容在发送客户端之前进行压缩,节约网站带宽,提升用户的访问体验,默认已经安装;
  • 可在配置文件中加入相应的压缩功能参数对压缩性能进行优化。

2.3.1 压缩功能参数

gzip on:开启gzip压缩输出g
zip_min_length 1k:用于设置允许压缩的页面最小字节数
gzip_buffers 4 16k:表示申请4个单位为16k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果(buffers:缓存区)
zip_http_version1.0:用于设置识别htt协议版本,默认是1.1,目前大部分浏览器已经支持gzip解压,但处理最慢,也比较消耗服务器CPU资源
gzip_comp_level 2:用来指定gzp缩比,1压缩比最小,处理速度最快;9压缩比最大,传输速度快,但处理速度最慢,使用默认即可
gzip_types text/plain:压缩类型,是就对哪些网页文档启用压缩功能
gzip_vary on:选项可以让前端的缓存服务器缓存经过gzi压缩的页面

将以上的压缩功能参数加入到主配置文件httpd配置中段。重启服务,查看网页压缩功能的结果。

2.3.2 优化网页压缩设置

[root@server ~]# vi /etc/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/javascript application/x-javascript application/javascript application/json application/x-httpd-php application/xml image/jpg image/jpeg image/gif image/png;
gzip_disable "MSIE [1-6]\.";
gzip_vary on;
...
[root@server ~]# 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@server ~]# systemctl stop nginx.service 
[root@server ~]# systemctl start nginx.service

在这里插入图片描述

  • 在浏览器上访问IP,抓包查看
    在这里插入图片描述

2.4 防盗链优化

2.4.1 防盗链概述

  • 在企业网站服务中,一般都要配置防盗链功能,以避免网站内容被非法盗用,造成经济损失;
  • Nginx防盗链功能也非常强大。默认情况下,只需要进行简单的配置,即可实现防盗链处理。

2.4.2 配置流程及说明

  • 配置流程
配置Nginx实现防盗链,重启服务,再次访问图片,检测防盗效果
  • 配置说明
~* \.(jpg|gif|swf)$:匹配以.jpg或.swf结尾的不区分大小写的文件
valid_referes:设置信任的网站,即能引用相应图片的网站
网址或者域名:referer中包含相关字符串的网址
if语句:如果链接的来源域名不在valid_referers所列出的列表中,$invalid_referer为1,则执行后面的操作,即进行重写或返回403页面

2.4.3 配置步骤

  • 修改nginx主配置文件
[root@server ~]# vi /etc/nginx.conf
...
 location ~* \.(jpg|gif|swf)$ {
        valid_referers none blocked *.aa.com aa.com 192.168.140.15;
        if ($invalid_referer) {
        rewrite ^/ http://192.168.140.15/error.png;
         }
}
...
  • 检查语法,并重启nginx服务
[root@server ~]# 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@server ~]# systemctl stop nginx.service 
[root@server ~]# systemctl start nginx.service
  • 删除原有的html文件,并设置映射地址
[root@server ~]# cd /usr/local/nginx/html/
[root@server html]# rm -rf index.html
[root@server html]# cd
[root@server ~]# vi /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.140.15 www.aa.com
  • 添加 html 文件和需要的图片,放入该目录下
    在这里插入图片描述

在这里插入图片描述

  • 访问网址
    在这里插入图片描述

2.4.4 进行盗链操作

  • 在另一台主机上,进行以下配置
[root@server2 ~]# yum -y install httpd
[root@server2 ~]# vi /var/www/html/index.html
<html><body>no no no</p>
<img src="http://192.168.140.15/a.jpg" />
</body></html>b
[root@server2 ~]# systemctl stop firewalld
[root@server2 ~]# setenforce 0
[root@server2 ~]# systemctl start httpd
[root@server2 ~]# vi /etc/hosts
...
192.168.140.15 www.aa.com		//添加映射地址
  • 在浏览器中访问该主机的IP,如图
    在这里插入图片描述

2.5 对FPM模块进行参数优化

FPM模块概述

  • Nginx的PHP解析功能实现如果是交由FPM处理的,为了提高PHP的处理速度,可对FPM模块进行参数的调整
  • FPM模块参数调整,要根据服务器的内存与服务负载进行调整
  • 启动fpm进程方式
static:将产生固定数量的fpm进程dynamic:将以动态的方式产生fpm进程
通过pm参数指定

2.5.1 FPM优化参数

  • Static的方式的参数
pm.max_children: 指定启动的进程数量
  • Dynamic方式的参数
pm.max_children:指定启动进程数的最大值
pm.start_servers: 动态方式下初始的fpm进程数
pm.min_spare_servers: 动态方式下最小的fpm空闲进程数
pm.max_spare_servers: 动态方式下最大的fpm空闲进程数

2.5.2 FPM优化参数实例

  • 优化原因:
    服务器为云服务器,运行了个人论坛,内存为15G,fpm进程数为20,内存消耗近1G,处理比较慢

  • 优化参数调整

FPM启动时有5个进程,最小空闲2个进程,最大空闲8个进程,最多可以有20个进程存在pm=dynamic
pm.max_children=20
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 8
要根据服务器的内存与服务负载进行调整
  • 启动fpm进程方式
static:将产生固定数量的fpm进程

dynamic:将以动态的方式产生fpm进程

通过pm参数指定
[root@lnmp ~]# vim /usr/local/php/etc/php-fpm.conf
pid = run/php-fpm.pid
pm = dynamic
pm.max_children =20 	'//static模式下空闲进程数上限,大于下面的值'
pm.start_servers = 5 	'//动态方式 下默认开启的进程数,在最小和最大之间'
pm.min_spare_servers = 2 	'//动态方式下最少空闲进程数'
pm.max_spare_servers = 8 	'//动态方式下最大空闲进程数'
[root@lnmp ~]# 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@lnmp ~]# systemctl restart nginx
  • 验证结果
[root@lnmp ~]# ps aux | grep php-fpm   //查看进程状态,默认进程2个
[root@lnmp ~]# pkill php-fpm           //终止进程
[root@lnmp ~]# /usr/local/php/sbin/php-fpm -c /usr/local/php/lib/php.ini     //重新加载
[root@lnmp ~]# ps aux | grep php-fpm   

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值