Nginx 核心功能

Nginx 是一款高性能的 HTTP 和反向代理服务器,同时也支持正向代理、四层 / 七层代理、URL 重写等核心功能。凭借高并发、低内存占用的新能成为服务端配置的主流选择。

正向代理

正向代理是客户端的代理,客户端同过正向代理服务器访问目标服务器,目标服务器仅能识别代理服务器的请求,无法直接获取客户端的真是信息,常应用于跨网络访问、客户端访问控制等场景。正向代理的实现完成 Nginx 的便宜安装与专属配置两步操作。

编译安装 Nginx

# 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):

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;    # 代理读取超时
        }
    }
}

生效与验证

# 重启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_passstream块、proxy_pass

配置 nginx 七层代理

七层代理是 Nginx 最基础的反向代理方式,核心配置在 http 块中完成,通过 upstream 配置后端集群,实现负载均衡,完整配置示例:

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 代理缓存可将后端服务器的相应结果缓存至本地,再次收到相同请求时直接返回缓存,降低后端压力、提升响应速度,完整配置示例:

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 模块
# 进入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 端口)为例:

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 = /path1(最高)完全匹配 URL 路径,匹配成功立即终止后续匹配
前缀匹配location ^~ /path2匹配以指定路径开头的 URL,终止后续正则匹配
正则匹配location ~ /path3区分大小写的正则匹配,按配置顺序匹配
正则匹配location ~* /path3不区分大小写的正则匹配,按配置顺序匹配
普通前缀匹配location /path4匹配以指定路径开头的 URL,可被正则匹配覆盖
通用匹配location /5(最低)匹配所有未被上述规则匹配的请求

location 匹配实操代码示例

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 规范化

永久域名跳转(旧域名跳新域名)

server {
    listen 80;
    server_name old.test.com; # 旧域名
    # 所有请求跳转到新域名,保留原URL和参数
    rewrite ^/(.*)$ http://new.test.com/$1 permanent;
}

URL 规范化(去除 www 前缀)

server {
    listen 80;
    server_name www.test.com test.com;
    # 匹配带www的域名,跳转到无www域名
    if ($host = 'www.test.com') {
        rewrite ^/(.*)$ http://test.com/$1 permanent;
    }
}

临时重定向(指定路径跳转)

server {
    listen 80;
    server_name www.test.com;
    # 旧接口路径跳新接口路径,临时跳转
    rewrite ^/old/api$ /new/api redirect;
}
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐