0%

nginx 的反向代理功能

代理的概念

代理,也就请人帮自己做一件事。生活中,代理的情况其实非常常见,比如:

  • 房屋中介
  • 微商
  • 科学上网代理
  • 黄牛

接下来,我们就以房屋中介为例,介绍一下代理的概念。

第一种形式,直接联系房东。

按照最直观的思路,我们要租房,当然要去找房东。直接联系到房东,找到我们想要的房屋资源。

这样做自然对用户来说很方便,可以直接联系到房东,不会有中间商赚差价。而且可以直接联系房东,能做的事情就多了。

但是对于房东来说,就不太喜欢这样了。首先,如果房子已经租出去了,就不希望在有人来打扰。但还会有很多人看着广告来向房东询问房屋信息。房东会不胜其烦。而且,一旦房子出了点什么问题,房客首先来找的当然是也只能是房东。这会让房东陷在租房过程中,无法抽身去做其他事,或者为更多人服务。

对于 web 请求来说,也是如此。这种方式就是浏览器直接访问服务器的 django 进程。django 不光处理租房子,也就是动态请求,其他的日常琐事,也就是静态文件也要由 django 处理。后台 django 的压力就很大,就会很吃资源,而且服务的效果也不好。这种方式,就是没有代理的 web 服务模式。

1
2
3
老王想租房 ----> 直接找到房东,找到我想要的资源 ---> 没有任何性能丢失,很好

用户浏览器 ----> 请求直接发给后台的django进程去处理

第二种形式,联系中介租房

这次房东将房子托管给中介,委托中介帮忙把房子租出去。房客如果想租房,没办法直接联系到房东。无奈,他只好找中介帮忙。中介找到房东的房屋信息,按照约定的价格租给房客。

具体的流程是这样的:

1
2
3
4
请求过程
老王想租房,找不到房东,找不到资源 ---> 请求发给中介---> 中介拿到房东的房源
响应过程
老王拿到房源 <---中介给的房源 <---房东给的中介的资源

这样做的好处是,房东只需提供住房,不再需要为其他的事情操心。

此时此刻,中介在用户的眼里,就是一个服务器(房东)。

类似地,对于 web 请求,浏览器不直接访问到后端的 django。而是先由 nginx 处理请求,若是静态文件,则直接返回给浏览器,若是需要读取数据库的动态请求,方才将请求转发给后端的 django,django 通过 pymysql 读取数据。处理好数据后,django 将处理好的请求返回给 nginx,再传给浏览器。在浏览器眼里,nginx 就是服务端。

1
2
3
反向代理的网站部署中的应用

浏览器 -> nginx web服务器 -> django(后端到底有多少的机器,我们无需知道)

正向代理和反向代理

上面谈到的通过中介租房的代理形式,以及将请求通过 nginx 转发的代理形式,都是一种反向代理。

反向代理,代理的是服务端。

在用户眼里,中介就如同房东;在浏览器眼里,nginx 就是是服务端了,其实请求还是要转发给 django 的。

至于正向代理,代理的是客户端。

一个常见的例子是 vpn 连接。

比如我在北京,但是访问不了国外的某些网站。

但如果我在日本,是可以访问到这些网站的。

那么如果我在北京,伪装成日本的身份,去访问国外网站。在国外网站的服务器眼里,请求是来自于日本的,而不是北京 ,就允许我们进行访问。

这时在服务器看来,客户端是日本的代理服务器,而不是我们。

总而言之,正向代理,代理的是客户端;反向代理,代理的是服务端。

正、反向代理的图解

nginx 的反向代理配置

反向代理,也就是请求转发。代理服务器将浏览器发出的请求转发给资源服务器。用户通过访问代理服务器,获取到资源服务器的内容。

环境准备

首先,需要准备 2 台 Linux 虚拟机(在 VMware 里安装 2 个 Linux机器),一台作为代理服务器,一台作为资源服务器:

1
2
3
机器1ip192.168.248.128    (中介代理)(nginx,配置代理功能)

机器2ip192.168.248.129 (房东,资源服务器)(nginx,返回一个网站页面)

按道理讲,资源服务器应该部署的是 django 项目。但是为了方便起见,就先用 nginx 作演示了:

中介,代理服务器配置

  1. 首先配置中介代理,128 服务器。最先要安装一个 nginx:

    1
    yum install nginx -y
  2. 通过 yum 安装的 nginx,配置文件路径自动的生成在了这:

    1
    vim /etc/nginx/nginx.conf
  3. 找到第一个 server{} 标签,修改配置如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    root /usr/share/nginx/html;

    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;
    # 当请求是192.168.248.128,也就是代理服务器的时候,进入这个location路径匹配
    location / {
    # proxy_pass 默认会替换掉这两个请求头,需要这么设置替换回去
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    # 请求通过proxy_pass参数,转发给资源服务器,也就是129那台机器
    proxy_pass http://192.168.248.129;
    }

    error_page 404 /404.html;
    location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    }
    }
  4. 改完 nginx.conf 之后,保存退出,启动或平滑重启 nginx:

    1
    2
    3
    nginx
    # 若nginx已经启动,则需要平滑重启
    nginx -s reload

房东,资源服务器配置

  1. 还是要安装配置好 nginx。

  2. 修改 nginx.conf,返回一个页面,测试使用(其实啥也不用动,直接用默认就好):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    server {
    listen 80;
    server_name localhost;

    #charset koi8-r;

    #access_log logs/host.access.log main;
    #access_log "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G" main;

    location / {
    root html;
    index index.html index.htm;
    }

    error_page 404 /40x.html;

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    root html;
    }
    }
  3. 因为改了配置文件,所以需要平滑重启 nginx:

    1
    nginx -s reload
  4. 创建首页内容:

    1
    echo "<meta charset='utf8'>我是资源服务器 192.168.248.129" > /opt/tengine23/html/index.html

客户端访问代理服务器

在浏览器中输入代理服务器的 IP,就可以访问到资源服务器了。