代理一词往往并不陌生, 该服务我们常常用到如(代理理财、代理租房、代理收货等等),如下图所示
在没有代理模式的情况下,客户端和Nginx
服务端,都是客户端直接请求服务端,服务端直接响应客户端
那么在互联网请求里面,客户端往往无法直接向服务端发起请求,那么就需要用到代理服务,来实现客户端和服务通信,如下图所示
Nginx作为代理服务,按照应用场景模式进行总结,代理分为正向代理、反向代理
正向代理,(内部上网)客户端<—>代理->服务端
反向代理,用于公司集群架构中,客户端->代理<—>服务端
1.区别在于形式上服务的”对象”不一样
2.正向代理代理的对象是客户端,为客户端服务
3.反向代理代理的对象是服务端,为服务端服务
Nginx作为代理服务,可支持的代理协议非常的多,具体如下图
如果将Nginx作为反向代理服务,常常会用到如下几种代理协议,如下图所示
反向代理模式与Nginx代理模块总结如表格所示
反向代理模式 | Nginx****配置模块 |
---|---|
http、websocket、https | ngx_http_proxy_module |
fastcgi | ngx_http_fastcgi_module |
uwsgi | ngx_http_uwsgi_module |
grpc | ngx_http_v2_module |
主机名 | 角色 | 外网IP | 内网IP |
---|---|---|---|
lb01 | 反向代理服务器 | 10.0.0.5 | 172.16.1.5 |
web01 | 被代理的服务器 | 10.0.0.7 | 172.16.1.7 |
# 1.安装nginx [root@lb01 ~]# yum install -y nginx # 2.修改nginx的配置文件 [root@lb01 ~]# vim /etc/nginx/conf.d/proxy.conf server{ listen 80; server_name blog.drz.com; location / { proxy_pass http://172.16.1.7:80; } } # 3.本地域名解析C:\Windows\System32\drivers\etc\hosts 10.0.0.5 blog.drz.com ## 代理172.16.1.7的80端口 proxy_pass http://172.16.1.7:80; ## 存在问题,后端网站是通过IP访问的,没有通过域名 proxy_set_header Host $http_host; ## 将域名放入请求头中,带到后端 server{ listen 80; server_name zh.drz.com; location / { proxy_pass http://172.16.1.7:80; proxy_set_header Host $http_host; } } ## 存在问题,后端无法获取真实用户IP,只能获取代理服务器IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ## 透传用户的真实ip到web服务器 server{ listen 80; server_name zh.drz.com; location / { proxy_pass http://172.16.1.7:80; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } ## 减少代理的配置 [root@lb01 nginx]# vim /etc/nginx/proxy_params ## 将域名放入请求头中,带到后端 proxy_set_header Host $http_host; ## 透传用户的真实ip到web服务器 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # http1.1版本 proxy_http_version 1.1; # 代理到web服务器的连接超时时间 proxy_connect_timeout 60; # web服务器回传数据给代理服务器的超时时间 proxy_send_timeout 60; # 代理服务器等待web服务器的响应时间 proxy_read_timeout 60; # 开启缓冲区 proxy_buffering on; # 请求头缓冲区的大小 proxy_buffer_size 32k; # 开启4个缓冲区,每个缓冲区大小为128k proxy_buffers 4 128k; ## 代理配置文件 [root@lb01 nginx]# vim /etc/nginx/conf.d/proxy.conf server{ listen 80; server_name zh.drz.com; location / { proxy_pass http://172.16.1.7:80; include /etc/nginx/proxy_params; } }