反向代理

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

相关推荐
小燚~几秒前
ubuntu开机进入initramfs状态
linux·运维·ubuntu
小林熬夜学编程8 分钟前
【Linux网络编程】第十四弹---构建功能丰富的HTTP服务器:从状态码处理到服务函数扩展
linux·运维·服务器·c语言·网络·c++·http
上海运维Q先生12 分钟前
面试题整理15----K8s常见的网络插件有哪些
运维·网络·kubernetes
hhhhhhh_hhhhhh_22 分钟前
ubuntu18.04连接不上网络问题
linux·运维·ubuntu
冷心笑看丽美人29 分钟前
探秘 DNS 服务器:揭开域名解析的神秘面纱
linux·运维·服务器·dns
wenxiaocsdn35 分钟前
某科技局国产服务器PVE虚拟化技术文档
运维·服务器
深圳安锐科技有限公司1 小时前
首次接触结构安全自动化监测系统,价格高吗?后期维护?
运维·自动化
冬天vs不冷2 小时前
Linux用户与权限管理详解
linux·运维·chrome
凯子坚持 c2 小时前
深入Linux权限体系:守护系统安全的第一道防线
linux·运维·系统安全
摸鱼也很难6 小时前
Docker 镜像加速和配置的分享 && 云服务器搭建beef-xss
运维·docker·容器