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的文档说明。
- URL:Nginx作为代理服务器后,所请求的服务器地址。
- 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