nginx反向代理

本文介绍了Nginx反向代理的概念及其在企业中的广泛应用,详细讲解了如何配置Nginx进行反向代理,包括代理单台服务器、指定location、启用缓存功能以及配置http upstream以负载均衡多台web服务器。通过具体的步骤和参数设置,帮助读者理解并实践Nginx的反向代理功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 反向代理介绍

反向代理也叫reverse proxy,指的是代理外网用户的请求到内部的指定web服务器,并将数据返回给用 户的一种方式,这是用的比较多的一种方式。
这里我们介绍nginx.
Nginx除了可以在企业提供高性能的web服务之外,另外还可以将本身不具备的请求通过某种预定义的协议转发至 其它服务器处理,不同的协议就是Nginx服务器与其他服务器进行通信的一种规范,主要在不同的场景使用以下模 块实现不同的功能:
逻辑调用关系:

ngx_http_proxy_module: 将客户端的请求以http协议转发至指定服务器进行处理。
ngx_stream_proxy_module:将客户端的请求以tcp协议转发至指定服务器处理。
ngx_http_fastcgi_module:将客户端对php的请求以fastcgi协议转发至指定服务器助理。
ngx_http_uwsgi_module:将客户端对Python的请求以uwsgi协议转发至指定服务器处理。

二 代理参数

proxy_hide_header; 
#用于nginx作为反向代理的时候,在返回给客户端http响应的时候,
#隐藏后端服务版本相应头部的信息,可以设置在http/server或location块
例子:
 location /hello {   
 index index.html;    
 proxy_pass http://192.168.10.3:80/;     
 proxy_hide_header ETag;
  }


 proxy_pass_request_body on | off
 #是否向后端服务器发送HTTP包体部分,可以设置在http/server或location块,默认即为开启
    
 proxy_pass_request_headers on | off
  #是否将客户端的请求头部转发给后端服务器,可以设置在http/server或location块,默认即为开启

 proxy_set_header
 #可以更改或添加客户端的请求头部信息内容并转发至后端服务器,
 #比如在后端服务器想要获取客户端的真实IP的时候,就要更改每一个报文的头部,如下:
 #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
#proxy_set_header HOST  $remote_addr;  
#添加HOST到报文头部,如果客户端为NAT上网那么其值为客户端的共用的公网IP地址。
    
 proxy_hide_header field; 
    #用于隐藏后端服务器特定的响应首部,默认nginx在响应报文中不传递后端服务器的首部字段Date, Server, X-Pad,  X-Accel等
    
 proxy_connect_timeout time; 
 #配置nginx服务器与后端服务器尝试建立连接的超时时间,默认为60秒,用法如下: 

proxy_connect_timeout 60s;
#60s为自定义nginx与后端服务器建立连接的超时时间
    
 proxy_read_time time; 
 #配置nginx服务器向后端服务器或服务器组发起read请求后,等待的超时时间,默认60s 

proxy_send_time 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。
    
proxy_headers_hash_bucket_size 64;
#当配置了proxy_hide_header和proxy_set_header的时候,
#用于设置nginx保存HTTP报文头的hash表的上限。
    
proxy_headers_hash_max_size 512;
#设置proxy_headers_hash_bucket_size的大可用空间 

server_namse_hash_bucket_size 512; 
#server_name hash 表申请空间大小

server_names_hash_max_szie   512;  
#设置服务器名称hash表的上限大小

三 配置nginx反向代理

3.1 代理单台
server
{
    listen 80;
#OPEN-PORT-443
    #listen 443 ssl http2;
    server_name www.a.com;
#DEFAULT-INDEX-START
	index  index.html index.htm index.php;
#DEFAULT-INDEX-END
    root /www/wwwroot/openvpn_110/openvpn-admin;
    
    #ERROR-PAGE-START  错误页配置,可以注释、删除或修改
    error_page 404 /404.html;
    error_page 502 /502.html;
    #ERROR-PAGE-END
   
location / {
	proxy_pass http://www.baidu.com/; #可以域名,可以IP

}
} 

如图:
在这里插入图片描述

3.2 反向代理–指定location
server
{
    listen 80;
#OPEN-PORT-443
    #listen 443 ssl http2;
    server_name www.a.com;
#DEFAULT-INDEX-START
	index  index.html index.htm index.php;
#DEFAULT-INDEX-END
    root /www/wwwroot/openvpn_110/openvpn-admin;
    
    #ERROR-PAGE-START  错误页配置,可以注释、删除或修改
    error_page 404 /404.html;
    error_page 502 /502.html;
    #ERROR-PAGE-END
   
location /web {
	proxy_pass http://192.168.233.150:9200/;  #可以域名,可以IP

} 

测试可以发现: 直接访问www.a.com 是自己内的内容;
然后 www.a.com/web访问为9200端口的内容

3.3 反向代理示例–缓存功能:

缓存功能默认关闭状态

proxy_cache zone | off;  
#默认off #指明调用的缓存,或关闭缓存机制;Context:http, server, location

proxy_cache_key string; 
#缓存中用于“键”的内容,默认值:proxy_cache_key $scheme$proxy_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  proxy_cache_path path [levels=levels] [use_temp_path=on|off] 
# keys_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=1048576个目录    
keys_zone=proxycache:20m 
#指内存中缓存的大小,主要用于存放key和metadata(如:使用次数)      
inactive=120s; 
#缓存有效时间     
max_size=1g; 
#大磁盘占用空间,磁盘存入文件内容的缓存空间大值
#调用缓存功能,需要定义在相应的配置段,如server{...};或者location等       
 proxy_cache proxycache;        
 proxy_cache_key $request_uri;        
 proxy_cache_valid 200 302 301 1h;        
 proxy_cache_valid any 1m;
 proxy_cache_use_stale; 
#在被代理的后端服务器出现哪种情况下,可直接使用过期的缓存响应客户端, 
#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方法总是被缓存
 
proxy_set_header field value; #设定发往后端主机的请求报文的请求首部的值   
 Context: http, server, location     proxy_set_header X-Real-IP  $remote_addr;    
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;        请求报文的标准格式如下:        X-Forwarded-For: client1, proxy1, proxy2

缓存设置分为两步
第一步

vim /www/server/nginx/conf/nginx.conf

#配置在nginx.conf http配置段
proxy_cache_path /data/nginx/proxycache levels=1:1:1 keys_zone=proxycache:20m inactive=120s  max_size=1g; 
第二步

#vim /www/server/nginx/conf/conf.d/a.com.conf

location /web 
{ 
 #要缓存的URL 或者放在server配置项对所有URL都进行缓存    
 proxy_pass http://192.168.233.150:80/;    
 proxy_set_header clientip $remote_addr;   
 proxy_cache proxycache;    
 proxy_cache_key $request_uri;    
 proxy_cache_valid 200 302 301 1h;   
 proxy_cache_valid any 1m;
  }

在浏览器上查看缓存

3.4 http upstream配置参数

Nginx可以基于ngx_http_upstream_module模块提供服务器分组 转发、权重分配、状态监测、调度算法等高级功能
官方文档: https://nginx.org/en/docs/http/ngx_http_upstr eam_module.html

http upstream配置参数:

#配置一个后端web服务器,配置在upstream内,至少要有一个server服务器配置。
upstream name { 
 
} #自定义一组服务器,配置在http内

server address [parameters]; 

#server支持的parameters如下:

weight=number #设置权重,默认为1。 

max_conns=number  #给当前server设置大活动链接数,默认为0表示没有限制。

max_fails=number  #对后端服务器连续监测失败多少次就标记为不可用。 

fail_timeout=time #对后端服务器的单次监测超时时间,默认为10秒。 

backup  #设置为备份服务器,当所有服务器不可用时将重新启用次服务器。

down    #标记为down状态。 

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

hash KEY consistent; 
#基于指定key做hash计算,使用consistent参数,将使用ketama一致性hash算法,适用于后端是Cache服务器
#(如varnish)时使用,consistent定义使用一致性hash运算,一致性hash基于取模运算。
#所谓取模运算,就是计算两个数相除之后的余数,比如10%7=3, 7%4=3
 
hash $request_uri consistent; 
#基于用户请求的uri做hash

ip_hash; 
#源地址hash调度方法,基于的客户端的remote_addr(源地址)做hash计算,以实现会话保持,

least_conn; 
#少连接调度算法,优先将客户端请求调度到当前连接少的后端服务
 

3.5 反向代理示例–多台web服务器:

upstream  webserver {  
#hash $request_uri consistent;  
#ip_hash;  
#least_conn;  
server 192.168.233.151:80 weight=1 fail_timeout=5s max_fails=3; #后端服务器状态监测  
server 192.168.233.152:80 weight=1 fail_timeout=5s max_fails=3;  
server  192.168.233.153:80 weight=1 fail_timeout=5s max_fails=3 backup; }
 
server 
{  
listen 80;  
server_name  www.a.com;  
location / {    
index index.html index.php;    
root /www/wwwroot/html/admin;  
 	}
 
 location /web {    
 index index.html;    
 proxy_pass http://webserver/; 
 	} 
}
 
Nginx 反向代理是一种常用的服务器配置方法,它可以将客户端的请求转到后端的多个服务器上,并将响应返回给客户端。通过反向代理,可以实现负载均衡、缓存、安全性等功能。 要配置 Nginx 反向代理,你需要编辑 Nginx 的配置文件(通常是 `nginx.conf`),然后添加相应的配置项。 以下是一个简单的 Nginx 反向代理配置示例: ``` http { upstream backend { server backend1.example.com; server backend2.example.com; server backend3.example.com; } server { listen 80; server_name example.com; location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } } ``` 在这个示例中,`upstream` 块定义了后端服务器的列表。`server` 块定义了监听的端口和域名,并在 `location` 块中配置了反向代理。 `proxy_pass` 指令将请求转发到 `http://backend`,其中 `backend` 是 `upstream` 块中定义的后端服务器列表。 `proxy_set_header` 指令用于设置转发请求时的请求头。在示例中,我们设置了 `Host` 和 `X-Real-IP` 请求头。 完成配置后,保存文件并重新加载 Nginx 配置。这样,Nginx 就会将客户端的请求转发到后端服务器,并将响应返回给客户端。 请注意,以上只是一个简单的示例,实际的配置可能因具体需求而有所不同。你可以根据实际情况进行配置,并参考 Nginx 官方文档获取更多信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值