60分钟

第5章 Web服务器管理

【学习目标】

1.知识目标

了解Apache、Tomcat、IIS服务器的特点。

理解Nginx服务器的功能。

理解HTTP工作原理及HTTP负载均衡。

掌握Nginx服务器的安装与部署。

掌握Nginx服务器的配置。

理解Redis服务器的应用。

2.技能目标

HTTP配置与代理。

Nginx服务器的安装与部署。

Nginx服务器的配置方法。

Redis服务器的应用。

【认证考点】

了解Apache、Tomcat、IIS服务器的功能与特点。

理解HTTP工作原理、安装与配置。

理解HTTP负载均衡的工作原理。

掌握Nginx服务器的安装、部署、配置及应用。

能掌握Redis安装、连接、查询数据、状态监测等操作。

项目引导:Nginx服务器性能优化

【项目描述】

某公司的Web应用在早期就用一个单服务器就能满足负载需求,随着用户增加,访问量越来越大,系统功能也越来越多,这时单台的服务器不能支撑访问压力。公司技术人员想通过负载均衡对流量进行减压,但是负载均衡设备比较昂贵,想通过负载均衡软件来实现。同时要兼顾公司内部安全,电脑都处在局域网环境办公,技术人员准备在局域网和外网之间加一个代理服务器,实现局域网的电脑访问外网的功能。根据综合的调研,技术人员准备采用Nginx服务器实现代理服务器和负载均衡。

知识储备

5.1常见Web服务器简介

Web Server中文名称叫网页服务器或Web服务器。Web服务器也称为WWW服务器,主要功能是提供网上信息浏览服务。Web服务器可以解析HTTP协议,当Web服务器接收到一个HTTP请求,会返回一个HTTP响应,如送回一个HTML页面。为了处理HTTP一个请求,Web服务器可以响应一个静态页面或图片,进行页面跳转,或者把动态响应的产生委托给一些其它的程序例如CGI脚本,JSP脚本,PHP脚本,服务器端JavaScript脚本,或者一些其它的服务器端技术,这些服务器端的程序通常产生一个HTML的响应来让浏览器可以浏览。主要的Web服务器有Nginx、Apache、Tomcat、IIS等。常见的Web服务器有Apache、IIS、Tomcat、Nginx等。

5.1.1 Apache服务器

Apache(Apache HTTP Server)是世界使用排名的Web服务器软件。它几乎可以运行在所有的计算机平台上。由于Apache是开源免费的,因此有很多人参与到新功能的开发设计,不断对其进行完善。Apache的特点是简单、速度快、性能稳定,并可做代理服务器来使用。早期的Apache只用于小型或试验Internet网络,后来逐步扩充到各种Unix系统中,尤其对Linux的支持相当完美。到目前为止Apache是世界上用的最多的Web服务器之一,市场占有率达60%左右。

1.Apache支持的技术

Apache有多种产品,可以支持SSL技术,支持多个虚拟主机。Apache是以进程为基础的结构,进程要比线程消耗更多的系统开支,不太适合于多处理处理器。

2.Apache的特点

(1)安装简单

在Linux系统下安装Apache服务器时,用户只需要会使用Linux下的文本编辑工具,如vi、emacs等,并且对shell有所了解即可。Apache服务器给用户提供已经预编译好的可执行文件或没有编译的源文件。

预编译好的可执行文件包含了服务器的基本功能,用户直接执行即可。如果用户对服务器的功能有特殊设置,可以自己修改编译配置文件Configuration以控制编译时要包含的源文件模块,生成满足自己需要的可执行程序。

Apache服务器在安装时提供了良好的图形用户界面(GUI),使得用户安装起来非常方便。用户也可以使用命令行的模式来安装Apache服务器。

(2)配置简单

Apache服务器在启动或重新启动时,将读取三个配置文件(srm.conf、access.conf和http.conf)来控制它的工作方式,这三个文件是缺省安装的,用户只需在这三个文件中添加或删除相应的控制指令即可。

在Window下也提供了许多图形化的界面,用户完全可以不直接修改这三个文件,只要通过一些设置,系统就会自动修改配置文件,因此很容易完成Apache服务器的配置。

(3)服务器功能扩展或裁减方便

Apache服务器的源代码完全公开,用户可以通过阅读和修改源代码来改变服务器的功能,这要求用户对服务器功能和网络编程有较深的了解,否则所做的修改很有可能使服务器无法正常工作。此外,Apache还使用了标准模块的组织方式,用户可以开发某个方面的软件包,并以模块的形式添加在Apache服务器中。

5.1.2 Microsoft IIS服务器

Microsoft的Web服务器为IIS(Internet Information Server),IIS是允许在公共Intranet或Internet上发布信息的Web服务器。IIS是目前最流行的Web服务器产品之一,很多著名的网站都是建立在IIS的平台上。IIS提供了一个图形界面的管理工具,称为Internet服务管理器,可用于监视配置和控制Internet服务。

1.IIS的构成

IIS是一种Web服务组件,包括Web服务器、FTP服务器、NNTP服务器和SMTP服务器,他们分别用于网页浏览、文件传输、新闻服务和邮件发送等方面。IIS使在网络上发布信息成了一件很容易的事,除此IIS还提供ISAPI(Intranet Server API)作为扩展Web服务器功能的编程接口;同时它还提供一个Internet数据库连接器,可以实现对数据库的查询和更新。

2.IIS的功能

IIS可以赋予一部主机电脑一组以上的IP地址,而且还可以有一个以上的域名作为Web网站,用户可以利用TCP/IP内容设置两组以上的IP地址,除了为网卡再加进一组IP地址之外,必须在负责这个点的DNS上为这组IP地址指定另一个域名,通过这些操作会生成一个虚拟Web服务器。对于IIS来说,所有服务器都是它的虚拟服务器。

5.1.3 Tomcat服务器

Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。

1.Tomcat服务器的构成

Tomcat是由Apache开发的一个Servlet容器,实现了对Servlet和JSP的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全域管理和Tomcat阀等。

由于Tomcat本身也内含了一个HTTP服务器,它也可以被视作一个单独的Web服务器,它包含了一个配置管理工具,也可以通过编辑XML格式的配置文件来进行配置。

2.Tomcat服务器的特点

(1)占用系统资源少

Tomcat运行时占用的系统资源少,扩展性好,支持负载均衡与邮件服务等开发应用系统常用的功能。

(2)开源的Web服务器

Tomcat是开源的Web服务器,经过长时间的发展,性能、稳定性等方面都非常好。Tomcat是开源免费、功能强大易用。

(3)能动态生成资源

与Apache HTTP Server相比,Tomcat能够动态的生成资源并返回到客户端。

(4)静态页面处理能力不强

在静态页面处理能力上,Tomcat不如Apache服务器。

5.1.4 Nginx服务器

Nginx是一款高性能的HTTP服务器,也是反向代理服务器,电子邮件(IMAP/POP3)代理服务器。它的特点就是高性能,占用内存少,支持高并发,运行稳定。

1.Nginx的发展

Nginx是2011年正式成立,它来自于俄罗斯,采用C语言开发的Web服务器,堪称以性能为王。Nginx的稳定性、功能集、示例配置文件和低系统资源的消耗的优势,使得它在全球活跃的网站中有12.18%的使用比率。

2.Nginx的常用功能

(1)HTTP代理

HTTP代理和反向代理功能是作为Web服务器最常用的功能之一。Nginx在做反向代理时,提供性能稳定和配置灵活的转发功能。Nginx可以根据不同的正则匹配,采取不同的转发策略,如文件服务器、动态页面Web服务器。Nginx根据返回结果进行错误页跳转、异常判断,如果被分发的服务器存在异常,它将请求重新转发给另外一台服务器,然后自动去除异常服务器。

(2)负载均衡

Nginx提供的负载均衡策略有2种,分别为内置策略和扩展策略。内置策略为轮询、加权轮询、IP Hash等算法;扩展策略可以参照所有的负载均衡算法来实现。

(3)Web缓存

Nginx可以对不同的文件做不同的缓存处理,配置灵活,并且支持FastCGI_Cache。FastCGI_Cache主要用于对FastCGI的动态程序进行缓存。Nginx配合着第三方的ngx_cache_purge,能对URL缓存内容进行增删管理。

3.Nginx的特点

(1)更快

更快主要表现在性能方面,通过两方面来表现。一方面单词请求会得到更快的响应;另一方面Nginx能比其他Web服务器响应更快的请求。

(2)高扩展性

Nginx的设计具有极强的扩展性,它由不同的功能、不同层次、不同类型且耦合度低的模块组成。因此对某一个模块修复Bug或进行升级时,可以仅仅专注于模块自身。如在HTTP模块中,设计了HTTP过滤器模块,一个正常的HTTP模块处理请求后,会有一串HTTP过滤模块对请求的结果进行处理,这样在开发一个新的HTTP模块时,可以原封不动地复制大量已有的HTTP过滤器模块。

(3) 高可靠性

高可靠性是选择Nginx的基本条件,在很多高流量网站的核心服务器上都大规模的使用Nginx。Nginx的高可靠性是基于它的核心框架代码的优秀设计和模块设计的简单性,每个WORKER进程相对独立,MASTER进程在每个WORKER进程出错时都可以快速拉起新的WORKER子进程。

(4) 低内存消耗

一般情况下,10000个非活跃的HTTP Keep-Alive链接在Nginx中仅消耗2.5MB的内存,这是Nginx支持高并发链接的基础。

(5)单机支持10万以上的并发链接

随着互联网的发展及用户数量的成倍增长,各大公司、网站需要应付海量的并发请求,一个能够在峰值顶住10万以上并发请求的Server,无疑会得到大家青睐,理论上Nginx支持并发链接取决于内存,10万并发还远未封顶。

(6)热部署

MASTER管理进程和WORKER进程是采用分离设计,使得Nginx能够提供热部署功能,即可以在7*24小时不间断服务的前提下,Nginx也能进行升级可执行文件、更新配置、更换日志文件等操作。

(7)最自由的许可协议

许可协议不只是允许用户免费使用Nginx,它还允许用户在自己的项目中直接使用或修改Nginx源码,然后发布。

5.2 HTTP与Web服务器

自1999年HTTP/1.1通过以来,Web发生了翻天覆地的变化,从几千字节,到基于文本的网页,到如今发展为平均大小超过2MB的富媒体网站。然而用来传输Web内容的HTTP协议这些年没有什么变化,直到2015年正式发布了HTTP/2,该协议能更好的适应复杂的页面,并且不降低传输速度,目前越来越多的网站管理员采用HTTP/2协议来提高Web的性能。

5.2.1 HTTP简介

HTTP(Hyper Text Transfer Protocol)协议是超文本传输协议,是用于从万维网(WWW)服务器传输超文本到本地浏览器的传送协议。它是一个基于TCP/IP通信协议来传递数据,如传输HTML文件、图片文件、查询结果等数据。

1.HTTP协议的发展历程

1989年HTTP开始走进人们的视野,经过随后几年的发展,HTTP逐渐流行起来,在1995年,世界上超过了18000台服务器在80端口处理HTTP请求。

(1)HTTP/0.9

HTTP/0.9是一个相对简单的协议,它包含了一个方法GET,作用是获取HTML文本。

(2)HTTP/1.0

HTTP/1.0在原有版本的基础上,增加了大量的内容,它主要包含了首部、响应码、重定位、错误、条件请求、内容编码、更多的请求方法等,虽然1.0版本相对于0.9版本有了一个巨大的飞跃,但是也存在很多瑕疵,尤其是不能让多个请求共用一个链接,缓存也十分的简陋,影响了Web的发展。

(3)HTTP/1.1

HTTP/1.0刚制定,HTTP/1.1就接踵而来,它修复了1.0版本的大量问题,强制客户端提供Host的首部,让虚拟主机托管成为可能,让一个IP提供多个Web服务。HTTP/1.0在缓存相关首部进行了扩展,如更新了OPTIONS方法、Upgrade首部、Range请求、压缩与传输码、管道化等内容。但随着Web的不断发展与变化,网站的交互式和实用性超出了当前文档库的想象,随之出现了Web性能专家,在原有的协议基础上提升网页的加载速度。

(4)HTTP/2.0

在2015年正式发布了HTTP/2.0协议,相比于HTTP/1.1,HTTP/2.0改善了用户感知的延迟,解决了HTTP中的对头阻塞,实现了并行的实现机制不依赖于服务器,并能建立多个连接,从而提升TCP连接利用率。

HTTP/2.0保留HTTP/1.1的语义,可以利用已有的文档资源、HTTP方法、状态码、URL和首都字段,能合理综合运用新的扩展点和策略。

2.HTTP工作原理

HTTP协议是工作在客户端/服务端架构上。浏览器作为HTTP客户端,通过URL向HTTP服务端即WEB服务器发送所有请求,Web服务器根据接收到的请求,向客户端发送响应信息,HTTP通信流程如图5-2-1所示。HTTP默认端口号为80,但也可改为8080或者其他端口。

图5-2-1 HTTP通信流程

在图5-2-1中,CGI(Common Gateway Interface)是HTTP服务器与机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上。绝大多数的CGI程序被用来解释处理来自表单的输入信息,并在服务器产生相应的处理,或将相应的信息反馈给浏览器,CGI程序使网页具有交互功能。

浏览器显示的内容有HTML、XML、GIF、Flash等,浏览器是通过MIME Type来区分它们。MIME Type是指资源的媒体类型,MIME Type是经过互联网(IETF)组织协商,以RFC(RFC是一系列以编号排定的文件,几乎所有的互联网标准都有收录在其中)的形式作为建议的标准发布在网上的,大多数的Web服务器和用户代理都会支持这个规范。媒体类型通常通过HTTP协议,由Web服务器告知浏览器的,主要是通过Content-Type来表示的,如:Content-Type:text/HTML。

【HTTP注意事项】

(1)HTTP是无连接

无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

(2)HTTP是媒体独立的

HTTP是媒体独立的,这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。

(3)HTTP是无状态

HTTP协议是无状态协议,无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。

5.2.2 HTTP的安装过程

早期互联网数据传输是基于TCP/IP模型完成数据交换,其各层对传输的数据包进行各协议的封装,从数据的发送方到接收方进行的数据交换都是基于明文传输。在传输的过程中数据可以被中间人进行拦截或抓取,对数据的保密性、完整性等产生威胁)。为了保障数据传输安全,采用加密和解密来抵御各种安全攻击。

在加密通信时,需要加密通信的协议SSL(Secure Sockets Layer,SSL),该协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。Netscape公司在推出第一个Web浏览器的同时,提出了SSL协议标准。其目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支持。已经成为Internet上保密通讯的工业标准。SSL协议可分为两层SSL记录协议和SSL握手协议。SSL记录协议是建立在可选的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持;SSL握手协议是建立在SSL记录协议之上,用于在实际的数据传输之前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。

TLS是安全传输层协议是开源SSL的实现,由IETF公司于1999年发布,其支持多种算法。TLS协议是为互联网通信提供安全及数据完整性保障,它用于两个通信应用程序之间。

搭建一个HTTP服务器,需要两个过程。首要获取安装一个支持HTTP/2.0的Web服务器,然后安装一张TLS证书,让浏览器和服务器通过HTTP/2链接。

1.TLS证书

证书获取主要采用三种方法:使用在线资源、自己创建一张证书、从数字证书认证机构(CA)申请一张证书。前面两种方法获取是自签名证书,仅用于测试,由于自签名证书不是由(CA)签发,浏览器要报警。

(1)在线证书生成器

在很多在线服务可以生成自签名的证书,在网上一搜,就能找到很多这样的资源,如XX网,使用这个工具,将生成的证书和秘钥分别保存在两个本地文件中,并分别命名为s1.key和s1.csr。

(2)自签名证书

OpenSSL生成能生成TSL证书。OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛被应用在互联网的网页服务器上。OpenSSL工具是广泛应用且容易获得的工具,可以生成自签名和私钥。

在Unix/Linux或者MacOS操作系统上,已有OpenSSL这个工具,直接打开终端就可以申请自签名证书。生成CA证书的步骤为:

【步骤1】生成私钥,使用genrsa命令生成私钥。

在使用公钥加密之前第一步是生成私钥,代码如下:

openssl genrsa –out mykey.pem 2048

【步骤2】key的生成,使用genrsa命令生成RSA秘钥。

OpenSSL支持RSA、DSA、ECDSA秘钥算法。在生成Web服务器秘钥时,使用RSA算法,因为DNS效率问题会限制在1024位,并且IE浏览器不支持更长的DSA秘钥。ECDSA秘钥大部分还未得到CA的支持。对于SSH而言,一般使用DSA和RSA秘钥。

建议使用密码去保存秘钥,受密码保护的秘钥可以被安全地存储、传输与备份。但采用密码保存秘钥也会带来不便,如果忘记密码了就无法使用秘钥了,每次重新启动Web服务器的时候就要求输入密码,如果遭遇了入侵,在生产环境中使用密码保护过的秘钥其实没有提高安全性,因为一旦使用密码解密后,私钥就会被明文保存到程序内存中,攻击者如果能登录服务器,那么就容易获得秘钥了。所以使用密码方式保存秘钥这种方式只有在私钥并没有被放在生产环境的服务器上的时候采用。如果想让生产环境的私钥更加安全,那么需要采用硬件解决方案。

秘钥长度,默认的秘钥长度一般不够安全,所以要自定义配置的秘钥长度,如RSA秘钥的长度为512,如果你的服务器还用512位秘钥,入侵者可以先取得你的证书,使用暴力方式算出对应的私钥,就可以冒充你的站点了。现在一般认为2048位RSA秘钥是安全的。DSA秘钥也不少于2048位,ECDSA秘钥应该在256位以上了。

【实例5-2-1】用ASE-128算法来保存生存的mykey.key私钥,代码如下:

openssl genrsa –aes128 –out mykey.key 2048

生存的mykey.key是密钥文件名,如图5-2-2所示。

图5-2-2 生成KEY和CSR命令

私钥用PEM格式存储,该格式仅包含文本,如图5-2-3所示。查看密钥文件,代码如下:

$cat mykey.key
图5-2-3 查看密钥文件

乍一看私钥是一堆随机数据,其实不是,可以使用rsa命令解析私钥的结构,如图5-2-4所示,代码如下:

rsa -text -in mykey.key
图5-2-4使用rsa解析私钥的结构

如果要看秘钥的公开部分,可以使用rsa命令,如图5-2-5所示,代码如下:

rsa –in mykey.key –pubout –out f1.key
图5-2-5查看私钥公开部分

查看生成的f1.key文件,就会发现是明文的表示,表示这部分是公开的信息,如下图5-2-6所示,代码如下:

$cat f1.key
图5-2-6秘钥的公开部分

【步骤3】CSR文件的生成

一旦有了私钥,就可以创建证书签名申请CSR,这是要求CA给证书签名的一种正式申请,该申请包含申请证书实体的公钥以及该实体的某些信息,该数据成为证书的一部分。CSR始终使用它携带的公钥所对应的私钥进行签名。代码如下:

openssl req -new -key mykey.key -out mykey.csr

在生成CSR文件时,需依次输入国家、地区、组织、Email。最重要的是有一个common name,可以写名字或者域名。如果为了HTTPS申请,这个必须和域名吻合,否则会引发浏览器警报。生成的CSR文件将CA签名后形成服务端自己的证书。生成KEY和CSR文件,如图5-2-7所示。

图5-2-7 生成KEY和CSR文件

CSR生成后,可以使用它直接进行证书签名或者将它发给公共的CA让他们对证书进行签名,在签名之前先检查一遍CSR是否正确,命令如下:

$openssl req -text -in fd.csr -noout

【步骤4】CRT的生成,代码如下:

openssl x509 -req -days 365 -in mykey.csr -signkey mykey.key -out mykey.crt

生成的CRT文件,如图5-2-8所示。

图5-2- 8生成的CRT文件

(3)认证机构获申请证书

Let’s Encrypt是CA领域的新玩家,让所有人能获得免费的TLS证书,能从Let’s Encrypt获得证书,需要验证域名,需要修改DNS和Web服务器来证明。在Linux操作系统,在运行的Web服务器的设备上执行下面的命令:

$wget https://dl.eff.org/certbot-auto
$chmod a+x cerbot-auto

下载后,执行certbot-auto:

$ ./certbot-auto certonly --webroot -w <your web root> -d <your domain>

上面命令中参数设置为本地Web服务器的文件目录或者域名,将自动安装所有用到的包。

2.运行HTTP/2.0服务器

有很多包文件支持HTTP/2.0服务器,以“nghttp2”包为例进行讲解。“nghttp2”是由Tatsuhiro Tsujikawa开发,是一个实现IETF官方HTTP/2和HPACK头压缩算法的C库,它还实现了HTTP2的客户端、服务器、代理服务器以及压测工具。

Linux Centos平台上安装nghttp2,命令如下:

#下载安装包
wget https://github.com/nghttp2/nghttp2/releases/download/v1.24.0/nghttp2-1.24.0.tar.bz2
#解压
tar jxvf nghttp2-1.24.0.tar.bz2
#进入目录
cd nghttp2-1.24.0
./configure
make
make install

利用已有的证书,启动nghttp2,命令如下:

$ ./nghttpd -v -d <webroot> <port> <key> <cert>

其中<webroot>是网站的路径,<port>是服务器要监听的端口,<key>和<cert>是私钥和证书路径。

启动浏览器,访问新安装的服务器,如果是创建一张自签名的证书,则会看到安全警告,这是自创建证书的问题,然后点击接受警告,现在就可以用基于HTTP/2的服务了。

5.2.3 HTTP配置与代理

如果环境要求使用HTTP或HTTPS代理以访问外部网站,这时候就需要对HTTP设置代理服务器。

1.HTTP 代理简介

公司为了安全考虑,员工的电脑都处在局域网环境办公。为了给局域网的电脑访问外网的权限,公司会在局域网和外网之间加一个代理服务器(代理服务器本身可以访问外网),然后局域网的电脑可以通过这个代理服务器访问外网。

2.HTTP代理设置

不同浏览器设置代理服务器方法有细微的区别。

(1)火狐浏览器(Firefox)设置代理服务器

【步骤1】在火狐浏览器点击“工具”→“代理设置”,如图5-2-9所示。

图5-2- 9 火狐浏览器设置代理

【步骤2】在弹出的窗口中选择“连接”→“局域网设置”,如图5-2-10所示。

图5-2- 10选择设置

【步骤3】选择“自动检测设置”→“使用自动配置脚本” →“代理服务器”下的其中之一进行设置,如图5-2-11所示,三者之间区别如表5-2-1所示。

表5-2-1代理服务器设置选项
图5-2- 11选择配置

(2)IE浏览器设置代理服务器

【步骤1】启动 Internet Explorer。

【步骤2】选择“工具”→“Internet”选项。

【步骤3】单击“连接”选项卡下面的“局域网设置”。

【步骤4】选择一个或多个代理配置选项,见表5-2-1所示。

如果代理服务器需要进行身份验证,则可以使用以下两种方法之一存储代理,见表5-2-2所示。

表5-2-2存储代理

5.2.4 HTTP的负载均衡

在一个典型的高并发、大用户量的Web互联网系统的架构设计中,对HTTP集群的负载均衡设计是作为高性能系统优化环节中必不可少的方案。HTTP负载均衡的本质上是将Web用户流量进行均衡减压,因此在互联网的大流量项目中,其重要性不言而喻。

1.负载均衡介绍

早期的互联网应用,由于用户流量比较小,业务逻辑也比较简单,往往一个单服务器就能满足负载需求。随着现在互联网的流量越来越大,稍微好一点的系统,访问量就非常大了,并且系统功能也越来越复杂,那么单台服务器就算将性能优化得再好,也不能支撑大用户量的访问压力了,这个时候就需要使用多台机器设计高性能的集群来应对。

那么,多台服务器是如何去均衡流量、如何组成高性能的集群的呢?此时就需要负载均衡器了。负载均衡(Load Balancer)是指把用户访问的流量,通过负载均衡器,根据某种转发的策略,均匀的分发到后端多台服务器上,后端的服务器可以独立的响应和处理请求,从而实现分散负载的效果。负载均衡技术提高了系统的服务能力,增强了应用的可用性。

2.主流负载均衡方案

目前市面上最常见的负载均衡技术方案主要有三种,分别为基于DNS负载均衡、基于硬件负载均衡(如F5)、基于软件负载均衡(如Nginx、Squid)。

三种方案各有优劣,DNS负载均衡可以实现在地域上的流量均衡,硬件负载均衡主要用于大型服务器集群中的负载需求,而软件负载均衡大多是基于机器层面的流量均衡。在实际场景中,这三种是可以组合在一起使用。

(1)基于DNS负载均衡

基于DNS来做负载均衡其实是一种最简单的实现方案,通过在DNS服务器上做一个简单配置即可。其原理是指当用户访问域名的时候,会先向DNS服务器去解析域名对应的IP地址,这个时候可以让DNS服务器根据不同地理位置的用户返回不同的IP。比如南方的用户就返回广州业务服务器的IP,北方的用户来访问的话,就返回北京业务服务器所在的IP,如图5-2-11所示。

图5-2-12 DNS负载均衡

DNS负载均衡,用户采用就近原则对请求进行分流了,既减轻了单个集群的负载压力,也提升了用户的访问速度。使用DNS做负载均衡的方案,天然的优势就是配置简单,实现成本非常低,无需额外的开发和维护工作。

DNS负载均衡也有缺点,主要表现在当修改配置后,生效不及时,这是由DNS的特性导致的。DNS一般会有多级缓存,当我们修改了DNS配置之后,由于缓存的原因,会导致IP变更不及时,从而影响负载均衡的效果。另外,使用DNS做负载均衡时,大多数是采用基于地域或IP轮询,没有更高级的路由策略,所以这也是DNS方案的局限所在。

(2)基于硬件负载均衡

硬件负载均衡,如大名鼎鼎的F5 Network Big-IP,也就是常说的F5。它是一个网络设备,可以理解成类似于网络交换机设备,完全通过硬件来抗压力,性能是非常的好,每秒能处理的请求数达到百万级,当然价格也就非常非常贵了,十几万到上百万人民币都有。因为这类设备一般用在大型互联网公司的流量入口最前端,及政府、国企等。硬件负载均衡如图5-2-13所示。

图5-2-13 硬件负载均衡

采用硬件负载均衡优势很多,如性能高,省心省事,买一台就能满足一般的业务的需求,除此硬件负载均衡在算法方面支持很多灵活的策略,同时也具备一些防火墙等安全功能。它缺点就是负载均衡设备比较贵。

(3)基于软件负载均衡

软件负载均衡是指使用软件的方式来分发和均衡流量。软件负载均衡分为7层协议和4层协议。网络协议有七层,基于第四层传输层来做流量分发的方案称为4层负载均衡,例如LVS,如图5-2-13所示。基于第七层应用层来做流量分发的称为7层负载均衡,例如Nginx。这两种在性能和灵活性上是有些区别的,基于4层的负载均衡性能要高一些,而基于7层的负载均衡处性能要低一些。

图5-2- 14基于软件的负载均衡

软件负载均衡一大优势就是便宜,只需在正常的服务器上部署即可,无需额外采购,软件负载均衡是互联网公司中用得最多的一种方式。

3.常用的均衡算法

常见的负载均衡的算法有轮询策略、负载度策略、响应策略、哈希策略。

(1)轮询策略

轮询策略其实很好理解,就是当用户请求来了之后,负载均衡器将请求轮流的转发到后端不同的业务服务器上。这个策略在DNS方案中用的比较多,无需关注后端服务的状态,只要有请求,就往后端轮流转发,非常的简单、实用。

在实际应用中,轮询也会有多种方式,有按顺序轮询的、有随机轮询的、还有按照权重来轮询的。前两种比较好理解,第三种按照权重来轮询,是指给每台后端服务设定一个权重值,比如性能高的服务器权重高一些,性能低的服务器给的权重低一些,这样设置的话,分配流量的时候,给权重高的更多流量,可以充分的发挥出后端机器的性能。

(2)负载度策略

负载度策略是指当负载均衡器往后端转发流量的时候,会先去评估后端每台服务器的负载压力情况,对于压力比较大的后端服务器转发的请求就少一些,对于压力比较小的后端服务器可以多转发一些请求给它。这种方式就充分的结合了后端服务器的运行状态,来动态的分配流量了。

负载度策略也有些弊端,因为需要动态的评估后端服务器的负载压力,负载均衡器除了转发请求以外,还要做很多额外的工作,比如采集连接数、请求数、CPU负载指标、IO负载指标等等,通过对这些指标进行计算和对比,判断出哪一台后端服务器的负载压力较大。因此这种方式带来了效果优势的同时,也增加负载均衡器的实现难度和维护成本。

(3)响应策略

响应策略是指当用户请求来的时候,负载均衡器会优先将请求转发给当前时刻响应最快的后端服务器。也就是说,不管后端服务器负载高不高,也不管配置如何,只要觉得这个服务器在当前时刻能最快的响应用户的请求,那么就优先把请求转发给它,这样的话,对于用户而言,体验也最好。

(4)哈希策略

哈希策略比较好理解,就是将请求中的某个信息进行Hash计算,然后根据后端服务器台数取模,得到一个值,算出相同值的请求就被转发到同一台后端服务器中。常见的用法是对用户的IP或者ID进行这个策略,然后负载均衡器就能保证同一个IP来源或者同一个用户永远会被送到同一个后端服务器上了,一般用于处理缓存、会话等功能的时候特别好用。

项目实施

某公司,随着用户的增加Web应用访问量越来越大,单台的服务器不能满足负载的需求,本着节约成本出发,技术人员准备采用负载均衡软件来分摊流量,同时要考虑公司内部安全,准备采用代理服务器来实现局域网访问外网的功能。经过前期的调研,技术人员决定采用Nginx服务器来实现代理服务器和负载均衡。

需要完成的任务:

  • Nigix服务器部署与优化。

5.3任务:Nginx服务器部署与优化

Nginx是一个跨平台的Web服务器,可以运行在Linux、FreeFSB、Solaris、AIX、MacOS、Windows等操作系统上,通过Nginx优化配置能提高当前操作系统的性能。

5.3.1 Nginx服务器的安装部署

Nginx服务器支持跨平台,可以安装到不同的操作系统上。以Linux CentOS操作系统为例,安装Nginx。

以Linux系统为例,需要安装在一个内核为Linux 2.6及其版本以上的系统,因为2.6版本以上内核支持epoll,在Linux上使用select或poll来解决事件的多路复用。

使用uname -a命令来查询Linux内核版本,命令如下:

uname -a

一、安装Nginx前的准备

要使用Nginx的正常功能,首先要确保操作系统上至少安装了如下软件。

1.GCC编译器

GCC可用来编译C语言程序。Nginx不会直接提供二进制的可执行程序,可以使用yum命令来安装GCC。代码如下:

yum install -y gcc

2.PCRE库

PCRE库是由Philip Hazel开发的函数库,目前为很多软件使用,该库文件支持正则表达式。如果在Nginx的配置文件nginx.conf中使用了正则表达式,那么在编译Nginx时就必须把PCRE库编译进Nginx,因为Nginx的HTTP模块要靠它来解析正则表达式。代码如下:

yum install -y pcre pcre-devel

pcre-devel是PCRE做的二次开发时所需要的开发库,包括了文件头等,这也是编译Nginx所必须的。

3.ZLIB库

ZLIB库是对HTTP包的内容做gzib格式的压缩,如果在配置文件nginx.conf中设置gzip=on,并指定对某些类型的HTTP响应使用gzip来进行压缩以减少网络传输量,那么就必须把zlib编译进ginx中。代码如下:

yum install -y  zlib zlib-devel

4.OpenSSL

OpennSSL在前面第五章第二节已经讲过了,这里就不再详细讲解,代码如下:

yum install -y openssl openssl-devel

Nginx是高度自由化的Web服务器,它的功能是由许多模块来支持的,这些模块根据需求来定制的,如果使用了某些模块,而这些模块使用了一些类似zlib或OpenSSL等三方库,那么就要先安装这些软件。

5.磁盘目录

要使用Nginx,还需要准备以下目录。

(1)Nginx源代码存放目录

该目录用于存放官网下载的Nginx的源码文件,以及第三方或者自己所写模块对的代码文件。

(2)Nginx编译阶段产生的中间文件存放目录

该目录用于存放configure命令执行后生成的源文件及目录,以及make命令执

行后生成的目标文件和最终链接成功的二进制文件。默认情况下该目录命名为objs,并放在Nginx源代码目录下。

(3)部署目录

该目录存放实际Nginx服务运行期间所需要的二进制文件、配置文件等。默认情况下,该目录为/usr/local/nignx。

(4)日志文件存放目录

日志文件通常比较大,当研究Nginx底层架构时,需要打开debug级别的日志,这个级别的认知非常详细,会导致日志文件的大小增长地极快,需要预先分配一个拥有更大磁盘空间的目录。

二、安装Nginx

1.获取Nginx服务器的安装文件

Nginx服务器软件版本包括Windows版本和Linux版本,在官网上就可以找到对应的版本进行下载。

2.在Windows下安装Nginx服务器

(1)下载Nginx软件

在官网下载Nginx安装包,如图5-3-1所示。在Windows操作系统中Nginx只需要解压安装后,就可以直接使用了,如图5-3-2所示,这就是Nginx的所有资源。

图5-3-1 Nginx的下载
图5-3-2Nginx解压后的文件

Windows版本的Nginx服务器在效率上要比Linux版本要差一些,并且Nginx在实际使用中一般在Linux/Unix系统中,为了便于后续的学习,对加压的文件和目录进行简单的介绍。

①conf目录中存放是Nginx的配置文件,包含Nginx服务器的基本配置文件和对部分特殊的配置文件。

②docs目录中存放是Nginx服务器的文档资料,包含Nginx服务器的LICENSE、OpenSSL的LICENSE、PCRE的LICENSE,还包括本版本Nginx服务器的升级的版本变更说明,以及README文件。

③html目录中存放了两个后缀名为.html的静态网页文件。这两个文件与Nginx服务器的运行相关。

④logs文件中存放了Nginx服务器的运行日志文件。

3.在Linux下安装Nginx

(1)首先安装相关依赖包,如GCC、PCRE、ZLIB和OpenSSL等。

(2)下载安装包

在local目录下新建一个nginx目录,将下载的Ngnix安装包存放在该目录下。这里下载的Nginx是1.9版本的,如图5-3-3所示。代码如下:

//创建一个文件夹
cd /usr/local
mkdir nginx
cd nginx
//下载tar包
wget http://nginx.org/download/nginx-1.9.11.tar.gz
图5-3-3 下载Nginx

(3)解压安装包

解压安装包后,如图5-3-4所示,代码如下:

tar -xvf nginx-1.9.11.tar.gz
图5-3-4 解压Nginx

(4)安装Nginx

用cd命令进入建好的“nginx”目录下的“nginx-1.9.11”目录,进行安装Nginx,先执行配置命令./configure,代码如下:

//进入nginx目录
cd /usr/local/nginx/nginx-1.9.11
//执行配置命令
./configure nginx-1.9.11
图5-3-5 执行Nginx配置文件

执行编译make和make install命令,代码如下:

//执行make命令
make
//执行make install命令
make install

(5)配置nginx.conf

# 打开配置文件
vi /usr/local/nginx/conf/nginx.conf

将端口号改成8089,因为可能Apache占用80端口,Apache端口尽量不要修改,修改nginx端口,如图5-3-6所示。localhost修改为本地服务器IP地址。

图5-3- 6修改端口为8089

(6)启动Nginx

Nginx服务器的安装目录中主要包含了conf、html、logs、sbin等4个目录。目录结构与Windows下的Ngnix类似,只是sbin目录下放的是Nginx的主程序,如图5-3-7所示。

图5-3-7安装目录下的文件

Nginx的启动指令,如果是使用yum安装,则Nginx启动的代码如下:

# 启动指令
systemctl start nginx

如果是使用源码安装,则启动Nginx的代码如下:

./sbin/nginx

5.3.2 Nginx服务器的配置

1.Nginx进程

运行中的Nginx使用MASTER进程来管理多个WORKER进程,一般情况下,WORKER进程的数量与服务器上的CPU核心数是相等的,每个WORKER进程真正提供互联网的服务,而MASTER进程则监控和管理WORKER进程。通过WORKER的一些进程之间的通信机制来实现负载均衡。

MASTER进程的主要作用有读取并验证配置信息;创建、绑定及关闭套接字;启动、终止WORKER进程以及维护WORKER进程的个数;无须终止服务而重新配置工作;控制非中断式程序升级,启用新的二进制程序并在需要的时回滚到老版本;重新打开日志文件;编译嵌入式perl脚本等。

WORKER主要作用有接收、传入并处理来自客户端的连接;提供反向代理及过滤功能;Nginx仍能完成的其他任务。

查看Nginx进程,如图5-3-8所示,代码如下:

ps -ef 
图5-3- 8 查看Nginx进程

2.Nginx的配置

Nginx的配置文件都放在安装目录的conf中,主配置文件为nginx.conf。nginx.conf主配置文件中主要是Nginx服务器的基础配置,默认的配置也存放在此。修改配置文件后,Nginx服务要重新启动,进入安装sbin目录,代码如下:

./nginx -s reload  

(1)nginx.conf配置文件

在nginx.conf文件中,注释标志为“#”。

#全局生效
worker_processes  1;
#在events部分中生效
events {
    worker_connections  1024;
}
#以下制定在http部分生效
http {
    include       mime.types;
    default_type  application/octet-stream;
    #以下指令在http的server部分生效
    server {
        listen       80;
        server_name  localhost;
 #以下指令在http/server的location部分生效
        location / {
            root   html;
            index  index.html index.htm;
        }
    error_page   500 502 503 504  /50x.html;
 location = /50x.html {
            root   html;
        }
}

初始的Nginx服务器文件比较长,结构和内容是比较清晰的。

(2)nginx.conf配置文件结构

①全局块。全局块是默认配置文件从开始到events块之间一部分内容,主要设置一些影响Nginx服务器整体运行的配置指令,它的作用域是Nginx服务器的全局。

②events。events块设计到指令主要影响Nginx服务器与用户的网络链接。常用的设置包括是否开启对多个WORKER进程下的网络进行序列化,是否允许同时接收多个网络链接,选取事件驱动模型处理链接请求,每个WORKER进程可以同时支持的最大连接数等。这部分的指令对Nginx服务器性能影响很大,在配置过程中根据具体情况进行灵活调整。

③http块,是Nginx服务器配置中重要部分,代理、缓存和日志定义等大部分功能和第三方模块的配置都可以在这里设置。

http块中可以包含自己的全局块,也可以包含server块,server块中可以进一步包含location块,可以在http全局块中的配置指令包括文件引入、日志定义、MIME-Type定义、是否使用sendfie传输文件、链接超时时间、单链接请求上限等。

④server块。server块和虚拟主机的概念密切相关,为了加深理解,先了解虚拟主机的相关内容。

虚拟主机又称为虚拟服务器、主机空间和网页空间,它是一种技术。该技术是为了节省互联网服务器硬件成本而出现的。虚拟主机技术主要应用于HTTP、FTP及EMAIL等多项服务,将一台服务器的某项或者全部服务内容逻辑划分为多个服务单位,对外表现为多个服务器,从而充分利用服务器硬件资源。

在Nginx服务器提供Web服务时,利用虚拟主机的技术就可以避免为每一个要运行的网站提供单独的Nginx服务器,也无需为每个网站对应运行一组Nginx进程。虚拟主机技术使得Nginx服务器可以在同一台服务器上只运行一组Nginx进程,就可以运行多个网站。如何对Nginx进行配置才能达到这种效果呢?

每一个http块可以包含多个server块,而每个server块就相当于一台虚拟主机,它内部可有多台主机联合提供服务,共同对外提供一组服务。

server块可以包括自己的全局块,同时可以包含多个location块。在server全局块中,最常见的两个配置项是本虚拟主机的监听配置和本虚拟主机的名称和IP配置。

⑤location块。每个server块中可以包含多个location块,可以这样说location块是server块的一个指令,Nginx服务器在许多功能上的灵活性往往在location指令的配置中体现出来。

3.Nginx服务的基本配置

(1)是否以守护进程方式运行Nginx

daemon on |off;

守护进程daemon,默认为darmon on。daemon是脱离终端并且在后台运行的进程。它脱离终端是为了避免进程的执行过程中的信息在任何终端上显示,这样,进程也不会被任何终端产生的信息打断。Nginx需要一个守护进程运行的服务。

(2)是否以master/worker方式工作

master_process on|off;

默认为master_process on。

(3)error日志的设置

error_log file |stderr [debug] | info|notice |warn |error |crit |alert |emerg;

在全局块、http块和server块中都可以对日志进行相关配置。默认为error_log logs/error.log error。error是Nginx问题的最佳工具,日志输出到固定一个文件file或输出到标准错误输出stdrr中;日志的级别是可选项,由低到高分为debug、info、notice、warn、error、crit、alert、emerg等,设置某一级别时,比这一级别高的日志也会记录。如设置error,则error、crit、alert、emerg的日志都会被记录下来。

【注意】指定文件对于运行Nginx进程的用户具有写权限,否则Nginx进程会出现报错。

(4)是否处理几个特殊的调试点

debug_points[stop|abort];

这个配置是为了帮助用户跟踪调试Nginx,如果debug_points设置为stop,则Nginx代码执行到这些调试点时就会发出SIFSTOP信号以用于调试,人工debug_points设置为abort,则会产生一个coredump文件,可以使用gdb来查看Nginx当时的各种信息。一般不用这个配置。

(5)仅对指定的客户端输出debug级别信息

debug_connection [IP|CIDR];

这个配置属于事件类配置,因此需要放在events{}中才有效,值可以是IP也可以是CIDR。

(6)限制coredump核心转储文件的大小

worker_rlimit_core size;

在Linux操作系统中,当进程发生错误或收到信号而终止时,系统就会将进程执行时的内存(核心映射)写入一个文件,以作为调试之用,这就是核心转储(coredump),生成核心转储文件core。在这个core文件中许多信息不一定是用户需要的,如果不加以限制,这个core文件就会达到几个GB。

(7)制定coredump文件的生成目录

worker_directory path;

4.正常运行的配置项

(1)定义环境变量

env VAR|VAR=value

这个配置项是可以让用户直接设置在操作系统上的环境变量。如:

env TESTPATH=/temp/;

(2)嵌入其他配置文件

include/path/file;

include配置项目可以将其他配置文件嵌入到当前的nginx.conf文件中,它的参数既可以是绝对路径,也可以是相对路径(相对于nginx.conf所在目录)。

include mine.types
include vhost/*.conf

参数值可以是一个明确的文件,也可以使含有通配符的*的文件,可以同时嵌入多个配置文件。

(3)配置Nginx进程PID的存放路径

Nginx进程作为系统的守护进程运行,需要在某个文件中保护当前运行程序的主进程号。Nginx支持对它的存放路径进行自定义配置,指令为pid,语法格式为:

pid path/file;

其中file指定存放的路径和文件名称。配置文件默认将进程的PID放在logs目录下,如图5-3-9所示。

图5-3-9 pid默认存放在logs目录下

可以通过nginx.conf的配置文件限选,如将nginx.conf文件放置到sbin目录下,并重新命名为web_nginx。

pid sbin/web_nginx;

【注意】在指定路径时,一定要包括文件名,仅仅设置了路径,没有设置文件名则会报错。

(4)配置运行Nginx服务器用户(组)

用于配置运行的Nginx服务器组的指令为user,其语法格式为:

user user [group];

user,指定可以运行Nginx服务器的用户。group为可选项,指定可以运行Nginx服务器的用户组。

只有被设置的用户或者用户组成员才有权启动Nginx进程,如果是其他用户(test_user)失败,引起错误的原因是nginx.conf的第二行,即配置Nginx服务器用户(组)的内容。

nginx:[emerg] getpwnam(“test_user”) failed (2:No such file or directory) in /Nginx/conf/nginx.conf:2

如果希望所有用户都可以启动Nginx进程,有两种方法,将配置文件的指令行注释掉。

# user [user] [group]

或者将用户(和用户组)设置为nobody:

user nobody nobody;

这也是user指令的默认配置,user指令只能全局块中配置,如图5-3-10所示。

图5-3-10 user指令默认值被注释

【注意】Nginx配置文件中每一条指令用“;”结束。

(5)指定Nginx worker进程可以打开的最大句柄描述符个数

Worker_rlimit_nofile limit;

设置一个worker进程可以打开最大文件句柄数。

(6)限制信号队列

worker_rlimit_singpending limit;

设置每个用户发往Nginx的信号队列的大小,当某个用户的信号队列满了,这个用户再发送的信号量会被丢掉。

5.优化性能的配置项

(1)配置允许生成的worker process数

worker process是Nginx服务器实现并发处理服务的关键,从理论来说worker process的值最大,支持的并发数最多,但还是要受到软件本身、操作系统本身资源和硬件设备等的制约。配置worker process的指令为:

worker_processes number |auto;

number指可以产生的worker proces的数量,auto自动检测。

在默认的配置文件中,number=1。启动“ps”命令可以看到Nginx服务器除了master process....之外,还有一个worker process进程,如图5-2-15所示。

ps ax|grep nginx
图5-2-15 ps查看Nginx进程

【注意】该指令只能在全局块设置。

(2)绑定Nginx worker进程到制定的CPU内核

worker_cpu_affinity cpumask[cpumask...]

绑定worker进程到CPU内核的原因,假设每一个worker进程都是非常繁忙的,如果多个worker进程都在抢同一个CPU,那么这就会出现同步问题,如果每个worker进程都独享一个CPU,就在内核的策略上实现完全的开发。假设有4颗CPU内核,就可以采用如下的配置:

worker_processes 4;
worker_cpu_affinity 1000 0100 0010 0001;

【注意】worker_cpu_affinity的配置仅仅对Linux操作系统有效,Linux操作系统采用sched_setaffinity()系统来调用实现这个功能。

(3)SSL硬件加速

ssl_engine device;

如果服务器上有SSL硬件加速设备,那么就可以进行配置以加速SSL协议的处理速度。用户可以使用OpenSSL提供的命令来查看是否有SSL硬件加速设备:

openssl engine -t

(4)系统调用gettimeofday的执行频率

timer_resolution t;

默认情况下,每次内核时间调用(如epoll、select、poll、kqueue等)返回时,都会执行一次gettimeofday,实现用内核的时钟来更新Nginx中的缓存时钟。当需要降低gettimeofday的调用频率时,可以是用timer_resolution配置,代码如下:

timer_resolution 100ms;

表示每100ms调用一次gettimeofday。

(5)Nginx worker优先级设置

worker_priority nice;

默认worker_priority 0;该配置用于设置Nginx worker进程的nice优先级。在Linux或其他操作系统,当许多进程都处于可执行状态时,按照所有进程的优先级来决定本次内核选择哪一个进行执行。

静态优先级和内核根据进程执行情况所做的动态调整(目前只有正负5调整),nice值是进程的静态优先级,它的取值范围为-20~+19,-20是最高优先级,+19是最低优先级。

6.事件类配置项

(1)是否打开accept锁

accept-mutex[on|off];

accept_mutex是Nginx的负载均衡锁,accept_mutex锁可以让多个worker进程轮流地、序列化地与新的客户端建立TCP链接,当一个worker进程建立的连接数量达到worker_connections配置的对打连接数的7/8时,会大大地减少该worker进程试图建立新的TCP链接的机会,此时所有的worker进程上处理的客户端请求数尽量接近。

accept锁默认是打开的,如果关闭它,那么建立TCP链接的耗时会更短,但worker进程之间的负载会非常的不均衡,所以建议不关闭它。

(2)lock文件的路径

lock_file path/file;

默认lock_file logs/nginx.lock,accept锁需要这个lock文件,如果accept锁关闭,lock_file配置完全不生效。

(3)使用accept锁喉到真正建立连接之间的延迟时间

accept_mutex_delay Nms;

默认accept_mutex_delay 500ms。在使用accept锁时,同一个时间只有一个worker进程能够取到accept锁,这个accept锁不是阻塞锁,如果取不到立刻返回,如果有一个worker进程试图取accept锁而没有取到,它至少要等accept_mutex_delay定义的时候间隔后才能再次试图取锁。

(4)批量建立新连接

Multi_accept[on|off];

默认为off,当事件模型通知有新连接时,尽可能地对本次调度中客户端发起的所有TCP请求都建立连接。

(5)选择事件模型

use [kqueue |rstig|epoll|/dev/poll|select|poll|eventport];

Nginx会自动使用最合适的事件模型。对了Linux操作系统事件模型有poll、select、epoll三种,epoll性能是最高的一种。

(6)每个worker的最大连接数

worker_connections number;

定义每个worker进程可以同时处理的最大连接数。

7.用HTTP核心模块配置一个静态WEB服务器

静态WEB服务器的主要功能是由ngx_http_core_module模块(HTTP框架的主要成员)实现,一个完整的静态WEB服务器还有许多功能是由其他的HTTP模块实现的。一个典型的静态WEB服务器还包含了多个server块和location块。

所有的HTTP配置都必须直属于http块、server块、location块、upstream块或if块等,这些都要包含在http{}块值内。Nginx为配置一个完整的Web服务器提供了非常多的功能,主要分为8类,包括虚拟主机与请求分发、文件路径的定义、内存与磁盘资源的分配、网络连接的设置、MIME类型的社会、对客户端请求的限制、文件操作的优化、对客户端请求的特殊处理。http块的结构如下:

http {
    include       mime.types;
    default_type  application/octet-stream;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        location ~ /\.ht {
            deny  all;
        }
    }

(1)虚拟主机的配置

由于IP地址的数量限制,存在多个主机域名对应同一个IP地址的情况,可以通过nginx.conf中的server块中server_name(对应用户请求的主机域名)来设置。每个server块就是一个虚拟主机,它只处理与之相对应的主机域名的请求,这样一台Nginx就能以不同的方式处理访问不同主机域名的HTTP请求。

①监听端口,代码如下:

listen address:port[default(deprecated in 0.8.21)|default_server |[backlog=num|
rcvbuf=size|sndsize=size|accept_filter=filter|deferred|bind|ipv6only=[on|off]|ssl]];

listen参数决定了Nginx服务器监听端口,在listen后可以只加IP地址、端口、或主机名,非常灵活。代码如下:

listen 127.0.0.1:8000;
listen 127.0.0.1;#不加端口默认端口为80
listen 8000;
listen localhost:8000;
listen *.8000;

如果使用IPV6,代码如下:

listen [::] :8000;
listen [fe80::1];

②主机

这里的“主机”,就是指server块对外提供的虚拟主机。设置主机的名称并配置好DNS,用户就可以使用这个名称向此虚拟主机发送请求。配置主机名称的指令为server_name,其语法为:

server_name name...;

对于name就是名称,可以有多个名称并且之间用空格隔开,每个名称就是一个域名,由两段或三段组成,之间由点号“.”隔开,代码如下:

server_name myserver.com www.myserver.com;

Nginx规定第一名称作为虚拟主机的主要名称,上面的虚拟主机为myserver.com。在name中可以使用通配符*,但通配符智能有三段字符串的首段和尾段。代码如下:

server_name *.myserver.com www.myserver.*;

在name中还可以使用正则表达式,并使用“~”作为正则表达式字符串的开始标记,代码如下:

server_name ~^www\d+\.myserver\.com;

③基于IP的虚拟主机配置

Linux操作系统支持IP别名的添加。配置基于IP的虚拟主机,即为Nginx服务器提供的每台虚拟主机配置一个不同的IP,因此需要将网卡设置为同时能够监听多个IP地址。在Linux平台中可以使用ifconfig工具为同一块平台添加多个IP别名。

【实例5-3-1】eth1为使用的网卡,IP值为192.168.1.3,现为eth1添加两个IP别名192.168.1.31和192.168.1.32,分别用于Nginx服务器提供两个虚拟主机,执行以下操作:

#ifconfig  eth1:0 192.168.1.31 netmask 255.255.255.0 up
#ifconfig  eth1:1 192.168.1.32 netmask 255.255.255.0 up

命令中up表示立即启动别名。

【注意】采用这种方法设置别名在系统重启后将不予保存,需要重新设置。为了解决这一问题,可以将上两条命令添加到Linux操作系统的启动脚本rc.local中,代码如下:

#echo “ifconfig eth1:0 192.168.1.31 netmask 255.255.255.0 up”>>/etc/rc.local
#echo “ifconfig eth1:0 192.168.1.32 netmask 255.255.255.0 up”>>/etc/rc.local

这样,在系统重启后,eth1的别名就自动设置好了。

网卡设置好别名以后,就可以为Nginx服务器配置基于IP的虚拟主机了,使用指令和配置基于名称的虚拟主机的指令是相同的,也是server_name,语法结构也相同,但不用通配符和正则表达式。

 server {
        listen       80;
        server_name 192.168.1.31;
........
}
   server{
listen       80;
      server_name 192.168.1.32;
........
}

经过上述配置,来自192.168.1.31的前端请求将由第一台虚拟主机接收和处理,来自192.168.1.32的前端请求将由第二台虚拟主机接收和处理。

④重定向主机名称的处理

server_name_in_redirect on|off

该配置要配合server name使用,在使用on打开时,表示在重定向请求是会使用server_name里配置的第一个主机名代替原先请求中的Host头部,而off时,表示在重定向请求时使用请求本身的Host头部。

⑤配置location块

Nginx的服务器location的语法:

location [= | ~ |~*|^~] uri {....}

其中uri变量是待匹配的请求字符串,可以是不含正则表达式的字符串,如/myserver.php等,也可以是包含正则表达式的字符串,如.php$,表示php借宿的URL等,其中不包含正则表达式为标准的uri,包含正则表达式称为正则uri。其中“=”表示标准的uri,要求请求字符串与uri严格匹配,如果匹配成功,就停止继续搜索;“~”用于表示uri包含正则表达式,区分大小写;“~*”用于表示uri包含正则表达式,不区分大小写。

如果uri包含了正则表达式,就必须要使用“~”或者“~*”标识。

⑥配置请求的根目录

Web服务器接收网络请求之后,首先要在服务器制定目录中寻找请求资源。在Nginx服务器中,指令root就是用来配置这个根目录的,其语法为:

root path;

如:

location /data/
{
root /locationtest1;
}

当location块接收到“/data/index.html”的请求时,将在/localtiontest1/data/目录下找到index.html相应请求。

⑦更改location的URI

在location块中,除了使用root指令指明请求处理根目录,还可以使用alias指令改变location接收到URI的请求路径,其语法格式如下:

alias path;

其中,path即为修改后的根路径,同时,此变量中可以包含除了$document_root和$realpath_root之外的其他Nginx服务器预设变量。代码如下:

location ~ ^/data/(.+\.(html|html)) $
{
alias /locationtest1/other/$1;
}

当location块收到/data/index.html的请求时,匹配成功,之后根据alias指令的配置,Nginx服务器将到/locationtest1/other目录下找到index.html并响应请求。可以看到,通过alias指令的配置,根路径已经从/data更改为locationtest1/other了。

⑧设置网站的默认首页

index file ...;

默认为index,index.html。有时访问站点的URI,这时一般会返回网站的首页,index后面可以跟很多参数,Nginx会按顺序来访问这些文件。

location / {
root  path;
Index /index.html /html/index.php/index.php;
}

⑨设置错误页面

如果客户端在查看网页时出现问题,服务器会将HTTP错误从网站发送到Web浏览器。如果无法显示页面,Web浏览器会显示网站发送的实际错误网页或Web浏览器内置的友好错误信息。Nginx会支持自定义错误网页的显示内容。

error_page code...[=[response]] uri

其中code表示要处理的HTTP错误代码;response为可选项,将code指定的错误代码转化为新的错误代码response;uri表示错误页面的路径或者网站地址;html目录为根路径的相对路径;常见的http错误,可以在官网网站去查看,这里就不做详细的介绍。

如http404错误,表示无法找到网页。

error_page 404/404.html;

⑩基于访问权限的设置

访问权限的设置有基于IP地址和基于密码的,这里先讲解基于IP地址的访问权限的设置。

基于IP地址的访问权限的设置,Nginx服务器通过两种途径支持访问权限的控制,其中一种就是由HTTP标准模板ngx_http_access_module支持的,其通过IP来判断客户端是否拥有对Nginx的访问权限。

allow指令,用于设置允许访问客户端的IP。

allow address | CIDR |all;

其中address不允许设置多个,允许访问的客户端的IP,如果有多个IP需要设置,需要重复使用allow指令。CIDR,允许访问的客户端的CIDR地址,如202.82.18.20/25,前面是32位IP地址,后面“/25”代表IP地址中前25位是网络部分,其余位代表为主机部分。all,表示允许所有客户端访问。Nginx也支持IPv6地址。代码如下:

allow 2620:100:e100::8001;

另一个指令deny,作用刚好和allow执行相反,它用于设置禁止访问Nginx的客户端IP。

deny address | CIDR |all;

Nginx还支持基于HTTP Basic Authentication协议的认证,该协议是一种HTTP协议的认证办法,需要识别用户名和密码,认证失败的客户端不拥有访问Nginx服务器的权限,该功能有HTTP标准模板块ngx_http_basic_module支持。

auth_basic指令,用户开启或关闭该认证功能。

auth_basic string |off;

string表示开启,off表示关闭。

auth_basic_user_file file指令,用户设置包含用户名和密码信息的文件路径。语法为:

auth_basic_user_file file;

file表示密码文件的绝对路径,密码文件支持明文和密码加密后的文件。明文的格式为:

nam1:password1
name2:password2:comment
name3:password3

加密密码文件可以使用crypt()函数进行密码加密的格式,在Linux平台上可以使用htpasswd命令生成,在PHP或Perl等语言中,也提供了crypt()函数。代码如下:

#htpasswd -c -d /nginx/conf/pass_file username

5.3.3 Nginx服务器的应用

Nginx服务器的基本应用主要有基本HTTP服务和高级HTTP服务。基本HTTP服务包括可以作为HTTP代理服务器和反向代理服务器,支持通过缓存加速访问,可以完成简单的负载均衡和容错,支持包过滤功能,支持SSL。高级HTTP服务,可以进行自定义配置,支持虚拟主机、支持URL重定向、支持网络监控、支持流媒体传输等。

1.Nginx设置虚拟主机

经过对Nginx配置文件的配置,生成虚拟主机,实现不同的域名访问不同的页面。虚拟主机技术是指主要应用于http服务,将一台服务器的某项或多个服务内容逻辑划分为多个服务单位,对外表现为多个服务器,从而可以充分利用服务器的硬件资源。具体配置如下:

【步骤1】进入Nginx的配置目录conf,如图5-3-11所示。

图5-3-11 Nginx配置目录conf

【步骤2】编辑nginx.conf配置文件,如图5-3-12所示,代码如下:

vi nginx.conf
图5-3-12修改配置文件

并启动nginx服务 ,代码如下:

./sbin/nginx –s reload

【步骤3】创建网页目录与网站的首页文件

在HTML根目录下建立www1和www2目录,并编辑index.html默认发布文件,如图5-3-13所示。

图5-3-13 创建www1和www2目录

编辑首页网页,如图5-3-14所示。

图5-3-14 编辑首页网页

【步骤4】添加本地映射。假设CentOS主机地址为“192.168.56.100”,将虚拟主机写入到“/etc/hosts”中,如图5-3-15所示,代码如下:

echo “192.168.56.100 www.xxx.com www.ccc.com ”>>/etc/hosts
图5-3-15添加本地映射

【步骤5】curl访问测试,如图5-3-16所示,代码如下:

curl www.xxx.com
curl www.ccc.com
图5-3-16 curl测试

【步骤6】浏览器访问虚拟主机测试,如图5-3-17所示。

图5-3-17 浏览器访问虚拟主机

【备注】在CentOS系统中要打开浏览器,需要安装图形化界面,如安装GNOME桌面。代码如下:

# 此过程会联网安装图形化界面,所需时间比较长
yum groupinstall 'GNOME Desktop' -y

启动GNOME,在命令行中输入startx命令即可。

2.Nginx反向代理

一般上线的项目,出于安全性的考虑,是不允许外网直接访问的,这时候Nginx的反向代理功能就起到了关键作用。通常表现为,在生产服务器上部署项目和代理服务器,客户端不能直接访问生产服务器,需要通过Nginx接收客户端传来的请求,然后转发给生产服务器,再将服务器的回应发送给客户端。这个闭合过程Nginx充当一个中转站,在此过程中,用户不需要配置任何代理IP和端口,或者说客户端根本就不知道自己访问的是真实的服务器还是代理服务器,这样能有效的保证内网的安全。

【实例5-3-3】设置反向代理。使用Nginx+Tomcat实现此项目的反向代理。在一台服务器上面实现,一台虚拟机安装了两个Tomcat服务器。

(1)虚拟机环境介绍

服务器IP:192.168.1.100,Nginx端口:8080,Tomcat1端口:8085,Tomcat2端口:8086。一台服务器安装了两个Tomcat,使用不同端口实现。

(2)在CentOS下安装Tomcat服务器

(3)测试搭建的Nginx,Tomcat是否正常访问

测试Nginx服务器,如图5-3-18所示。

图5-3-18 测试Nginx是否可用

测试Tomcat服务器是否可用,如图5-3-19所示。

图5-3-19Tomcat测试

(4)配置反向代理。

修改Nginx的配置文件nginx.conf,代码如下:

vi nginx.conf

在server段里面的“location”加上“proxy_pass”设置为“http://ip:端口”,如图5-3-20所示。

图5-3-20 反向代理配置

Nginx配置完成后重启一下。通过浏览器窗口访问,如图所示,反向代理就完成了。

图5-3-21 反向代理成功

3.Nginx负载均衡

负载均衡建立在现有网络结构之上,提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽,增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。Nginx不仅可以作为强大的Web服务器,也可以作为反向代理服务器,而且Nginx还可以按照调度规则实现动静分离,还可以对后端的服务器做负载均衡。

(1)Nginx自带负载均衡策略

①轮询(默认)。每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器关机,能自动剔除。配置代码如下:

upstream backserver { 
server 192.168.1.14; 
server 192.168.1.15; 
} 

②指定权重。指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 配置代码如下:

upstream backserver { 
server 192.168.0.14 weight=8; 
server 192.168.0.15 weight=10; 
} 

③IP绑定ip_hash。每个请求按访问IP的Hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 配置代码如下:

upstream backserver { 
ip_hash; 
server 192.168.0.14:88; 
server 192.168.0.15:80; 
} 

④fair。按后端服务器的响应时间来分配请求,响应时间短的优先分配。 配置代码如下:

upstream backserver { 
server server1; 
server server2; 
fair; 
} 

⑤url_hash。按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 配置代码如下:

upstream backserver { 
server squid1:3128; 
server squid2:3128;
hash $request_uri;
hash_method crc32; 
} 

本章小结

本章主要讲解了常见Web服务器简介、HTTP与Web服务器和Nginx服务器部署与优化。通过本章的学习,读者应掌握常见Web服务器如Apache、Tomcat、IIS、Nginx服务器等各自的特点、HTTP配置与代理、HTTP负载均衡类型及各自的特点、Nginx服务器的安装与部署、Nginx服务器的配置及Nginx服务器的应用等知识与技能。

本章习题

一、单项选择题

1.Web服务器解析( )协议。

A.FTP

B.HTTP

C.POP3

D.IP

2.HTTP(Hyper Text Transfer Protocol)是( )协议。

A.邮件传输协议

B.文件传输协议

C.超文本传输协议

D.远程桌面协议

3.HTTP协议是工作在( )架构上。

A. 服务器端

B.客户端

C.远程端

D.客户端/服务端

4.TLS是( )协议。

A.加密协议

B.安全传输层协议

C.解密

D.生成密钥协议

5.OpenSSL生成能生成( )证书。

A.CA证书

B.TSL

C.OpenSSL

二、多选题

1.Linux操作系统下的文本编辑器有( )。

A. vi

B. emacs

C. word

D. ppt

2.Apache服务器在启动或重新启动时,将读取三个配置文件( )来控制它的工作方式。

A. srm.conf

B. access.conf

C. http.conf

D.config.conf

3.IIS是一种Web服务组件,包括( )。

A.Web服务器

B.SMTP服务器

C.FTP服务器

D.NNTP服务器

4.Tomcat是由Apache开发的一个Servlet容器,实现了对( )支持。

A. Servlet

B. JSP

C.PHP

D.C++

5.Nginx安装前,首先安装相关依赖包,相关依赖包有( )。

A.GCC

B.PCRE

C.ZLIB

D.OpenSSL