反向代理

反向代理: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

相关推荐
鬼手点金几秒前
ReAct 循环
linux·服务器·前端·javascript·react.js·前端框架
EterNity_TiMe_19 分钟前
Docker服务越装越多记不住端口?我用Fenrus把NAS里的常用入口整理成一个导航页
运维·人工智能·docker·ai·容器·cpolar
l1t1 小时前
修改两处,让SQLite求解数独SQL在datafusion上运行
服务器·数据库·sql
IT大白鼠1 小时前
AI SSH 运维助手 V13.0内部版七项私有新特性全解
运维·人工智能·ssh
天蓝蓝的本我2 小时前
ollama外部无法访问.ollama.service 文件无法写入.ollama外部无法访问.
运维·网络
帷幕落秋2 小时前
经典命令场景与软硬链接
linux·运维
派小心.2 小时前
DAU和MAU怎么计算?先确定活跃事件、用户键和统计窗口
大数据·服务器·前端·人工智能·数据分析
data analyse 4562 小时前
Session数怎么计算?明确会话切分、超时与跨页规则
java·服务器·数据库
先知后行。3 小时前
各种文件系统
linux·服务器·数据库