Nginx系列(二)反向代理案例和负载均衡

一、什么是反向代理?

正向代理:客户端配置代理服务器,通过代理服务器进行访问
反向代理:请求访问代理服务器,由反向服务器选择目标服务器返回访问服务器,暴露的是代理服务器的ip和端口,隐藏了真实服务器的IP地址

下面将进行两个反向代理的案例

案例一:输入域名后,反向代理到另外一个ip的端口

1.1.1 环境准备

  • Nginx的安装
  • JDK的安装
  • docker 安装tomcat
  • 修改windows的hosts文件

扩展学习:docker启动tomcat

shell>mkdir -p /data/app/tomcat8090/test
shell>cd /data/app/tomcat8090/test
shell>echo "The port is 8090" >> a.html
shell>sudo docker run -itd -p 8090:8080 --name my_tomcat -v /data/app/tomcat8090:/usr/local/tomcat/webapps tomcat:8.5

访问测试,输入http://ip:8090/test/a.html

新兴技术能力Nginx系列(二)反向代理案例和负载均衡插图

tomcat部署成功

1.1.2 修改nginx配置文件

带端口访问:http://www.abc.com:8090/test/a.html

由于文件监听的是8090端口

worker_processes  1;


events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    server {
        listen       8090;
        server_name  192.168.8.21;

        location / {
          proxy_pass http://127.0.0.1:8090;
        }


    }

}
新兴技术能力Nginx系列(二)反向代理案例和负载均衡插图1

如何让链接可以不戴端口呢?我们只需要把监听端口改成80即可

worker_processes  1;


events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    server {
        listen       80;
        server_name  192.168.8.21;

        location / {
          proxy_pass http://127.0.0.1:8090;
        }


    }

}
新兴技术能力Nginx系列(二)反向代理案例和负载均衡插图2

方案二、根据访问的路径自动跳转到不同的服务器

例如:

  • 当访问的路径http://192.168.8.21/test/edu/a.html 跳转到 http://192.168.8.21:8090/test/edu/a.html
  • 当访问的路径http://192.168.8.21/test/vod/a.html 跳转到 http://192.168.8.21:8091/test/vod/a.html

1.2.1 环境准备

  • 安装nginx
  • 安装JDK
  • 安装两个tomcat
####docker 安装tomcat1
shell>mkdir -p /data/app/tomcat8090/test/edu /data/app/tomcat8091/test/vod
shell>cd /data/app/tomcat8090/test/edu
shell>echo "edu:The port is 8090" >> a.html
shell>sudo docker run -itd -p 8090:8080 --name my_tomcat -v /data/app/tomcat8090:/usr/local/tomcat/webapps tomcat:8.5
####docker 安装tomcat2
shell>cd /data/app/tomcat8091/test/vod
shell>echo "vod:The port is 8091" >> a.html
shell>sudo docker run -itd -p 8091:8080 --name my_tomcat2 -v /data/app/tomcat8091:/usr/local/tomcat/webapps tomcat:8.5

1.2.2 修改Nginx的配置文件

worker_processes  1;


events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    server {
        listen       80;
        server_name  192.168.8.21;

        location ~ /edu/ {
          proxy_pass http://127.0.0.1:8090;
        }

        location ~ /vod/ {
          proxy_pass http://127.0.0.1:8091;
        }
        
    }

}
新兴技术能力Nginx系列(二)反向代理案例和负载均衡插图3
新兴技术能力Nginx系列(二)反向代理案例和负载均衡插图4

三、负载均衡

负载均衡的定义:

随着访问量的增加,把请求分开到不同的服务器中,达到负载均衡的效果。

Nginx负载均衡的模式主要分为以下四种

  • 轮询(默认):按时间排序
  • weight(权重):权重越大,分配越多
  • ip_hash:根据访问IP转换的hashcode分配,每个访问的IP固定服务器
  • fair:按后端服务器反映时间来分配

3.1 负载均衡案例(一)

效果:访问www.abc.com/test/edu/b.html,会跳转到不同端口/服务器的文件

3.1.1 环境准备

  • Nginx的安装
  • JDK的安装
  • docker 安装tomcat1、tomcat2
  • 修改windows的hosts文件
  • 在tomcat1、tomcat2中创建相同的b.html
####docker 安装tomcat1
shell>mkdir -p /data/app/tomcat8090/test/edu /data/app/tomcat8091/test/edu
shell>cd /data/app/tomcat8090/test/edu
shell>echo "edu:The port is 8090" >> b.html
shell>sudo docker run -itd -p 8090:8080 --name my_tomcat -v /data/app/tomcat8090:/usr/local/tomcat/webapps tomcat:8.5
####docker 安装tomcat2
shell>cd /data/app/tomcat8091/test/edu
shell>echo "edu:The port is 8091" >> b.html
shell>sudo docker run -itd -p 8091:8080 --name my_tomcat2 -v /data/app/tomcat8091:/usr/local/tomcat/webapps tomcat:8.5

3.1.2 修改nginx的conf配置文件


worker_processes  1;


events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    
    upstream myserver {
       # ip_hash;
        server 192.168.8.21:8090;
        server 192.168.8.21:8091;
    }


    server {
        listen       80;
        server_name  192.168.8.21;

        location / {
          proxy_pass http://myserver;
        }

        
    }

}
新兴技术能力Nginx系列(二)反向代理案例和负载均衡插图5
新兴技术能力Nginx系列(二)反向代理案例和负载均衡插图6
新兴技术能力Nginx系列(二)反向代理案例和负载均衡插图7

如果使用权重的方式呢?

新兴技术能力Nginx系列(二)反向代理案例和负载均衡插图8

四、Nginx动静分离

一般为了提高性能,都会把静态资源和动态资源分开部署。

案例一:实现动静分离

4.1 环境准备

  • Nginx的安装
  • JDK的安装
  • docker 安装tomcat1
  • 修改windows的hosts文件
  • 服务器中创建两个静态资源html和图片
  • 修改nginx.conf
####docker 安装tomcat1
shell>mkdir -p /data/app/www/html /data/app/www/img /data/app/tomcat8090/test/edu
shell>cd /data/app/www/html
shell>echo "This is a html page" >> b.html
shell>cd /data/app/www/img
####通过rz命令上传图片
shell>rz
####启动动态资源
shell>cd /data/app/tomcat8090/test/edu
shell>echo "edu:The port is 8090" >> b.html
shell>sudo docker run -itd -p 8090:8080 --name my_tomcat -v /data/app/tomcat8090:/usr/local/tomcat/webapps tomcat:8.5

4.2 修改nginx.conf文件

worker_processes  1;


events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    upstream myserver {
       # ip_hash;
        server 192.168.8.21:8090 weight=5;
        server 192.168.8.21:8091 weight=10;
    }


    server {
        listen       80;
        server_name  192.168.8.21;

         location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css){
           root   /data/app/www;
           expires 7d;
         }


       # location / {
       #   proxy_pass http://myserver;
       # }


    }

}
新兴技术能力Nginx系列(二)反向代理案例和负载均衡插图9

关于更多的nginx知识,可以参考这个帖子

https://juejin.cn/post/7112826654291918855#heading-3

包括Nginx的高可用方案