Nginx作为代理服务

一、代理相关概念

1、什么是代理?

代理不直接让客户端请求源服务器,由代理服务器来代为办理。

生活中如 代理理财,代理收快递都是同一个道理。

2、代理的分类

按应用场景进行分类

  • 正向代理
  • 反向代理

a、正向代理

客户端访问站点不需要通过DNS解析,代理会实现域名和IP的解析,是由代理去请求的DNS,并且实现请求与响应的转发。

正向代理是为客户端服务的。

 

b、反向代理

反向代理一般用在有针对性的去访问某一个站点的时候,客户端会自己通过DNS请求域名来获取服务端的IP地址,代理是为服务端服务的,通过Nginx反向代理是实现流量的分发,当服务端的负载过大时,可以通过代理来是实现负载均衡。

 

c、正向代理与反向代理的区别:

  • DNS解析成IP的位置上有区别,正向代理是由代理服务器完成的,而反向代理是由客户端自己来完成。
  • 服务模式是由区别,服务的对象不一样,正向代理是为客户端服务的,反向代理是为服务端服务的。

 

d、Nginx可支持的代理协议

e、各协议释意:

  • websocket是建立在http1.1的基础上,实现客户端与服务端建立长连接的通讯协议。
  • GRPC是一个远程调用的协议,流行于go语言。
  • ICMP\POP\IMAP:邮件收发协议。Nginx对邮件的支持相当高。
  • RTMP:流媒体的协议。

f、Nginx作为反向代理所支持的协议。

  • http_proxy模块,最常用和基础的模块,正反代理都会用到该模块
  • fastcgi协议接口模式。PHP应用服务需要用到。
  • uwsgi配置模式,Python中应用服务中需要用到的反向代理模式。
  • ws:Websocket协议的简写,基于http1.1。
  • grpc是一个远程调用协议,基于http2.0。

 Nginx反向代理所需要用到的模块如下表所示:

反向代理模式 Nginx配置模块
http,websocket,https ngx_http_proxy_module
fastcgi ngx_http_fastcgi_module
uwsgi  ngx_http_uwsgi_module
grpc ngx_http_v2_module

g、Nginx作为正向代理支持的协议

  • Nginx作为正向代理不支持 https 协议。
  • Nginx作为正向代理使用的场景并不多。

 

正向代理 Nginx配置模块
http   ngx_http_proxy_module

二、Nginx作为代理服务的配置语法

语法格式:

Syntax:    proxy_pass URL;
Default:    —
Context:    location, if in location, limit_except

具体可参见ngx_http_proxy_module的文档说明。

  • URLNginx作为代理服务器后,所请求的服务器地址。
  • url的格式:
  • http://localhost:80/uri/    //http协议 + 主机名或IP + ip + uri
  • https://192.168.0.133:80/uri/    //https协议 + 主机名或IP + ip + uri
  • http://unix://tmp/backend.socket:/uri/    //还支持以socket的方式,在linux下进程通信的方式。

示例:

 a、在/etc/nginx/conf.d目录下配置2个配置文件,

一个真实主机的配置文件( realserver.conf)。

 

另一个是反向代理服务器的配置文件(fx_proxy.conf).

location ~ /test_proxy.html$ {
     //只要代理服务器和真实服务器直接网络是通的就可以。
    #proxy_pass http://127.0.0.1:8080; 
    proxy_pass http://192.168.0.133:8080;
}

b、在 8080 对应的真实服务器的项目目录(/opt/app/code2)下面新建一个 test_proxy.html文件。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>proxy</title>
</head>
<body>
    test proxy
</body>
</html>

如果没有配置代理服务,访问效果如下:

 

 配置代理服务后,访问效果如下:

 

 三、Nginx作为正项代理

a、配置一个真实的服务器的配置文件admin.conf

location / {
       //如果访问的IP不是192.168.0.133,就返回403,也就说只允许192.168.0.133这个IP访问该站点。
    if ($http_x_forwarded_for !~* "^192\.168\.0\.133") {
        return 403;
    }
    root   /opt/app/code;
    index  index.html index.htm;
}

b、然后在允许客户端访问的那一台服务器上配置正向代理:

//DNS
resolver 192.168.0.1;
location / {
        //正向代理host+uri
    proxy_pass http://$http_host$request_uri;
}

 我这里由于只有一台服务器,没演示出效果。

 

四、其它配置语法

1、缓冲区

配置语法:

Syntax:proxy_buffering on | off;
Default:proxy_buffering on;
Context:server,locatin;

当代理服务器往真实服务器转发请求的时候,往往接收到的是请求头的一小部分信息,如果把proxy_buffering 打开,那么proxy会尽可能的去把请求收集完,然后在返回给客户端,这个起到了一个缓存的作用,当然也需要注意内存,

当内存不够时,会存入硬盘的临时文件。

拓展模块:proxy_buffer_size, proxy_buffers, proxy_busy_buffers_size 用来控制缓冲区的大小。

 2、跳转重定向

配置语法:

Syntax:proxy_redirect default | off | redirect replacement;
Default:proxy_redirect default;
Context:http,server,locatin;

场景:

当代理服务器代理真实服务器,真实服务器返回的是一个301的重定向地址时,他会把地址重定向到另一个地址上去返回给客户端,

作用:

当后端返回的地址是前端无法访问到的,或者需要将服务端返回的地址做重写的时候,可以用到该模块。一般情况下都配置为 default。

也可以配置为 off,当为 off 时,对301的地址不会做任何更改。

 3、头信息

配置语法:

Syntax:proxy_set_header field value;
Default:proxy_set_header Host $proxy_host | Connection close;
Context:http,server,location;

场景

该模块比较常用,当我们把Nginx作为代理服务器,但是后端的realserver只需要读取一些头信息,但是这些头信息是不准确的,如 $remote_addr就因为走了代理,而不再是真正客户端的IP地址,在这种情况下就可以通过

proxy_set_header增加一个新的头,将信息携带到后端,让后端能够读取到真实的信息。

拓展:

proxy_hide_header : 隐藏一些头,不给后端访问到。

proxy_set_body : 也可以在请求的 body 中添加一些东西。

4、超时

配置语法

Syntax:proxy_connect_timeout time;
Default:proxy_connect_timeout 60;
Context:http,server,location;

这里的超时指的是Nginx作为代理到后端服务器的一个TCP请求连接超时,

拓展:

proxy_read_timeout : 已经建立好连接的情形下,后端服务器接收来自代理服务器所等待的超时时间。

proxy_send_timeout : 后端处理完毕后发送给代理服务器所等待超时时间。

 

5、企业常用代理配置如下:

示例:

代理服务器配置文件如下:

location ~ /test_proxy.html$ {
    proxy_pass http://127.0.0.1:8080;
    include conf.d/proxy_params;
}

 

/etc/nginx/conf.d/目录下新建一个 proxy_params 文件,该文件写入通用的代理配置信息,方便复用。

proxy_redirect default;

proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;

proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;

proxy_buffer_size 32k;
proxy_buffering on;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
proxy_max_temp_file_size 256k;

 

proxy_redirect default : 跳转重定向设置为默认值。

 

proxy_set_header Host $http_host :向后端服务器发送主机名。

proxy_set_header X-Real-IP $remote_addr : 向后端服务器发送客户端真实IP地址

 

proxy_connect_timeout 30 : 连接超时时间为30s ,这些可以根据企业的实际情况来配置

proxy_send_timeout 60 :已经建立好连接的情形下,后端服务器接收来自代理服务器所等待的超时时间为60s

proxy_read_timeout 60 :已经建立好连接的情形下,后端处理完毕后发送给代理服务器所等待超时时间为60s

 

proxy_buffer_size 32k : Nginx代理服务临时存储Response(响应)头信息的大小,该值一般不会特别大,这些值也要根据企业的实际情况和内存的大小来配置。

proxy_buffering on : Nginx尽量等到后端所有响应都发送过来了在一起发送给前端页面。

proxy_buffers 4 128k : proxy_buffering打开后,就需要设置缓冲区的数量和大小。

proxy_busy_buffers_size 256k : 忙的时候 buffer的最大值。

proxy_max_temp_file_size 256k : 用于buffer的临时文件的大小。

 

 本文为袋鼠学习中的总结,如有转载请注明出处:https://www.cnblogs.com/chrdai/p/11337238.html

posted @ 2019-08-14 22:55  Chrdai  阅读(1051)  评论(0编辑  收藏  举报