# Nginx 反向代理服务
# 1.Nginx 代理概述
# 1.1 什么是代理
- 代理代理,代为办理,对于代理一词而言,我们并不陌生,在我们日常生活中常常用到。
- 比如代理理财、代理租房、代理收货等等

# 2. Nginx 正向代理
- 正向代理,(内部上网) 客户端 <--> 代理 -> 服务端
- 比如:科学的方式访问 Google

# 3. Nginx 反向代理
反向代理,用于公司集群架构中,客户端 -> 代理 <--> 服务端

# 3.1 负载均衡
将用户发送的请求,通过负载均衡调度算法挑选一台合适的节点进行请求处理。

# 3.2 动静分离
根据用户请求的 URI 进行区分,将动态资源调度至应用服务器处理,将静态资源调度至静态资源服务器处理。

# 3.3 数据缓存
将后端查询的数据存储至反向代理上缓存,可以加速用户获取资源。

# 4. 正向与反向代理区别
区别在于形式上服务的 "对象" 不一样、其次架设的位置点不一样。
- 正向代理代理的对象是【客户端】,为客户端服务
- 反向代理代理的对象是【服务端】,为服务端服务
- user--> 正向代理(路由器)--> 反向代理(缓存)--> 服务器
# 5. Nginx 常用的代理协议
通常情况下,我们将 Nginx 作为反向代理,常常会用到如下几种代理协议,如下图所示:


# 6. Nginx 反向代理实践
# 6.1 配置语法指令
Syntax: proxy_pass URL; | |
Default: — | |
Context: location, if in location,limit_except | |
proxy_pass http://localhost:8000/uri/ | |
http://10.0.0.7:8000/uri/ |
# 6.2 代理配置场景

# 6.2.1 环境准备
| 角色 | 外网 ****IP (NAT) | 内网 ****IP (LAN) | 主机名 |
|---|---|---|---|
| Proxy | eth0:10.0.0.5 | eth1:172.16.1.5 | proxy01 |
| web01 | eth1:172.16.1.7 | web01 |
# 6.2.2 web 节点配置
# web01 服务配置一个网站,监听在 `8080`,此时网站仅 `172` 网段的用户能访问 | |
[root@web01 conf.d]# cat /etc/nginx/conf.d/web.hmallleasing.com.conf | |
server { | |
listen 8080; | |
server_name web.hmallleasing.com; | |
location / { | |
root /code/web; | |
index index.html; | |
} | |
} | |
[root@web01 conf.d]# mkdir /code/web | |
[root@web01 conf.d]# echo "web01-8080...">/code/web/index.html | |
[root@web01 conf.d]# nginx -t | |
[root@web01 conf.d]# systemctl restart nginx |
# 6.2.3 proxy 节点配置
# proxy 代理服务配置,让外网用户能够通过代理服务访问到后端的 172.16.1.7 的 8080 端口站点内容 | |
[root@lb01 conf.d]# cat /etc/nginx/conf.d/proxy_web.hmallleasing.com.conf | |
server { | |
listen 80; | |
server_name web.hmallleasing.com; | |
location / { | |
proxy_pass http://172.16.1.7:8080; | |
} | |
} | |
[root@lb01 conf.d]# systemctl enable nginx | |
[root@lb01 conf.d]# systemctl start nginx |
# 6.2.4 抓包分析访问过程
抓包分析 Nginx 代理处理整个请求的过程

# 6.3 代理相关配置参数
# 6.3.1 proxy_set_header
# 添加发往后端服务器的请求头信息, | |
Syntax: proxy_set_header field value; | |
Default: proxy_set_header Host $proxy_host; | |
proxy_set_header Connection close; | |
Context: http, server, location | |
# 客户端请求 Host 的值是 www.oldxu.net, 那么代理服务会像后端请求时携带 Host 变量为 www.oldxu.net | |
proxy_set_header Host $http_host; | |
# 将 $remote_addr 的值放进变量 X-Real-IP 中,$remote_addr 的值为客户端的 ip | |
proxy_set_header X-Real-IP $remote_addr; | |
# 客户端通过代理服务访问后端服务,后端服务会通过该变量会记录真实客户端地址 | |
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
# 6.3.2 proxy_http_version
# 代理的向后端请求时使用的 HTTP 协议版本。默认 1.0 版本 | |
Syntax: proxy_http_version 1.0 | 1.1; | |
Default: proxy_http_version 1.0; | |
Context: http, server, location | |
This directive appeared in version 1.1.4 |
# 6.3.3 proxy_connect_timeout
#nginx 代理与后端服务器 "连接超时" 时间 (代理连接超时) | |
Syntax: proxy_connect_timeout time; | |
Default: proxy_connect_timeout 60s; | |
Context: http, server, location |
# 6.3.4 proxy_read_timeout
#nginx 代理等待后端服务器 "响应(Header)超时" 时间 | |
Syntax: proxy_read_timeout time; | |
Default: proxy_read_timeout 60s; | |
Context: http, server, location |
# 6.3.5 proxy_send_timeout
#后端服务器 "数据(Data)回传给 nginx 代理超时" 时间 | |
Syntax: proxy_send_timeout time; | |
Default: proxy_send_timeout 60s; | |
Context: http, server, location |
# 6.3.6 proxy_buffer (缓冲区)
1)启用缓冲时,nginx 代理服务器将尽快的接收响应 Header 以及响应报文,并将其保存到 proxy_buffer_size (Headers) 和 proxy_buffers (data) 设置的缓冲区中。
# proxy_buffer 代理缓冲区 | |
Syntax: proxy_buffering on | off; | |
Default: proxy_buffering on; | |
Context: http, server, location |
如果响应报文过大无法存储至内存,则会将其中部分保存到磁盘上的临时文件中。写入临时文件由 proxy_temp_path(控制临时存储目录)proxy_max_temp_file_size(控制临时存储目录大小) 和 proxy_temp_file_write_size(控制一次写入临时文件的数据大小),临时文件最大大小由 proxy_buffer_size 和 proxy_buffers 限制。但当禁用缓冲时,nginx 代理服务器会在接收到响应时立即同步传递给客户端。nginx 代理服务器不会读取整个响应。
2)proxy_buffer_size 用于控制代理服务读取后端第一部分响应 Header 的缓冲区大小。
Syntax: proxy_buffer_size size; | |
Default: proxy_buffer_size 4k|8k; | |
Context: http, server, location | |
# proxy_buffer_size 64k; |
3)proxy_buffers 是代理服务器为单个连接设置响应缓冲区 “数量” 和 “大小” 。
如果一个后端服务所返回的页面大小为 256KB,那么会为其分配 4 个 64KB 的缓冲区来缓存,如果页面大小大于 256KB,那么大于 256KB 的部分会缓存到 proxy_temp_path 指定的路径中。但是这并不是好方法,因为内存中的数据处理速度要快于硬盘。所以这个值一般建议设置为站点响应所产生的页面大小中间值,如果站点大部分脚本所产生的页面大小为 256KB,那么可以把这个值设置为 “16 16k”、“4 64k” 等。
Syntax: proxy_buffers number size; | |
Default: proxy_buffers 8 4k|8k; | |
Context: http, server, location | |
#proxy_buffers 4 64k; |
# 6.3.7 代理参数总结
# 代理网站常用优化配置如下,将配置写入一个新文件,调用时使用 include 即可 | |
[root@lb01 ~]# vim /etc/nginx/proxy_params | |
proxy_http_version 1.1; | |
proxy_set_header Connectin ""; | |
proxy_set_header Host $http_host; | |
proxy_set_header X-Real-IP $remote_addr; | |
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | |
proxy_connect_timeout 60; | |
proxy_send_timeout 60; | |
proxy_read_timeout 120; | |
proxy_buffering on; | |
proxy_buffer_size 32k; | |
proxy_buffers 4 128k; | |
proxy_temp_file_write_size 10240k; | |
proxy_max_temp_file_size 10240k; | |
# 使用 include 方式,便于后续 Location 的重复使用。 | |
location / { | |
proxy_pass http://127.0.0.1:8080; | |
include proxy_params; | |
} |

