Nginx详细介绍与深入优化(1):隐藏和自定义版本信息 配置网页缓存时间

案例概述

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

Nginx介绍

Nginx工作原理

●Nginx由内核和模块组成。Nginx本身做的工作实际很少,当它接到一个HTTP请求时,
它仅仅是通过查找配置文件将此次请求映射到一个location block,而此location中所配置
的各个指令则会启动不同的模块去完成工作,因此模块可以看做Nginx真正的劳动工作者。

#通常一个location中的指令会涉及一个handler模块和多个filter模块(当然,多个location
可以复用同一个模块)。handler模块负责处理请求,完成响应内容的生成,而filter模块对
响应内容进行处理。

●用户根据自己的需要所开发的模块都属于第三方模块。正是有了这么多模块的支撑,Nginx的功能才会如此强大
Nginx的模块从结构上分为核心模块、基础模块和第三方模块:


#核心模块:      HTTP模块、EVENT模块和MAIL模块;
#基础模块:      HTTP Access模块、HTTP FastCGl模块、HTTP Proxy模块和HTTP Rewrite模块;
#第三方模块:    HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块。

Nginx的模块从功能上分为如下三类:
Handlers(处理器模块):此类模块直接处理请求,并进行输出内容和修改headers
信息等操作。Handlers处理器模块一般只能有一个;

Filters(过滤器模块)∶此类模块主要对其他处理器模块输出的内容进行修改操作,
最后由 Nginx输出;

Proxies(代理类模块)∶此类模块是Nginx的HTTP Upstream之类的模块,这些
模块主要与后端一些服务比如FastCGl等进行交互,实现服务代理和负载均衡等
功能。

Nginx的进程模型

●在工作方式上,Nginx分为单工作进程和多工作进程两种模式
在单工作进程模式下,除主进程外,还有一个工作进程,工作进程是单线程的;
在多工作进程模式下,每个工作进程包含多个线程。
Nginx默认为单工作进程模式。

●Nginx在启动后,会有一个master进程和多个worker进程。
master进程主要用来管理worker进程,主要包含:接收来自外界的信号,向各worker
进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动
重新启动新的worker进程。

扫描二维码关注公众号,回复: 11637009 查看本文章

Nginx深入优化

隐藏版本号

●在生产环境中,需要隐藏Nginx的版本号,以避免泄漏Nginx的版本,使攻击者不能
针对特定版本进行攻击。在隐藏前,可以使用fiddler工具抓取数据包,查看Nginx版本,
也可以在CentOS中使用命令curl -I http://IP/查看

●隐藏 Nginx版本号有两种方式:
第一种是修改Nginx源码文件,指定不显示版本号,
第二种是修改 Nginx的主配置文件


[root@localhost ~]#  curl -I http://20.0.0.26

HTTP/1.1 200 OK
Server: nginx/1.15.9     
Date: Tue, 08 Sep 2020 12:05:06 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Wed, 02 Sep 2020 11:24:11 GMT
Connection: keep-alive
ETag: "5f4f80db-264"
Accept-Ranges: bytes

Server: nginx/1.15.9 这里版本号可以看的到

●修改配置文件方式


[root@localhost~]# vi /usr/local/nginx/conf/nginx.conf
   ###省略###
http {
     includemime.types;
     default_type application/octet-stream;
     server_tokens off;              ###此处新增代码,含义是将版本号关闭

###省略###

[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~]# systemctl restart nginx        ###重启Nginx服务

这时候我们再开看一下版本号在不在了


[root@localhost ~]#  curl -I http://20.0.0.26          

HTTP/1.1 200 OK
Server: nginx                                  我们发现看不见了
Date: Tue, 08 Sep 2020 12:10:00 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Wed, 02 Sep 2020 11:24:11 GMT
Connection: keep-alive
ETag: "5f4f80db-264"
Accept-Ranges: bytes

●自定义版本信息

Nginx源码文件nginx-1.12.0/src/core/nginx.h包含了版本信息,可以随意设置,
然后重新编译安装,隐藏版本信息。

找到你的Nginx源码文件目录


[root@localhost ~]# cd /opt
[root@localhost opt]# ll
总用量 1008
drwxr-xr-x. 9 nginx nginx     186 92 19:17 nginx-1.15.9
-rw-r--r--. 1 root  root  1031760 226 2019 nginx-1.15.9.tar.gz

接下来重新编译安装,修改版本信息

[root@localhost opt]# vi nginx-1.15.9/src/core/nginx.h

#define NGINX_VERSION      "1.1.1"                        ###修改版本号
#define NGINX_VER          "IIS/" NGINX_VERSION         ###修改服务器类型

[root@localhost opt] cd /opt/nginx-1.15.9/
[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 nginx-1.15.9]# vi /usr/local/nginx/conf/nginx.conf

http {
    includemime.types;
    default_type application/octet-stream;
    server_tokens on;            ####打开版本号

[root@localhost conf]# 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 conf]# systemctl restart nginx

[root@localhost conf]# curl -I http://20.0.0.26

HTTP/1.1 200 OK
Server: IIS/1.1.1                 ##显示刚刚你修改的内容
Date: Tue, 08 Sep 2020 12:18:50 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Wed, 02 Sep 2020 11:24:11 GMT
Connection: keep-alive
ETag: "5f4f80db-264"
Accept-Ranges: bytes

修改用户与组

●Nginx运行时进程需要有用户与组的支持,用以实现对网站文件读取时进行访问控制。
主进程由root创建,子进程由指定的用户与组创建。Nginx默认使用nobody用户帐号与组
帐号,一般也要进行修改。

●修改Nginx用户与组有两种方法,一种是在编译安装时指定用户与组,另一种是修改
配置文件指定用户与组。

指定用户与组参数

首先你要有一个Nginx的账户
有了指定用户之后,就可以在编译安装过程就可以 去指定 user和group


[root@localhost ~]# useradd -M -s /sbin/nologin nginx 

编译安装时指定

[root@localhost ~]# systemctl stop nginx

[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

配置用户与组
修改Nginx配置文件的Nginx指定用户与组

[root@localhost conf]# cd /usr/local/nginx/conf/
[root@localhost conf]# vi nginx.conf

   ###省略###
user  nginx nginx;                ###修改用户为nginx ,组为nginx


[root@localhost conf] systemctl start nginx
[root@localhost conf] systemctl restart nginx        ###重启Nginx进程
[root@localhost conf]# ps aux | grep nginx
root      21364  0.0  0.0  20560   620 ?        Ss ...master process /usr/local/nginx/sbin/nginx
nginx     21365  0.0  0.0  21012  1340 ?        S ....worker process
root      21369  0.0  0.0 112724   988 pts/0    S+  grep --color=auto nginx

#我们可以看到主进程由root帐户创建,子进程则由Nginx创建

配置网页缓存时间

●为什么要做缓存?
有了缓存之后,不需要向Nginx服务器重新发出请求,减少了服务器的使用带宽。

●以图片作为缓存对象,上传zz.jpg图片到/usr/local/nginx/html的工作目录,访问
http://20.0.0.26/zz.jpg,用wireshark工具进行抓包,查看响应报文
在这里插入图片描述
在这里插入图片描述

[root@localhost ~]# cd /usr/local/nginx/html/
[root@localhost html]# ll
总用量 400
-rw-r--r--. 1 root root    494 92 19:24 50x.html
-rw-r--r--. 1 root root    612 92 19:24 index.html
-rw-r--r--  1 root root 398206 99 07:08 zz.jpg

接下来我们打开wireshark工具进行抓包,寻找Cahce-Control:max-age=,表示缓存时间
在这里插入图片描述
在这里插入图片描述
这里我们看到没有缓存时间,接下来配置缓存

[root@localhost~]# vi /usr/local/nginx/conf/nginx.conf
#在第一个location / {}后面添加

        location ~ \.(gif|jpg|jepg|png|bmp|ico)$ {
            root html;
            expires 1d;
        }
#1d代表一天:86400秒
[root@localhost conf]# systemctl restart nginx

这个时候清除浏览器访问记录,重新访问20.0.0.26/zz.jpg,重新打开wireshark工具进行抓包

在这里插入图片描述
在这里插入图片描述
其中的Cahce-Control:max-age=86400表示缓存时间是86400秒,也就是缓存一天的
时间,一天之内浏览器访问这个页面,都是用缓存中的数据

总结

本章介绍了Nginx工作原理,Nginx的进程模型

●隐藏版本号
●自定义版本信息
●修改用户与组
●配置网页缓存时间以及作用
希望能对大家有用,下一张将讲解shell脚本实现Nginx日志分割,设置连接超时等高级优化内容,记得来看哟

猜你喜欢

转载自blog.csdn.net/weixin_48190891/article/details/108475708