一、正向代理
1. 概念
正向代理的核心概念是:代理服务器位于客户端和目标服务器之间。客户端配置代理后,所有请求首先发送到代理服务器,代理服务器再转发请求到目标服务器,并将响应返回给客户端。代理服务器可以隐藏客户端的真实IP地址,并实现访问控制或内容过滤
2. 应用场景
正向代理的常见应用场景包括:
- 企业内部网络:员工通过公司代理访问外部网站,便于监控和安全管理
- 访问受限资源:在地区限制或防火墙环境下,代理服务器可以绕过限制
- 缓存加速:代理服务器缓存常用资源,减少带宽消耗和加载时间
- 匿名浏览:用户通过代理隐藏IP地址,保护隐私
3. 编译安装nginx
以下是编译安装nginx的详细步骤
(1)安装支持软件
首先,安装必要的依赖库:
bash
# 更新系统
sudo apt update # Ubuntu/Debian
# 或 sudo yum update # CentOS/RHEL
# 安装编译工具和依赖
sudo apt install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev -y
(2)创建用户、组、日志目录
创建nginx运行所需的用户和组,并设置日志目录:
bash
# 创建nginx用户和组(无登录权限)
sudo groupadd nginx
sudo useradd -g nginx -s /sbin/nologin nginx
# 创建日志目录
sudo mkdir -p /var/log/nginx
sudo chown nginx:nginx /var/log/nginx
(3)编译安装nginx
下载nginx源码并编译安装:
bash
# 下载nginx源码(以版本1.24.0为例)
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0
# 配置编译选项
./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_ssl_module
# 编译并安装
make
sudo make install
(4)添加nginx系统服务
添加systemd服务文件以方便管理:
bash
# 创建服务文件
sudo nano /etc/systemd/system/nginx.service
# 写入内容
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
# 启用并启动服务
sudo systemctl daemon-reload
sudo systemctl enable nginx
sudo systemctl start nginx
4. 配置正向代理
在nginx配置文件中设置正向代理。编辑/usr/local/nginx/conf/nginx.conf:
nginx
http {
server {
listen 8080; # 代理监听端口
location / {
proxy_pass http://$http_host; # 转发请求到目标主机
proxy_set_header Host $host;
proxy_buffering off; # 关闭缓冲以支持流式传输
}
}
}
重启nginx使配置生效:sudo systemctl restart nginx。客户端配置代理为服务器IP和端口8080即可使用
二、反向代理
反向代理中,代理服务器代表后端服务器接收客户端请求,并将响应返回给客户端。常用于负载均衡、安全防护和内容分发
1. 配置nginx七层代理
七层代理基于HTTP协议,适用于Web应用
(1)环境安装
确保nginx已安装(如上所述)。如果未安装,参考正向代理部分的编译安装步骤
(2)配置nginx七层代理转发
编辑nginx配置文件(如/usr/local/nginx/conf/nginx.conf):
nginx
http {
upstream backend {
server 192.168.1.100:80; # 后端服务器1
server 192.168.1.101:80; # 后端服务器2
}
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;
}
}
}
此配置将请求分发到后端服务器组
(3)验证转发效果
重启nginx:sudo systemctl restart nginx。测试方法:
- 使用curl:
curl http://example.com,应返回后端服务器响应 - 检查nginx日志:
tail -f /var/log/nginx/access.log,观察请求转发记录
2. 代理缓存功能设置
代理缓存可以存储响应,减少后端负载并提升性能
(1)缓存功能的核心原理和缓存类型
核心原理:nginx缓存HTTP响应,当相同请求再次发生时,直接从缓存返回数据。 缓存类型:
- 内存缓存:快速但容量小
- 磁盘缓存:持久化存储,适合大文件。 缓存键基于请求URL、头信息等,使用正则表达式匹配,例如缓存键可定义为uriis_argsargs
(2)反向代理配置
在反向代理基础上添加缓存配置:
nginx
http {
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m use_temp_path=off;
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_cache my_cache; # 启用缓存
proxy_cache_valid 200 304 12h; # 缓存有效时间
proxy_cache_key "$scheme$request_method$host$request_uri"; # 缓存键定义
}
}
}
(3)设置缓存功能
创建缓存目录并设置权限:
bash
sudo mkdir -p /var/cache/nginx
sudo chown nginx:nginx /var/cache/nginx
重启nginx:sudo systemctl restart nginx
(4)验证缓存功能
测试方法:
- 首次访问:
curl -I http://example.com,查看响应头是否有X-Cache-Status: MISS - 再次访问:应有
X-Cache-Status: HIT,表示缓存命中 - 检查缓存目录:
ls /var/cache/nginx,查看缓存文件
3. 配置nginx四层代理
四层代理基于TCP/UDP协议,适用于非HTTP服务如数据库或游戏服务器
(1)配置四层代理
编辑nginx配置文件,使用stream模块:
nginx
stream {
upstream db_backend {
server 192.168.1.102:3306; # MySQL服务器
}
server {
listen 3306; # 监听MySQL端口
proxy_pass db_backend;
}
}
确保nginx编译时启用了--with-stream模块(需重新编译)
(2)验证四层代理
重启nginx:sudo systemctl restart nginx。测试方法:
- 使用telnet:
telnet <nginx_server_ip> 3306,应连接到后端MySQL服务器 - 检查连接日志:在nginx错误日志中查看连接记录
四、Nginx rewrite和正则
Nginx的rewrite模块使用正则表达式重写URL,用于URL美化、重定向等
1. Nginx正则
Nginx支持Perl兼容正则表达式(PCRE),语法基于标准正则。例如:
- 匹配数字序列:\^\\d+
- 匹配路径:\^/images/.\* 正则表达式在配置文件中用于模式匹配,如
location或rewrite指令
2. nginx location
location块用于匹配请求URI并定义处理规则
(1)location 的语法:
语法:location [修饰符] 匹配模式 { ... } 常见修饰符:
=:精确匹配,例如location = /path { ... }~:正则匹配(区分大小写),例如location ~ \.php$ { ... }~*:正则匹配(不区分大小写)^~:前缀匹配
示例:
nginx
location ~ ^/user/(\d+)$ { # 匹配/user/数字
proxy_pass http://backend/users/$1; # $1捕获组
}
(2)location 验证
测试方法:
- 配置后重启nginx
- 访问不同URL,如
http://example.com/user/123,检查是否匹配并正确处理 - 查看nginx访问日志验证匹配结果
3. Rewrite
rewrite指令用于URL重写
(1)Rewrite 语法
语法:rewrite 正则表达式 替换字符串 [flag]; 示例:
nginx
rewrite ^/old/(.*)$ /new/$1 permanent; # 永久重定向
(2)rewrite flag 验证
常见flag:
last:停止当前处理,重新匹配locationbreak:停止rewrite处理redirect:临时重定向(302)permanent:永久重定向(301)。 验证方法:访问旧URL,如http://example.com/old/page,应重定向到新URL并返回301/302状态码
(3)rewrite 中的捕获组
正则表达式中用括号定义捕获组,例如\^/user/(\\d+),在替换字符串中用$1引用。示例:
nginx
rewrite ^/product/(\d+)$ /item?id=$1? break; # 捕获数字并重写
(4)nginx 中的 set指令
set指令用于定义变量,常用于rewrite或条件判断。语法:set $变量名 值; 示例:
nginx
set $backend "http://app-server";
location / {
proxy_pass $backend;
}
验证:变量可用于动态配置,测试时确保代理正确转发