Linux操作系统实验指导-实验03:使用Nginx实现负载均衡

80 阅读9分钟

一、实验目的

1、了解负载均衡的基本原理;

2、掌握使用Apache发布网站;

3、掌握使用Nginx实现负载均衡。

二、实验学时

2学时

三、实验类型

综合性

四、实验需求

1、硬件

每人配备计算机1台。

2、软件

安装VMware WorkStation Pro或Oracle VM VirtualBox软件,安装Mobaxterm软件。

3、网络

本地主机与虚拟机能够访问互联网,虚拟机网络不使用DHCP服务。

4、工具

五、实验任务

1、完成安装Apache HTTP Server;

2、完成通过Apache发布内部网站 ;

3、完成使用Nginx以负载均衡方式发布内部网站;

4、完成负载均衡服务的测试。

六、实验环境

1、本实验需要VM 3台;

2、本实验VM配置信息如下表所示;

虚拟机配置操作系统配置
虚拟机名称:VM-Lab-03-Task-01-172.31.0.31内存:1GBCPU:1颗,1核心虚拟磁盘:20GB网卡:1块1块,内部网络主机名:Lab-03-Task-01IP地址:172.31.0.31子网掩码:255.255.255.0网关:172.31.0.254DNS:172.31.0.254IP地址:10.0.0.1子网掩码:255.255.255.0DNS:不配置
虚拟机名称:VM-Lab-03-Task-02-10.0.0.2内存:1GBCPU:1颗,1核心虚拟磁盘:20GB网卡:1块,内部网络主机名:Lab-03-Task-02IP地址:10.0.0.2子网掩码:255.255.255.0网关:不配置DNS:不配置
虚拟机名称:VM-Lab-03-Task-03-10.0.0.3内存:1GBCPU:1颗,1核心虚拟磁盘:20GB网卡:1块,内部网络主机名:Lab-03-Task-03IP地址:10.0.0.3子网掩码:255.255.255.0网关:不配置DNS:不配置

3、本实验拓扑图。

4、本实验操作演示视频。

本实验操作演示视频为视频集的第3集:www.bilibili.com/video/BV1b1…

七、实验内容及步骤

1、内部网站服务器-1的配置,并发布网站

在 VM-Lab-03-Task-02-10.0.0.2 主机上操作,进行内部网站服务器的建设和网站发布。

(1)在VMware WorkStation Pro中创建内部网站服务器的虚拟机,并临时将虚拟机临时调整为可联网状态,方便安装应用服务,具体操作步骤请参考《实验01:安装与基本配置》。

(2)虚拟机调整为可联网状态后,安装Apache,并完成防火墙的配置。

# 通过yum在线工具安装Apache HTTP Server
# 安装Apache HTTP Server
[root@Lab-03-Task-02 ~]# yum -y install httpd

# 启动httpd服务,并设置为自动启动
[root@Lab-03-Task-02 ~]# systemctl start httpd
[root@Lab-03-Task-02 ~]# systemctl enable httpd

# 查看httpd服务状态
[root@Lab-03-Task-02 ~]# systemctl status httpd

# 开启防火墙端口
[root@Lab-03-Task-02 ~]# firewall-cmd --permanent --add-port=80/tcp
[root@Lab-03-Task-02 ~]# firewall-cmd --permanent --add-port=81/tcp
[root@Lab-03-Task-02 ~]# firewall-cmd --permanent --add-port=8080/tcp
[root@Lab-03-Task-02 ~]# firewall-cmd --reload
[root@Lab-03-Task-02 ~]# firewall-cmd --list-all

🔔 提醒:

  1. 内网服务器创建完成后,临时将虚拟机调整为可联网状态,安装配置完服务后再调整至内网服务器。具体步骤如下:

  • 选择指定的虚拟机“10.0.0.2”,鼠标右键,依次选择【设置(S)...】->【硬件】->【网络适配器】,勾选“NAT模式(N):用于共享主机的IP地址”,保存设置。

  • 开启虚拟机,在系统中修改网络接口配置信息,修改内容如下:

    IP地址:172.31.0.32
    子网掩码:255.255.255.0
    网关:172.31.0.254
    DNS:172.31.0.254
    重启网络接口,使得配置生效,此时虚拟机为可联网状态。
    
  • 将其他虚拟机临时调整为可联网状态,均可参考以上步骤,注意IP地址不冲突。

(3)创建内部网站。

将虚拟机网络按照规划调整后,开展后续操作。创建的网站与发布方式结果如下:

表 3-1 内部网站服务器-1发布的网站一览表

网站名称访问路径存放目录发布方式
Site-1http://10.0.0.2/var/www/html基于IP地址
Site-2http://10.0.0.2:81/var/www/html/sitefolder2基于端口
Site-3http://10.0.0.2:8080/var/www/html/sitefolder3基于端口
Site-4http://10.0.0.2/site4/var/www/html/sitefolder4基于虚拟目录
Site-5http://10.0.0.2/site5/var/www/html/sitefolder5基于虚拟目录
# Site-1的内容创建:使用/var/www/html存储网站内容,撰写网站首页。
[root@Lab-03-Task-02 ~]# echo "<h1>Site-1:Publish using IP</h1>" > /var/www/html/index.html

# Site-2的内容创建:创建sitefolder2目录,撰写网站首页。
[root@Lab-03-Task-02 ~]# mkdir /var/www/html/sitefolder2
[root@Lab-03-Task-02 ~]# echo "<h1>Site-2:Release using port 81</h1>" > /var/www/html/sitefolder2/index.html

# Site-3的内容创建:创建sitefolder3目录,撰写网站首页。
[root@Lab-03-Task-02 ~]# mkdir /var/www/html/sitefolder3
[root@Lab-03-Task-02 ~]# echo "<h1>Site-3:Release using port 8080</h1>" > /var/www/html/sitefolder3/index.html

# Site-4的内容创建:创建sitefolder4目录,撰写网站首页。
[root@Lab-03-Task-02 ~]# mkdir /var/www/html/sitefolder4
[root@Lab-03-Task-02 ~]# echo "<h1>Site-4:Publish using virtual directory/site4</h1>" > /var/www/html/sitefolder4/index.html

# Site-5的内容创建:创建sitefolder5目录,撰写网站首页。
[root@Lab-03-Task-02 ~]# mkdir /var/www/html/sitefolder5
[root@Lab-03-Task-02 ~]# echo "<h1>Site-5:Publish using virtual directory/site5</h1>" > /var/www/html/sitefolder5/index.html

(4)基于IP地址发布网站

修改Apache配置文件的信息,以默认方式发布网站Site-1。

# 配置文件的具体路径:/etc/httpd/conf/httpd.conf
# 查看Apache配置文件中实际用到的内容,完成修改配置信息。
[root@Lab-03-Task-02 ~]# cat /etc/httpd/conf/httpd.conf | grep -vE "#|^$"
# --------------------httpd.conf文件--------------------
ServerRoot "/etc/httpd"
Listen 80
Include conf.modules.d/*.conf
User apache
Group apache
ServerAdmin root@localhost
<Directory />
    AllowOverride none
    Require all denied
</Directory>
DocumentRoot "/var/www/html"
<Directory "/var/www">
    AllowOverride None
    Require all granted
</Directory>
<Directory "/var/www/html">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>
<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>
<Files ".ht*">
    Require all denied
</Files>
# 此处省略了部分提示信息
# ----------------------------------------------------

(5)基于端口发布网站。

在/etc/httpd/conf.d文件夹下创建Site-2、Site-3的配置文件。

# 使用端口方式发布Site-2、Site-3。
# 创建Site-2、Site-3的配置文件,并存入到/etc/httpd/conf.d目录下。
[root@Lab-03-Task-02 ~]# vi /etc/httpd/conf.d/port-site-2.conf
# 将以下内容写入配置文件
# --------------------port-site-2.conf文件--------------------
Listen 81
<VirtualHost *:81>
    DocumentRoot "/var/www/html/sitefolder2"
</VirtualHost>
# --------------------port-site-2.conf文件--------------------

[root@Lab-03-Task-02 ~]# vi /etc/httpd/conf.d/port-site-3.conf
# 将以下内容写入配置文件
# --------------------port-site-3.conf文件--------------------
Listen 8080
<VirtualHost *:8080>
    DocumentRoot "/var/www/html/sitefolder3"
</VirtualHost>
# --------------------port-site-3.conf文件--------------------

(6)基于虚拟目录发布网站。

在/etc/httpd/conf.d目录下创建Site-4、Site-5的配置文件。

# 使用虚拟目录方式发布Site-4、Site-5。
# 创建Site-4、Site-5的配置文件,并存入到/etc/httpd/conf.d目录下。
[root@Lab-03-Task-02 ~]# vi /etc/httpd/conf.d/alias-site-4.conf
# 将以下内容写入配置文件
# --------------------alias-site-4.conf文件--------------------
Alias /site4 "/var/www/html/sitefolder4"
<Directory "/var/www/html/sitefolder4">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>
# --------------------alias-site-4.conf文件--------------------

[root@Lab-03-Task-02 ~]# vi /etc/httpd/conf.d/alias-site-5.conf
# 将以下内容写入配置文件
# --------------------alias-site-5.conf文件--------------------
Alias /site5 "/var/www/html/sitefolder5"
<Directory "/var/www/html/sitefolder5">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>
# --------------------alias-site-5.conf文件--------------------

(7)网站测试。

# 重新载入httpd服务的配置文件
[root@Lab-03-Task-02 ~]# systemctl reload httpd
#通过内部主机进行网站的访问测试

2、内部网站服务器-2的配置,并发布网站

(1)创建内部网站服务器-2。

(2)修改网络配置,将IP地址修改为10.0.0.3。

(3)发布内容与内部网站服务器-1内容一致。

创建的网站与发布方式结果如下:

表 3-2 内部网站服务器-2发布的网站一览表

网站名称访问路径存放目录发布方式
Site-1http://10.0.0.3/var/www/html基于IP地址
Site-2http://10.0.0.3:81/var/www/html/sitefolder2基于端口
Site-3http://10.0.0.3:8080/var/www/html/sitefolder3基于端口
Site-4http://10.0.0.3/site4/var/www/html/sitefolder4基于虚拟目录
Site-5http://10.0.0.3/site5/var/www/html/sitefolder5基于虚拟目录

🔔提醒:

安装配置完服务后必须要将内部网站服务器-1、网站服务器-2的网络接口配置和网络适配器修改至原样。

3、安装并配置Nginx实现负载均衡

在VM-Lab-03-Task-01-172.31.0.31主机上操作,配置Nginx并实现负载均衡服务。

本项目以域名方式发布内部网站服务器上的5个网站,通过Nginx发布的网站的信息如下:

表 3-3 对外发布的网站一览表

序号发布地址对应内部网站服务器-1的网站对应内部网站服务器-2的网站
1www.a.comhttp://10.0.0.2http://10.0.0.3
2www.b.comhttp://10.0.0.2:81http://10.0.0.3:81
3www.c.comhttp://10.0.0.2:8080http://10.0.0.3:8080
4www.d.comhttp://10.0.0.2/site4http://10.0.0.3/site4
5www.e.comhttp://10.0.0.2/site5http://10.0.0.3/site5

具体的配置方法如下:

(1)安装Nginx。

# 安装了必要的依赖库和工具
[root@Lab-03-Task-01 ~]# yum install -y gcc wget tar make zlib-devel pcre-devel openssl-devel
# 官网下载Nginx 源码包
[root@Lab-03-Task-01 ~]# wget https://nginx.org/download/nginx-1.18.0.tar.gz

# 解压下载的源码包
[root@Lab-03-Task-01 ~]# tar -xzvf nginx-1.18.0.tar.gz
# 使用 ./configure 命令配置 Nginx,并添加 http_stub_status_module 模块
[root@Lab-03-Task-01 ~]# cd nginx-1.18.0
[root@Lab-03-Task-01 nginx-1.18.0]# ./configure --with-http_stub_status_module
# 编译并安装 Nginx
[root@Lab-03-Task-01 nginx-1.18.0]# make
[root@Lab-03-Task-01 nginx-1.18.0]# make install
# 添加环境变量,启动 Nginx
[root@Lab-03-Task-01 nginx-1.18.0]# cd /usr/local/nginx
[root@Lab-03-Task-01 nginx]# vi /etc/profile
-------------------- profile ------------------
# 添加内容
export PATH="/usr/local/nginx/sbin:$PATH"
------------------------------------------------------
[root@Lab-03-Task-01 nginx]# source ~/.bashrc
[root@Lab-03-Task-01 nginx]# ./sbin/nginx

(2)实现轮询模式的负载均衡。

# 配置Nginx实现负载均衡服务
# 在cd /usr/local/nginx/conf.d/目录下进行配置文件修改
# 轮询负载均衡
# 创建配置文件port-site-1.conf,通过域名实现内部网站80端口的负载。
[root@Lab-03-Task-01 nginx]# mkdir /usr/local/nginx/conf.d
[root@Lab-03-Task-01 nginx]# vi /usr/local/nginx/conf.d/port-site1.conf
-------------------- port-site1.conf ------------------
upstream load1{
        server 10.0.0.2:80;
        server 10.0.0.3:80;
}
server{
        listen 80;
        server_name www.a.com;
        location / {
                proxy_pass http://load1;
                proxy_set_header Host $host:80;
        }
}

------------------------------------------------------
# 创建配置文件port-site-2.conf,通过域名实现内部网站81端口的负载
[root@Lab-03-Task-01 nginx]# vi /usr/local/nginx/conf.d/port-site2.conf
-------------------- port-site2.conf ------------------
upstream load2{
        server 10.0.0.2:81;
        server 10.0.0.3:81;
}
server{
        listen 80;
        server_name www.b.com;
        location / {
                proxy_pass http://load2;
                proxy_set_header Host $host:80;
        }

}
----------------------------------------------------
# 创建配置文件port-site-3.conf,通过域名实现内部网站8080端口的负载
[root@Lab-03-Task-01 nginx]# vi /usr/local/nginx/conf.d/port-site3.conf
-------------------- port-site3.conf ------------------
upstream load3{
        server 10.0.0.2:8080;
        server 10.0.0.3:8080;
}
server{
        listen 80;
        server_name www.c.com;
        location / {
                proxy_pass http://load3;
                proxy_set_header Host $host:80;
        }

}
----------------------------------------------------
# 创建配置文件port-site-4.conf,通过域名实现内部网站虚拟目录site4的负载
[root@Lab-03-Task-01 nginx]# vi /usr/local/nginx/conf.d/port-site4.conf
-------------------- port-site4.conf ------------------
upstream load4{
        server 10.0.0.2;
        server 10.0.0.3;
}
server{
        listen 80;
        server_name www.d.com;
        location / {
                proxy_pass http://load4/site4/;
                proxy_set_header Host $host:80;
        }

}
----------------------------------------------------
# 创建配置文件port-site-5.conf,通过域名实现内部网站虚拟目录site5的负载
[root@Lab-03-Task-01 nginx]# vi /usr/local/nginx/conf.d/port-site5.conf
-------------------- port-site5.conf ------------------
upstream load5{
        server 10.0.0.2;
        server 10.0.0.3;
}
server{
        listen 80;
        server_name www.e.com;
        location / {
                proxy_pass http://load5/site5/;
                proxy_set_header Host $host:80;
        }

}
----------------------------------------------------
# 修改Nginx 配置文件nginx.conf
[root@Lab-03-Task-01 nginx]# vi /usr/local/nginx/conf/nginx.conf
-------------------- nginx.conf ------------------
# 在文件中添加以下内容
 include /usr/local/nginx/conf.d/*.conf;
----------------------------------------------------

# 重新加载Nginx
[root@Lab-03-Task-01 nginx]# ./sbin/nginx -s reload

(3)完成服务器防火墙的配置。

# 添加防火墙策略
[root@Lab-03-Task-01 nginx]# firewall-cmd --zone=public --add-port=80/tcp --permanent
[root@Lab-03-Task-01 nginx]# firewall-cmd --reload
[root@Lab-03-Task-01 nginx]# firewall-cmd --list-all
# 配置SELinux
[root@Lab-03-Task-01 nginx]# setenforce 0
# 修改SELinux配置文件
[root@Lab-03-Task-01 nginx]# sed -i "s/SELINUX=enforcing/SELINUX=permissive/g" /etc/selinux/config
# 重启Nginx服务器
[root@Lab-03-Task-01 nginx]# reboot

4、配置Nginx状态监控

在VM-Lab-03-Task-01-172.31.0.31主机上操作,配置Nginx并实现服务监控。

Nginx提供了一个内置的状态信息监控页面可用于监控Nginx的整体访问情况,这个功能由ngx_http_stub_status_module模块进行实现。

配置Nginx实现监控。

# 修改Nginx 配置文件,添加以下内容
[root@Lab-03-Task-01 ~]# vi /usr/local/nginx/conf/nginx.conf
-------------------- nginx.conf ------------------
server {
        listen *:80 default_server;
        server_name _;
        location /nginx_status {
        stub_status on;
        access_log off;
        allow 172.31.0.31;
        #deny all;
        }
}
--------------------------------------------------

[root@Lab-03-Task-01 nginx]# ./sbin/nginx -s reload

# 在本地浏览器上通过访问http://172.31.0.31/nginx_status可查看Nginx的状态信息

5、访问测试

在本地主机上配置hosts文件(文件访问路径 C:\Windows\System32\drivers\etc\hosts),依次通过浏览器进行域名访问测试。

#hosts文件内容
172.31.0.31    www.a.com
172.31.0.31    www.b.com
172.31.0.31    www.c.com
172.31.0.31    www.d.com
172.31.0.31    www.e.com

测试完成后,不同场景下的测试结果如表4所示:

表4测试结果表

场景测试步骤测试结果
场景一两台内部服务器均正常,进行访问测试。查看Nginx状态监控。两台正常,可以访问,负载均衡。
场景二手动关闭内部网站服务器-1,进行网站访问测试。查看Nginx状态监控。单台故障,可以访问,说明容灾。
场景三手动关闭内部网站服务器-1和网站服务器-2,进行网站访问测试。查看Nginx状态监控。全部故障,不可访问。

八、实验考核

实验考核分为【实验随堂查】和【实验线上考】两个部分。

实验随堂查:每个实验设置5个考核点。完成实验任务后,按照考核点要求,学生提交实验成果的截图或录屏视频。通过线上考核平台(如课堂派)进行作答。依据提交成果进行评分。

实验线上考:每个实验设置5道客观题。通过线上考核平台(如课堂派)进行作答。系统自动评分。

1、实验随堂查

本实验随堂查设置提交实验成果-5个截图/视频,具体如下:

题目1[文件题]:提交通过内部主机访问内部服务器发布的网站截图;

题目2[文件题]:提交使用域名能够访问到发布的网站截图;

题目3[文件题]:提交在两台内部服务器均正常的情况下进行访问测试,查看Nginx状态监控,结果为两台正常,可以访问,负载均衡的网站截图;

题目4[文件题]:提交在手动关闭内部网站服务器-1,进行网站访问测试,查看Nginx状态监控,结果为单台故障,可以访问,说明容灾的网站截图;

题目5[文件题]:提交在手动关闭内部网站服务器-1和网站服务器-2,进行网站访问测试。查看Nginx状态监控,结果为全部故障,不可访问的网站截图;

2、实验线上考

本实验线上考共5题。