140、【JavaEE】【Nginx】反向代理

1、概述

  • 反向代理,即服务器端的代理。用户并不知道反向代理的存在。由反向代理服务器接收请求然后转发给真正的服务器,服务器的响应再通过反向代理服务器返回给用户。

  • Nginx 实现反向代理的基础是虚拟主机,因为真正的服务器对于 Nginx 而言就是一个虚拟主机,只不过在配置的时候最起码要配置真正服务器的地址。

2、举例

2.1、使用 Nginx 反向代理与其部署在同一机器上的 Tomcat

  • 为了最佳效果,还需借助“本地 DNS” — hosts文件。在hosts文件中配置一个域名(www.nginxtest.com),映射到部署 Nginx 的主机 IP 地址中。

  • 部署 Nginx 和 Tomcat 的主机的 IP 地址是192.168.3.42(举例使用的是虚拟机)

  • 正常情况下,Tomcat 启动之后,使用http://192.168.3.42:8080就能访问到。但是“反向代理”要实现的是:通过 Nginx,使用www.nginxtest.com也能访问到 Tomcat。

Nginx-30
  • 1、开启 Tomcat,开放防火墙的8080端口,访问http://192.168.3.42:8080,验证 Tomcat 是否正常。
Nginx-31
  • 2、配置hosts:
Nginx-32
  • 3、Nginx 配置文件:
worker_processes  1;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  www.nginxtest.com;

        location / {
            proxy_pass http://192.168.3.42:8080; # 反向代理的关键,使用 proxy_pass 配置要代理的真实 IP 地址
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }    
    }
}

关于 server 块中的 server_name 不理解的可以参考:139、【JavaEE】【Nginx】虚拟主机配置 最后的流程图

  • 4、启动 Nginx 或已启动重新加载配置文件。在浏览器上输入http://www.nginxtest.com,可以看到 Tomcat 的页面,说明反向代理成功。
Nginx-33

2.2、使用 Nginx 反向代理与其部署在不同一机器上的 Tomcat

  • 原理跟“2.1、使用 Nginx 反向代理与其部署在同一机器上的 Tomcat”是一样的。只需要修改 Nginx 配置文件中对应 server 块中的proxy_pass指令即可(比如说proxy_pass http://192.168.3.55:8080等)。

2.3、使用 Nginx 反向代理多个 Tomcat

一般情况:

  • 如果每个 Tomcat 部署的是不同的内容,打算使用不同域名,那么这个时候,多个 Tomcat 就需要多个 server 块。

  • 如果每个 Tomcat 部署的内容相同,目的是为了降低服务器压力,这个时候使用一个 server 块即可,但需要进行一些与“负载均衡”有关的配置。

3、反向代理中 Nginx 配置文件中的 server 块

worker_processes  1;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  www.nginxtest.com;

        location / {
            proxy_pass http://192.168.3.42:8080;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }    
    }
}
  • listen:Nginx 所监听的本机(部署并启动 Nginx 的主机)端口。

  • server_name:虚拟主机名称,见 139、【JavaEE】【Nginx】虚拟主机配置 最后的“流程图”。

  • location 块:路由,一个 server 块中可以有多个 location 块。

常见 location 块的通式是:

location [=|~|~*|^~|@] /pattern/ {
    # ······
}

其中,location后的部分是定义的路由(映射)规则。通过指定模式来与客户端请求的 URI 相匹配。


https://segmentfault.com/a/1190000013267839

Nginx-34

https://blog.csdn.net/weixin_44367006/article/details/101715799

Nginx-35

proxy_pass:代理转发,被代理的真实服务器的 IP、端口等。

关于proxy_pass注意事项:https://blog.csdn.net/weixin_42170236/article/details/109315541

Nginx-38

4、总结

  • 使用 Nginx 作为反向代理服务器,可以直接将其看作“其所代理的服务器”,否则对一些现象很难理解。

比如说:Nginx 的配置文件如下:

worker_processes  1;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

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

浏览器访问http://192.168.3.42,然后看到 Tomcat 页面,没有问题:

Nginx-39

当修改 Nginx 配置文件中的location

worker_processes  1;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        location = / {
            proxy_pass http://192.168.3.42:8090;
        }
    }
}

浏览器再次访问http://192.168.3.42,看到的结果:

Nginx-40

发现一些静态资源(CSS 等)无法加载。

Nginx-41

通过浏览器控制台,看到相关静态资源的响应码是404,但是“请求网址”是http://192.168.3.42/tomcat.css,而不是http://192.168.3.42:8090/tomcat.css

原因是在 Nginx 的配置文件中只提供了location = / {······}这一精确路由(使用=
页面中的<link href="tomcat.css" rel="stylesheet" type="text/css" />等转化为 HTTP 请求,由于 Nginx 中存在精确路由,所以请求的是http://192.168.3.42/tomcat.css(成功被代理)。但是 Nginx 并没有提供其他的路由与之匹配,导致404。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容