一、正向代理和反向代理
1.1 正向代理概述
正向代理是位于客户端和目标服务器之间的中间服务器,代理的是客户端。客户端向代理服务器发送包含目标服务器的请求,代理服务器转发请求并将结果返回给客户端。
正向代理的作用
- 为局域网客户端提供访问 Internet 的途径
- 利用缓冲特性减少网络使用率
- 帮助访问受地理位置限制的网络
- 隐藏客户端真实 IP 地址
正向代理基本配置格式
server {
listen 192.164.65.100:80;
server_name 客户端访问的域名;
location / {
proxy_pass http://目标服务器地址;
}
}
1.2 反向代理概述
反向代理代理的是服务端,客户端不直接与后端服务器通信,而是与反向代理服务器交互,从而隐藏了后端服务器的 IP 地址。
反向代理的主要功能
- 负载均衡:将请求分发给多个后端服务器,平衡负载
- 缓存功能:缓存静态文件或动态页面,提高响应速度
- 动静分离:分离动态内容和静态资源到不同服务器
- 多站点代理:代理多个域名,转发到不同后端服务器
反向代理常用模块
ngx_http_proxy_module:# 以http协议转发请求至指定服务器
ngx_http_upstream_module # 定义后端服务器分组
ngx_stream_proxy_module:# 以tcp协议转发请求
ngx_http_fastcgi_module:# 以fastcgi协议转发php请求
ngx_http_uwsgi_module: # 以uwsgi协议转发Python请求
二、反向代理配置详解
2.1 核心配置参数
proxy_pass 指令
用于设置将客户端请求转发给的后端服务器,格式如下:
proxy_pass 地址:端口;
不同用法的区别:
# 不带斜线,会将location后的url附加到proxy_pass指定的url后
proxy_pass http://10.0.0.18:8080;
# 带斜线,相当于置换,访问/web时实际访问后端的/
proxy_pass http://10.0.0.18:8080/;
注意:如果 location 使用正则表达式模式,则 proxy_pass 之后不能使用 uri(即不能有 /)
其他常用参数
# 隐藏后端服务器响应头部信息
proxy_hide_header field;
# 传递后端服务器特定首部字段给客户端
proxy_pass_header field;
# 是否向后端服务器发送HTTP实体部分,默认开启
proxy_pass_request_body on | off;
# 是否将客户端的请求头部转发给后端服务器,默认开启
proxy_pass_request_headers on | off;
三、反向代理实战案例
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;
}
}
真实服务端配置:
# 安装httpd服务
yum install httpd -y
# 创建主页内容
cd /var/www/html
echo "Hi~" > index.html
# 启动服务
systemctl start httpd
客户机配置 hosts:
vim /etc/hosts
192.164.65.100 www.pc.com
测试:
curl 192.164.65.100
3.2 实现动静分离的反向代理
通过不同 location 配置,将动态资源和静态资源转发到不同服务器:
# 代理服务器配置
vim /apps/nginx/conf.d/pc.conf
location /api {
proxy_pass http://192.164.65.101;
}
location /static {
proxy_pass http://192.164.65.103;
}
动态资源服务器配置:
# 创建动态资源
cd /usr/share/nginx/html
mkdir api
echo this is api > ./api/index.html
静态资源服务器配置:
# 创建静态资源
cd /usr/share/nginx/html
mkdir static
echo this is static > ./static/index.html
测试:
# 测试动态资源
curl 192.164.65.100/api -L
# 测试静态资源
curl 192.164.65.100/static -L
3.3 Nginx 缓存功能配置
Nginx 可以缓存静态资源,减少后端服务器压力,提高响应速度。
缓存核心配置
# 在http配置块中定义缓存信息
proxy_cache_path /var/cache/nginx/proxy_cache # 缓存保存路径
levels=1:2:2 # 缓存目录结构层次
keys_zone=proxycache:20m # 内存中缓存的大小
inactive=120s # 缓存有效时间
max_size=10g; # 最大磁盘占用空间
# 在server或location块中调用缓存
proxy_cache proxycache;
proxy_cache_key $request_uri; # 缓存key
proxy_cache_valid 200 302 301 10m; # 特定状态码缓存时长
proxy_cache_valid any 1m; # 其他状态码缓存时长
缓存相关参数
# 定义对哪些请求方法进行缓存
proxy_cache_methods GET | HEAD | POST ...;
# 后端服务器异常时是否使用过期缓存
proxy_cache_use_stale error | timeout | http_500 ...;
缓存清理方法
- 直接删除缓存目录:
rm -rf 缓存目录
- 使用第三方扩展模块 ngx_cache_purge
3.4 实现客户端 IP 透传
在反向代理中,通过特定 HTTP 头字段将客户端真实 IP 传递给后端服务器。
一级代理配置
# 代理服务器配置
server{
listen 192.164.65.100:80;
server_name www.pc.com;
location / {
proxy_pass http://192.164.65.101;
# 添加IP透传配置
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
$proxy_add_x_forwarded_for
变量会获取客户端真实 IP 并添加到X-Forwarded-For
头字段中,后端服务器可通过该字段获取真实客户端 IP。
多级代理配置
在每一级代理服务器都添加相同的proxy_set_header X-Forwarded-For
配置,即可实现多级代理下的 IP 透传。
3.5 反向代理负载均衡
Nginx 基于ngx_http_upstream_module
模块提供负载均衡功能,支持多种调度算法。
常见配置参数
upstream 服务器组名 {
server 后端服务器地址 [参数];
}
# 常用参数
weight=number # 权重,默认为1
max_conns=number # 最大活动连接数
max_fails=number # 失败次数阈值
fail_timeout=time # 失败重试时间
backup # 备份服务器
down # 标记为不可用
常用调度算法
轮询(Round Robin)
upstream backend {
server 192.164.65.1;
server 192.164.65.2;
}
-
加权轮询(Weighted Round Robin)
upstream backend {
server 192.164.65.1 weight=10;
server 192.164.65.2 weight=20;
} -
IP 哈希(ip_hash)
upstream backend {
ip_hash;
server 192.164.65.1:88;
server 192.164.65.2:80;
} -
最少连接数(least_conn)
upstream backend {
least_conn;
server backend1.example.com;
server backend2.example.com;
} -
第三方算法:fair(按响应时间)、url_hash(按 URL 哈希)
负载均衡实战配置
# 在主配置文件中定义服务器组
vim /apps/nginx/conf/nginx.conf
upstream group1{
server 192.164.65.102 weight=2;
server 192.164.65.103 weight=3;
}
# 在子配置文件中引用
vim /apps/nginx/conf.d/pc.com
location / {
proxy_pass http://group1;
}
四、Nginx 配置跨域 CORS
4.1 跨域的定义与限制
同源策略是浏览器的安全机制,限制不同源之间的交互。同源指协议、域名和端口都相同。
不同源的限制包括:
- 数据层面:限制读取 Cookie、IndexDB 等数据
- DOM 层面:限制对 DOM 对象的操作
- 网络层面:限制跨域请求
4.2 Nginx 解决跨域的原理
浏览器向与前端同源的 Nginx 服务器发送请求,Nginx 转发请求到目标服务器,再将响应返回给浏览器,从而绕过 CORS 限制。
4.3 跨域配置案例
server {
listen 80;
server_name fe.server.com;
location / {
proxy_pass dev.server.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 防盗链设置
5.1 防盗链原理
基于 HTTP 的 Referer 机制,通过识别请求来源,限制未经允许的网站盗用资源。Referer 头信息表示请求的来源页面。
5.2 防盗链配置
server {
listen 80;
server_name localhost;
location ~* \.(js|img|css|png)$ {
# 只允许指定来源访问
valid_referers 192.168.166.9;
# 非法来源返回403
if ($invalid_referer) {
return 403;
}
root html;
}
}
valid_referers 参数说明
none
:允许没有 Referer 的请求blocked
:允许 Referer 不以 http:// 或 https:// 开头的请求server_names
:允许指定域名的请求- 可以直接指定 IP 或域名作为白名单
通过以上配置,Nginx 可以有效防止静态资源被其他网站盗用,保护服务器带宽资源。