Nginx反向代理和负载均衡

基本概念

负载均衡

负载均衡(Load Balance)是由多台服务器以对称的方式组成一个服务器集群,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。经过某种负载分管技术,将外部发送来的中央请求均匀分配到对称结构中的某一台服务器

代理

代理(英语:Proxy)也称网络代理,是一种特殊的网络服务,允许一个终端(一般为客户端)通过这个服务与另一个终端(一般为服务器)进行非直接的连接。通常指的事代理服务器。现实中的例子, 从A地到B地,由于某些原因无法直接到达,需要经过C中转。C就是代理,可以理解为中转站。

维基百科 百度百科

正向代理

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

正向代理,其实是”代理服务器”代理了”客户端”,去和”目标服务器”进行交互。科学上网的代理就是正向代理。

正向代理一般是客户端架设的,比如在自己的机器上安装一个代理软件。

作用

突破访问限制

通过代理服务器,可以突破自身IP访问限制,访问国外网站,教育网等。

提高访问速度

通常代理服务器都设置一个较大的硬盘缓冲区,会将部分请求的响应保存到缓冲区中,当其他用户再访问相同的信息时, 则直接由缓冲区中取出信息,传给用户,以提高访问速度。

隐藏客户端真实IP

上网者也可以通过这种方法隐藏自己的IP,免受攻击。

反向代理

反向代理(reverse proxy):是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

反向代理,其实是”代理服务器”代理了”目标服务器”,去和”客户端”进行交互。

反向代理一般是服务器架设的比如在自己的机器集群中部署一个反向代理服务器

作用

隐藏服务器真实IP

使用反向代理,可以对客户端隐藏服务器的IP地址。

负载均衡

反向代理服务器可以做负载均衡,根据所有真实服务器的负载情况,将客户端请求分发到不同的真实服务器上。

提高访问速度

反向代理服务器可以对于静态内容及短时间内有大量访问请求的动态内容提供缓存服务,提高访问速度。

提高访问速度

反向代理服务器可以对于静态内容及短时间内有大量访问请求的动态内容提供缓存服务,提高访问速度。

配置

反向代理

官方文档 ngx_http_proxy_module 此处为nginx 的http proxy代理模块

http代理完整的例子

server {
    listen 80;
    server_name proxy.stu;

    location / {
        proxy_http_version 1.1; //http版本
        proxy_set_header Host $http_host; // host主机
        proxy_set_header Scheme $scheme; //协议
        proxy_set_header SERVER_PORT $server_port; //端口
        proxy_set_header REMOTE_ADDR $remote_addr; //远程地址
        proxy_set_header Connection "keep-alive"; //链接类型keep-alive
        proxy_set_header X-Real-IP $remote_addr; // 获取真实ip
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;//通过该变量获取ip
        proxy_pass http://127.0.0.1:8080; //后端http服务地址
    }
}

websocket代理完整的例子

官方文档

//http模块
http {
  map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
  }

//server模块
server{
    location /ws
      {
         proxy_pass http://127.0.0.1:8282;
         proxy_http_version 1.1;
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Connection "Upgrade";
         proxy_set_header X-Real-IP $remote_addr;
      }
  } 
}

参数解释

proxy_http_version

proxy_http_version 代理的http版本,官方文档写了只支持1.0,1.1 。 编译时添加http2,配置加入proxy_http_version 2,可以支持http2 。强烈不推荐使用。

http2解决的浏览器(客户端)和服务器之间链接问题,提高了性能。不适用于代理服务器和后端服务之间的通讯, 事情可能会因为HTTP2在后端的应用(单个TCP代替了多个TCP连接)变得更加糟糕.

来自知乎Twosee​ Swoole & PHP 开发组成员的答案

stack overflow 的答案

X-Real-IP $remote_addr与X-Forwarded-For $proxy_add_x_forwarded_for

Nginx 获取客户端真实IP $remote_addr与X-Forwarded-For,参数详细解释

proxy_pass

proxy_pass 代理的服务地址 支持unix socket 这种写法:

proxy_pass http://unix:/tmp/backend.socket:/uri/;

ngx_stream_proxy_module 支持代理 tcp udp data stream

负载均衡

相关参考

极客时间-nginx核心知识100讲-陶辉

一篇文章搞定 Nginx 反向代理与负载均衡

终于有人把正向代理和反向代理解释的明明白白了!