Nginx 核心功能

发布于:2025-05-24 ⋅ 阅读:(12) ⋅ 点赞:(0)

目录

一:正向代理

1:编译安装 Nginx

(1)安装支持软件

(2)创建运行用户、组和日志目录

(3)编译安装 Nginx

(4)添加 Nginx 系统服务

2:配置正向代理

二:反向代理

1:配置nginx七层代理

2:配置nginx四层代理

三:Nginx 缓存

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

2:代理缓存功能设置

四:Nginx rewrite和正则


一:正向代理

  正向代理(Forward Proxy)是一种位于客户端和原始服务器之间的代理服务器,其主 要作用是将客户端的请求转发给目标服务器,并将响应返回给客户端 Nginx 的 正向代理 充当客户端的“中间人”,代表用户访问外部资源并隐藏真实 IP。 它是企业内网管控、安全审计与加速访问的核心工具。用于场景一般是:

  • 内网访问控制:限制员工访问特定网站(如社交媒体)
  • 匿名访问:通过代理服务器隐藏用户真实身份。
  • 资源缓存加速:缓存公共资源(如软件包、镜像文件),减少外网带宽消耗。

1:编译安装 Nginx

(1)安装支持软件

    Nginx 的配置及运行需要 pcre、zlib 等软件包的支持,因此应预先安装这些软件的开发包(devel),以便提供相应的库和头文件,确保 Nginx 的安装顺利完成。

[root@localhost ~]# dnf install -y gcc make pcre-devel zlib-devel openssl-devel
perl-ExtUtils-MakeMaker git wget tar

(2)创建运行用户、组和日志目录

    Nginx 服务程序默认以 nobody 身份运行,建议为其创建专门的用户账号,以便更准确 地控制其访问权限,增加灵活性、降低安全风险。例如,创建一个名为 nginx 的用户,不 建 立宿主文件夹,也禁止登录到 Shell 环境。

[root@localhost ~]# useradd -M -s /sbin/nologin nginx
[root@localhost ~]# mkdir -p /var/log/nginx
[root@localhost ~]# chown -R nginx:nginx /var/log/nginx

(3)编译安装 Nginx

    配置Nginx的编译选项时,将安装目录设为/usr/local/nginx,运行用户和组均设为nginx; 启用 http_stub_status_module 模块以支持状态统计,便于查看服务器的连接信息。具体选项根据实际需要来定,配置前可参考“./configure --help”给出的说明。

[root@localhost ~]# tar zxf nginx-1.26.3_http_proxy.tar.gz
[root@localhost ~]# cd nginx-1.26.3
[root@localhost ~]# git clone
https://github.com/chobits/ngx_http_proxy_connect_module.git #(默认nginx不支持
转发https)下载第三方模块,用以支持正向代理https转发,提供的源码目录已提前放置该
模块,这里无需下载,仅作为介绍
[root@localhost nginx-1.26.3]#./configure --prefix=/usr/local/nginx --user=nginx
--group=nginx --with-http_ssl_module --with-http_v2_module
--with-http_realip_module --with-http_stub_status_module
--with-http_gzip_static_module --with-pcre --with-stream
--with-stream_ssl_module --with-stream_realip_module
--with-http_gzip_static_module --add-module=./ngx_http_proxy_connect_module
[root@localhost nginx-1.26.3]# make && make install
参数类别 参数名称 说明
用户/组 user=nginx 指定nginx运行用户
group=nginx 指定nginx运行组
HTTP模块 with=http_ssl_module 支持HTTPS协议
with=http_v2_module 支持HTTP/2协议
with=http_realip_module 支持IP透传(获取客户端真实IP)
with=http_stub_status_module 支持状态页面(用于监控nginx运行状态)
with=http_gzip_static_module 支持静态文件压缩
with=pcre 支持正则表达式
流模块 with=stream 支持TCP/UDP反向代理
with=stream_ssl_module 支持TCP连接的SSL加密
with=stream_realip_module 支持TCP连接的IP透传
第三方模块 add=module=./ngx_http_proxy_connect_module 支持HTTPS转发(默认nginx不支持,需添加此第三方模块)

    为了使 Nginx 服务器的运行更加方便,可以为主程序 nginx 创建链接文件,以便管 理员直接执行“nginx”命令就可以调用 Nginx 的主程序。

[root@localhost nginx-1.26.3]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

(4)添加 Nginx 系统服务

[root@localhost ~]# vi /lib/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/sbin/nginx -t
ExecStart=/usr/local/sbin/nginx
ExecReload=/usr/local/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
User=root
Group=root

[Install]
WantedBy=multi-user.target
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl start nginx
[root@localhost ~]# systemctl enable nginx

2:配置正向代理

[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
server {
    listen 8080;         # 代理监听端口
    server_name proxy.example.com;

    # 解析域名使用的 DNS
    resolver 8.8.8.8 1.1.1.1;     # 多个 DNS 用空格分隔

    # 启用代理 CONNECT 方法(支持 HTTPS)
    proxy_connect;
    proxy_connect_allow 443 80; # 允许代理到 80 和 443 端口
    proxy_connect_connect_timeout 10s;
    proxy_connect_read_timeout 10s;
    proxy_connect_send_timeout 10s;

    # 处理 HTTP/HTTPS 请求
    location / {
        proxy_pass $scheme://$http_host$request_uri; # 动态协议
        proxy_set_header Host $http_host;
        
        # 优化缓冲区
        proxy_buffers 256 4k;
        proxy_max_temp_file_size 0;

        # 保持连接
        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }
}
[root@localhost ~]#nginx -t
[root@localhost ~]#nginx -s reload

验证正向代理:

Windows中验证,使用火狐浏览器,设置http和https代理即可:

二:反向代理

    Nginx 的七层(应用层)反向代理基于 HTTP/HTTPS 协议,深度解析应用层内容(如 URL 、Header、Cookie),将客户端请求精准转发至后端服务器。作为企业级架构的“智能调 度器”,它实现了负载均衡、安全隔离与性能优化的核心能力。应用场景一般是:

  • 负载均衡:将流量分发至多台后端服务器,避免单点故障。
  • 动静分离:静态资源(图片、CSS/JS)由 Nginx 直接响应,动态请求(PHP、API)转发 至 Apache/Tomcat。
  • SSL 终端:统一处理 HTTPS 加密/解密,降低后端服务器计算压力。
  • 灰度发布:根据请求特征(如 IP、Header)将部分流量导向新版本服务。

    Nginx 的四层(网络层)反向代理基于 TCP/UDP 协议,直接转发原始数据流,不解析应用 层内容。它专为高性能、低延迟的传输层场景设计,是数据库、游戏服务器等非 HTTP 服 务的理想选择。应用场景一般是:

  • 数据库代理:对外暴露统一端口,内部转发至 MySQL、Redis 集群。
  • 游戏服务器:代理 UDP 协议,实现实时数据包负载均衡。
  • SSH 跳板机:通过端口映射安全访问内网服务器。
  • 高可用服务:TCP 服务(如 MQTT)的主备切换与健康检查。

资源清单

本实验需要两台主机

操作系统

配置

IP

服务

OpenEuler

2C4G

192.168.10.101

Nginx

OpenEuler

2C4G

192.168.10.102

Httpd

1:配置nginx七层代理

(1)环境安装( 192.168.10.102上操作 )

[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#dnf install httpd -y
[root@localhost ~]#echo "这是后端主机" >/var/www/html/index.html
[root@localhost ~]#systemctl start httpd

(3)配置nginx七层代理转发 ( 192.168.10.101上操作 )

[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
http {
    upstream backend {     #后端地址池设置
        server 192.168.10.102:80 ;     # 后端主机设置
    }
    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;
        }
    }
}
[root@localhost ~]#nginx -t
[root@localhost ~]#nginx -s reload

(4)验证转发效果

[root@localhost ~]# curl 192.168.10.101
这是后端主机

2:配置nginx四层代理

(1)配置四层代理 (192.168.10.101上操作)

[root@localhost ~]#vi /usr/local/nginx/conf/nginx.conf
stream {
    upstream ssh_cluster { #定义后端地址池
        server 192.168.10.102:22; #设置后端地址和服务端口
    }
    server {
        listen 2222;
        proxy_pass ssh_cluster;
        proxy_connect_timeout 5s; # 连接超时时间
        proxy_timeout 1h; # 长连接保持时间
    }
}

注意:

stream需要与http{ }模块平级,不能在http{ }中嵌套

[root@localhost ~]#nginx -t
[root@localhost ~]#nginx -s reload
[root@localhost ~]#ss -nlpt | grep 2222
LISTEN 0 511 0.0.0.0:2222 0.0.0.0:*
users:(("nginx",pid=8404,fd=6),("nginx",pid=8403,fd=6))

(2)验证四层代理

[root@localhost ~]# ssh root@192.168.10.101 -p2222
[root@localhost ~]#ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
    inet 192.168.10.102 netmask 255.255.255.0 broadcast 192.168.10.255
    inet6 fe80::20c:29ff:fe9f:de15 prefixlen 64 scopeid 0x20<link>
    ether 00:0c:29:9f:de:15 txqueuelen 1000 (Ethernet)
    RX packets 389822 bytes 511828164 (488.1 MiB)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 104614 bytes 8588675 (8.1 MiB)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

三:Nginx 缓存

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

缓存类型 作用场景 特点
代理缓存 缓存反向代理的后端服务器(如 Tomcat、Apache)的响应内容。 需定义缓存路径、缓存键、有效期等;适合静态接口或变化较少的内容。
FastCGI 缓存 缓存通过 FastCGI 协议处理的动态内容(如 PHP/Python 配合 PHP-FPM)。 需与 FastCGI 服务配合使用;可加速动态页面响应。
uWSGI/SCGI 缓存 缓存通过 uWSGI 或 SCGI 协议处理的后端内容(如 Python Flask/Django)。 类似 FastCGI 缓存,但针对特定协议。
静态资源缓存 通过客户端浏览器缓存静态资源(如 JS/CSS/图片),减少服务端请求。 服务端不存储缓存,仅控制浏览器缓存行为;节省带宽但无法减少后端负载。

代理缓存原理:

第一步:客户端第一次向Nginx请求数据A;

第二步:当Nginx发现缓存中没有数据A时,会向服务端请求数据A;

第三步:服务端接收到Nginx发来的请求,则返回数据A到Nginx,并且缓存在Nginx;

第四步:Nginx返回数据A给客户端应用;

第五步:客户端第二次向Nginx请求数据A;

第六步:当Nginx发现缓存中存在数据A时,则不会请求服务端;

第七步:Nginx把缓存中的数据A返回给客户端应用。

2:代理缓存功能设置

(1)反向代理配置

[root@localhost ~]#/usr/local/nginx/conf/nginx.conf
http {
    upstream backend { #后端地址池设置
        server 192.168.10.102:80 ; # 后端主机设置
    }
    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;
        }
    }
}
[root@localhost ~]#nginx -t
[root@localhost ~]#nginx -s reload

(2)设置缓存功能

  • proxy_cache_path :定义缓存文件的存储路径
  • levels=1:2 :定义缓存目录的层级结构,levels=N:M,表示缓存文件路径的层级深度,
  • keys_zone=my_cache:10m :定义共享内存区域,用于存储缓存键(key)和元数据(如 过期时间),10m:共享内存区大小(通常每 1MB 可存储约 8000 个键) i
  • nactive=60m :定义缓存内容的闲置有效期。60分钟 内未被访问,将被自动删除
  • max_size=1g :定义缓存目录的最大磁盘空间。当缓存量达到 1GB 时,Nginx 启动 LRU (最近最少使用)算法清理旧缓存。
  • use_temp_path=off :控制临时文件的存储位置,推荐值:off(减少磁盘操作,提升性 能)

(3)验证缓存功能

[root@localhost ~]# curl -I 192.168.10.101
HTTP/1.1 200 OK
Server: nginx/1.26.3
Date: Tue, 04 Mar 2025 12:45:50 GMT
Content-Type: text/html
Content-Length: 19
Connection: keep-alive
Last-Modified: Mon, 03 Mar 2025 12:39:32 GMT
ETag: "67c5a304-13"
X-Cache-Status: HIT #再次请求发现已经命中,说明数据已经被缓存
Accept-Ranges: bytes

四:Nginx rewrite和正则

Rewrite的应用场景

  • 路径美化:将/product/123 转换为 /index.php?id=123
  • 旧链接迁移:将过期URL永久重定向(301)到新地址
  • 强制HTTPS/域名统一:自动跳转http://到https://,或合并www与非www域名
  • 动态路由:适配单页应用(SPA)、RESTful API路由
  • 灰度发布:按规则将部分流量导向新版本服务
Nginx rewrite 指令语法
语法格式 说明 示例
rewrite regex replacement [flag]; 将匹配 regex 的URL重写为 replacement rewrite ^/old/(.*)$ /new/$1 permanent;
flag 可选值
last 重写后重新发起新请求(再次匹配location) rewrite ^/path /newpath last;
break 重写后不再匹配其他规则,直接处理请求 rewrite ^/path /newpath break;
redirect 返回302临时重定向(浏览器地址栏变) rewrite ^/oldurl /newurl redirect;
permanent 返回301永久重定向(浏览器地址栏变) rewrite ^/old /new permanent;
正则符号 说明 Nginx示例
^ 匹配字符串开头 ^/path 匹配以 /path 开头的URL
$ 匹配字符串结尾 \.html$ 匹配以 .html 结尾的URL
.* 匹配任意字符(除换行外) ^/old/(.*)$ 匹配 /old/ 后的任意内容
\d 匹配数字 ^/item/(\d+)$ 匹配如 /item/123
[abc] 匹配括号内任意字符 ^/[abc]/ 匹配 /a//b/ 或 /c/
[^abc] 不匹配括号内字符 ^/[^abc]/ 排除 /a//b//c/
(pattern) 捕获分组,用于后续引用 ^/user/(\w+)$ 捕获用户名
\w 匹配字母、数字、下划线 ^/user/(\w+)$ 匹配用户名
\s 匹配空白字符(空格、制表符等) 较少在URL中使用
+ 前一个字符1次或多次 \d+ 匹配1个或多个数字
? 前一个字符0次或1次 ^/page/? 匹配 /page 或 /page/
{n,m} 前一个字符n到m次 \d{2,4} 匹配2~4位数字

网站公告

今日签到

点亮在社区的每一天
去签到