代理

正向代理

在说反向代理之前,先说下什么是代理或者正向代理。

正向代理也就是代理,他的工作原理就像一个跳板,是用于代理客户端的。所谓代理,就是在客户端和服务端之间强行添加了一层,用来实现流量转发的功能,粗略的框图如下:

+----------------+         +---------------+        +--------------+
|                |         |               |        |              |
|                |         |               |        |              |
|                |  http   |               | http   |              |
|    client      <--------->    proxy      <-------->   server     |
|                |  https  |               | https  |              |
|                |         |               |        |              |
|                |         |               |        |              |
+----------------+         +---------------+        +--------------+

举个很简单的例子:你直接在大陆地区访问google.com肯定是访问不了的,原因大家都知道,现在假如你有一台在美国的主机A,并且能够正常访问,那么你可以将浏览器对google.com的请求先转发给服务器A,服务器A收到请求后,扮演客户端的角色,发起对google.com的请求,服务器A收到响应后,又扮演服务端,将此响应原封不动的返回给你,自此,一次正向代理顺利完成。

结论就是,正向代理 是一个位于客户端和原始服务器(origin server)之间的服务器。为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。

目前代理软件很多,浏览器上的代理就更多了。什么自由门啊,红杏等。

反向代理

反向代理顾名思义是用来代理服务端的。我们也举个简单的例子来说明:我们知道google.com每秒钟要处理如洪水般的网络请求,这些请求如果仅仅让一台单一的服务器处理,肯定是处理不过来的,我们自然而然的想到让多台服务器来处理这些请求,减少每台服务器的压力。但是现在有一个问题,多个服务器那就产生了多个IP,一般的,google.com只能解析到某个固定的IP(为了方便描述,我们暂且这样认为。实际情况下,通过设置也是可以让同一个域名解析到多个IP的),因为现在存在多个Server,我的一个google.com就不能解析到这些服务器上,而且用多个二级域名比如server1.google.comserver2.google.com等等也给用户造成了使用上的不便(一万台服务器,你咋不上天呢?),那该怎么办呢?通过反向代理可以很好的解决这个问题。为此,我绘制了下面的示意图:

                                                                   +-------------------+
                                                                   |                   |
                                                            +------>   server 1        |
+-------------+                                             |      |                   |
|             +----------+                                  |      |                   |
|  client 1   |          |                                  |      +-------------------+
|             |          |                                  |
+-------------+          |                                  |
                         |         +------------------+     |      +-------------------+
                         |         |                  |     |      |                   |
+-------------+          |         |                  |     |      |   server 2        |
|             |          |         |                  +------------>                   |
|  clent 2    +-------------------->  reverse proxy   |     |      |                   |
|             |          |         |                  |     |      +-------------------+
+-------------+          |         |                  |     |
                         |         |                  |     |               .
      .                  |         |                  |     |               .
      .                  |         +------------------+     |               .
      .                  |                                  |
                         |                                  |      +--------------------+
+-------------+          |                                  |      |                    |
|             |          |                                  |      |   server m         |
|  client n   +----------+                                  +------>                    |
|             |                                                    |                    |
+-------------+                                                    +--------------------+

正向代理和反向代理就基本清楚了,那我们就来用nginx来配置一个反向代理。

nginx 使用反向代理,主要是使用location模块下的 proxy_pass 选项。

配置反向代理

我们利用 node 启动一个本地server。

index.js 中开启3000端口 (node 服务器脚本请查阅相关资料)

$ node index

其中index.js

配置host文件, 在里面添加一条记录

$ vim /etc/hosts
test.com  127.0.0.1

配置nginx.conf

http里面添加:

#本地http-server开启的server,命名为node-server,监听3000端口
upstream node-server {
  server 127.0.0.1:3000;
}
# NGINX 虚拟主机,监听8880端口
server {
  listen 8880;
  server_name test.com;
  access_log /var/log/nginx/node-server;
  # Gzip Compression
  gzip on;
  gzip_comp_level 6;
  gzip_vary on;
  gzip_min_length  1000;
  gzip_proxied any;
  gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
  gzip_buffers 16 8k;
  # 反向代理 node-server
  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;
    # 代理的地址
    proxy_pass http://node-server;
    proxy_redirect off;
  }
}

如果是https, 需要配置SSL证书:

server {
    listen 443;
    server_name test.cn;
    root /var/www/html;
    index index.html index.htm;
    ssl on;
    ssl_certificate "/data/crts/test.crt";
    ssl_certificate_key "/data/crts/test.key";
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    location / {
        proxy_pass http://localhost:8443;
    }
}

如果需要转发所有的请求,使用正则表达式,使用~启用正则

location ~ .*|/ {
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $http_host;
  proxy_set_header X-NginX-Proxy true;
  # 代理的地址
  proxy_pass http://node-server;
  proxy_redirect off;
}

重新启动设置 nginx -s reload

测试

可以看到,对于用户的请求,我们成功反向代理到127.0.0.1:3000上!

MIT Licensed | Copyright © 2018-present 滇ICP备16006294号

Design by Quanzaiyu | Power by VuePress