了解学习Nginx反向代理与缓存功能

一、正向代理和反向代理

1. 反向代理概述和功能

反向代理的主要作用是提供负载均衡和高可用性。

负载均衡:Nginx可以将传入的请求分发给多个后端服务器,以平衡服务器的负载,提高系统性能和可靠性。

缓存功能:Nginx可以缓存静态文件或动态页面,减轻服务器的负载,提高响应速度。

动静分离:将动态生成的内容(如 PHP、Python、Node.js 等)和静态资源(如 HTML、CSS、JavaScript、图片、视频等)分别存放在不同的服务器或路径上。

多站点代理:Nginx可以代理多个域名或虚拟主机,将不同的请求转发到不同的后端服务器上,实现多个站点的共享端口。

1.1 反向代理的可用模块

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协议转发至指定服务器处理

二、配置反向代理

2.1 反向代理配置参数

2.1.1 proxy_pass

proxy_pass 地址:端口的方式 ;

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

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

proxy_pass http://10.0.0.18:8080;

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

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

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 内容返回给客户端

2.1.2 其他参数

proxy_hide_header field;

#用于nginx作为反向代理的时候,在返回给客户端http响应时,隐藏后端服务器相应头部的信息,可以设置proxy_hide_header field;

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块,默认即为开启

三、配置实战

3.1 反向代理单台web服务器

所需配置

复制代码
代理服务器
vim /apps/nginx/conf.d/pc.conf
#编辑子配置文件
server{
        listen 192.164.65.100:80;
        server_name  www.pc.com;
        root    /apps/nginx/html/pc;
     location  / {
        proxy_pass http://192.164.65.101;
}

}
nginx -t
nginx -s reload
#重新加载
复制代码
#真实服务端
yum  install   httpd  -y #安装服务

cd  /var/www/html
echo   "Hi~"  > index.html #主页内容

systemctl start httpd #开启服务

vim /etc/hosts
#添加地址映射

192.164.65.100 www.pc.com
复制代码
#客户机

vim  /etc/hosts
192.164.65.100  www.pc.com

客户机访问代理服务器

复制代码
 curl 192.164.65.100

3.2 实现反向代理客户端IP透传

3.2.1 基本原理

反向代理客户端IP透传是指在使用反向代理服务器时,将客户端的真实IP地址传递给后端服务器。

这可以通过一些特定的 如X-Forwarded-For 等HTTP 头字段来实现 头字段。

当请求经过反向代理服务器时,代理服务器会将客户端的真实IP地址添加到 XFF 头字段中,然后转发给后端服务器。

后台服务端开启main日志格式调用!!!

所需配置

#代理服务器

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

#编辑子配置文件

server{

listen 192.164.65.100:80;

server_name www.pc.com;

root /apps/nginx/html/pc;

location / {

proxy_pass http://192.164.65.101;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

}

`$proxy_add_x_forwarded_for` 是一个 nginx 变量,用于获取客户端的真实 IP 地址并将其添加到请求中的 `X-Forwarded-For` 头字段中,后端服务器可以通过检查该头字段来获取请求的真实客户端 IP 地址。

复制代码
#后端服务器

#关闭防火墙和selinux
systemctl stop firewalld
setenforce 0

#安装服务
yum install -y epel-release #依赖
yum install nginx -y 
systemctl start nginx 

测试

#客户端

curl 192.164.65.100

#后端服务器

cat /var/log/nginx/access.log |tail -f -n2

3.3 多级代理

所需配置

#一级代理服务器

#编辑子配置文件

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

#反向代理指向二级代理服务器的IP

nginx -t

nginx -s reload

#重新加载

复制代码
#yum安装nginx
yum install -y epel-release 
yum install nginx -y 

systemctl start nginx 

vi /etc/nginx/nginx.conf
#编辑主配置文件

server {
location / {
proxy_pass http://192.164.65.102;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

systemctl restart nginx
#重新加载
复制代码
#后端服务器

#关闭防火墙和selinux
systemctl stop firewalld
setenforce 0

#安装nginx服务
yum install -y epel-release 
yum install nginx -y 
systemctl start nginx 

测试

复制代码
#客户端,访问代理服务器
curl 192.164.2.100

#后端服务器,查看日志
cat /var/log/nginx/access.log | tail -n -1

3.3 实现反向代理负载均衡

Nginx 可以基于ngx_http_upstream_module模块提供服务器分组转发、权重分配、状态监测、调度算法等高级功能

3.4 常见配置参数

server address [parameters];

#配置一个后端web服务器,配置在upstream内,至少要有一个server服务器配置。

#server支持的parameters如下:

weight=number #设置权重,默认为1,实现类似于LVS中的WRR,WLC等

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

max_fails=number #后端服务器的下线条件,当客户端访问时,对本次调度选中的后端服务器连续进行检测多少次,如果都失败就标记为不可用,默认为1次,当客户端访问时,才会利用TCP触发对探测后端服务器健康性检查,而非周期性的探测

fail_timeout=time #后端服务器的上线条件,对已经检测到处于不可用的后端服务器,每隔此时间间隔再次进行检测是否恢复可用,如果发现可用,则将后端服务器参与调度,默认为10秒

sorry server #自己不能转自己

down #标记为down状态

resolve #当server定义的是主机名的时候,当A记录发生变化会自动应用新IP而不用重启Nginx
backup #设置为备份服务器,当所有后端服务器不可用时,才会启用此备用服务器

upstream backend {

server backend1.example.com;

server backend2.example.com backup;

server backend3.example.com;

}

3.5 调度算法
3.5.2.1 轮询(Round Robin)

每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响。

#示例

upstream bakend {

server 192.164.65.1;

server 192.164.65.2;

}

3.5.2.2 轮询权值(Weighted Round Robin)

weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或者仅仅为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

#示例

upstream bakend {

server 192.164.65.1 weight=10;

server 192.164.65.2 weight=20;

}

3.5.2.3 ip_hash (source hash)

每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题。

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

#示例

upstream bakend {

ip_hash;

server 192.164.65.1:88;

server 192.164.65.2:80;

}

3.6 使用轮询算法实现负载均衡

所需配置

#代理服务器

vim /apps/nginx/conf/nginx.conf

#编辑主配置文件

upstream group1{

server 192.164.65.102;

server 192.164.65.103;

}

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

#修改子配置文件

#修改location部分,加入

pass_proxy http://group1;

nginx -t

nginx -s reload

#重新加载

测试

#修改102、103主页文件

vi /usr/share/nginx/html/index.html

#转到客户端

curl 192.164.65.100 #x2

所需配置

复制代码
#代理服务器

#修改主配置文件
vim /apps/nginx/conf/nginx.conf

upstream group1{
    server 192.164.65.102 weight=2;
    server 192.164.65.103 weight=3;
}

nginx -t

nginx -s reload

#重新加载

#转到客户端

curl 192.164.65.100 #x2

四、 Nginx配置跨域 CORS

案例

前端 server 的域名为:fe.server.com

后端服务的域名为:dev.server.com

现在在 fe.server.comdev.server.com 发起请求一定会出现跨域。

现在我们只需要启动一个 Nginx 服务器,将 server_name 设置为 fe.server.com 然后设置相应的 location 以拦截前端需要跨域的请求,最后将请求代理回 dev.server.com

如下面的配置:

复制代码
server {
  listen        80;
  server_name  fe.server.com;
  location / {
    	proxy_pass dev.server.com;
        proxy_set_cookie_domain target-domain.com your-domain.com;
        proxy_set_header Host target-domain.com;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # 可选的配置,用于处理响应头
        proxy_set_header Access-Control - Allow - Origin http://fe.server.com;
        proxy_set_header Access-Control - Allow - Methods GET,POST,PUT,DELETE;
        proxy_set_header Access-Control - Allow - Headers Content - Type,Authorization;
  }
}

五、Nginx防盗链设置

案例

修改 192.168.166.10 Nginx 默认访问文件

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>产生盗链</title>
</head>
<body>
 <a href='http://192.168.166.9/photos/1.png'>站点</a>
</body>
</html>

**防盗链设置格式:**

复制代码
valid_referers none | blocked | server_names | strings ....;
  • --none:允许没有http_refer的请求访问资源,检测 Referer 头域不存在的情况,则可以访问。

  • --blocked:检测 Referer 头域的值被防火墙或者代理服务器删除或伪装的情况。这种情况该头域的值不以"http://" 或 "https://" 开头。允许不是http://开头的,不带协议的请求访问资源。

  • --server_names :只允许指定ip/域名来的请求访问资源(白名单)。可设置一个或多个 URL ,检测 Referer 头域的值是否是这些 URL 中的某一个。在生产环境中尽量使用域名,不使用ip。

**举例**

valid_referers 192.168.44.101;

if ($invalid_referer) {

return 403;

}

192.168.166.9设置防盗链**

复制代码
server {
	listen 80;
	server_name localhost;
    location / {
            root   /usr/local/nginx1273/html;
            index  index.html index.htm;
        }
 
    location ~* \.(js|img|css|png)${
    	valid_referers 192.168.166.9; #只允许192.168.166.9访问静态资源,其他人访问则会返回403
    	if ($invalid_referer){
    		return 403;
		}
        root html;
        index index.html index.htm;
    }
    error_page 500 502 503 504 /50x.html;
    location =/50x.html {
    root html;
    }
}

测试

浏览器测试

用192.168.166.10去访问,css等静态资源返回403,获取不到数据。

点击"站点",跳转到192.168.166.9站点资源是显示:/

相关推荐
梅孔立2 小时前
基于 Service Worker 的图书馆资源缓存技术研究
缓存
小哈里2 小时前
【后端开发】golang部分中间件介绍(任务调度/服务治理/数据库/缓存/服务通信/流量治理)
数据库·缓存·中间件·golang·后端开发
sswithyou3 小时前
TCP的学习
网络协议·学习·tcp/ip
BreezeJuvenile3 小时前
外设模块学习(3)——28BYJ-48步进减速电机
stm32·学习·步进电机·外设模块
苦逼大学生被编程薄纱4 小时前
C++ 容器学习系列|vector 核心知识全解析,铺垫下一期模拟实现
开发语言·c++·学习
DKPT4 小时前
JVM栈溢出时如何dump栈信息?
java·jvm·笔记·学习·spring
DKPT4 小时前
JVM堆大小如何设置?
java·开发语言·jvm·笔记·学习
小喵要摸鱼4 小时前
【机器学习】监督学习 —— 逻辑回归
学习·机器学习·逻辑回归
xx.ii4 小时前
59.keepalived实现高可用
运维·nginx·负载均衡