反向代理

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

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

1.1.反向代理配置参数

proxy_pass;

#用来设置将客户端请求转发给的后端服务器的主机,可以是主机名(将转发至后端服务做为主机头首部)、IP

地址:端口的方式

#也可以代理到预先设置的主机群组,需要模块ngx_http_upstream_module支持

示例:

10.0.0.8/web

location /web {

index index.html;

proxy_pass http://10.0.0.18:8080;

#8080后面无uri,即无 / 符号,需要将location后面url 附加到proxy_pass指定的url后面,此行为类似于root

proxy_pass指定的uri不带斜线将访问的/web,等于访问后端服务器

http://10.0.0.18:8080/web/index.html,即后端服务器配置的站点根目录要有web目录才可以被访问

http://nginx/web/index.html ==> http://10.0.0.18:8080/web/index.html

proxy_pass http://10.0.0.18:8080/; #8080后面有uri,即有 / 符号,相当于置换,即访问/web时实际返回proxy_pass后面uri内容.此行为类似于alias

#proxy_pass指定的uri带斜线,等于访问后端服务器的http://10.0.0.18:8080/index.html 内容返回给客户端

} # http://nginx/web/index.html ==> http://10.0.0.18:8080

#重启Nginx测试访问效果:

#curl -L http://www.kgc.org/web

#如果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块

#示例: 隐藏后端服务器ETag首部字段

location /web {

index index.html;

proxy_pass http://10.0.0.18:8080/;

proxy_hide_header ETag;

}

proxy_pass_header field;

#默认nginx在响应报文中不传递后端服务器的首部字段Date, Server, X-Pad, X-Accel等参数,如果

要传递的话则要使用 proxy_pass_header field声明将后端服务器返回的值传递给客户端

#field 首部字段大小不敏感

#示例:透传后端服务器的Server和Date首部给客户端,同时不再响应报中显示前端服务器的Server字段

proxy_pass_header Server;

proxy_pass_header Date;

proxy_pass_request_body on | off;

#是否向后端服务器发送HTTP实体部分,可以设置在http,server或location块,默认即为开启

proxy_pass_request_headers on | off;

#是否将客户端的请求头部转发给后端服务器,可以设置在http,server或location块,默认即为开启

1.2.反向代理单台web 服务器

第一台代理服务器

vim /apps/nginx/conf.d/pc.conf

server{

listen 80;

server_name www.pc.com;

root /data/nginx/pc;

location / {

proxy_pass http://192.168.190.10;

}

}

第二台真实服务器

yum install httpd -y

cd /var/www/html

echo "real server 101" > index.html

建立大文件查看连接情况

dd if=/dev/zero of=test.img count=1 bs=1G

找台服务器访问

curl www.pc.com

wget --limit-rate=1024 www.pc.com/test.img

systemctl stop nginx

systemctl start httpd

第三台客户机

vim /etc/hosts

192.168.190.11 www.pc.com

修改端口号

真实服务器

httpd 服务器修改端口号

server{

listen 80;

server_name www.pc.com;

root /data/nginx/pc;

location / {

root /data/nginx/pc;

proxy_pass http://192.168.190.10:8080;

}

}

在真实服务器上 做防火墙规则

iptables -A INPUT -s 192.168.190.10 -j DROP

客户端再次访问 会出现504网关超时(有可能只是处理时间久,服务器不一定挂了),时间较长1分钟,没有定义代理超时时间

iptables -A INPUT -s 192.168.190.10 -j REJECT

客户端再次访问 会出现502,一般出现502 代表后端真实服务器挂了

1.3.反向代理示例:缓存功能

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_valid 200 302 10m;

proxy_cache_valid 404 1m;

proxy_cache_path;

#定义可用于proxy功能的缓存;Context:http 必须放在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;

#示例:在http配置定义缓存信息

proxy_cache_path /var/cache/nginx/proxy_cache #定义缓存保存路径,proxy_cache会自动创建

levels=1:2:2 #定义缓存目录结构层次,1:2:2可以生成2^4x2^8x2^8=2^20=1048576个目录

keys_zone=proxycache:20m #指内存中缓存的大小,主要用于存放key和metadata(如:使用次数),一般1M可存放8000个左右的key

inactive=120s #缓存有效时间

max_size=10g; #最大磁盘占用空间,磁盘存入文件内容的缓存空间最大值

#调用缓存功能,需要定义在相应的配置段,如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_use_stale error http_502 http_503;

proxy_cache_methods GET | HEAD | POST ...;

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

清理缓存

方法1: rm -rf 缓存目录

方法2: 第三方扩展模块ngx_cache_purge

相关推荐
蜡笔婧萱5 小时前
磁盘监控 + Web 服务巡检自动化脚本实训任务
运维·自动化
折哥的程序人生 · 物流技术专研5 小时前
Tomcat 严重警告:JDBC 驱动未注销 + 工作线程泄漏 —— 原因、影响与彻底修复(生产级终极指南)
java·运维·数据库·mysql·oracle·tomcat
lqjun08275 小时前
Linux 下 Hermes Agent 代理配置不生效问题的解决
linux·服务器
Techblog of HaoWANG5 小时前
智巡守卫:多模态巡检智能体算法服务端设计与实现——基于Ollama+Qwen3.5的自动化巡检报告生成系统
运维·人工智能·算法·目标检测·自动化·边缘计算
c_lb72886 小时前
期货量化策略从 Windows 迁到 Linux 服务器:环境注意点
linux·服务器·windows·python
hweiyu006 小时前
Linux命令:newgrp
linux·运维·服务器
Full Stack Developme6 小时前
计算机加密与解密的历史
运维·服务器·网络·云计算
tedcloud1236 小时前
Supermemory部署教程:打造Agent记忆与RAG环境
服务器·人工智能·学习·自动化·powerpoint
m0_737302586 小时前
读懂OpenClaw:重塑人机交互的开源AI智能体
服务器
Web极客码6 小时前
使用人工智能翻译WordPress网站
服务器·人工智能·wordpress