首页 > 系统相关 >Nginx反向代理功能

Nginx反向代理功能

时间:2024-08-20 23:52:46浏览次数:11  
标签:缓存 http nginx 代理 server Nginx 反向 proxy 服务器

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

proxy_pass; #用来设置将客户端请求转发给的后端服务器的主机
            #可以是主机名(将转发至后端服务做为主机头首部)、IP地址:端口的方式
            #也可以代理到预先设置的主机群组,需要模块ngx_http_upstream_module支持
#如果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块
proxy_pass_header field; #透传
#默认nginx在响应报文中不传递后端服务器的首部字段Date, Server, X-Pad, X-Accel等参数
#如果要传递的话则要使用 proxy_pass_header field声明将后端服务器返回的值传递给客户端
#field 首部字段大小不敏感
proxy_pass_request_body on | off; 
#是否向后端服务器发送HTTP实体部分,可以设置在http,server或location块,默认即为开启
proxy_pass_request_headers on | off; 
#是否将客户端的请求头部转发给后端服务器,可以设置在http,server或location块,默认即为开启
proxy_set_header;
#可更改或添加客户端的请求头部信息内容并转发至后端服务器,比如在后端服务器想要获取客户端的真实IP的
时候,就要更改每一个报文的头部

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 

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 

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

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 $scheme$proxy_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配置参数

#自定义一组服务器,配置在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 

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

标签:缓存,http,nginx,代理,server,Nginx,反向,proxy,服务器
From: https://blog.csdn.net/weixin_63657273/article/details/141367181

相关文章

  • Nginx如何实现负载均衡发布策略?
    在Linux中,Nginx实现负载均衡发布策略主要依赖于其反向代理功能。Nginx作为高性能的开源web服务器和反向代理服务器,具有轻量级、高并发、低内存消耗等特点,被广泛用于搭建静态资源服务器、负载均衡、反向代理等场景。以下是Nginx实现负载均衡发布策略的详细过程:一、负载均衡基本概......
  • 交互式智能代理基础模型:迈向通用人工智能的新途径
     人工智能咨询培训老师叶梓转载标明出处传统的AI系统主要集中在收集有用的感官信息上,而新一代的通用AI系统不仅要能够理解环境,还要能够以有意义的方式与之交互。交互式智能代理基础模型代表了开发具有跨任务和数据模态单一神经模型训练能力的通用AI系统的重要一步,这种方法......
  • 全面解析:IP池大小对国外代理IP选择的影响
    代理IP是跨境人不可或缺的工具,广泛应用于广告验证、数据获取和账号矩阵管理等方面。而在选择代理IP时,IP池的大小往往是一个至关重要的考量因素。本文将深入解析IP池大小对代理IP选择的影响,帮助大家更好地理解这一关键决策点。一、IP池的定义及其重要性IP池,作为代理服务提供......
  • nginx 配置允许跨域
    当前端页面和后端应用的协议、IP、端口有任意一项不一样时,就会出现跨域问题,对于这种情况我们可以在后端应用前加一个nginx ,在server{location/{…}}中配置可以跨域完整配置文件如下:worker_processes1;events{worker_connections1024;}http{include......
  • 海外代理IP网速快慢取决因素有哪些?
    在全球化日益加深的今天,海外代理IP成为许多用户进行跨境网络活动的重要工具。然而,用户在使用海外代理IP时,往往会遇到网速快慢不一的问题。本文将从多个角度探讨影响海外代理IP网速快慢的因素,帮助用户更好地理解并选择适合自己的代理IP服务。一、网络基础设施与带宽网络基础......
  • liunx下安装Nginx
    Linux下nginx的安装以及环境配置https://blog.csdn.net/qq_42815754/article/details/82980326第一步:下载nginx压缩包在这里可以去nginx官网下载https://nginx.org/en/download.html也可以直接使用wget命令下载,指令如下所示(请根据自己的需求进行下载):建议选择官网发布的稳......
  • 2024.8.20(playbook剧本安装nginx、roles)
    一、playbook 剧本安装nginx[root@m0~]#mkdir/etc/ansible/playbook[root@m0~]#vim/etc/ansible/playbook/nginx.yml----hosts:group02remote_user:roottasks:-name:卸载httpdyum:......
  • 《深度解读代理模式:静态代理与动态代理的详尽剖析》
    代理模式一、引言在Java开发中,代理模式是一种非常重要的设计模式,它为其他对象提供一种代理,以控制对这个对象的访问,在访问对象和目标对象之间起到中介作用。Java中的代理按照代理类生成时机不同分为静态代理和动态代理,而动态代理又有JDK代理和CGLib代理两种。本文将......
  • Nginx
    在CentOS上部署Nginxyuminstall-ynginx详细命令:[root@CentOS7~]#yuminstallnginx-yLoadedplugins:fastestmirror,langpacksRepositoryepelislistedmorethanonceintheconfigurationRepositoryepel-debuginfoislistedmorethanonceintheconfigur......
  • 设计模式之cglib动态代理
    什么是动态代理呢?动态代理就是在java进程运行时,通过字节码技术,动态的生成某个类的代理类。在这个代理类中,我们可以做一些额外的操作,一方面仍然保持原有的方法的能力,另外一方面还增强了这些能力。听着是不是AOP有点像,没错,动态代理就是AOP的技术基石。在这之前我曾经写过两篇相关的......