Skip to content

反向代理实战

1. 反向代理介绍

所谓代理功能,就是用户和应用服务器之间,Nginx只是转发请求,传递数据作用(类似中间商),不处理数据业务。所谓反向代理是服务器端的代理,代表服务器接收客户端请求,隐藏真实服务器。 Alt text 从图中看出代理服务器(比如Nginx)是和服务器是在一起的,客户端无法感知真实的服务器。

2. 正向代理介绍

正向代理是客户端的代理,代表客户端向服务器发送请求,隐藏真实客户端。常见于公司内部上网,科学上网、内网穿透场景。 Alt text 此时外网是无法感知真实的客户端信息。 正向代理由于是代理客户端请求,当请求过于频繁和客户端较多时,正向代理服务器的压力会变得很大,造成整个系统的性能瓶颈。

3. Nginx反向代理应用

3.1 传统系统中Nginx的反向代理应用

Alt text

3.2 中小型互联网中Nginx的反向代理应用

Alt text

4. Nginx反向代理配置

主要涉及的配置就是proxy_pass,在http块->server子块->location子块中。proxy_pass不能和(root属性、index属性同时存在),修改nginx.conf文件:

ini
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  mvnhub.com;

        location / {
		    proxy_pass  http://jiebaba.cn;
            #root   /www/www;
            #index  index.html index.htm;
        }

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

运行效果: Alt text 但是配置qq.com,会发现nginx并不能直接代理,而是通过302重定向转向https://qq.com。这是因为proxy_pass如果反向代理的地址是https类型的话,需要配置https相关证书才能生效。

5. 配置负载均衡

反向代理一个重要的应用就是支持负载均衡特性。由于负载均衡特性是作用在多个主机上面,直接在proxy_pass后面接上一个ip地址就不合适了,需要使用upstream配置,在upstream配置块中可以配置多个机器的地址信息,一般我们配置2个以上。

5.1 前期准备

提前安装三台nginx服务器:hadoop102, hadoop103, hadoop104, 其中hadoop103, hadoop104在/www/www/目录下分别创建index.html文件:

html
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<h2>这是首页, 我是hadoop103</h2>
</body>
</html>

hadoop104机器上就改成我是hadoop104即可。

5.2 修改nginx配置

这里我们使用hadoop102作为负载均衡器,去反向代理hadoop103, hadoop104。所以修改hadoop102的nginx.conf配置文件,在http块->server子块->添加upstream:

ini
worker_processes  1;

events {
    worker_connections  1024;
}

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

    upstream load_balance_info{
        server 192.168.101.103:80;
        server 192.168.101.104:80;
    }

    server {
        listen       80;
        server_name  mvnhub.com;

        location / {
		    proxy_pass  load_balance_info;
        }

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