一、正向代理
正向代理是客户端通过代理服务器访问外部资源的模式。Nginx 默认配置主要针对反向代理,但可通过设置实现正向代理功能。以下逐步说明安装和配置过程。
1.编辑安装 Nginx
Nginx 通常通过编译安装来定制功能。以下是详细步骤。
(1)安装支持软件
在编译前,需安装依赖库:
- PCRE(Perl Compatible Regular Expressions):用于正则表达式支持。
- zlib:用于压缩。
- OpenSSL:用于 SSL/TLS 加密。
在基于 Debian 的系统(如 Ubuntu)中,运行:
bash
sudo apt-get update
sudo apt-get install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev openssl libssl-dev
在基于 RHEL 的系统(如 CentOS)中,运行:
bash
sudo yum groupinstall "Development Tools"
sudo yum install pcre pcre-devel zlib zlib-devel openssl openssl-devel
(2)创建运行用户
为安全起见,创建一个专用用户运行 Nginx:
bash
sudo useradd -r -s /sbin/nologin nginx
(3)编译安装 Nginx
下载 Nginx 源码并编译:
bash
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
--with-http_ssl_module启用 SSL 支持,用于代理 HTTPS 流量。- 编译完成后,Nginx 安装在
/usr/local/nginx。
(4)添加 Nginx 系统服务
创建 systemd 服务文件以便管理:
bash
sudo nano /etc/systemd/system/nginx.service
添加内容:
ini
[Unit]
Description=Nginx HTTP Server
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 quit
PrivateTmp=true
User=nginx
Group=nginx
[Install]
WantedBy=multi-user.target
启用并启动服务:
bash
sudo systemctl daemon-reload
sudo systemctl enable nginx
sudo systemctl start nginx
2.配置正向代理
Nginx 默认不支持正向代理,需手动配置代理服务器功能。编辑 Nginx 配置文件 /usr/local/nginx/conf/nginx.conf:
nginx
http {
server {
listen 8080; # 代理监听端口
location / {
proxy_pass http://$http_host; # 将请求转发到原始主机
proxy_set_header Host $host;
proxy_buffers 256 4k;
proxy_max_temp_file_size 0; # 禁用临时文件
resolver 8.8.8.8; # DNS 解析器
}
}
}
proxy_pass http://$http_host:将客户端请求转发到目标 URL。resolver:指定 DNS 服务器以解析域名。- 保存后,重启 Nginx:
sudo systemctl restart nginx。 - 客户端需配置代理(如浏览器设置代理为
http://your_nginx_ip:8080)。 - 注意:正向代理需确保防火墙允许端口访问,且仅适用于 HTTP 流量;HTTPS 代理需更复杂设置。
二、反向代理
反向代理是服务器端代理,Nginx 接收客户端请求并转发到后端服务器。支持七层(HTTP)和四层(TCP/UDP)代理。
1.配置nginx七层代理
七层代理基于 HTTP 协议,处理应用层流量。
(1)环境安装
假设 Nginx 已安装(见正向代理部分)。如果未安装,重复编译安装步骤。确保启用代理模块(默认已包含)。
(2)配置nginx七层代理转发
编辑 Nginx 配置文件(如 /usr/local/nginx/conf/nginx.conf),添加 server 块:
nginx
http {
upstream backend_servers {
server 192.168.1.100:80; # 后端服务器 1
server 192.168.1.101:80; # 后端服务器 2
server 192.168.1.102:80 backup; # 备份服务器
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_servers; # 转发到 upstream
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
upstream:定义后端服务器组,支持负载均衡。proxy_pass:指定转发目标。proxy_set_header:传递客户端信息到后端。- 保存后,重启 Nginx:
sudo systemctl restart nginx。
(3)验证转发效果
使用 curl 或浏览器测试:
bash
curl http://example.com
- 检查响应是否来自后端服务器(查看日志或响应头)。
- 日志路径:
/usr/local/nginx/logs/access.log。
3.代理缓存功能设置
缓存可减少后端负载,提高响应速度。
(1)缓存功能的核心原理和缓存类型
- 核心原理:Nginx 缓存响应内容,对相同请求直接返回缓存数据,避免重复访问后端。
- 缓存类型 :
proxy_cache:基于 HTTP 响应的缓存。- 缓存键:基于请求 URL、方法等生成,如
$scheme$proxy_host$request_uri。 - 缓存状态:通过响应头控制(如
Cache-Control)。
(2)反向代理配置
在现有反向代理配置基础上扩展。确保 http 块中定义缓存路径:
nginx
http {
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m use_temp_path=off;
# keys_zone:共享内存区名称和大小(10MB)
# inactive:缓存失效时间(60分钟)
# levels:目录层级结构
}
(3)设置缓存功能
在 location 块中添加缓存指令:
nginx
server {
location / {
proxy_pass http://backend_servers;
proxy_cache my_cache; # 启用缓存
proxy_cache_valid 200 302 10m; # 对200和302状态码缓存10分钟
proxy_cache_valid 404 1m; # 对404缓存1分钟
proxy_cache_use_stale error timeout updating; # 在错误时使用旧缓存
add_header X-Cache-Status $upstream_cache_status; # 添加缓存状态头
}
}
proxy_cache_valid:指定不同状态码的缓存时间。add_header:在响应中添加头信息,便于验证。
(4)验证缓存功能
测试步骤:
- 发送请求:
curl -I http://example.com。 - 检查响应头:
X-Cache-Status应为HIT(缓存命中)或MISS(未命中)。 - 查看缓存文件:在
/var/cache/nginx目录中生成缓存文件。 - 重复请求应显示
HIT,表明缓存生效。
3.配置nginx四层代理
四层代理基于传输层(TCP/UDP),处理原始数据流,不解析应用层协议。
(1)配置四层代理
Nginx 需启用 stream 模块。在编译时添加 --with-stream:
bash
./configure --with-stream ... # 其他参数见编译安装步骤
编辑配置文件,添加 stream 块:
nginx
stream {
upstream tcp_backend {
server 192.168.1.100:3306; # 例如 MySQL 服务
server 192.168.1.101:3306;
}
server {
listen 3306; # 监听 TCP 端口
proxy_pass tcp_backend; # 转发到 upstream
proxy_timeout 30s;
}
}
proxy_pass:直接转发 TCP/UDP 流量。- 保存后,重启 Nginx。
(2)验证四层代理
使用 telnet 或 nc 测试:
bash
telnet your_nginx_ip 3306
- 如果连接成功并转发到后端(如 MySQL),则代理生效。
- 查看 Nginx 错误日志:
/usr/local/nginx/logs/error.log以排查问题。
四、Nginx rewrite和正则
Nginx 的 rewrite 模块和 location 块使用正则表达式实现 URL 重写和路由。
1.Nginx正则
Nginx 支持 Perl 兼容正则表达式(PCRE),语法包括:
- 基本匹配:如
^(开头)、$(结尾)、.(任意字符)。 - 字符类:如
[a-z]匹配小写字母。 - 量词:如
*(0 或多个)、+(1 或多个)、?(0 或 1 个)。 - 捕获组:用
( )捕获子匹配,可在 rewrite 中引用。 - 示例:
~* \.(jpg|png)$匹配不区分大小写的 JPG 或 PNG 文件。
2.nginx location
location 块定义 URL 匹配规则和处理逻辑。
(1)location 的语法
语法格式:
nginx
location [修饰符] 匹配模式 {
# 指令
}
- 修饰符 :
=:精确匹配(如= /index.html)。~:区分大小写正则匹配(如~ \.php$)。~*:不区分大小写正则匹配(如~* \.html$)。^~:前缀匹配,优先于正则。
- 匹配模式:字符串或正则表达式。
- 优先级顺序 :精确匹配 (
=) > 前缀匹配 (^~) > 正则匹配 (~或~*) > 普通前缀匹配。
示例配置:
nginx
server {
location = /favicon.ico {
access_log off; # 精确匹配,忽略日志
}
location ~ \.php$ {
proxy_pass http://php_backend; # 正则匹配 PHP 文件
}
location /static/ {
root /data; # 前缀匹配静态文件
}
}
(2)location 验证
测试方法:
-
添加测试 location 块:
nginxlocation /test { return 200 "Match successful"; } -
重启 Nginx:
sudo systemctl restart nginx。 -
发送请求:
curl http://example.com/test。 -
检查响应:应为 "Match successful",否则查看错误日志。
3.Rewrite
rewrite 指令用于修改 URL,实现重定向或内部转发。
(1)Rewrite 语法
基本格式:
nginx
rewrite 正则模式 替换目标 [flag];
- 正则模式:匹配 URL 的正则表达式。
- 替换目标 :新 URL,可包含捕获组引用(如
$1)。 - flag:可选标志,控制行为(见下文)。
示例:
nginx
rewrite ^/old/(.*)$ /new/$1 last; # 将 /old/xxx 重写到 /new/xxx
(2)rewrite flag 验证
常用 flag:
last:停止当前 rewrite 处理,重新匹配 location。break:停止所有 rewrite 处理,继续执行当前 location。redirect:返回 302 临时重定向。permanent:返回 301 永久重定向。
验证方法:
-
添加 rewrite 规则:
nginxrewrite ^/redirect$ http://example.com/new permanent; -
重启 Nginx。
-
请求
http://example.com/redirect,应返回 301 重定向到http://example.com/new。 -
使用
curl -I http://example.com/redirect检查响应头。
(3)rewrite 中的捕获组
捕获组用 ( ) 定义,在替换目标中用 $1, $2 等引用。
示例:
nginx
rewrite ^/user/(\d+)/profile$ /profile?id=$1 last;
- 匹配
/user/123/profile重写为/profile?id=123。
(4)nginx 中的 set指令
set 指令用于定义变量,常在 rewrite 或 location 中使用。
语法:
nginx
set $variable value;
示例:
nginx
location / {
set $backend "http://fallback_server";
if ($arg_debug) {
set $backend "http://debug_server";
}
proxy_pass $backend;
}
- 变量可用于条件逻辑或动态配置。
- 验证:通过请求参数(如
?debug=1)改变代理目标。
以上配置需结合实际环境测试。Nginx 配置错误可能导致服务中断,建议在修改前备份文件,并使用 nginx -t 检查语法。