Linux云计算架构-使用nginx进行反向代理、负载均衡、动静分离

Linux云计算架构-使用nginx进行反向代理、负载均衡、动静分离

nginx下载地址:http://nginx.org/en/download.html

tomcat下载地址:https://tomcat.apache.org/download-90.cgi

实验版本nginx1.19.2 tomcat9.0.37

1. 下载并启动tomcat

[root@master ~]# cd /usr/local/
[root@master local]# rz

[root@master local]# ll apache-tomcat-9.0.37.tar.gz
-rw-r--r-- 1 root root 11211292 8月  27 20:35 apache-tomcat-9.0.37.tar.gz
[root@master local]# tar xzf apache-tomcat-9.0.37.tar.gz
# 对解压包重命名,是因为在生产环境中可能需要多个tomcat进行负载均衡。
[root@master local]# mv apache-tomcat-9.0.37 tomcat0
[root@master local]# cd tomcat0/
[root@master tomcat0]# ll
总用量 124
drwxr-x--- 2 root root  4096 8月  27 20:40 bin
-rw-r----- 1 root root 18982 7月   1 04:14 BUILDING.txt
drwx------ 2 root root   238 7月   1 04:14 conf
-rw-r----- 1 root root  5409 7月   1 04:14 CONTRIBUTING.md
drwxr-x--- 2 root root  4096 8月  27 20:40 lib
-rw-r----- 1 root root 57092 7月   1 04:14 LICENSE
drwxr-x--- 2 root root     6 7月   1 04:09 logs
-rw-r----- 1 root root  2333 7月   1 04:14 NOTICE
-rw-r----- 1 root root  3255 7月   1 04:14 README.md
-rw-r----- 1 root root  6898 7月   1 04:14 RELEASE-NOTES
-rw-r----- 1 root root 16262 7月   1 04:14 RUNNING.txt
drwxr-x--- 2 root root    30 8月  27 20:40 temp
drwxr-x--- 7 root root    81 7月   1 04:12 webapps
drwxr-x--- 2 root root     6 7月   1 04:09 work
# 启动tomcat,默认端口号是8080
[root@master tomcat0]# ./bin/startup.sh 
Using CATALINA_BASE:   /usr/local/tomcat0
Using CATALINA_HOME:   /usr/local/tomcat0
Using CATALINA_TMPDIR: /usr/local/tomcat0/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat0/bin/bootstrap.jar:/usr/local/tomcat0/bin/tomcat-juli.jar
Tomcat started.
[root@master tomcat0]# ps aux | grep 8080
root      10840  0.0  0.0 112724   988 pts/0    S+   20:46   0:00 grep --color=auto 8080
[root@master tomcat0]# firewall-cmd --permanent --zone=public --add-port=8080/tcp
success
[root@master tomcat0]# firewall-cmd --reload
success

在这里插入图片描述

2. nginx反向代理

正向代理:用户和服务器之间的连接桥梁【用户做的桥梁】
反向代理:用户和服务器之间的连接桥梁【服务器做的桥梁】
举例:

用户A想访问微博,不能直接访问微博,所以用户A找了用户B,通过用户B去访问微博。这叫正向代理
用户A想访问微博,不能直接访问微博,只能直接访问百度,微博把其上的资源放到了百度上,当用户访问微博的资源时,百度就给予回应。这叫反向代理。

Nginx反向代理,即是指用户访问nginx,而nginx把资源放到tomcat上,用户请求nginx的资源时,tomcat就会回应用户,并返回相应资源。
nginx是一个web服务器,速度快,但是不能作为Servlet 容器独立运行。所以通常的工作方式是Nginx配合Tomcat来协同工作。 这就是为什么要单独提供Tomcat,以方便配合Nginx进行工作。

直接访问192.168.8.184,即是访问nginx服务的80端口号。

在这里插入图片描述

访问192.168.8.184:8080,即是访问tomcat服务的8080端口号。

在这里插入图片描述

反向代理:访问192.168.8.184上的资源,而nginx把请求资源存放到了tomcat上,故会访问到192.168.8.184:8080上面的资源。

# 配置代码
[root@master ~]# vim /usr/local/nginx/conf/nginx.conf
 45         location / {
    
    
 46             root   html;
 47             proxy_pass http://192.168.8.184:8080/;   # proxy_pass反向代理
 48             index  index.html index.htm;
 49         }
[root@master ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@master ~]# nginx -s reload
# 再次访问192.168.8.184,可以看到如下内容,而不再是haha

在这里插入图片描述

3. nginx负载均衡

nginx的upstream负载有5种方式:
①轮询(默认)
②按weight分配
③ip_hash,同一客户端访问同一后端服务器。
④fair,按后端服务器的响应时间分配请求,响应时间短的先分配。
⑤url_hash,相同url请求分配到同一后端服务器。常用于后端服务器为缓存服务器的场景。

为了达到负载均衡的效果,这里使用2个tomcat来提供服务。

# 查看下8081端口号是否被占用,发现没有,那么tomcat可以使用8081端口号。

[root@master webapps]# netstat -antup | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      10736/java          
[root@master webapps]# netstat -antup | grep 8081

# 查看下8086端口号是否被占用,发现没有,那么tomcat可以使用8086端口号作为关闭服务的端口。
[root@master webapps]# netstat -antup | grep 8086

# 部署tomcat1
[root@master ~]# cd /usr/local/
[root@master local]# ll apache-tomcat-9.0.37.tar.gz 
-rw-r--r-- 1 root root 11211292 8月  27 20:35 apache-tomcat-9.0.37.tar.gz
[root@master local]# tar xzf apache-tomcat-9.0.37.tar.gz
[root@master local]# mv apache-tomcat-9.0.37 tomcat1 
[root@master local]# vim ./tomcat1/conf/server.xml
 22 <Server port="8006" shutdown="SHUTDOWN">         # 停止tomcat服务端口号,默认8005

 69     <Connector port="8081" protocol="HTTP/1.1"   # 访问http端口号,默认8080
 70                connectionTimeout="20000"
 71                redirectPort="8443" />
 
 
[root@master ~]# /usr/local/tomcat1/bin/startup.sh 
Using CATALINA_BASE:   /usr/local/tomcat1
Using CATALINA_HOME:   /usr/local/tomcat1
Using CATALINA_TMPDIR: /usr/local/tomcat1/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat1/bin/bootstrap.jar:/usr/local/tomcat1/bin/tomcat-juli.jar
Tomcat started.
[root@master local]# firewall-cmd --permanent --zone=public --add-port=8081/tcp
success
[root@master local]# firewall-cmd --reload 
success

# 可以看到8080和8081都已经开启了。
[root@master local]# netstat -antup | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      10736/java          
[root@master ~]# netstat -antup | grep 8081
tcp6       0      0 :::8081                 :::*                    LISTEN      12533/java     

访问http://192.168.8.184:8081/,结果如下:

在这里插入图片描述

# 部署nginx负载均衡
[root@master ~]# vim /usr/local/nginx/conf/nginx.conf
 35     upstream tomcat_local{
    
         # upstream负载均衡器
 36         server 192.168.8.184:8080 weight=1;
 37         server 192.168.8.184:8081 weight=2;
 38     }
 39 
 40     server {
    
    
 41         listen       80;
 42         server_name  localhost;
 43 
 44         #charset koi8-r;
 45 
 46         #access_log  logs/host.access.log  main;
 47 
 48         location / {
    
    
 49             root   html;
 50             proxy_pass http://tomcat_local;
 51             index  index.html index.htm index.jsp;
 52             proxy_set_header Host $host:$server_port;
 53             proxy_set_header X-Real-IP $remote_addr;
 54             proxy_set_header REMOTE-HOST $remote_addr;
 55             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 56         }

[root@master ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@master ~]# nginx -s reload

# 我这里换了个局域网,IP地址换了,不影响测试。

在这里插入图片描述

在这里插入图片描述

通过访问一次页面产生的访问日志可以看出,tomcat1的日志多余tomcat0,就是说nginx把比较多请求交给了tomcat1处理,而tomcat0比较少,比例即为weight的比值。

4. nginx动静分离

静态资源: 当用户多次访问这个资源,资源的源代码基本不会发生改变的资源。【图片、css、js】
动态资源:当用户多次访问这个资源,资源的源代码可能会发生改变。【jsp】
动静分离:静态资源交由nginx直接处理,而nginx不好处理的动态资源反代到tomcat处理,从而达到动静分离的效果。
在这里插入图片描述
①修改nginx服务的主配置文件,要重启nginx服务。将静态资源交由nginx处理,tomcat只处理动态资源。

# 动静分离配置	
		location / {
    
    
          #   root   html;
            proxy_pass http://192.168.137.7:8080;   # 把请求的所有资源都反代到tomcat上
          #   index  index.html index.htm index.jsp;
          #  proxy_set_header Host $host:$server_port;
          #  proxy_set_header X-Real-IP $remote_addr;
          #  proxy_set_header REMOTE-HOST $remote_addr;
          #  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        location ~ .*\.(css|js|png) {
    
                   # 如果是该类型的资源,直接在nginx上处理
           root /usr/local/tomcat0/webapps/ROOT/;    # 静态资源nginx直接处理,其余的反代到tomcat上处理。要声明nginx直接处理的静态资源存放目录,并授予755权限。
        }
        
        
# 动静分离思想:
①由于请求是先经过nginx的,静态资源在经过nginx的时候就会被直接处理,不会反向代理到tomcat上,而动态资源nginx不处理,会被反向代理到tomcat上进行处理。【如上述配置,这种方法适合做负载均衡】
②由于请求是先经过nginx的,可以判断该资源是否是动态资源,是的话反向代理到tomcat上处理。【如下配置,这种方法不适合做负载均衡】
        location / {
    
    
            root /usr/local/tomcat0/webapps/ROOT/;   # 请求资源目录
            index index.html index.htm index.jsp;    # 允许请求的资源类型
        }
        location ~ .*\.(jsp|css)$ {
    
                      # 筛选出jsp和css类型
            proxy_pass http://192.168.137.7:8080;    # 把这些类型反代到tomcat上处理
           # proxy_set_header Host $host:$server_port;
           # proxy_set_header X-Real-IP $remote_addr;
           # proxy_set_header REMOTE-HOST $remote_addr;
           # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

②输入网址http://192.168.137.7/,并查看tomcat的访问情况,可以看到tomcat提供的是动态资源。
在这里插入图片描述

nginx服务在处理静态文件的吞吐量上优于tomcat,故nginx直接处理静态资源,而nginx不好处理的动态资源交由tomcat直接处理,从而达到动静分离的效果。

5. nginx动静分离和负载均衡、反向代理结合

  • 若使用了Nginx动静分离,则请求中所有的静态资源都由nginx处理,tomcat则不再处理静态资源。
  • 若使用了Nginx负载均衡,则请求的所有资源按权重进行分配给相应的tomcat处理。
  • 若同时使用了Nginx动静分离和负载均衡,则静态资源由nginx处理,动态资源按权重分配给tomcat处理。
    upstream tomcat_local {
    
    
     server 192.168.8.186:8080 weight=1;
     server 192.168.8.186:8081 weight=2;
   }

    server {
    
    
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
        location / {
    
                           # 资源都反向代理到tomcat上分发处理
            root html;
            proxy_pass http://tomcat_local;
            proxy_set_header Host $host:$server_port;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
        location ~ .*\.(css|js|png) {
    
           # 静态资源单独获取
            root /usr/local/tomcat0/webapps/ROOT/;
        }
# 在生产环境中,要做到真正的动静分离,要把动态资源和静态资源分开存放。静态资源一般存放在nginx的网站数据目录下。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_36522099/article/details/108286536
今日推荐