Nginx反向代理功能

反向代理:reverse proxy,指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的 一种方式,这是用的比较多的一种方式。

Nginx 除了可以在企业提供高性能的web服务之外,另外还可以将 nginx 本身不具备的请求通过某种预 定义的协议转发至其它服务器处理,不同的协议就是Nginx服务器与其他服务器进行通信的一种规范,主 要在不同的场景使用以下模块实现不同的功能。

ngx_http_proxy_module: 将客户端的请求以http协议转发至指定服务器进行处理

ngx_http_upstream_module :用于定义为proxy_pass,fastcgi_pass,uwsgi_pass,等指令引用的后端服务器分组

ngx_stream_proxy_module: 将客户端的请求以tcp协议转发至指定服务器处理

ngx_http_fastcgi_module: 将客户端对php的请求以fastcgi协议转发至指定服务器助理

ngx_http_uwsgi_module: 将客户端对Python的请求以uwsgi协议转发至指定服务器处理

逻辑调用关系:

访问逻辑图:

同构代理:用户不需要其他程序的参与,直接通过http协议或者tcp协议访问后端服务器

异构代理:用户访问的资源时需要经过处理后才能返回的,比如php,python,等等,这种访问资源需 要经过处理才能被访问

官方文档:Module ngx_http_proxy_module

一、HTTP协议反向代理

1.1 反向代理配置参数

官方文档:Module ngx_http_proxy_module

bash 复制代码
proxy_pass; #用来设置将客户端请求转发给的后端服务器的主机
            #可以是主机名(将转发至后端服务做为主机头首部)、IP地址:端口的方式
            #也可以代理到预先设置的主机群组,需要模块ngx_http_upstream_module支持
bash 复制代码
#如果location定义其uri时使用了正则表达式模式(包括~,~*,但不包括^~),则proxy_pass之后必须不能
使用uri
#即不能有/ ,用户请求时传递的uri将直接附加至后端服务器之后
server {
 ...
 server_name HOSTNAME;
 location ~|~* /uri/ {
 proxy_pass http://host:port; #proxy_pass后面的url 不能加/
 }
 ...
 }
 
 http://HOSTNAME/uri/ --> http://host/uri/
proxy_hide_header field; #用于nginx作为反向代理的时候
 #在返回给客户端http响应时
 #隐藏后端服务器相应头部的信息
 #可以设置在http,server或location块
bash 复制代码
proxy_pass_header field; #透传
#默认nginx在响应报文中不传递后端服务器的首部字段Date, Server, X-Pad, X-Accel等参数
#如果要传递的话则要使用 proxy_pass_header field声明将后端服务器返回的值传递给客户端
#field 首部字段大小不敏感
bash 复制代码
proxy_pass_request_body on | off; 
#是否向后端服务器发送HTTP实体部分,可以设置在http,server或location块,默认即为开启
proxy_pass_request_headers on | off; 
#是否将客户端的请求头部转发给后端服务器,可以设置在http,server或location块,默认即为开启
proxy_set_header;
#可更改或添加客户端的请求头部信息内容并转发至后端服务器,比如在后端服务器想要获取客户端的真实IP的
时候,就要更改每一个报文的头部
bash 复制代码
proxy_connect_timeout time;
#配置nginx服务器与后端服务器尝试建立连接的超时时间,默认为60秒

proxy_read_timeout time;
#配置nginx服务器向后端服务器或服务器组发起read请求后,等待的超时时间,默认60s

proxy_send_timeout time; 
#配置nginx项后端服务器或服务器组发起write请求后,等待的超时 时间,默认60s

proxy_http_version 1.0; 
#用于设置nginx提供代理服务的HTTP协议的版本,默认http 1.0

proxy_ignore_client_abort off; 
#当客户端网络中断请求时,nginx服务器中断其对后端服务器的请求。即如果此项设置为on开启,则服务器、
会忽略客户端中断并一直等着代理服务执行返回,如果设置为off,则客户端中断后Nginx也会中断客户端请求
并立即记录499日志,默认为off

1.2 反向代理单台web服务器

要求:将用户对域 www.timinglee.org 的请求转发给后端服务器处理

1、编辑子配置文件

root@Nginx \~# vim /usr/local/nginx/conf.d/vhosts.conf

bash 复制代码
server {
 listen 80;
 server_name ou.qisheng.org;
 location / {
   proxy_pass http://172.25.254.30;
 }
}

2、重启nginx,并测试

nginx -s reload

1.3 指定location实现反向代理

1.3.1 针对指定的location

1.编辑子配置文件

root@Nginx \~# vim /usr/local/nginx/conf.d/vhosts.conf

bash 复制代码
server {
 listen 80;
 server_name ou.qisheng.org;
 location / {
   proxy_pass http://172.25.254.20;
 }
 location ~ /static {
   proxy_pass http://172.25.254.30;
 }
}

2、后端web服务器必须要有相对于的访问URL

root@apache20 \~# echo web2 172.25.254.20 > /var/www/html/index.html

root@apache30 \~# mkdir /var/www/html/static

root@apache30 \~# echo static 172.25.254.30 > /var/www/html/static/index.html

3、重启nginx并访问测试

nginx -s reload

1.3.2 针对特定的资源实现代理

root@Nginx \~# vim /apps/nginx/conf.d/vhost.conf

bash 复制代码
server {
 listen 80;
 server_name ou.qisheng.org;
 location / {
   proxy_pass http://172.25.254.20;
 }
 location ~ \.(png|jpg|gif) {
   proxy_pass http://172.25.254.30;
 }
}

1.4 缓存功能

缓存功能默认关闭状态,需要先动配置才能启用。

proxy_cache zone_name | off; 默认off

#指明调用的缓存,或关闭缓存机制;Context:http, server, location

#zone_name 表示缓存的名称.需要由proxy_cache_path事先定义
proxy_cache_key string;

#缓存中用于"键"的内容,默认值:proxy_cache_key schemeproxy_host$request_uri;
proxy_cache_valid code ... time;

#定义对特定响应码的响应内容的缓存时长,定义在http{...}中
proxy_cache_path;

#定义可用于proxy功能的缓存;Context:http

proxy_cache_path path levels=levels use_temp_path=on\|off

keys_zone=zone_name:size inactive=time max_size=size manager_files=number

manager_sleep=time\] \[manager_threshold=time\] \[loader_files=number

loader_sleep=time\] \[loader_threshold=time\] \[purger=on\|off

purger_files=number purger_sleep=time purger_threshold=time;
#调用缓存功能,需要定义在相应的配置段,如server{...};或者location等

proxy_cache proxycache;

proxy_cache_key $request_uri; #对指定的数据进行MD5的运算做为缓存的key

proxy_cache_valid 200 302 301 10m; #指定的状态码返回的数据缓存多长时间

proxy_cache_valid any 1m; #除指定的状态码返回的数据以外的缓存多长时间,必须设置, 否则不会缓存

proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ;

#默认是off #在被代理的后端服务器出现哪种情况下,可直接使用过期的缓存响应客户端

proxy_cache_methods GET | HEAD | POST ...;

#对哪些客户端请求方法对应的响应进行缓存,GET和HEAD方法总是被缓存

1.4.1 非缓存场景压测

1、准备后端服务器测试页面

root@apache30 static# mkdir /var/www/html/static

root@apache30 static# cat /var/log/messages > ./log.html

2、开始压测

root@Nginx \~# ab -n1000 -c100 http://ou.qisheng.org/static/log.html

1.4.2 准备缓存配置

1、编辑nginx.conf配置文件

root@Nginx \~# vim /usr/local/nginx/conf/nginx.conf

2、编辑子配置文件

root@Nginx \~# vim /usr/local/nginx/conf.d/vhosts.conf

3、重启nginx,查看

/data/nginx/proxycache/ 目录会自动生成

1.4.3 访问并验证缓存文件

1、访问web并验证缓存目录

root@Nginx \~# ab -n1000 -c100 http://ou.qisheng.org/static/index.html

root@Nginx \~# ab -n2000 -c200 http://ou.qisheng.org/static/log.html

2、验证缓存目录结构及文件大小

二、HTTP 反向代理负载均衡

Nginx可以将客户端的请求转发至单台后端服务器但是无法转发至特定的一组的服务器,而 且不能对后端服务器提供相应的服务器状态监测,Nginx 可以基于ngx_http_upstream_module模块提 供服务器分组转发、权重分配、状态监测、调度算法等高级功能。

官方文档:Module ngx_http_upstream_module

2.1 http upstream配置参数

bash 复制代码
#自定义一组服务器,配置在http块内
upstream name { 
 server .....
 ......
}


#server支持的parameters如下:
weight=number #设置权重,默认为1,实现类似于LVS中的WRR,WLC等
max_conns=number #给当前后端server设置最大活动链接数,默认为0表示没有限制
max_fails=number #后端服务器的下线条件,当客户端访问时,对本次调度选中的后端服务器连续进行检
测多少次,如果都失败就标记为不可用,默认为1次,当客户端访问时,才会利用TCP触发对探测后端服务器健康性
检查,而非周期性的探测
fail_timeout=time #后端服务器的上线条件,对已经检测到处于不可用的后端服务器,每隔此时间间隔再
次进行检测是否恢复可用,如果发现可用,则将后端服务器参与调度,默认为10秒
backup   #设置为备份服务器,当所有后端服务器不可用时,才会启用此备用服务器
down     #标记为down状态,可以平滑下线后端服务器

resolve #当server定义的是主机名的时候,当A记录发生变化会自动应用新IP而不用重启Nginx


hash KEY [consistent];
#基于指定请求报文中首部字段或者URI等key做hash计算,使用consistent参数,将使用ketama一致性
hash算法,适用于后端是Cache服务器(如varnish)时使用,consistent定义使用一致性hash运算,一致
性hash基于取模运算
hash $request_uri consistent; #基于用户请求的uri做hash

hash $cookie_sessionid #基于cookie中的sessionid这个key进行hash调度,实现会话绑定

ip_hash;
#源地址hash调度方法,基于的客户端的remote_addr(源地址IPv4的前24位或整个IPv6地址)做hash计算,以实现会话保持

least_conn;
#最少连接调度算法,优先将客户端请求调度到当前连接最少的后端服务器,相当于LVS中的WLC

2.2 后端多台 web服务器

环境说明:

172.25.254.10 #Nginx 代理服务器

172.25.254.20 #后端web A,Apache部署

172.25.254.30 #后端web B,Apache部署

部署后端 Apache服务器:

root@apache20 \~# yum install httpd -y

root@apache20 \~# echo "web1 172.25.254.20" > /var/www/html/index.html

root@apache20 \~# systemctl enable --now httpd

root@apache30 \~# yum install httpd -y

root@apache30 \~# echo "web2 172.25.254.30" >> /var/www/html/index.html

root@apache30 \~# systemctl enable --now httpd

访问测试:

2.2.1 配置nginx反向代理

注意: 本节实验过程中先关闭缓存

1、编辑子配置文件

root@Nginx \~# vim /usr/local/nginx/conf.d/vhosts.conf

bash 复制代码
upstream webserver {
 server 172.25.254.20 weight=1 fail_timeout=15s max_fails=3;
 server 172.25.254.30 weight=1 fail_timeout=15s max_fails=3;
 server 172.25.254.10 backup;
}

server {
 listen 80;
 server_name ou.qisheng.org;
 location ~ / {
   proxy_pass http://webserver;
 }
}

2、重启nginx,并访问测试

关闭172.25.254.20和172.25.254.30,测试nginx backup服务器可用性:

while true;do curl http://ou.qisheng.org;sleep 1;done

相关推荐
ping某2 天前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工4 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智4 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_4 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉4 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
AC赳赳老秦4 天前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw
java_cj4 天前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes