1.反向代理和正向代理

正向代理

简单的说,我是一个用户,我无法直接访问一个网站,但是我能访问一个代理服务器,这个代理服务器能访问那个我不能访问的网站,于是我先连上代理服务器,告诉它我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。从网站的角度,只在代理服务器来取内容的时候有一次记录。

结论就是,正向代理,是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理

反向代理

例如我要访问 localhost:8080/dmxsp/code 这个页面,但dmxsp对应的服务器上并没有code这个资源,它是从另一台服务器上调用的资源。这样dmxsp对应的那个服务器就使用了反向代理。即用户只需要把请求发给特定的反向代理服务器,具体请求是谁处理的用户不需要知道(其实也不知道),由代理服务器统一处理。

结论就是反向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容 原本就是它自己的一样。正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。

正向代理还可以使用缓冲特性减少网络使用率。反向代理的典型用途是将 防火墙后面的服务器提供给Internet用户访问。反向代理还可以为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务。

总结

正向代理:针对客户端而言, 代理服务器代理客户端,转发请求,并将获得的内容返回给客户端。

反向代理:针对客户端而言, 代理服务器就像是原始服务器,代理集群的web节点服务器返回结果

2.nginx代理支持协议

协议 应用 常见 模块名称
http/https web服务 http_proxy_module
tcp 端口代理/转发 nginx4层 负载均衡 stream_proxy_module
websocket html5(替代flash 动画) 应用 http_proxy_module
GRPC 处理golang ngx_http_v2_module
POP/IMAP 邮件服务 mail…….
RTMP/HLS 直播,流媒体,点播…… 默认不支持,需要安装第3方 rtmp
python请求(uwsgi) python程序 http_uwsgi_module

rtmp

websocket

3.反向代理

环境准备

lb 10.0.0.63

web 10.0.0.45

web写配置文件

[root@web01 ~]$ cat /etc/nginx/conf.d/web.dmxsp.com.conf
server {
listen 6666;
server_name web.dmxsp.com;
location / {
root /code/web;
index index.html;
allow 172.16.1.0/24;
allow 10.0.0.0/24;
deny all;
}
}

写入

[root@web01 ~]$ mkdir -p /code/web
[root@web01 ~]$ echo `hostname` `hostname -I` >/code/web/index.html

检查语法

[root@web01 ~]$ nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

重启nginx

[root@web01 ~]$ systemctl reload nginx.service

命令行访问

[root@web01 ~]$ curl -H Host:web.dmxsp.com http://10.0.0.45:6666
web01 10.0.0.45 172.16.1.45

[root@web01 ~]$ curl -H Host:web.dmxsp.com http://172.16.1.45:6666
web01 10.0.0.45 172.16.1.45

lb安装nginx

[root@lb ~]$ yum install nginx -y

[root@lb ~]$ systemctl start nginx.service
[root@lb ~]$ systemctl enable nginx.service

proxy_pass模块

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

写配置文件

[root@lb ~]$ cat /etc/nginx/conf.d/web.dmxsp.com.conf
server {
listen 80;
server_name web.dmxsp.com;
location / {
proxy_pass http://10.0.0.45:6666;
}
}

检查语法

[root@web01 ~]$ nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

重启nginx

[root@web01 ~]$ systemctl reload nginx.service

测试

[root@lb ~]$ curl -H Host:web.dmxsp.com http://172.16.1.45:6666
web01 10.0.0.45 172.16.1.45

抓包

设置或修改代理到后端,请求头的内容proxy_set_header

设置或修改代理到后端,请求头的内容proxy_set_header  
Syntax proxy_set_header field value
Default

proxy_set_header Host $proxy_host
proxy_set_header Connection close
$http_host,$host:$proxy_port,$host

Context http, server, location

proxy_set_header Host   $http_host;   :修改 Host的内容$host

 

写配置文件

[root@lb /etc/nginx/conf.d]$ cat web.dmxsp.com.conf
server {
listen 80;
server_name web.dmxsp.com;
location / {
proxy_pass http://10.0.0.45:6666;
proxy_set_header Host $http_host;
}
}

测试

如何记录IP

配置文件

[root@lb /etc/nginx/conf.d]$ cat web.dmxsp.com.conf
server {
listen 80;
server_name web.dmxsp.com;
location / {
proxy_pass http://10.0.0.45:6666;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

X-Forwarded-For $proxy_add_x_forwarded_for:代理–>web请求头信息让后端节点记录用户真实ip地址(客户端ip地址)

如果请求头中有X-Forwarded-For 字段 则proxy_add_x_forwarded_for 记录用户ip地址 累加追加#$remote_addr 记录一个ip

测试

连接,读取,写入超时时间

代理与后端节点 建立连接的超时时间不建议超过75s

Syntax proxy_connect_timeout time
Default proxy_connect_timeout 60s
Context http, server, location

代理服务器读取后端响应的超时时间

Syntax proxy_read_timeout time
Default proxy_read_timeout 60s
Context http, server, location

代理服务器发送请求给后端节点 超时时间

Syntax proxy_send_timeout time
Default proxy_send_timeout 60s
Context http, server, location

缓存

proxy_buffering   是否开启代理服务器 缓存后端节点的响应报文信息(响应头和响应主体)

Syntax proxy_buffering on | off
Default proxy_buffering on
Context http, server, location

启用缓冲后,nginx会尽快从代理服务器接收响应,并将其保存到proxy_buffer_size和proxy_buffers指令设置的缓冲区中

如果整个响应无法放入内存,则可以将部分响应保存到磁盘上的临时文件中。

写入临时文件由proxy_max_temp_file_size和proxy_temp_file_write_size指令控制

用于读取从代理服务器接收的响应的第一部分

Syntax proxy_buffer_size size
Default proxy_buffer_size 4k|8k
Context http, server, location

默认情况下,缓冲区大小等于一个内存页。这是4K或8K,取决于平台。不过,它可以做得更小。设置8k | 16k

为单个连接缓存响应信息 8 128k

Syntax proxy_buffers number size
Default proxy_buffers 8 4k|8k
Context http, server, location

为单个连接设置用于从代理服务器读取响应的缓冲区的数量和大小。

默认情况下,缓冲区大小等于一个内存页。这是4K或8K,取决于平台

通常情况下,我们可以将这些配置汇总一下写在一个文件里,编辑配置文件时直接include即可

写配置文件

[root@lb ~]$ cat /etc/nginx/proxy_params
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_connect_timeout 30;
proxy_read_timeout 60;
proxy_send_timeout 60;

proxy_buffering on;
proxy_buffer_size 8k;
proxy_buffers 4 64k;
proxy_http_version 1.1;

 

[root@lb /etc/nginx/conf.d]$ cat blog.wordpress.com.conf
server {
listen 80;
server_name blog.wordpress.com;
location / {
proxy_pass http://10.0.0.45:80;
include proxy_params;
}
}

作者 dmxsp

发表回复

您的电子邮箱地址不会被公开。