运维学习Nginx的原因在于Nginx是一种高性能的开源Web服务器,常用于反向代理、负载均衡和作为HTTP服务器。Nginx的概述涵盖其轻量级、高并发处理、可扩展性强等特点,使其成为处理Web流量和提高系统性能的重要工具。学习Nginx有助于运维人员优化网站性能、提高稳定性,并能有效处理大量并发请求。

        请注意,本博客使用的Nginx版本为Nginx-1.12.2

1.Nginx简介

1.1.什么是Nginx

        ​ Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器 ,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,公开版本1.19.6发布于2020年12月15日。

         其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。2022年01月25日,nginx 1.21.6发布。

         Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。 ​

1.2.Nginx作为web服务器

        Nginx 可以作为静态页面的 web 服务器,同时还支持 CGI 协议的动态语言,比如 perl、php等。但是不支持 java。Java 程序只能通过与 tomcat 配合完成。Nginx 专为性能优化而开发性能是其最重要的考量,实现上非常注重效率 ,能经受高负载的考验,有报告表明能支持高达 50000 个并发连接数。

1.3.反向代理

1.3.1.正向代理

        如果把局域网外的 interet 想象成一个巨大的资源库,则局域网中的客户端要访问 Interet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。

        很抽象?说人话就是,我们PC需要访问一个服务器或者网站,但是我们因为一些原因或者需要,不能够直接访问到服务器或者网站。那我们就会启动一个代理服务器,我们个人的访问请求发到该代理服务器中,这个服务器的功能类似NAT网络转换,把我们的个人请求转变成代理服务器的请求,请求数据包会通过代理服务器在发送回我们个人PC当中,此时正向代理服务器和客户端对外就是一个客户端,只是暴露的是代理服务器的地址,隐藏了客户端的地址,在这里代理服务器是代理的是我们客户端。

1.3.2.反向代理

        反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。

        还是很抽象?在说人话就是,我们PC需要访问一个服务器或者网站,该服务器或者网站给我们提供了一个代理服务器,并非是我们客户端开启的,这样做的目的是,服务端可以通过自己提供的代理服务器接收客户端的请求,在把数据包提供给代理服务器转发,从而隐藏了自己的服务器IP地址。客户端在访问服务端时,其实是不会知道自己是访问的是代理服务器还是真的直接访问到了服务器,此时反向代理服务器和目标服务器对外就是一个服务器,只是暴露的是代理服务器的地址,隐藏了目标服务器的地址,在这里代理服务器是代理的是服务端。

        Nginx在服务器中扮演的就是反向代理服务器

1.4.负载均衡

1.4.1.单台服务器

        在我们客户端对服务端发起请求时,Nginx作为反向代理服务器虽然隐藏了服务端地址,但是还是会把该请求转发给服务器。此时,如果服务端只有一台服务器,Nginx就会把请求发送到该服务器中,当客户端增多时,Nginx会把这些请求全部的发送到一台服务器中。终于,在大量数据请求下,服务器宕机了。我们该如何防止这类服务器宕机的原因?提高单台服务器的配置,购买内存和CPU,但是我们知道摩尔定律的日益失效,硬件的性能提升已经不能满足日益提高的需求。那么根据这种系统框架,将机器的所有配置都提高到顶级,依旧无法满足需求。

1.4.2.多台服务器

        上面的分析我们去掉了增加服务器物理配置来解决问题的办法,也就是说纵向解决问题的办法行不通了,那么横向增加服务器的数量呢?这时候集群的概念产生了,单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到一台服务器的情况改为了请求分到多台服务器中,将负载分发到不同的服务器,也就是我们所说的负载均衡。Nginx作为反向代理服务器,提供了多种负载均衡算法,将不同的请求,根据负载均衡算法,发送到不同的服务器中。但在我们客户端看来,服务端依旧是一台服务器。

1.5.动静分离

1.5.1.静态资源

        前端的固定页面,这里面包含HTML、CSS、JS、图片等等,不需要查数据库也不需要程序处理,直接就能够显示的页面。 具体形式为:客户端发送请求到web服务器,web服务器拿到对应的文件,返回给客户端,客户端解析并渲染出来。

1.5.2.动态资源

        需要程序处理或者从数据库中读数据,能根据不同的条件在页面显示不同的数据,优点是内容更新不需要修改页面,缺点是访问速度不及静态页面。 具体形式为:客户端请求的动态资源,先把请求交给web的一个存储点,web存储点连接数据库,数据库处理数据之后,将数据交给web服务器,web服务器返回给客户端解析渲染处理。

1.5.3.动静分离

        为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。

2.Nginx的安装

2.1.使用wget和tar下载并安装pcre

wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz

下载包

查看下载文件

         解压缩文件到/opt/module中

tar -xvf pcre-8.37.tar.gz -C /opt/module/

查看下载文件

        进入解压后的文件目录,执行下面命令,检查环境,如果这一步失败,先运行2.的命令再回来运行下面的命令

./configure

         然后使用以下命令进行,编译并安装已经编译好的程序

make && make install

查看版本,如果出现版本号即说明安装成功

2.2.使用yum下载安装其他的依赖

yum install -y make zlib zlib-devel gcc-c++ libtool openssl openssl-devel

2.3. 安装Nginx

        Nginx官网:nginx news

        nginx.1.12.2下载地址:http://nginx.org/download/nginx-1.12.2.tar.gz

 

         与下载pcre的操作一样,解压缩到/opt/module中,然后进入/opt/module/nginx-1.12.2/检查环境,最后编译并安装已经编译好的程序

tar -xvf nginx-1.12.2.tar.gz -C /opt/module

./configure

make && make install

然后nginx会编译安装到该目录下

        安装成功后,在usr多出一个文件夹local/nginx,在nginx/sbin/有启动脚本 

2.4.启动nginx

 2.5.如何关闭nginx

        关闭nginx有多个方法,可以强制关闭,也可以优雅的关闭。什么是优雅的关闭先按下不表,在nginx的sbin路径下输入以下任何一个命令即可关闭

./nginx -s quit # 优雅的关闭

./nginx -s stop # 强制关闭

2.Nginx的初体验

2.1.Nginx默认欢迎界面

        当我们下载安装好Nginx之后,我们把它启动,查看虚拟机的IP地址,直接可以在宿主机的浏览器(前提是你宿主机能ping通虚拟机。并且防火墙配置需要开启80端口,或者关闭防火墙)输入你的虚拟机IP,就能进入你虚拟机的Nginx欢迎页面

Nginx的默认欢迎界面

        需要注意的是,当我查看Nginx配置文件,我们可以发现,他配置的默认访问界面是配置到80端口的,理论上我是要访问到这个默认欢迎界面是需要输入IP加端口的,为什么我们直接访问虚拟机IP就可以访问到呢?因为根据HTTP协议,“If the port is empty or not given, port 80 is assumed.”(如果端口号为空或未给出,则假定为 80 端口),至于为什么这么设计,可能是为了让 URL 更简单、清晰。

 2.2.Nginx常用操作命令

        使用Nginx命令时,我们需要进入Nginx的sbin目录。

# 1.查看nginx的版本号

./nginx -v

# 2.启动nginx

./nginx

# 3.关闭nginx

./nginx -s stop

./nginx -s quit

# 4.重新加载nginx,在后面我们配置nginx配置文件后,需要重新加载才可生效

./nginx -s reload

2.3.Nginx的配置文件

        在此之前,我们先要知道nginx配置文件在哪里,它在我们nginx里面的conf文件里面,

2.3.1.nginx配置文件有什么具体内容

        我们vim进去后,发现里面有很多白色和蓝色的内容,其中白色的内容是生效的配置,蓝色的内容是配置文件的注释,但我们注释删掉后,发现只有如下的内容

# nginx.conf

# 我们将如下配置文件,分为三个部分拆分介绍

# 第一部分:全局块

# 主要会设置一些影响 nginx 服务器整体运行的配置指令

# 主要包括配置运行 Nginx 服务的用户(组)、

# 允许生成的 worker process 数,进程 PID 存放路径、

# 日志存放路径和类型以及配置文件的引入等。

# 例如这一行配置,这是 Nginx 服务器并发处理服务的关键配置

# worker_processes 值越大,可以支持的并发处理量也越多

# 但是会受硬件,软件等设备的影响

worker_processes 1;

# 第二部分:evens块

# events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接

# 这部分的配置比较灵活,对 Nginx 的性能影响较大

# 在实际中需要零活配置

events {

# 比如这一行配置,就表示每一个 worker process 支持的最大连接数是1024

worker_connections 1024;

}

# 第三部分:http块

# Nginx 服务器配置中最频繁的部分

# 代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里

# 需要注意的是: http 块也可以包括 http全局块、server 块

http {

# http全局块

# 配置的指令包括文件引入、MIME-TYPE 定义

# 日志自定义、连接超时时间、单链接请求数上限等

include mime.types;

default_type application/octet-stream;

sendfile on;

keepalive_timeout 65;

# server块

# 这块和虚拟主机有密切关系,虚拟主机从用户角度看

# 和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本

# 每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机

# 而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块

server {

# 这一行代表的意思是,nginx目前监听的端口号是80端口

listen 80;

# 这一行表示的意思是,主机名称

server_name localhost;

# 对虚拟主机名称(也可以是IP)之外的字符串进行匹配

# 对特定的请求进行处理。地址定向、数据缓存和应答控制等功能

# 还有许多第三方模块的配置也在这里进行

location / {

root html;

index index.html index.htm;

}

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;

}

}

}

3.Nginx实例

        在搞懂如何配置和启动nginx之后,我们来尝试着配置nginx的实例

3.1.反向代理

3.1.1.实现效果

        打开浏览器,在浏览器的地址栏中输入一个地址,比如说地址是 www.123.com ,当我们输入之后,跳转到linux系统tomcat主页面中

3.1.2.准备工作

        在我们的linux系统中安装tomcat,使用默认端口号8080

        下载地址:https://archive.apache.org/dist/tomcat/tomcat-7/v7.0.70/bin/apache-tomcat-7.0.70.tar.gz

        ​         解压缩安装到/usr/src/中

         和Nginx类似,我们进入tomcat的bin目录下,输入以下命令即可启动tomcat

./startup.sh

        启动之后就可以在宿主机浏览器中查看tomcat默认页面

3.1.3.反向代理的过程分析

        宿主机在hosts中配置一个域名映射,模拟服务器的域名在DNS中解析,然后在浏览器中输入www.123.com,之后,浏览器在hosts文件中找到了主机的IP。然后访问该IP的80端口,之后请求打到虚拟机的80端口,Nginx在接受到请求后,通过配置文件的反向代理地址,把请求打到虚拟机的8080端口上(127.0.0.1是回环地址,代表的是自己的IP),实现反向代理

        

3.1.4.具体实现

        在windows系统的hosts文件中进行域名和IP对应关系的配置

        C:\Windows\System32\drivers\etc\hosts

        配置好hosts文件之后,我们在浏览器打开www.abc.com就会通过hosts映射到我们的虚拟机IP上,接着我们试着打开www.abc.com:8080就能打开 tomcat的欢迎界面

        接下来我们打开nginx的配置文件,在server块中配置如下内容,并重新加载nginx。该内容表示,如果宿主机访问192.168.10.102:80端口,就会转发到http://127.0.0.1:8080端口,也就是转发到tomcat的默认端口中去。又因为我们查询IP不加端口号就默认访问该IP的80端口,所以我们在宿主机浏览器直接搜索www.abc.com就会通过hosts文件解析查询到192.168.10.102这个IP,然后通过80端口的nginx的反向代理转发到nginx所在主机的8080端口,实现代理转发,效果如下

3.2.反向代理2

3.2.1.实现效果

        使用nginx反向代理,根据访问的路径跳转到不同端口的服务中去

        访问www.abc.com:9001/edu/ 直接跳转到192.168.10.102:8080

        访问www.abc.com:9001/vod/ 直接跳转到192.168.10.102:8081

3.2.2.准备工作

        准备两个tomcat的服务器,一个8080端口,一个8081端口。首先我们重新创建两个目录,按照上面下载步骤,分别在两个文件夹中下载两个tomcat。(再次之前我们kill掉之前的tomcat,以免影响接下来的实现效果),由于其中一个tomcat是使用8080默认端口,所以我们直接运行即可

         第二个tomcat我们需要修改一下他的启动配置,让他启动在8081端口上,我们打开他的配置目录,修改其中的server.xml配置文件,为了避免和第一个tomcat冲突,其中tomcat的其他服务的端口也需要同一更改。

# Server port="8005" shutdown="SHUTDOWN" 需要更改为

Server port="8015" shutdown="SHUTDOWN"

# Connector port="8080" protocol="HTTP/1.1" 需要更改为

Connector port="8081" protocol="HTTP/1.1"

Connector port="8009" protocol="AJP/1.3" redirectPort="8443" 需要更改为

Connector port="8019" protocol="AJP/1.3" redirectPort="8443"

        之后保持配置文件并启动,我们可以通过ps查看到我们已经启动到两个tomcat进程  

        我们也可以尝试在服务器分别打开192.168.10.102:8080和192.168.10.102:8081查看tomcat界面

        为了能测试反向代理的效果,我们需要创建文件夹和测试页面

        在8080中的webapps文件夹中,创建一个edu文件夹,写一个a.html的测试页面,用来代表8080端口

        接着在8081中的webapps文件夹中,创建一个vod文件夹,也写一个a.html的测试页面,用来代表8081端口

 3.2.3.具体实现

        接下来我们打开nginx的配置文件,新创建一个server块,我们可以用nginx给我们的这一段注释修改成我们的实例实现。配置内容为,当客户端向自己的IP的9001端口进行访问时,通过正则表达式查看访问的路径,如果包含edu,nginx就会把访问请求转发到8080端口;如果包含vod,nginx就会把访问请求转发到8081端口。然后重新加载nignx使配置生效

3.2.4.实现效果

3.3.负载均衡

3.3.1.实现效果

        在浏览器输入http://192.168.10.102/edu/a.html。负载均衡的效果,平均8080和8081端口中

3.3.2.准备工作

        准备两台tomcat服务器,一台8080,一台8081,我们之前在反向代理中已经准备好了

        在两台tomcat里面的webapps目录中,创建名称是edu的文件夹,在edu文件夹中创建页面a.html,用于测试,由于之前在反向代理中8080的edu文件夹已经里面的页面已经创建,我们只需要在8081创建即可,效果如下

3.3.3.具体配置

        在nginx的配置文件中进行负载均衡的配置

        在http块中定义一个upstream,名字叫做myserver,在下面配置两个server,分别是8080和8081端口,后面的负载均衡走这个upstream时,就会把请求负载到这两个端口号中,然后在下面的server块中,配置走的规则为upstream,重启nginx服务即可

3.3.4.实现效果

3.3.5.负载均衡策略

        随着互联网信息的爆炸性增长,负载均衡 (load balance) 已经不再是一个很陌生的话题,顾名思义,负载均衡即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。快速增长的访问量和数据流量催生了各式各样的负载均衡产品,很多专业的负载均衡硬件提供了很好的功能,但却价格不菲,这使得负载均衡软件大受欢迎,nginx就是其中的一个,在 linux下有 Nginx、LVS、Haproxy等等服务可以提供负载均衡服务,而且 Nginx提供了几种分配方式(策略)

3.3.5.1.轮询(默认)

        每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除

3.3.5.2.weight

        weight 代表权,重默认为1,权重越高被分配的客户端越多         指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 例如在上面的例子中,如果我们给8080端口的权限设置为10,8081端口不变,那么服务请求就会以10:1的比例分别打到8080和8081端口中去

3.3.5.3.ip_hash

        每个请求按访问ip的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题,如果一个客户端的iphash 结果分配到8080端口,那该ip以后的所有会话都会打到8080端口

 3.3.5.4.fair(第三方)

        按后端服务器的响应时间来分配请求,响应时间短的优先分配

3.4.动静分离

3.3.1.什么是动静分离

        什么是动态?请求动态请求通常指需要在服务器上运行脚本或程序生成内容的请求,例如使用PHP、Python或其他服务器端语言的页面

        静态请求则是指直接从服务器获取已经存在的静态文件,如HTML、CSS、JavaScript和图像,无需经过服务器端处理。Nginx的动静分离能力允许它有效地处理这两种请求类型,提高性能和效率

        Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用nginx处理静态页面,tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种

        一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开

        小知识:通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义: 是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码 304,如果有修改,则直接从服务器重新下载,返回状态码 200 

3.3.2.准备工作

        因为动态资源直接配置到tomcat中,所以我们只测试配置静态资源。在linux系统中准备静态资源,用于进行访问,创建以下目录,在www中写入一个a.html,在image中传入一张图片,模拟静态资源

3.3.3.具体配置

        在nginx的配置文件中进行配置,nginx默认是不允许列出整个目录的。如需此功能,打开nginx.conf文件或你要启用目录浏览虚拟主机的配置文件,在 server 或location 段里添加上autoindex on,来启用目录流量。重启nginx服务

 3.3.4.具体效果

        在浏览器中输入地址 http://192.168.10.102/image/,效果如下,autoindex生效,点击01.png

 

         在浏览器中输入地址 http://192.168.10.102/www/a.html,效果如下

4.Nginx高可用

        Nginx作为反向代理服务器,可以做到反向代理,负载均衡以及动静分离,也可以做到对服务器的监控上下线,如果服务器当中有服务器宕机,会进行把请求转发到别的存活的服务器中去。如果启动nginx的服务器在宕机的时候,服务器集群就会因为没有反向代理服务器而无法正常提供服务,为了预防Nginx所在节点宕机的问题,我们还也可给Nginx配置高可用。

4.1.什么是高可用

        nginx作为负载均衡器,所有请求都到了nginx,可见nginx处于非常重点的位置,如果nginx服务器宕机后端web服务将无法提供服务,影响严重。 为了屏蔽负载均衡服务器的宕机,需要建立一个备份机。 主服务器和备份机上都运行高可用(HA)监控程序

4.2.准备工作

        因为需要配置Nginx的高可用,所以我们需要开启两个虚拟机,我的虚拟机名称和ip分别是,Hadoop102(192.168.10.102)和Hadoop103(192.168.10.103),分别下载两个Nginx,然后配置Nginx的高可用需要一个名为keepalived的插件,他的作用是把两个Nginx统一起来对外保留一个虚拟ip,这样,客户端就可以访问这一个ip就可以访问Nginx,如果主节点的Nginx宕机,客户端访问同一个ip,keepalived就会判断主节点宕机,从而请求就会发送到从节点的Nginx当中

        根据上面的Nginx安装,把Nginx安装到Hadoop103之后,我们开始在两台虚拟机安装keepalived插件,他会下载到/etc/keepalived中

yum install keepalived -y

 4.3.完成高可用的配置

4.3.1.修改keepalived.conf

        把原来的全部内容替换成以下配置

#全局配置

global_defs {

notification_email {

acassen@firewall.loc

failover@firewall.loc

sysadmin@firewall.loc

}

notification_email_from Alexandre.Cassen@firewall.loc

smtp_server 192.168.10.102 #主机ip

smtp_connect_timeout 30

router_id LVS_DEVEL #服务器域名名字,可在/etc/hosts中查看和设置127.0.0.1映射的域名

}

#脚本配置

vrrp_script chk_http_port {

script "/usr/local/src/nginx_check.sh" #脚本路径

interval 2 #(检测脚本执行的间隔);每隔2s检查一次

weight 2 #设置服务器权重

}

#虚拟ip的配置

vrrp_instance VI_1 {

state BACKUP # Master为Master;Salve为BACKUP

interface ens33 #网卡;可以用ip addr 看网卡名

virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同

priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小

advert_int 1 #每1s发送一次心跳

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.10.50 # VRRP H 虚拟ip地址,多台keepalived绑定一个ip;必须同一网段

}

}

4.3.2.编写nginx_check.sh脚本

        在/usr/local/src/创建nginx_check.sh,写入以下脚本内容用于检查节点宕机

#!/bin/bash

A=`ps -C nginx –no-header |wc -l`

if [ $A -eq 0 ];then

/usr/local/nginx/sbin/nginx #nginx启动路径

sleep 2

if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then

killall keepalived #nginx挂掉后,杀掉这个服务器的所有keepalived进程

fi

fi

4.3.3.启动

        分别在两台虚拟机重启nginx后,使用systemctl启动keepalived服务即可

systemctl start keepalived.service

         我们使用ip a命令,可以看到我们的虚拟机的ens33绑定了keepalived设置的虚拟ip

4.3.4.启动效果

        在宿主机浏览器输入虚拟IP 192.168.10.50 即可打开nginx的默认欢迎界面

        我们模拟服务器宕机,关闭Hadoop102的nginx和keepalived,然后再在宿主机的浏览器输入192.168.10.50,依旧可以访问到nginx的欢迎界面

参考阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: