nginx核心功能

一、正向代理

1. 概念

正向代理的核心概念是:代理服务器位于客户端和目标服务器之间。客户端配置代理后,所有请求首先发送到代理服务器,代理服务器再转发请求到目标服务器,并将响应返回给客户端。代理服务器可以隐藏客户端的真实IP地址,并实现访问控制或内容过滤

2. 应用场景

正向代理的常见应用场景包括:

  • 企业内部网络:员工通过公司代理访问外部网站,便于监控和安全管理
  • 访问受限资源:在地区限制或防火墙环境下,代理服务器可以绕过限制
  • 缓存加速:代理服务器缓存常用资源,减少带宽消耗和加载时间
  • 匿名浏览:用户通过代理隐藏IP地址,保护隐私
3. 编译安装nginx

以下是编译安装nginx的详细步骤

(1)安装支持软件

首先,安装必要的依赖库:

bash 复制代码
# 更新系统
sudo apt update  # Ubuntu/Debian
# 或 sudo yum update  # CentOS/RHEL

# 安装编译工具和依赖
sudo apt install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev -y
(2)创建用户、组、日志目录

创建nginx运行所需的用户和组,并设置日志目录:

bash 复制代码
# 创建nginx用户和组(无登录权限)
sudo groupadd nginx
sudo useradd -g nginx -s /sbin/nologin nginx

# 创建日志目录
sudo mkdir -p /var/log/nginx
sudo chown nginx:nginx /var/log/nginx
(3)编译安装nginx

下载nginx源码并编译安装:

bash 复制代码
# 下载nginx源码(以版本1.24.0为例)
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
(4)添加nginx系统服务

添加systemd服务文件以方便管理:

bash 复制代码
# 创建服务文件
sudo nano /etc/systemd/system/nginx.service

# 写入内容
[Unit]
Description=nginx
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 stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target

# 启用并启动服务
sudo systemctl daemon-reload
sudo systemctl enable nginx
sudo systemctl start nginx
4. 配置正向代理

在nginx配置文件中设置正向代理。编辑/usr/local/nginx/conf/nginx.conf

nginx 复制代码
http {
    server {
        listen 8080;  # 代理监听端口
        location / {
            proxy_pass http://$http_host;  # 转发请求到目标主机
            proxy_set_header Host $host;
            proxy_buffering off;  # 关闭缓冲以支持流式传输
        }
    }
}

重启nginx使配置生效:sudo systemctl restart nginx。客户端配置代理为服务器IP和端口8080即可使用

二、反向代理

反向代理中,代理服务器代表后端服务器接收客户端请求,并将响应返回给客户端。常用于负载均衡、安全防护和内容分发

1. 配置nginx七层代理

七层代理基于HTTP协议,适用于Web应用

(1)环境安装

确保nginx已安装(如上所述)。如果未安装,参考正向代理部分的编译安装步骤

(2)配置nginx七层代理转发

编辑nginx配置文件(如/usr/local/nginx/conf/nginx.conf):

nginx 复制代码
http {
    upstream backend {
        server 192.168.1.100:80;  # 后端服务器1
        server 192.168.1.101:80;  # 后端服务器2
    }

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://backend;  # 转发到上游服务器组
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

此配置将请求分发到后端服务器组

(3)验证转发效果

重启nginx:sudo systemctl restart nginx。测试方法:

  • 使用curl:curl http://example.com,应返回后端服务器响应
  • 检查nginx日志:tail -f /var/log/nginx/access.log,观察请求转发记录
2. 代理缓存功能设置

代理缓存可以存储响应,减少后端负载并提升性能

(1)缓存功能的核心原理和缓存类型

核心原理:nginx缓存HTTP响应,当相同请求再次发生时,直接从缓存返回数据。 缓存类型:

  • 内存缓存:快速但容量小
  • 磁盘缓存:持久化存储,适合大文件。 缓存键基于请求URL、头信息等,使用正则表达式匹配,例如缓存键可定义为uriis_argsargs
(2)反向代理配置

在反向代理基础上添加缓存配置:

nginx 复制代码
http {
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m use_temp_path=off;

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://backend;
            proxy_cache my_cache;  # 启用缓存
            proxy_cache_valid 200 304 12h;  # 缓存有效时间
            proxy_cache_key "$scheme$request_method$host$request_uri";  # 缓存键定义
        }
    }
}
(3)设置缓存功能

创建缓存目录并设置权限:

bash 复制代码
sudo mkdir -p /var/cache/nginx
sudo chown nginx:nginx /var/cache/nginx

重启nginx:sudo systemctl restart nginx

(4)验证缓存功能

测试方法:

  • 首次访问:curl -I http://example.com,查看响应头是否有X-Cache-Status: MISS
  • 再次访问:应有X-Cache-Status: HIT,表示缓存命中
  • 检查缓存目录:ls /var/cache/nginx,查看缓存文件
3. 配置nginx四层代理

四层代理基于TCP/UDP协议,适用于非HTTP服务如数据库或游戏服务器

(1)配置四层代理

编辑nginx配置文件,使用stream模块:

nginx 复制代码
stream {
    upstream db_backend {
        server 192.168.1.102:3306;  # MySQL服务器
    }

    server {
        listen 3306;  # 监听MySQL端口
        proxy_pass db_backend;
    }
}

确保nginx编译时启用了--with-stream模块(需重新编译)

(2)验证四层代理

重启nginx:sudo systemctl restart nginx。测试方法:

  • 使用telnet:telnet <nginx_server_ip> 3306,应连接到后端MySQL服务器
  • 检查连接日志:在nginx错误日志中查看连接记录

四、Nginx rewrite和正则

Nginx的rewrite模块使用正则表达式重写URL,用于URL美化、重定向等

1. Nginx正则

Nginx支持Perl兼容正则表达式(PCRE),语法基于标准正则。例如:

  • 匹配数字序列:\^\\d+
  • 匹配路径:\^/images/.\* 正则表达式在配置文件中用于模式匹配,如locationrewrite指令
2. nginx location

location块用于匹配请求URI并定义处理规则

(1)location 的语法:

语法:location [修饰符] 匹配模式 { ... } 常见修饰符:

  • =:精确匹配,例如location = /path { ... }
  • ~:正则匹配(区分大小写),例如location ~ \.php$ { ... }
  • ~*:正则匹配(不区分大小写)
  • ^~:前缀匹配

示例:

nginx 复制代码
location ~ ^/user/(\d+)$ {  # 匹配/user/数字
    proxy_pass http://backend/users/$1;  # $1捕获组
}
(2)location 验证

测试方法:

  • 配置后重启nginx
  • 访问不同URL,如http://example.com/user/123,检查是否匹配并正确处理
  • 查看nginx访问日志验证匹配结果
3. Rewrite

rewrite指令用于URL重写

(1)Rewrite 语法

语法:rewrite 正则表达式 替换字符串 [flag]; 示例:

nginx 复制代码
rewrite ^/old/(.*)$ /new/$1 permanent;  # 永久重定向
(2)rewrite flag 验证

常见flag:

  • last:停止当前处理,重新匹配location
  • break:停止rewrite处理
  • redirect:临时重定向(302)
  • permanent:永久重定向(301)。 验证方法:访问旧URL,如http://example.com/old/page,应重定向到新URL并返回301/302状态码
(3)rewrite 中的捕获组

正则表达式中用括号定义捕获组,例如\^/user/(\\d+),在替换字符串中用$1引用。示例:

nginx 复制代码
rewrite ^/product/(\d+)$ /item?id=$1? break;  # 捕获数字并重写
(4)nginx 中的 set指令

set指令用于定义变量,常用于rewrite或条件判断。语法:set $变量名 值; 示例:

nginx 复制代码
set $backend "http://app-server";
location / {
    proxy_pass $backend;
}

验证:变量可用于动态配置,测试时确保代理正确转发

相关推荐
原来是猿2 小时前
Linux - 基础IO【下】
linux·运维·服务器
淡泊if2 小时前
eBPF 实战:一次诡异的 Nginx 高延迟,我用 5 分钟在内核里找到了真凶
java·运维·nginx·微服务·ebpf
xyd陈宇阳2 小时前
面向网络协议初学者的入门指南
linux·运维·网络协议
_DCG_2 小时前
用户态和内核态的区别
linux
肖恭伟3 小时前
QtCreator Linux ubuntu24.04问题集合
linux·windows·qt
兮动人3 小时前
Linux 云服务器部署 OpenClaw 全攻略:从环境搭建到 QQ 机器人集成
linux·服务器·机器人·openclaw
linux修理工3 小时前
使用 nextcloud.occ 重置用户密码
linux·运维·服务器
toradexsh3 小时前
基于 NXP iMX8MP ARM平台安装测试 Openclaw
linux·docker·arm·nxp·openclaw
ego.iblacat3 小时前
Nginx 核心功能
运维·nginx