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 小时前
MySQL高可用
android·运维·数据库
孟章豪5 小时前
《SQL拼接 vs 参数化,为什么公司禁止拼接SQL?(附真实案例)》
服务器·数据库·sql
hsjcjh6 小时前
Nodemailer使用教程:在Node.js中发送电子邮件
linux·运维·node.js
没有梦想的咸鱼185-1037-16637 小时前
北斗高精度数据解算:破解城市峡谷/长基线/无网区难题,从毫米级定位到自动化交付——(GAMIT/GLOBK底层核心解算技术方法)
运维·arcgis·数据分析·自动化
不怕犯错,就怕不做7 小时前
linux 如何查看自己的帐号密码及samba的帐号和密码
linux·运维·服务器
实在智能RPA7 小时前
Agent 在物流行业能实现哪些自动化?——深度拆解 AI Agent 驱动的智慧物流新范式
运维·人工智能·ai·自动化
张3237 小时前
Linux 启动过程
linux·运维
李彦亮老师(本人)8 小时前
Rocky Linux 9.x 新特性详解
linux·运维·服务器·centos·rocky linux
NiKick8 小时前
在Linux系统上使用nmcli命令配置各种网络(有线、无线、vlan、vxlan、路由、网桥等)
linux·服务器·网络