Nginx 核心功能

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;
}
相关推荐
yy55272 小时前
Nginx 核心功能
运维·nginx
somi72 小时前
Linux—网络通信04-IO多路复用-并发模型
linux·运维·服务器
mpr0xy2 小时前
Linux操作系统安装nvidia-drives和nvidia-container-toolkit
linux·运维·服务器
minji...2 小时前
Linux 基础IO (三) (用户缓冲区/内核缓冲区深刻理解)
java·linux·运维·服务器·c++·算法
蜜獾云2 小时前
linux-磁盘挂载
linux·运维·服务器
翻斗包菜2 小时前
Nginx 四大核心功能实战:正向代理 + 反向代理 + 缓存 + Rewrite 正则
运维·nginx·缓存
稀样2 小时前
Nginx限流分析
nginx
阿望要努力上研究生2 小时前
Docker入门常用指令和Docker概念
运维·docker·容器
蜜獾云3 小时前
从linux内核理解Java怎样实现Socket通信
java·linux·运维