一、Nginx的安装

本次安装的环境为centos7.0的版本。

1.1 pcre依赖包的相关安装

  1. 安装pcre压缩包中的依赖

    1
    wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz
  2. 压缩包解压并进入解压后的文件夹

    1
    tar -zxvf pcre-8.37.tar.gz
  3. C++方面的依赖(openssl、zlib、gcc等依赖)

    因为Nginx依赖C++的编译环境,故需要安装C++方面的依赖。

    1
    yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
  4. ./configure

    作用:是用来检测你的安装平台的目标特征的。比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,一般用来生成 Makefile,为下一步的编译做准备

  5. make && make install

    进行编译与安装

1.2 安装Nginx

下载Nginx安装包后(为方便管理安装目录同pcre),其安装步骤同上面的1,2,4,5;一路安装下来若没有报错则表明此时安装完成。安装完成后的目录,默认在/usr/local/nginx下。

之后进入/usr/local/nginx/sbin/启动服务启动服务,启用命令./nginx。几个常用的命令:

1
2
3
4
5
6
7
8
# 启动
./nginx
# 关闭
./nginx -s stop
# 不重启nginx服务器,重加载配置文件
./nginx -s reload
# 查看版本号
./nginx -v

1.3 测试

因为Nginx默认监听的是80端口,故可以直接访问http:ip即可,例如装载在本机Linux系统中,则直接访问http:localhost,即可。若出现以下画面,则表明安装成功。

2

二、配置文件说明

Nginx的配置文件在/usr/local/nginx/conf/nginx.conf中。配置文件中的内容包含三部分:

  1. 全局块:配置服务器整体运行的配置指令。例如:worker_processes 1;处理并发数的配置,数字越大,并发处理量就越大(会受到硬件、软件等设备的制约)。

    从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。

  2. events块:影响Nginx服务器与用户的网络连接。例如:worker_connections 1024;支持的最大连接数为1024

    events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。

  3. http块:包含两部分,分别为http全局块server块。这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。

    • http全局块

      http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。

    • server块:这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。

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

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

    • 全局server块:最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。

    • location块:一个 server 块可以配置多个 location 块。

      这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行,进行负载均衡、反向代理以及动静分类等配置都涉及到location块。

三、反向代理

Nginx最重要的功能之一就是反向代理,这一节会实操如何实现Nginx的反向代理操作,即对Nginx进行相关配置。

3.1 正向代理

Nginx不仅可以做反向代理,实现负载均衡。还能用作正向代理来进行上网等功能。

正向代理:如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访问Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。即:需要在客户端配置代理服务进行指定网站访问。

3

如上图,客户端需要访问谷歌网站时,需要在客户端(浏览器端)进行配置,去访问代理服务器,再由代理服务器进行谷歌网站的访问。

3.2 反向代理

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

4

3.3 Nginx配置反向代理实验一

实现效果:使用nginx反向代理,访问106.15.65.210(代理服务器地址,Nginx服务器地址),跳转到106.12.65.210:8999真实服务器上。

首先,在未配置反向代理前,访问106.15.65.210

2

则上面直接访问的是nginx服务器地址(即为代理服务器)。

访问106.15.65.210:8999

现在看到访问路径(106.15.65.210)下,展示的nginx页面。

这里的使用反向代理能够做到的是:

访问106.15.65.210,真实访问的是106.15.65.210:8999,这里省略了域名操作,假设我们给106.15.65.210绑定了www.123.com,则直接访问的是106.15.65.210:8999.如下图:

7

这里省略域名的绑定操作,我们直接访问106.15.65.210代理服务器地址,转发到后面真实tomcat服务器中。

  1. nginx进行请求转发的配置(反向代理配置)

只需要配置代理服务器地址(域名),以及真实转发地址即可。

访问106.15.65.210,显示:

可以看到跳转到我们所配置的tomcat服务器,106.15.65.210:8999。如果没有生效,检查下是否是浏览器缓存的原因。

配置:

6

3.4 Nginx配置反向代理实验二

实现效果:使用Nginx反向代理,根据访问的路径跳转到不同端口的服务器中。这里Nginx端口为默认的80端口。

访问http://106.15.65.210/edu/ 直接跳转到http://106.15.65.210:8080

访问http://106.15.65.210/vod/直接跳转到http://106.15.65.210:8999

根据不同的访问路径,最终来到不同的服务器请求数据。

准备工作:

  1. 准备两个tomcat服务器,一个8080端口,一个是8999端口。(如果用的是云服务器,开头端口权限以及防火墙设置)

  2. 创建文件夹和测试页面(只是用于区别根据访问路径的不同,请求的服务器不同)

    即在8080端口的tomcat服务器下的webapps中创建一个edu文件夹,创建一个index.html页面,内容

    1
    <h1>tomcat8.5.9</h1>

    在在8999端口的tomcat服务器下的webapps中创建一个vod文件夹,创建一个index.html页面,内容

    1
    <h1>tomcat9</h1>

    此时,分别访问106.15.65.210:8080/edu/106.15.65.210:8080/vod/时,页面分别显示

    tomcat8.5.9tomcat9

Nginx配置:

注意:在配置该项方向代理实验之前,需要备份之前的配置文件。

8

Nginx代理服务器中,存在edu路径时,跳转到8080的服务上请求相应的服务;存在vod路径时,跳转到8999的服务器上请求相应的服务。

效果如下图:

请求:http://106.15.65.210/edu/

9

请求:http://106.15.65.210/vod/

10

四、负载均衡

4.1 介绍

增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡.即:将原来一台服务器做的事情,现在增加到多台服务器来完成(每台服务器的功能模块相同,即存放的资源相同)。

11

4.2 实验

实现效果:

请求访问http://106.15.65.210/edu/a.html,负载均衡效果,平均到80808999端口中。

准备工作:

  1. 准备两台tomcat服务器,一台8080,一台8081
  2. 在两台tomcat里面webapps目录中创建名称为edu的文件夹,在edu文件夹中创建页面a.html,内容用于标识两台服务即可,不做具体要求了,只用作测试罢了。

配置:

image-20210510210451404

4.3 Nginx分配服务器策略

  • 第一种:轮询(默认)

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

  • 第二种:weight,即设置权重访问

weight代表权重默认为1,权重越高被分配的客户端越多。

  • 第三种:ip_hash

每个请求按访问iphash结果分配,这样每个访客固定访问一个后端服务器

  • 第四种:fair(第三方)

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

注意:当使用docker启动多个tomcat服务器时,做端口映射时,不需要修改默认端口8080,只需要映射端口时,选用不同的端口即可。

五、动静分离

Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种,一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。

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

image-20210510150522509

从上图中也可以看到,当发送请求时,静态资源请求静态资源服务器,动态资源请求动态服务器。

六、Nginx工作原理初探

ps -ef | grep nginx

首先发送请求,由Nginx中的master进程进行接收;随后,master将请求分发给worker进程,由worker进程进行”争抢”,获取到任务的worker通过反向代理转发请求到tomcat,进行处理。

一个master和多个worker机制的好处:

worker设置的数量:worker数量和cpu数量设置相等。

连接数worker_connection:2个或者4个;如果采用的动态分离机制,静态请求和动态请求是分别请求,各占用两个connection。这里是指,发送一个请求,占用的worker的连接数是多少。

问:Nginx有一个master,有四个worker,每个worker支持最大的连接数据为1024(worker_connections),支持的最大并发数是多少?(最大并发数可以理解为,能够承受的最大请求数量)

答:一共四个worker,则全部worker最大支持的连接数为:1024*4;因为一个请求占用两个连接或四个连接,则最大并发数(请求)为1024*4/2或者1024*4/4.

附:docker常用命令

因为,上述实验需要配置两台tomcat服务器,这里我选择使用的docker配合完成,附上一些docker常用命令。

docker主机(Host):安装了Docker程序的机器(Docker直接安装在操作系统之上);

docker客户端(Client):连接docker主机进行操作;

docker仓库(Registry):用来保存各种打包好的软件镜像;

docker镜像(Images):软件打包好的镜像;放在docker仓库中;

docker容器(Container):镜像启动后的实例称为一个容器;容器是独立运行的一个或一组应用

首先在Linux中安装docker及相关命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1、检查内核版本,必须是3.10及以上
uname -r
2、安装docker
yum install docker
3、输入y确认安装
4、启动docker
[root@localhost ~]# systemctl start docker
[root@localhost ~]# docker -v
Docker version 1.12.6, build 3e8e77d/1.12.6
5、开机启动docker
[root@localhost ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
6、停止docker
systemctl stop docker
  1. 镜像操作
操作 命令 说明
检索 docker search 关键字 eg:docker search redis 我们经常去docker hub上检索镜像的详细信息,如镜像的TAG。
拉取 docker pull 镜像名:tag :tag是可选的,tag表示标签,多为软件的版本,默认是latest
列表 docker images 查看所有本地镜像
删除 docker rm image-id 删除指定的本地镜像
  1. 容器操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1、搜索镜像
[root@localhost ~]# docker search tomcat
2、拉取镜像
[root@localhost ~]# docker pull tomcat
3、根据镜像启动容器
docker run --name mytomcat -d tomcat:latest
4、docker ps
查看运行中的容器
5、 停止运行中的容器
docker stop 容器的id
6、查看所有的容器
docker ps -a
7、启动容器
docker start 容器id
8、删除一个容器
docker rm 容器id
9、启动一个做了端口映射的tomcat
[root@localhost ~]# docker run -d -p 8888:8080 tomcat
-d:后台运行
-p: 将主机的端口映射到容器的一个端口 主机端口:容器内部的端口

10、为了演示简单关闭了linux的防火墙
service firewalld status ;查看防火墙状态
service firewalld stop:关闭防火墙
11、查看容器的日志
docker logs container-name/container-id
12、进入容器终端进行操作
docker exec -it container-id /bin/bash
更多命令参看
https://docs.docker.com/engine/reference/commandline/docker/
可以参考每一个镜像的文档

Comment