前端工程师在理解Nginx之后,就能更好的与后端工程师沟通,为了能提高工作效率,这两天抽空读了《Nginx高性能Web服务器实战教程》。

一、Nginx

Nginx是一款高性能的Web服务器软件,主要用于提供网上信息浏览服务,为高并发网站的应用场景而设计,可以在Linux、macOS和Windows等操作系统中运行,它的优点包括性能高、稳定性好、结构模块化、配置简单以及资源消耗非常低等。拥有HTTPS访问、gzip压缩、虚拟主机和URL重写等功能,不但可以搭配FastCGI程序处理动态请求,还可以用于代理、反向代理、负载均衡和缓存服务器等功能。P2

1)进程和访问控制

Nginx由一个主进程和多个工作进程组成,主进程接收客户端请求,再转交给工作进程处理,从而很好地利用多核心CPU的计算能力。P89

Nginx的访问控制是网络安全防范和保护的主要策略,其任务是保证网络资源不被非法访问。P93

2)日志记录功能

Nginx提供了一个非常灵活的日志记录功能,它可以使每个块的配置拥有各自独立的日志进行记录,并且根据记录内容的不同又分为访问日志和错误日志。P101
(1)访问日志用于记录客户端访问Nginx的每一个请求。记录用户的IP、访问时间、请求方式、响应状态、地域来源、跳转来源、使用终端等信息。
(2)错误日志记录在访问Nginx时出错的记录,可以查看某个服务的性能瓶颈。

3)虚拟主机技术

虚拟主机技术是指一台物理主机服务器上划分出多个磁盘空间,每个磁盘空间都是一台虚拟主机,每台虚拟主机都可以独立对外提供Web服务,且互不干扰。
利用虚拟主机可把多个不同域名的网站部署在同一台服务器上,而不必再为建立一个网站单独购买一台服务器,既解决了维护难题,又节省了硬件成本。P107

二、PHP与Nginx

对Nginx而言,PHP是一个外部程序,而非其内部的一个模块。为了让Web服务器的功能扩展性更强,就需要支持CGI(Common Interface,公共网关接口)规范。P124

1)CGI

CGI是Web服务器与外部程序之间的接口标准,用于两种不同程序之间的信息传递。CGI规范允许Web服务器根据浏览器请求调用CGI程序,并将其输出结果通过响应发送给浏览器,从而使Web服务器支持处理复杂的网站业务需求。
Web服务器支持CGI的意义不在于性能而在于开发,开发者只需要编写一个CGI文件放在网站目录中,当浏览器请求CGI文件,Web服务器就会调用CGI程序执行CGI文件,等待CGI程序处理完成后,再将程序的输出结果返回给浏览器。

2)FastCGI和PHP-FPM

FastCGI主要用于解决CGI性能上的缺陷。传统CGI方式是每当客户端请求CGI时,Web服务器就通过操作系统创建一个新的CGI进程,一个CGI进程完成一个请求处理后就退出,下次请求再创建一个新CGI进程。由于这种方式需要不断为每个请求创建进程,因此在网站并发量很大时显得非常低效。FastCGI优化了这种工作方式,它由一个常驻的CGI进程管理器,通过管理一个进程池来处理Web服务器的请求,由此提高了性能。
PHP提供的PHP-FPM(FastCGI Process Manager)就是一个FastCGI进程管理器,其可执行文件位于PHP安装的目录中。

三、负载均衡与缓存

1)正向代理

代理也称为正向代理,是一个位于客户端和目标服务器之间的代理服务器,客户端将发送的请求和指定的目标服务器提交给代理服务器,然后代理服务器向目标服务器发起请求,并将获得的响应结果返回给客户端。P158

2)反向代理

反向代理对于客户端而言就是目标服务器,客户端反向代理服务器发送请求后,反向代理服务器将该请求转发给内部网络上的后端服务器,并从后端服务器上得到的响应结果返回给客户端。

两种代理的特性有:安全性和功能性。

3)负载均衡

负载均衡(load balance)就是将负载分摊到多个操作单元上执行,从而提高服务的可用性和响应速度,带给用户更好的体验。P162

目前负载均衡有4种典型的配置方式,分别为轮询、权重、ip_hash和利用第三方模块的方式。

4)Web缓存方式

利用反向代理服务器对访问频率较多的内容进行缓存,有利于节省后端服务器的资源。Nginx提供了两种Web缓存方式:永久性缓存和临时性缓存。P168
永久性缓存:将内容源服务器响应的内容缓存到本地,若不手动删除,该缓存文件会一直生效。
临时性缓存:采用md5算法将请求连接进行哈希后,根据具体配置生成缓存文件目录,保存响应的数据。
Web缓存服务器位于内容源Web服务器和客户端之间,当客户端用户访问一个URL时,Web缓存服务器就会请求相应的内容源Web服务器,并将响应的信息缓存至内存或磁盘;然后,当下一个请求到来时,如果访问的是相同URL,Web缓存服务器会直接将已缓存的内容输出给客户端,而不用再次向内容源Web服务器发送请求。

四、模块配置应用

由于Nginx的高度模块化设计,使得每个模块的功能相对简单,便于实现功能的扩展性。P182

1)模块化结构设计

模块化结构设计就是以功能块为单位进行程序设计,实现其求解算法的一种方法。模块化结构设计的目的是为了降低程序复杂度,使程序设计、调试和维护等操作简单化,方便团队协作以及应用的扩展升级。
换句话说,Nginx就像是积木搭建的房子,在实现规范接口的前提下,各个团队只要保持接口不变,可同时开发功能模块,这样就可以根据实际需求不断地加入新的功能,或者去掉旧的功能,达到应用程序的高配置性、高扩展性、高定制性和高伸缩性。
Nginx分为5大模块:核心模块、标准HTTP模块、可选HTTP模块、邮件服务模块和第三方模块。

2)gzip

gzip(GNU-ZIP)是一种压缩技术,经过gzip压缩后,页面大小可以变为原来的30%甚至更小。gzip网页压缩的实现需要浏览器和服务器的支持。P195

gzip的压缩过程:首先在服务器端压缩,然后传到浏览器端后解压。当浏览器支持gzip解压时,会在请求消息头中包含Accpet-Encoding:gzip,这样Nginx就会向浏览器发送经过gzip后的内容,同时在响应消息头中加入Content-Encoding:gzip,声明这是gzip后的内容,告知浏览器要先解压后才能解析输出。

3)重写与重定向

为了能够在修改网站结构或域名后,避免造成网站中的链接或在其他网站中的外链失效,以及提高该网站在搜索引擎的收录量和排名等目的。通常会采用URL重写与重定向,在增强网站专业化的同时,为用户提供更加舒适的使用体验。P198
下面第6行通过if指令判断访问不到用户请求或目录时,执行第7行指令,^/.*用于匹配当前网络下的所有请求,/default/default.html用于替换符合指定规则的请求。

下面第5行利用set指令为变量$name赋值,$1表示符合正则表达式第一个子模式的值。第6行用于在用户请求“http://test.ng.test/img-数字.jpg”时,重定向到“http://test.ng.test/img/数字.jpg”。

Last modification:February 10th, 2020 at 10:07 pm