Nginx 核心功能

一、正向代理

正向代理是客户端通过代理服务器访问外部资源的模式。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)验证缓存功能

测试步骤:

  1. 发送请求:curl -I http://example.com
  2. 检查响应头:X-Cache-Status 应为 HIT(缓存命中)或 MISS(未命中)。
  3. 查看缓存文件:在 /var/cache/nginx 目录中生成缓存文件。
  4. 重复请求应显示 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 验证

测试方法:

  1. 添加测试 location 块:

    nginx 复制代码
    location /test {
        return 200 "Match successful";
    }
  2. 重启 Nginx:sudo systemctl restart nginx

  3. 发送请求:curl http://example.com/test

  4. 检查响应:应为 "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 永久重定向。

验证方法:

  1. 添加 rewrite 规则:

    nginx 复制代码
    rewrite ^/redirect$ http://example.com/new permanent;
  2. 重启 Nginx。

  3. 请求 http://example.com/redirect,应返回 301 重定向到 http://example.com/new

  4. 使用 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 检查语法。

相关推荐
卤炖阑尾炎2 小时前
Nginx 核心功能全解析:正向代理、反向代理、缓存与 Rewrite 实战
运维·nginx·缓存
ShineWinsu2 小时前
2026年AI Agent变现新思路:告别传统电商,拥抱自动化矩阵与服务套利
运维·人工智能·自动化
加密棱镜2 小时前
从攻防两端看 AI 对密码安全的重构 挑战与机遇并存
网络·安全
yangchanghua1112 小时前
Nacos如何开启ssl(https)[图文版]
服务器·https·ssl
PetaCloud2 小时前
Supabase Storage 迎来重大更新,性能、安全与可靠性全面升级
网络·安全·supabase
互成2 小时前
数据防泄密软件应该怎么选?2026顶尖数据防泄密软件推荐
网络
零基础的修炼2 小时前
Linux网络---Epoll-Reactor模式
linux·网络·php
larance2 小时前
NebulaGraph 数据库部署与运维指令清单
linux·服务器·数据库
小尔¥2 小时前
Nginx核心功能
运维·网络·nginx