Nginx 核心功能
Nginx 是一款高性能的 HTTP 和反向代理服务器,同时也支持正向代理、四层 / 七层代理、URL 重写等核心功能。凭借高并发、低内存占用的新能成为服务端配置的主流选择。
正向代理
正向代理是客户端的代理,客户端同过正向代理服务器访问目标服务器,目标服务器仅能识别代理服务器的请求,无法直接获取客户端的真是信息,常应用于跨网络访问、客户端访问控制等场景。正向代理的实现完成 Nginx 的便宜安装与专属配置两步操作。
编译安装 Nginx
bash
# 1. 安装编译依赖
yum install -y gcc pcre-devel zlib-devel openssl-devel wget
# 2. 下载并解压Nginx源码(以1.24.0版本为例)
wget https://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0
# 3. 配置编译参数(指定安装路径,启用默认模块)
./configure --prefix=/usr/local/nginx
# 4. 编译并安装
make && make install
# 5. 启动Nginx并验证
/usr/local/nginx/sbin/nginx
curl -I 127.0.0.1 # 出现HTTP/1.1 200 OK即安装成功
配置正向代理
Nginx 正向代理的核心配置围绕 http 块或 server 块展开,需配置 DNS 解析、代理转发规则等关键项,完整配置示例 (修改/usr/local/nginx/conf/nginx.conf):
nginx
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 正向代理核心配置
server {
listen 8080; # 代理监听端口
resolver 223.5.5.5 114.114.114.114; # 配置DNS服务器(阿里+电信)
resolver_timeout 30s; # DNS解析超时时间
# 匹配所有请求进行代理转发
location / {
proxy_pass $scheme://$host$request_uri; # 转发请求到目标地址
proxy_set_header Host $host;
proxy_connect_timeout 30s; # 代理连接超时
proxy_send_timeout 30s; # 代理发送超时
proxy_read_timeout 30s; # 代理读取超时
}
}
}
生效与验证
bash
# 重启Nginx
/usr/local/nginx/sbin/nginx -s reload
# 客户端验证(指定代理服务器访问百度)
curl -x 代理服务器IP:8080 https://www.baidu.com
反向代理
反向代理是服务端的代理,代理服务器接收客户端的请求,再将请求转发给后端的应用服务器,将处理结果返回给客户端,客户端无需感知后端服务器的存在。Nginx 反向代理是ui常用的核心功能,支持七层代理、四层代理,且可配置代理缓存提升服务相应效率。
七层与四层代理核心区别
差异
| 对比维度 | 七层代理 | 四层代理 |
|---|---|---|
| 基于 OSI 层级 | 应用层(HTTP/HTTPS/FastCGI) | 传输层(TCP/UDP) |
| 核心识别依据 | 域名、URL、请求头 | IP 地址、端口号 |
| 所需 Nginx 模块 | 默认 http 模块(无需额外启用) | stream 模块(编译时需启用) |
| 适用场景 | Web 服务、接口代理 | 数据库、Redis、TCP 服务 |
| 核心指令 | http块、proxy_pass |
stream块、proxy_pass |
配置 nginx 七层代理
七层代理是 Nginx 最基础的反向代理方式,核心配置在 http 块中完成,通过 upstream 配置后端集群,实现负载均衡,完整配置示例:
nginx
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 配置后端服务器集群(负载均衡)
upstream backend_server {
server 192.168.1.100:8080 weight=5; # 权重5,权重越高被分配概率越大
server 192.168.1.101:8080 weight=3;
server 192.168.1.102:8080 backup; # 备用服务器,主服务器故障时启用
}
# 反向代理核心配置
server {
listen 80;
server_name www.test.com; # 客户端访问的域名
location / {
proxy_pass http://backend_server; # 转发至后端集群
# 转发客户端真实IP和请求头,后端可通过X-Real-IP获取真实IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 连接超时配置
proxy_connect_timeout 30s;
proxy_send_timeout 30s;
proxy_read_timeout 60s;
}
}
}
核心负载均衡策略: upstream 中直接配置,常用的有 weight(权重)、ip_hash(基于客户端 IP 哈希,保证会话粘滞)、fair(基于后端响应速度)。
代理缓存功能设置
Nginx 代理缓存可将后端服务器的相应结果缓存至本地,再次收到相同请求时直接返回缓存,降低后端压力、提升响应速度,完整配置示例:
nginx
http {
include mime.types;
default_type application/octet-stream;
# 1. 配置缓存基础参数(全局http块中配置)
proxy_cache_path /usr/local/nginx/cache levels=1:2 keys_zone=nginx_cache:100m max_size=10g inactive=7d use_temp_path=off;
# 解释:
# /usr/local/nginx/cache:缓存文件存储路径
# levels=1:2:缓存文件目录层级
# keys_zone=nginx_cache:100m:缓存命名空间(nginx_cache),内存占用100M
# max_size=10g:缓存最大磁盘占用10G
# inactive=7d:7天未访问的缓存自动清理
# use_temp_path=off:避免临时文件与缓存文件混放
upstream backend_server {
server 192.168.1.100:8080;
}
server {
listen 80;
server_name www.test.com;
location / {
proxy_pass http://backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# 2. 启用并配置缓存(location中配置)
proxy_cache nginx_cache; # 关联上述命名空间
proxy_cache_key $host$request_uri$args; # 缓存唯一标识(域名+URL+参数)
proxy_cache_valid 200 304 206 1h; # 200/304/206状态码缓存1小时
proxy_cache_valid any 1m; # 其他状态码缓存1分钟
proxy_cache_bypass $http_cache_control; # 客户端带Cache-Control则跳过缓存
add_header X-Cache $upstream_cache_status; # 响应头添加缓存状态(HIT/MISS/EXPIRED)
}
}
}
**缓存状态说明:**通过 X-Cache 响应头可查看,HIT(命中缓存)、MISS(未命中)、EXPIRED(缓存过期)、BYPASS(跳过缓存).
配置 Nginx 四层代理
四层代理需要启用 stream 模块,编译时需指定 --with-stream,先补全编译命令:
1.编译启用 stream 模块
bash
# 进入Nginx源码目录
cd nginx-1.24.0
# 配置编译参数,启用stream模块
./configure --prefix=/usr/local/nginx --with-stream
# 重新编译安装
make && make install
# 验证模块是否启用
/usr/local/nginx/sbin/nginx -V # 出现--with-stream即启用成功
2.四层代理完整配置示例
stream 块与 http 块同级,核心配置 TCP/UDP 转发,以代理 MySQL(TCP 协议,3306 端口)为例:
nginx
worker_processes 1;
events {
worker_connections 1024;
}
# 四层代理核心配置(stream块,与http同级)
stream {
# 配置后端MySQL服务器集群
upstream mysql_server {
server 192.168.1.100:3306 weight=5;
server 192.168.1.101:3306 weight=3;
}
# 监听TCP 3306端口,转发至后端集群
server {
listen 3306; # 与MySQL端口一致
proxy_pass mysql_server;
proxy_connect_timeout 10s; # 四层代理连接超时
proxy_timeout 300s; # 四层代理会话超时
}
# 若需代理UDP服务(如DNS),只需指定listen为udp:
# server {
# listen 53 udp;
# proxy_pass dns_server;
# }
}
# 原有http块配置可保留
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
}
Nginx rewrite 和正则
Nginx 的 rewrite 功能基于正则表达式实现 URL 重写、重定向,结合 location 指令的请求匹配规则,可灵活处理客户端的 URL 请求,常应用于域名跳转、URL 规范化、伪静态配置等场景,是 Nginx 配置中灵活性极强的功能模块。
Nginx 正则
Nginx 正则基于 Perl 兼容的正则表达式(PCRE),是 rewrit 与 location 匹配的核心,常用的正则元字符有:
| 元字符 | 核心含义 | 示例 | 示例说明 |
|---|---|---|---|
^ |
匹配字符串开头 | ^/api |
匹配以 /api 开头的 URL |
$ |
匹配字符串结尾 | .html$ |
匹配以.html 结尾的 URL |
. |
匹配任意单个字符 | a.b |
匹配 a + 任意字符 + b(如 a1b) |
* |
匹配前一个字符 0 次 / 多次 | a* |
匹配 0 个或多个 a |
+ |
匹配前一个字符 1 次 / 多次 | a+ |
匹配 1 个或多个 a |
? |
匹配前一个字符 0 次 / 1 次 | a? |
匹配 0 个或 1 个 a |
() |
分组匹配,可反向引用 | (api)/(\\d+) |
分组匹配 api 和数字,可通过1/2 引用 |
| `` | 匹配多个表达式中的一个 | html php |
匹配 html 或 php |
\\d |
匹配任意数字 | \\d{4} |
匹配 4 位数字 |
nginx location
location 指令用于匹配客户端的 URL 请求路径,根据匹配规则将请求分发至不同的处理逻辑,是 Nginx 路由配置的核心。匹配类型、优先级与说明如下表(优先级从高到低):
| 匹配类型 | 语法格式 | 优先级 | 核心说明 |
|---|---|---|---|
| 精准匹配 | location = /path |
1(最高) | 完全匹配 URL 路径,匹配成功立即终止后续匹配 |
| 前缀匹配 | location ^~ /path |
2 | 匹配以指定路径开头的 URL,终止后续正则匹配 |
| 正则匹配 | location ~ /path |
3 | 区分大小写的正则匹配,按配置顺序匹配 |
| 正则匹配 | location ~* /path |
3 | 不区分大小写的正则匹配,按配置顺序匹配 |
| 普通前缀匹配 | location /path |
4 | 匹配以指定路径开头的 URL,可被正则匹配覆盖 |
| 通用匹配 | location / |
5(最低) | 匹配所有未被上述规则匹配的请求 |
location 匹配实操代码示例
nginx
server {
listen 80;
server_name www.test.com;
# 精准匹配:仅匹配http://www.test.com/
location = / {
return 200 "精准匹配 /";
}
# 前缀匹配:匹配/api开头的URL,终止后续正则匹配
location ^~ /api {
return 200 "前缀匹配 /api";
}
# 不区分大小写正则匹配:匹配以.html结尾的URL
location ~* \.html$ {
return 200 "正则匹配 .html";
}
# 普通前缀匹配:匹配/static开头的URL,若有正则匹配则被覆盖
location /static {
return 200 "普通前缀匹配 /static";
}
# 通用匹配:匹配所有未被上述规则匹配的请求
location / {
return 200 "通用匹配";
}
}
Rewrite
Rewrite 指令是 Nginx 实现 URL 重写 / 重定向的核心,基于正则匹配 URL 并替换为新路径,结合flag 标记控制请求处理逻辑。先通过表格说明常用 flag,再给出多场景实操代码示例。
Rewrite 常用 flag 标记说明
| 标记 | 核心含义 | 适用场景 |
|---|---|---|
last |
完成本次重写,按新 URL重新匹配 location,终止当前块的重写规则 | 站内 URL 重写、伪静态配置 |
break |
完成本次重写,不再匹配 location 和后续重写规则,直接处理新 URL | 简单 URL 重写,无需二次匹配 |
redirect |
返回 302临时重定向,客户端根据新地址重新请求,地址栏会变化 | 临时域名跳转、URL 临时调整 |
permanent |
返回 301永久重定向,浏览器会缓存重定向规则,地址栏会变化 | 永久域名跳转、URL 规范化 |
永久域名跳转(旧域名跳新域名)
nginx
server {
listen 80;
server_name old.test.com; # 旧域名
# 所有请求跳转到新域名,保留原URL和参数
rewrite ^/(.*)$ http://new.test.com/$1 permanent;
}
URL 规范化(去除 www 前缀)
nginx
server {
listen 80;
server_name www.test.com test.com;
# 匹配带www的域名,跳转到无www域名
if ($host = 'www.test.com') {
rewrite ^/(.*)$ http://test.com/$1 permanent;
}
}
临时重定向(指定路径跳转)
nginx
server {
listen 80;
server_name www.test.com;
# 旧接口路径跳新接口路径,临时跳转
rewrite ^/old/api$ /new/api redirect;
}