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 |
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 |
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;
}
}