# Nginx 反向代理服务
# 1.Nginx 代理概述
# 1.1 什么是代理
- 代理代理,代为办理,对于代理一词而言,我们并不陌生,在我们日常生活中常常用到。
- 比如代理理财、代理租房、代理收货等等
![1.jpg]()
# 2. Nginx 正向代理
- 正向代理,(内部上网) 客户端 <--> 代理 -> 服务端
- 比如:科学的方式访问 Google
![2.jpg]()
# 3. Nginx 反向代理
反向代理,用于公司集群架构中,客户端 -> 代理 <--> 服务端
![3.jpg]()
# 3.1 负载均衡
将用户发送的请求,通过负载均衡调度算法挑选一台合适的节点进行请求处理。
![4.jpg]()
# 3.2 动静分离
根据用户请求的 URI 进行区分,将动态资源调度至应用服务器处理,将静态资源调度至静态资源服务器处理。
![5.jpg]()
# 3.3 数据缓存
将后端查询的数据存储至反向代理上缓存,可以加速用户获取资源。
![6.jpg]()
# 4. 正向与反向代理区别
区别在于形式上服务的 "对象" 不一样、其次架设的位置点不一样。
- 正向代理代理的对象是【客户端】,为客户端服务
- 反向代理代理的对象是【服务端】,为服务端服务
- user--> 正向代理(路由器)--> 反向代理(缓存)--> 服务器
# 5. Nginx 常用的代理协议
通常情况下,我们将 Nginx 作为反向代理,常常会用到如下几种代理协议,如下图所示:
![7.jpg]()
![8.jpg]()
# 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 代理配置场景
![9.jpg]()
# 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 节点配置
| |
| [root@web01 conf.d] |
| server { |
| listen 8080; |
| server_name web.hmallleasing.com; |
| |
| location / { |
| root /code/web; |
| index index.html; |
| } |
| } |
| [root@web01 conf.d] |
| [root@web01 conf.d] |
| [root@web01 conf.d] |
| [root@web01 conf.d] |
# 6.2.3 proxy 节点配置
| |
| [root@lb01 conf.d] |
| server { |
| listen 80; |
| server_name web.hmallleasing.com; |
| |
| location / { |
| proxy_pass http://172.16.1.7:8080; |
| } |
| } |
| [root@lb01 conf.d] |
| [root@lb01 conf.d] |
# 6.2.4 抓包分析访问过程
抓包分析 Nginx 代理处理整个请求的过程
![1.jpg]()
# 6.3 代理相关配置参数
| |
| Syntax: proxy_set_header field value; |
| Default: proxy_set_header Host $proxy_host; |
| proxy_set_header Connection close; |
| Context: http, server, location |
| |
| |
| 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; |
# 6.3.2 proxy_http_version
| |
| 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
| |
| Syntax: proxy_connect_timeout time; |
| Default: proxy_connect_timeout 60s; |
| Context: http, server, location |
# 6.3.4 proxy_read_timeout
| |
| Syntax: proxy_read_timeout time; |
| Default: proxy_read_timeout 60s; |
| Context: http, server, location |
# 6.3.5 proxy_send_timeout
| |
| 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) 设置的缓冲区中。
| |
| 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 |
| |
| |
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 |
| |
| |
# 6.3.7 代理参数总结
| |
| [root@lb01 ~] |
| 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; |
| |
| |
| |
| location / { |
| proxy_pass http://127.0.0.1:8080; |
| include proxy_params; |
| } |
![2.jpg]()