一、Nginx反向代理(七层代理)二、Nginx的TCP/UDP调度器(四层代理)

复制代码
一、Nginx反向代理(七层代理)
实验要求
使用Nginx实现Web反向代理功能,实现如下功能: 
    后端Web服务器两台,可以使用httpd实现
    Nginx采用轮询的方式调用后端Web服务器
    两台Web服务器的权重要求设置为不同的值
    最大失败次数为2,失败超时时间为30秒
实验环境
以下机器全部已经存在,无须再次配置

主机名	IP地址	角色
server1(已存在)	eth0:192.168.99.254/24	客户端
proxy(已存在)	eth1:192.168.99.5/24	代理服务器
web1(已存在)	eth1:192.168.99.100/24	web服务器
web2(已存在)	eth1:192.168.99.200/24	web服务器
image-20241008213058281

 

1)部署后端Web服务器
1)部署后端Web1服务器
后端Web服务器可以简单使用yum方式安装httpd实现Web服务,为了可以看出后端服务器的不同,可以将两台后端服务器的首页文档内容设置为不同的内容
[root@web1 ~]# yum -y install httpd
[root@web1 ~]# echo "web1" > /var/www/html/index.html
[root@web1 ~]# systemctl enable --now httpd

2)部署后端Web2服务器
[root@web2 ~]# yum -y install  httpd
[root@web2 ~]# echo "web2" > /var/www/html/index.html
[root@web2 ~]# systemctl enable --now httpd

3)使用proxy主机测试
[root@proxy ~]# curl 192.168.99.100
web1
[root@proxy ~]# curl 192.168.99.200
web2
2)配置Nginx代理服务器
添加服务器池,实现反向代理功能

之前proxy主机安装的nginx已经改过很多配置,避免实验冲突,先还原proxy主机的nginx,重新安装nginx
[root@proxy ~]# /usr/local/nginx/sbin/nginx  -s stop    #如果之前没有启动,可以不用执行停止的命令
[root@proxy ~]# rm -rf /usr/local/nginx/
[root@proxy ~]# cd /root/lnmp_soft/
[root@proxy lnmp_soft]# rm -rf nginx-1.22.1
[root@proxy lnmp_soft]# tar -xf nginx-1.22.1.tar.gz
[root@proxy lnmp_soft]# cd nginx-1.22.1/
[root@proxy nginx-1.22.1]# yum -y install gcc make pcre-devel openssl-devel
[root@proxy nginx-1.22.1]# ./configure 
[root@proxy nginx-1.22.1]# make && make  install    

1)修改nginx的配置文件
[root@proxy nginx-1.22.1]# vim /usr/local/nginx/conf/nginx.conf
...
http {
...
#使用upstream定义后端服务器集群,集群名称任意(如webserver)
#使用server定义集群中的具体服务器和端口
      upstream webserver {
         server 192.168.99.100:80;
         server 192.168.99.200:80;
        }
      server {
          listen       80;
          server_name  localhost;
          
          #charset koi8-r;
          
          #access_log  logs/host.access.log  main;
  
          location / {
              root   html;
              index  index.html index.htm;
              proxy_pass http://webserver;  #通过proxy_pass将用户的请求转发给webserver集群
          }
 ...
 
2)启动nginx
[root@proxy nginx-1.22.1]# /usr/local/nginx/sbin/nginx

3)使用真机浏览器做测试192.168.99.5,刷新可以看到网站的轮询效果,出现结果为 web1 或者 web2
3)配置upstream服务器集群池属性
1)设置权重
weight可以设置后台服务器的权重,权重越大任务的分配量就越大
[root@proxy nginx-1.22.1]# vim /usr/local/nginx/conf/nginx.conf
.. ..
      upstream webserver {
         server 192.168.99.100:80 weight=2;
         server 192.168.99.200:80;
        }
      server {
 .. ..

2)重新加载配置并访问,可以看到web1的任务量增加
[root@proxy nginx-1.22.1]# /usr/local/nginx/sbin/nginx -s reload

真机浏览器测试http://192.168.99.5,不太明显
可以使用命令行测试
[root@server1 ~]# curl 192.168.99.5
web1
[root@server1 ~]# curl 192.168.99.5
web2
[root@server1 ~]# curl 192.168.99.5
web1
[root@server1 ~]# curl 192.168.99.5
web1

3)设置健康检查max_fails可以设置后台服务器连不上的失败次数,fail_timeout可以设置后台服务器的失败超时时间,等待多长时间再次尝试连接
[root@proxy nginx-1.22.1]# vim /usr/local/nginx/conf/nginx.conf
...
      upstream webserver {
         server 192.168.99.100:80;
         server 192.168.99.200:80 max_fails=2 fail_timeout=30;
        }
      server {
 ...

4)重新加载配置并访问
[root@proxy nginx-1.22.1]# /usr/local/nginx/sbin/nginx -s reload

测试时,先将web2的httpd服务关闭
[root@web2 ~]# systemctl stop  httpd

使用真机命令行访问集群页面curl 192.168.99.5,只会显示web1的页面
[root@server1 ~]# curl 192.168.99.5
web1
[root@server1 ~]# curl 192.168.99.5
web1

此时即使将web2的httpd服务开启也无效,因为要等待30秒
[root@web2 ~]# systemctl start  httpd
[root@server1 ~]# curl 192.168.99.5 #30秒之后再访问,web2会出现
web2
4)配置upstream服务器集群的调度算法
测试ip_hash
1)设置相同客户端访问相同Web服务器
[root@proxy nginx-1.22.1]# vim /usr/local/nginx/conf/nginx.conf
...
      upstream webserver {
         ip_hash;
         server 192.168.99.100:80;
         server 192.168.99.200:80;
        }
      server {
...
2)重新加载配置
[root@proxy nginx-1.22.1]# /usr/local/nginx/sbin/nginx -s reload

3)测试只会见到一个页面
[root@server1 ~]# curl 192.168.99.5
web1
[root@server1 ~]# curl 192.168.99.5
web1
添加down标记
down标记可以让集群主机暂时不参与集群活动
[root@proxy nginx-1.22.1]# vim /usr/local/nginx/conf/nginx.conf
...
      upstream webserver {
         server 192.168.99.100:80;
         server 192.168.99.200:80 down;
        }
      server {
 ...
重新加载配置
[root@proxy nginx-1.22.1]# /usr/local/nginx/sbin/nginx -s reload

测试,只会见到web1
[root@server1 ~]# curl 192.168.99.5
web1
[root@server1 ~]# curl 192.168.99.5
web1



二、Nginx的TCP/UDP调度器(四层代理)


实验要求
使用Nginx实现TCP/UDP调度器功能,实现如下功能: 
    后端SSH服务器两台
    Nginx编译安装时需要使用--with-stream,开启ngx_stream_core_module模块
    Nginx采用轮询的方式调用后端SSH服务器
实验环境
以下机器全部已经存在,无须再次配置

主机名	IP地址	角色
server1(已存在)	eth0:192.168.99.254/24	客户端
proxy(已存在)	eth1:192.168.99.5/24	代理服务器
web1(已存在)	eth1:192.168.99.100/24	ssh服务器
web2(已存在)	eth1:192.168.99.200/24	ssh服务器
image-20241008213311333

 

1)部署nginx服务
支持4层TCP/UDP代理的Nginx服务器 

1)部署nginx服务器
编译安装必须要使用--with-stream参数开启4层代理模块
[root@proxy nginx-1.22.1]# /usr/local/nginx/sbin/nginx -s stop
[root@proxy nginx-1.22.1]# rm -rf /usr/local/nginx/
[root@proxy nginx-1.22.1]# cd /root/lnmp_soft/nginx-1.22.1/
[root@proxy nginx-1.22.1]# yum -y install gcc make pcre-devel openssl-devel
[root@proxy nginx-1.22.1]# ./configure --with-stream                    #开启4层代理功能
[root@proxy nginx-1.22.1]# make && make install
[root@proxy nginx-1.22.1]# /usr/local/nginx/sbin/nginx -V           #查看安装模块情况
nginx version: nginx/1.22.1
built by gcc 8.5.0 20210514 (Red Hat 8.5.0-10) (GCC) 
configure arguments: --with-stream
2)配置Nginx服务
添加服务器池,实现四层代理功能

 1)修改nginx配置文件
 [root@proxy nginx-1.22.1]# vim /usr/local/nginx/conf/nginx.conf    #配置写到http的上方即可
...
      stream {
        upstream backend {             #创建集群,名称为backend
            server 192.168.99.100:22;  #后端SSH服务器IP和端口
            server 192.168.99.200:22;
          }
         server {               #调用集群
            listen 12345;       #Nginx代理监听的端口,可以自己定义
            proxy_pass backend; #调用backend集群
          }
     }
http {
.. ..
}
2)启动nginx
[root@proxy nginx-1.22.1]# /usr/local/nginx/sbin/nginx 

3)客户端使用访问代理服务器测试轮询效果
[root@server1 ~]# ssh 192.168.99.5 -p 12345     #使用该命令多次访问查看轮询效果
[root@web1 ~]# exit
[root@server1 ~]# ssh 192.168.99.5 -p 12345
[root@web2 ~]#

一、Nginx反向代理(七层代理)

实验要求

使用Nginx实现Web反向代理功能,实现如下功能:

后端Web服务器两台,可以使用httpd实现

Nginx采用轮询的方式调用后端Web服务器

两台Web服务器的权重要求设置为不同的值

最大失败次数为2,失败超时时间为30秒

实验环境

以下机器全部已经存在,无须再次配置

主机名 IP地址 角色

server1(已存在) eth0:192.168.99.254/24 客户端

proxy(已存在) eth1:192.168.99.5/24 代理服务器

web1(已存在) eth1:192.168.99.100/24 web服务器

web2(已存在) eth1:192.168.99.200/24 web服务器

image-20241008213058281

1)部署后端Web服务器

1)部署后端Web1服务器

后端Web服务器可以简单使用yum方式安装httpd实现Web服务,为了可以看出后端服务器的不同,可以将两台后端服务器的首页文档内容设置为不同的内容

root@web1 \~# yum -y install httpd

root@web1 \~# echo "web1" > /var/www/html/index.html

root@web1 \~# systemctl enable --now httpd

2)部署后端Web2服务器

root@web2 \~# yum -y install httpd

root@web2 \~# echo "web2" > /var/www/html/index.html

root@web2 \~# systemctl enable --now httpd

3)使用proxy主机测试

root@proxy \~# curl 192.168.99.100

web1

root@proxy \~# curl 192.168.99.200

web2

2)配置Nginx代理服务器

添加服务器池,实现反向代理功能

之前proxy主机安装的nginx已经改过很多配置,避免实验冲突,先还原proxy主机的nginx,重新安装nginx

root@proxy \~# /usr/local/nginx/sbin/nginx -s stop #如果之前没有启动,可以不用执行停止的命令

root@proxy \~# rm -rf /usr/local/nginx/

root@proxy \~# cd /root/lnmp_soft/

root@proxy lnmp_soft# rm -rf nginx-1.22.1

root@proxy lnmp_soft# tar -xf nginx-1.22.1.tar.gz

root@proxy lnmp_soft# cd nginx-1.22.1/

root@proxy nginx-1.22.1# yum -y install gcc make pcre-devel openssl-devel

root@proxy nginx-1.22.1# ./configure

root@proxy nginx-1.22.1# make && make install

1)修改nginx的配置文件

root@proxy nginx-1.22.1# vim /usr/local/nginx/conf/nginx.conf

...

http {

...

#使用upstream定义后端服务器集群,集群名称任意(如webserver)

#使用server定义集群中的具体服务器和端口

upstream webserver {

server 192.168.99.100:80;

server 192.168.99.200:80;

}

server {

listen 80;

server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {

root html;

index index.html index.htm;

proxy_pass http://webserver; #通过proxy_pass将用户的请求转发给webserver集群

}

...

2)启动nginx

root@proxy nginx-1.22.1# /usr/local/nginx/sbin/nginx

3)使用真机浏览器做测试192.168.99.5,刷新可以看到网站的轮询效果,出现结果为 web1 或者 web2

3)配置upstream服务器集群池属性

1)设置权重

weight可以设置后台服务器的权重,权重越大任务的分配量就越大

root@proxy nginx-1.22.1# vim /usr/local/nginx/conf/nginx.conf

.. ..

upstream webserver {

server 192.168.99.100:80 weight=2;

server 192.168.99.200:80;

}

server {

.. ..

2)重新加载配置并访问,可以看到web1的任务量增加

root@proxy nginx-1.22.1# /usr/local/nginx/sbin/nginx -s reload

真机浏览器测试http://192.168.99.5,不太明显

可以使用命令行测试

root@server1 \~# curl 192.168.99.5

web1

root@server1 \~# curl 192.168.99.5

web2

root@server1 \~# curl 192.168.99.5

web1

root@server1 \~# curl 192.168.99.5

web1

3)设置健康检查max_fails可以设置后台服务器连不上的失败次数,fail_timeout可以设置后台服务器的失败超时时间,等待多长时间再次尝试连接

root@proxy nginx-1.22.1# vim /usr/local/nginx/conf/nginx.conf

...

upstream webserver {

server 192.168.99.100:80;

server 192.168.99.200:80 max_fails=2 fail_timeout=30;

}

server {

...

4)重新加载配置并访问

root@proxy nginx-1.22.1# /usr/local/nginx/sbin/nginx -s reload

测试时,先将web2的httpd服务关闭

root@web2 \~# systemctl stop httpd

使用真机命令行访问集群页面curl 192.168.99.5,只会显示web1的页面

root@server1 \~# curl 192.168.99.5

web1

root@server1 \~# curl 192.168.99.5

web1

此时即使将web2的httpd服务开启也无效,因为要等待30秒

root@web2 \~# systemctl start httpd

root@server1 \~# curl 192.168.99.5 #30秒之后再访问,web2会出现

web2

4)配置upstream服务器集群的调度算法

测试ip_hash

1)设置相同客户端访问相同Web服务器

root@proxy nginx-1.22.1# vim /usr/local/nginx/conf/nginx.conf

...

upstream webserver {

ip_hash;

server 192.168.99.100:80;

server 192.168.99.200:80;

}

server {

...

2)重新加载配置

root@proxy nginx-1.22.1# /usr/local/nginx/sbin/nginx -s reload

3)测试只会见到一个页面

root@server1 \~# curl 192.168.99.5

web1

root@server1 \~# curl 192.168.99.5

web1

添加down标记

down标记可以让集群主机暂时不参与集群活动

root@proxy nginx-1.22.1# vim /usr/local/nginx/conf/nginx.conf

...

upstream webserver {

server 192.168.99.100:80;

server 192.168.99.200:80 down;

}

server {

...

重新加载配置

root@proxy nginx-1.22.1# /usr/local/nginx/sbin/nginx -s reload

测试,只会见到web1

root@server1 \~# curl 192.168.99.5

web1

root@server1 \~# curl 192.168.99.5

web1

二、Nginx的TCP/UDP调度器(四层代理)

实验要求

使用Nginx实现TCP/UDP调度器功能,实现如下功能:

后端SSH服务器两台

Nginx编译安装时需要使用--with-stream,开启ngx_stream_core_module模块

Nginx采用轮询的方式调用后端SSH服务器

实验环境

以下机器全部已经存在,无须再次配置

主机名 IP地址 角色

server1(已存在) eth0:192.168.99.254/24 客户端

proxy(已存在) eth1:192.168.99.5/24 代理服务器

web1(已存在) eth1:192.168.99.100/24 ssh服务器

web2(已存在) eth1:192.168.99.200/24 ssh服务器

image-20241008213311333

1)部署nginx服务

支持4层TCP/UDP代理的Nginx服务器

1)部署nginx服务器

编译安装必须要使用--with-stream参数开启4层代理模块

root@proxy nginx-1.22.1# /usr/local/nginx/sbin/nginx -s stop

root@proxy nginx-1.22.1# rm -rf /usr/local/nginx/

root@proxy nginx-1.22.1# cd /root/lnmp_soft/nginx-1.22.1/

root@proxy nginx-1.22.1# yum -y install gcc make pcre-devel openssl-devel

root@proxy nginx-1.22.1# ./configure --with-stream #开启4层代理功能

root@proxy nginx-1.22.1# make && make install

root@proxy nginx-1.22.1# /usr/local/nginx/sbin/nginx -V #查看安装模块情况

nginx version: nginx/1.22.1

built by gcc 8.5.0 20210514 (Red Hat 8.5.0-10) (GCC)

configure arguments: --with-stream

2)配置Nginx服务

添加服务器池,实现四层代理功能

1)修改nginx配置文件

root@proxy nginx-1.22.1# vim /usr/local/nginx/conf/nginx.conf #配置写到http的上方即可

...

stream {

upstream backend { #创建集群,名称为backend

server 192.168.99.100:22; #后端SSH服务器IP和端口

server 192.168.99.200:22;

}

server { #调用集群

listen 12345; #Nginx代理监听的端口,可以自己定义

proxy_pass backend; #调用backend集群

}

}

http {

.. ..

}

2)启动nginx

root@proxy nginx-1.22.1# /usr/local/nginx/sbin/nginx

3)客户端使用访问代理服务器测试轮询效果

root@server1 \~# ssh 192.168.99.5 -p 12345 #使用该命令多次访问查看轮询效果

root@web1 \~# exit

root@server1 \~# ssh 192.168.99.5 -p 12345

root@web2 \~#

相关推荐
Dovis(誓平步青云)1 小时前
《Linux CPU频率为何忽高忽低:cpufreq、idle状态与性能抖动教程》
linux·运维·服务器·spring boot·后端·生成对抗网络
小此方1 小时前
Re:Linux系统篇(四十三)信号篇·一:谁在敲进程的门?一篇带你了解信号概念与产生机制
linux·运维·驱动开发
Championship.23.248 小时前
Linux 3.0 锁机制与故障排查详解
linux·运维·服务器
天疆说8 小时前
Zotero Connector 在 Edge 里找不到桌面 Zotero(Linux / Zotero 9.0.6 / Edge 150)
linux·前端·edge
风123456789~10 小时前
【Linux专栏】ls 排除某个文件
linux·运维·服务器
IpdataCloud10 小时前
担心IP暴露隐私?用安全IP查询工具自查,三步配置网络出口
网络·tcp/ip·安全·ip
IT曙光11 小时前
ubuntu apt-get离线源制作
linux·ubuntu
其实防守也摸鱼11 小时前
运维--学习阶段问题解答(1)(自测)
linux·运维·服务器·数据库·学习·自动化·命令模式
懒鸟一枚11 小时前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系
java·linux·数据库
玖玥拾12 小时前
C# 语言进阶(十五)C# 游戏服务端 MySQL 数据库
服务器·开发语言·网络·数据库·mysql·c#