一、Web 服务基础介绍
1.1 Apache 经典 Web 服务端

Apache 历经 1.X、2.X 两大版本,支持编译安装定制功能,核心有三种工作模型,均基于多进程 / 线程架构,各有适用场景:
Nginx 作为企业级高性能 Web 服务器,其核心原理涉及 I/O 模型优化、零拷贝技术及 Master-Worker 进程架构。文章涵盖编译安装、配置详解、虚拟主机管理、反向代理与负载均衡策略,以及 FastCGI 集成方案。通过对比 Apache 工作模型,阐述 Nginx 高并发优势,并提供 OpenResty 等二次开发版本的应用场景,适合运维与后端开发人员参考。

Apache 历经 1.X、2.X 两大版本,支持编译安装定制功能,核心有三种工作模型,均基于多进程 / 线程架构,各有适用场景:
| 模型 | 核心原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| prefork(预派生) | 主进程生成多个独立子进程,单进程单线程,select 模型,最大并发 1024 | 稳定性极高,进程独立互不影响 | 内存占用大,并发能力弱,每个请求对应一个进程 | 访问量小、对稳定性要求高的场景 |
| worker(多进程多线程) | 主进程启动子进程,子进程包含固定线程,线程处理请求,线程不足时新建子进程 | 内存占用比 prefork 少,并发能力更高 | keepalive 长连接会占用线程至超时,高并发下易无可用线程 | 中等访问量场景 |
| event(事件驱动) | 2.4.X 版本正式支持,epoll 模型,与 worker 类似,新增专门线程管理 keepalive 线程 | 单线程响应多请求,内存占用最低,高并发表现优秀,解决 keepalive 线程资源浪费 | 无线程安全控制 | 高并发访问场景 |
Apache prefork 模型

Apache worker 模型

Apache event 模型



Nginx 前置处理请求,静态资源直接返回,动态资源转发至 Tomcat 等应用服务器,数据存储至 MySQL,图片等资源由专用存储服务器提供,实现动静分离与服务分层。

无论磁盘 / 网络 I/O,均分为两个阶段:
I/O 模型的核心区分维度为同步 / 异步(消息通信机制,是否主动通知处理结果)、阻塞 / 非阻塞(等待结果时的进程状态,是否被挂起),主流有 5 种网络 I/O 模型,前 4 种为同步 I/O,仅异步 I/O 为纯异步。


原理:用户线程发起系统调用后,全程阻塞,直至数据从内核复制至用户空间;
优点:程序简单,阻塞期间基本不占用 CPU;
缺点:单连接单进程 / 线程,并发高时内存、线程切换开销大(Apache prefork 基于此)。
原理:用户线程发起调用后立即返回,无数据则返回错误,通过轮询反复发起调用,直到获取数据;
缺点:轮询消耗大量 CPU,上下文切换频繁,实际极少单独使用。





非阻塞型 I/O(nonblocking IO)

| 特性 | select | poll | epoll |
|---|---|---|---|
| 操作方式 | 线性遍历 | 线性遍历 | 事件回调 |
| 底层实现 | 数组 | 链表 | 哈希表 |
| IO 效率 | O(n) | O(n) | O(1) |
| 最大连接数 | 1024(x86)/2048(x64) | 无上限 | 无上限 |
| IO 拷贝 | 每次调用均从用户态拷贝至内核态 | 每次调用均从用户态拷贝至内核态 | 仅 epoll_ctl 时拷贝,epoll_wait 不拷贝 |

标准 I/O 接口(read/write)基于数据拷贝,需经过用户态 - 内核态多次切换,数据拷贝耗时占比达 57.1%,严重消耗 CPU,降低传输性能。
并非真正'0 拷贝',而是通过减少用户态与内核态之间的拷贝、降低上下文切换,缓解 CPU 压力,核心技术为 MMAP 和 SENDFILE。
SENDFILE:数据直接在内核缓冲区与 socket 缓冲区之间传输,全程不经过用户态,彻底消除用户态 - 内核态的拷贝,适合静态文件传输(Nginx 默认启用)。


MMAP(内存映射):将磁盘文件映射至进程虚拟地址空间,进程可直接访问内核缓冲区(page cache),减少一次内核态到用户态的拷贝,适合大量数据传输;


Nginx 采用Master-Worker多进程模型,主进程与工作进程分工明确,进程间通过管道、共享内存通信,支持平滑升级和故障重启。



| 进程类型 | 核心功能 |
|---|---|
| Master(主进程) | 读取 / 验证配置、管理 Worker 进程、监控 Worker 状态(异常自动重启)、绑定 / 关闭 socket、接收外部指令(重启 / 升级 / 退出)、实现平滑升级、开启日志文件 |
| Worker(工作进程) | 处理实际网络请求、平等竞争新连接、I/O 调用、与后端服务器通信、缓存数据、发送响应结果、接收主进程指令;数量一般等于 CPU 核心数,避免进程竞争 CPU |
Worker 之间:通过 Master 转发管道信息实现通信,或通过共享内存(如 upstream zone、limit_req)通信。

Worker 进程竞争新连接,获胜方通过 TCP 三次握手建立连接,处理请求。


Nginx 高度模块化,模块是功能实现的核心,1.9.11 版本开始支持动态装载 / 卸载,模块分为五大类:

| 模块类型 | 核心功能 | 示例 |
|---|---|---|
| 核心模块 | Nginx 运行必备,负责基础功能 | 错误日志、配置解析、事件驱动、进程管理 |
| 标准 HTTP 模块 | HTTP 协议解析,基础 Web 功能 | 端口配置、网页编码、HTTP 响应头设置 |
| 可选 HTTP 模块 | 扩展 HTTP 功能,需编译指定 | Gzip 压缩、SSL、GeoIP 解析、Flash 传输 |
| 邮件服务模块 | 支持邮件代理协议 | POP3、IMAP、SMTP 协议处理 |
| Stream 服务模块 | 实现 TCP/UDP 反向代理 | 四层负载均衡、TCP 协议转发 |
| 第三方模块 | 开发者自定义功能 | Lua 支持、Json 解析、Rds-json |
推荐源码编译安装(可自定义路径、功能,yum 版本较旧),需提前安装依赖库,编译后生成四大核心目录。
useradd -s /sbin/nologin -M nginx。# 安装依赖
dnf install gcc pcre-devel zlib-devel openssl-devel -y
# 解压源码
tar zxf nginx-1.24.0.tar.gz && cd nginx-1.24.0
# 配置编译参数(自定义路径、功能)
./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
# 编译并安装
make && make install
| 目录 | 功能 |
|---|---|
| /usr/local/nginx/conf | 所有配置文件,核心为 nginx.conf |
| /usr/local/nginx/html | 静态 Web 文件,包含默认错误页面(50x.html) |
| /usr/local/nginx/logs | 访问日志、错误日志、PID 文件 |
| /usr/local/nginx/sbin | 二进制启动脚本(nginx),支持多种命令参数 |
nginx -v # 查看版本
nginx -V # 查看版本 + 编译参数
nginx -t # 测试配置文件有效性
nginx -s reload # 平滑重载配置
nginx -s quit # 优雅退出
nginx -s stop # 强制停止
nginx -g "worker_processes 6;" # 临时指定全局指令
创建/lib/systemd/system/nginx.service,实现 systemctl 管理:
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
启用服务:systemctl daemon-reload && systemctl enable --now nginx。
无需停机,实现版本升级 / 回滚,核心通过信号控制(SIGUSR2、WINCH、QUIT、HUP),保证业务不中断。

cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old;SIGUSR2:旧 Master 重命名 PID 文件为 nginx.pid.oldbin,启动新 Master 进程;WINCH:旧 Worker 进程平滑停止,新请求由新 Worker 处理;QUIT:关闭旧 Master,完成升级。HUP:重新拉起旧 Worker 进程;WINCH:新 Worker 进程平滑停止;QUIT:关闭新 Master,完成回滚。Nginx 配置文件为纯文本格式,采用指令 + 指令块结构,支持 include 引入子配置、注释(#)、变量($),核心分为四大配置段:main(全局)、event(事件驱动)、http(HTTP/HTTPS)、stream(TCP/UDP),mail(邮件)为可选段。
{} 包裹,支持嵌套(如 http 包含 server,server 包含 location);include conf.d/*.conf);set $变量名 值;),引用方式为$变量名;对所有配置段生效,核心为 Nginx 运行的基础配置,分为必备配置、性能优化配置、调试配置三类。
| 指令 | 功能 | 推荐值 |
|---|---|---|
| user nginx nginx; | 启动 Worker 进程的用户和组 | 专用 nginx 用户 |
| worker_processes n; | Worker 进程数量 | 等于 CPU 核心数(或 auto) |
| worker_cpu_affinity 掩码; | 将 Worker 进程绑定到指定 CPU 核心 | 如 4 核心:0001 0010 0100 1000 |
| error_log 路径 级别; | 错误日志路径与级别 | /usr/local/nginx/logs/error.log error |
| pid 路径; | PID 文件保存路径 | /usr/local/nginx/logs/nginx.pid |
| worker_priority n; | Worker 进程优先级 | 0(范围 - 20~20,值越高优先级越高) |
| worker_rlimit_nofile n; | Worker 进程最大打开文件数 | 65536(与系统 ulimit -n 一致) |
| daemon on/off; | 是否以守护进程运行 | on(生产)/off(测试 / 容器) |
| master_process on/off; | 是否启用 Master-Worker 模型 | on(生产)/off(调试) |
仅用于配置事件驱动相关功能,决定 Nginx 与客户端的网络连接方式,是高并发优化的核心配置段。
| 指令 | 功能 | 推荐值 |
|---|---|---|
| worker_connections n; | 单个 Worker 进程最大并发连接数 | 65535 |
| use 模型; | 事件驱动模型 | epoll(Linux)/kqueue(FreeBSD) |
| accept_mutex on/off; | 连接互斥锁,防止惊群效应 | on |
| multi_accept on/off; | 单个 Worker 进程是否同时接受多个连接 | on |
ulimit -n 65536(临时),修改/etc/security/limits.conf(永久);worker_rlimit_nofile 65536:突破文件数限制;epoll、accept_mutex、multi_accept。处理所有 HTTP/HTTPS 协议相关配置,是 Nginx 配置的核心,包含虚拟主机、缓存、代理、日志、压缩等功能,可嵌套多个server指令块(虚拟主机)。
| 指令 | 功能 | 推荐值 |
|---|---|---|
| include mime.types; | 引入 MIME 类型映射文件 | 必加 |
| default_type 类型; | 未匹配 MIME 类型的默认文件类型 | application/octet-stream(下载)/text/html |
| sendfile on/off; | 启用零拷贝 SENDFILE 技术 | on |
| keepalive_timeout n [m]; | keep-alive 长连接超时时间 | 65 60(服务器 65s,告知客户端 60s) |
| keepalive_requests n; | 单条长连接最大请求数 | 500(默认 100) |
| log_format 名称 格式; | 定义访问日志格式 | 包含、request、$status 等 |
| access_log 路径 格式; | 访问日志路径与格式 | /usr/local/nginx/logs/access.log main |
属于http子配置段,一个http可包含多个server,每个server对应一个虚拟主机,通过listen(端口)、server_name(域名 / IP)区分,核心用于部署多站点。
server {
listen 80; # 监听端口(可加 IP,如 192.168.1.100:80)
server_name lee.timinglee.org www.timinglee.org; # 虚拟主机域名,支持多个、通配符、正则
root /webdata/nginx/timinglee.org/html; # 站点根目录
index index.html index.htm index.php; # 默认首页文件
error_page 404 500 502 /error.html; # 自定义错误页面
access_log /var/log/nginx/timinglee.access.log main; # 独立访问日志
}
属于server子配置段,一个server可包含多个location,根据用户请求的 URI进行匹配,实现路径映射、访问控制、反向代理等功能,是 Nginx 配置最灵活的部分。
语法:location [ = | ~ | ~* | ^~ ] uri { ... }匹配优先级从高到低:=(精确匹配) > ^~(前缀匹配,终止正则) > ~(正则,区分大小写)/~*(正则,不区分大小写) > 普通前缀匹配(无符号)
| 修饰符 | 功能 | 示例 |
|---|---|---|
| = | 精确匹配 URI,匹配成功立即停止 | location = /logo.png { ... } |
| ^~ | 前缀匹配,匹配成功后终止后续正则匹配 | location ^~ /static/ { ... } |
| ~ | 正则匹配,区分大小写 | location ~ .php$ { ... } |
| ~* | 正则匹配,不区分大小写 | location ~* .(jpg |
| 无 | 普通前缀匹配,按匹配度最高匹配 | location /web/ { ... } |
均用于指定文件路径,核心区别:
root 路径,文件绝对路径 = root 路径 + location URI(默认方式);示例:location /dirtest { root /mnt; } → 访问/dirtest对应/mnt/dirtest;alias 路径,直接替换 location URI 为指定路径,仅适用于 location;示例:location /alias { alias /mnt/dirtest; } → 访问/alias对应/mnt/dirtest。基于域名部署两个站点,通过 include 引入子配置:
# 创建子配置目录
mkdir /usr/local/nginx/conf.d
# 主配置文件引入子配置
echo 'include conf.d/*.conf;' >> /usr/local/nginx/conf/nginx.conf
# 创建站点配置文件
vim /usr/local/nginx/conf.d/lee.conf
server {
listen 80;
server_name lee.timinglee.org;
root /webdata/nginx/lee/html;
index index.html;
}
vim /usr/local/nginx/conf.d/www.conf
server {
listen 80;
server_name www.timinglee.org;
root /webdata/nginx/www/html;
index index.html;
}
server {
listen 80;
server_name lee.timinglee.org;
root /webdata/nginx/lee/html;
error_page 404 /404.html; # 404 错误指向 404.html
error_page 500 502 503 504 /50x.html; # 服务器错误指向 50x.html
# 错误页面独立路径
location = /404.html {
root /webdata/nginx/lee/errors;
}
location = /50x.html {
root /webdata/nginx/lee/errors;
}
}
按顺序检查文件 / 目录是否存在,返回第一个存在的,否则重定向至最后一个参数:
server {
listen 80;
server_name lee.timinglee.org;
root /webdata/nginx/lee/html;
# 检查$uri → $uri.html → $uri/index.html,均不存在则指向/error/default.html
try_files $uri $uri.html $uri/index.html /error/default.html;
}
启用自动目录索引,支持文件下载,可限速、显示文件信息:
server {
listen 80;
server_name lee.timinglee.org;
root /webdata/nginx/lee;
location /download {
autoindex on; # 启用自动索引
autoindex_exact_size off; # 显示文件近似大小(K/M/G)
autoindex_localtime on; # 显示服务器本地时间
limit_rate 1024k; # 限速 1MB/s
}
}
基于ngx_http_auth_basic_module实现 HTTP 基本认证,需生成密码文件:
# 安装 htpasswd,生成密码文件
yum install httpd-tools -y
htpasswd -cmb /usr/local/nginx/conf/.htpasswd admin 123456
location /admin {
root /webdata/nginx/lee/html;
auth_basic "Admin Login"; # 认证提示语
auth_basic_user_file /usr/local/nginx/conf/.htpasswd; # 密码文件路径
}
基于ngx_http_stub_status_module实现,查看 Nginx 运行状态(需编译时添加--with-http_stub_status_module),显示全局状态,非单个虚拟主机。
location /nginx_status {
stub_status; # 启用状态页
auth_basic "Nginx Status"; # 认证保护
auth_basic_user_file /usr/local/nginx/conf/.htpasswd;
allow 192.168.1.0/24; # 允许指定 IP 段访问
allow 127.0.0.1;
deny all; # 拒绝其他 IP
}
Active connections: 291 # 当前活动连接数(Reading+Writing+Waiting)
server accepts handled requests 16630948 16630948 31070465 # 接受连接数/处理连接数/总请求数
Reading: 6 Writing: 179 Waiting: 106 # 读取请求/发送响应/空闲等待连接数
Waiting = Active - (Reading+Writing);worker_connections限制被拒绝。基于ngx_http_gzip_module实现,对指定类型文件压缩后传输,降低带宽消耗(需消耗少量 CPU),默认内置模块,无需额外编译。
http {
gzip on; # 启用 gzip 压缩
gzip_comp_level 5; # 压缩级别 1-9,5 为平衡值(值越高压缩比越高,CPU 消耗越大)
gzip_min_length 1k; # 最小压缩文件大小,小于 1k 不压缩
gzip_types text/plain text/html text/css application/javascript application/json image/png; # 压缩的文件类型
gzip_vary on; # 响应头添加 Vary: Accept-Encoding,告知浏览器支持压缩
gzip_disable "MSIE [1-6]."; # 禁用 IE6 及以下压缩(不支持)
gzip_static on; # 启用预压缩(直接使用.gz 文件,无需实时压缩)
}
使用 curl 命令验证,响应头包含Content-Encoding: gzip即为压缩成功:
curl --head --compressed http://lee.timinglee.org/data.txt
隐藏响应头中的 Nginx 版本号,提升安全性,需修改源码重新编译:
# 编辑源码头文件
vim nginx-1.26.1/src/core/nginx.h
# 修改版本号
#define NGINX_VERSION "1.0"
# 可选:修改服务器标识
#define NGINX_VER "HAHA/" NGINX_VERSION
# 重新编译安装
make && make install
Nginx 变量分为内置变量(模块提供,获取请求 / 服务器信息)和自定义变量(用户定义,set指令),用于配置判断、日志、URL 重写等场景。
| 变量 | 功能 |
|---|---|
| $remote_addr | 客户端 IP 地址 |
| $request_uri | 包含参数的完整 URI(如 /var?id=1) |
| $document_uri | 不包含参数的 URI(如 /var) |
| $host | 客户端请求的主机名 |
| $server_name | 虚拟主机名 |
| $server_port | 监听端口 |
| $http_user_agent | 客户端浏览器信息 |
| $args | URL 中的所有参数 |
| $scheme | 请求协议(http/https) |
通过set $变量名 值;定义,支持拼接内置变量:
location /var {
default_type text/html;
set $name lee; # 自定义变量
set $web_addr $scheme://$host:$server_port; # 拼接内置变量
echo $name; # 输出变量(需 ngx_http_echo_module)
echo $web_addr;
}
基于ngx_http_rewrite_module实现,通过正则表达式匹配 URI 并修改,支持 URL 重定向、地址伪装、防盗链等,核心依赖 PCRE 库(编译时需--with-pcre)。
if ($scheme = http) { rewrite ^(.*)$ https://$host$1 permanent; };return 301 http://www.baidu.com;(永久重定向)、return 403 "Forbidden";(禁止访问);rewrite regex replacement [flag];。控制 Rewrite 的循环机制,分为跳转型(客户端重定向)和代理型(服务器内部跳转):
| Flag | 类型 | 功能 |
|---|---|---|
| redirect | 跳转型 | 临时重定向(302),客户端重新发起请求,适用于临时调整 |
| permanent | 跳转型 | 永久重定向(301),客户端缓存重定向记录,适用于永久域名变更 |
| break | 代理型 | 停止当前 location 的后续 Rewrite,直接执行后续配置,结束循环 |
| last | 代理型 | 停止当前 location 的后续 Rewrite,对新 URI 启动新一轮 Rewrite 检查 |
文件不存在重定向首页:访问不存在的 URL 时,重定向至网站首页:
server {
listen 80;
server_name www.timinglee.org;
root /webdata/nginx/www/html;
if (!-e $request_filename) {
rewrite .* /index.html redirect;
}
}
HTTP 自动跳转 HTTPS:全站强制 HTTPS,避免死循环(添加 $scheme 判断):
server {
listen 80;
listen 443 ssl;
server_name www.timinglee.org;
ssl_certificate /usr/local/nginx/certs/cert.pem;
ssl_certificate_key /usr/local/nginx/certs/key.pem;
if ($scheme = http) {
rewrite ^(.*)$ https://$host$1 redirect;
}
root /webdata/nginx/www/html;
}
域名永久重定向:将lee.timinglee.org永久重定向至www.timinglee.org:
server {
listen 80;
server_name lee.timinglee.org;
rewrite ^(.*)$ http://www.timinglee.org$1 permanent;
}
基于ngx_http_referer_module实现,通过检查请求头的Referer 字段(记录请求来源),阻止其他网站直接链接本站资源(图片、视频、文件等)。
| 类型 | 功能 |
|---|---|
| none | 无 Referer(用户直接输入域名访问) |
| blocked | Referer 无有效值(如为空) |
| server_names | Referer 包含本站域名($server_name) |
| 通配符 | 自定义域名,如 *.timinglee.org |
| 正则 | 正则匹配 Referer,如~/.baidu/(允许百度搜索) |
server {
listen 80;
server_name www.timinglee.org;
root /webdata/nginx/www/html;
# 对图片资源防盗链
location ~* \.(jpg|png|gif|jpeg)$ {
# 允许的 Referer
valid_referers none blocked server_names *.timinglee.org ~/.baidu/ ~/.google/;
# 无效 Referer 返回 404 或重定向至防盗链图片
if ($invalid_referer) {
# return 404;
rewrite ^/ http://www.timinglee.org/daolian.png permanent;
}
}
}
反向代理是 Nginx 的核心功能之一,指代理服务器接收客户端请求,转发至后端服务器处理,将结果返回给客户端,代表服务端利益,与正向代理(代表客户端利益,如翻墙)本质区别。
Nginx 支持七层反向代理(HTTP/HTTPS,基于ngx_http_proxy_module)和四层反向代理(TCP/UDP,基于ngx_stream_proxy_module,1.9 + 支持),同时支持负载均衡、缓存、会话保持。
基于ngx_http_proxy_module实现,核心指令为proxy_pass,支持配置代理参数、缓存、会话保持。


同构代理:用户不需要其他程序的参与,直接通过 http 协议或者 tcp 协议访问后端服务器
异构代理:用户访问的资源时需要经过处理后才能返回的,比如 php,Python,等等,这种访问资源需 要经过处理才能被访问

| 指令 | 功能 |
|---|---|
| proxy_pass 地址; | 核心指令,转发请求至后端服务器(IP: 端口 / 域名 /upstream 组) |
| proxy_set_header 头名 值; | 修改 / 添加请求头,转发至后端服务器 |
| proxy_connect_timeout n; | Nginx 与后端服务器的连接超时时间 |
| proxy_read_timeout n; | Nginx 等待后端服务器响应的超时时间 |
| proxy_hide_header 头名; | 隐藏后端服务器的响应头,不返回给客户端 |
| proxy_pass_header 头名; | 透传后端服务器的响应头,返回给客户端 |
proxy_pass末尾是否加 /,决定 URI 的转发规则,核心区别:
location /web { proxy_pass http://172.25.254.30:8080; } → 访问/web/index.html转发至http://172.25.254.30:8080/web/index.html;location /web { proxy_pass http://172.25.254.30:8080/; } → 访问/web/index.html转发至http://172.25.254.30:8080/index.html。Nginx 作为反向代理时,后端服务器获取的 IP 为 Nginx 的 IP,需通过proxy_set_header透传客户端真实 IP:
location / {
proxy_pass http://172.25.254.30;
# 透传客户端真实 IP
proxy_set_header X-Forwarded-For $remote_addr;
# 透传请求主机名
proxy_set_header Host $host;
# 透传请求协议
proxy_set_header X-Forwarded-Proto $scheme;
}
后端服务器需配置日志格式,记录X-Forwarded-For字段。
启用代理缓存,将后端服务器的响应结果缓存至 Nginx 本地,减少后端请求,提升响应速度,核心指令为proxy_cache。
http {
# 定义缓存池,配置在 http 段
proxy_cache_path /var/cache/nginx/proxy_cache \
levels=1:2:2 \
# 缓存目录层次
keys_zone=proxycache:20m \
# 内存缓存区(20M,存放 key 和元数据)
inactive=120s \
# 缓存非活动时间,超时清理
max_size=10g; # 缓存最大磁盘占用
server {
listen 80;
server_name www.timinglee.org;
location / {
proxy_pass http://172.25.254.30;
proxy_cache proxycache; # 启用缓存池
proxy_cache_key $request_uri; # 缓存 key(基于 URI)
proxy_cache_valid 200 302 10m; # 200/302 状态码缓存 10 分钟
proxy_cache_valid 404 1m; # 404 状态码缓存 1 分钟
proxy_cache_valid any 1m; # 其他状态码缓存 1 分钟
proxy_cache_use_stale error http_502 http_503; # 后端错误时使用过期缓存
}
}
}
基于ngx_http_upstream_module实现,通过upstream指令定义后端服务器组,实现请求分发,支持多种调度算法和后端服务器状态管理,是高可用架构的核心。
http {
# 定义后端服务器组,名称为 webserver
upstream webserver {
server 172.25.254.20:80 weight=2; # 权重 2,优先级更高
server 172.25.254.30:80 weight=1; # 权重 1
server 172.25.254.40:80 backup; # 备份服务器,主服务器不可用时启用
server 172.25.254.50:80 down; # 标记为下线,平滑移除
}
server {
listen 80;
server_name www.timinglee.org;
# 转发至 upstream 组
location / {
proxy_pass http://webserver;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
}
| 参数 | 功能 |
|---|---|
| weight=n | 调度权重,默认为 1,值越高被调度的概率越大 |
| max_fails=n | 连续失败 n 次后,标记服务器为不可用 |
| fail_timeout=n | 服务器不可用后,每隔 n 秒检测一次,恢复后重新加入调度 |
| backup | 备份服务器,所有主服务器不可用时启用 |
| down | 标记服务器为下线,不参与调度 |
| max_conns=n | 服务器最大并发连接数,默认为 0(无限制) |
Nginx 内置多种调度算法,适用于不同场景:
| 算法 | 原理 | 适用场景 |
|---|---|---|
| 轮询(默认) | 按顺序依次分发请求至后端服务器 | 后端服务器配置一致 |
| 加权轮询 | 按权重分发,权重越高分发越多 | 后端服务器配置不一致(性能差异) |
| ip_hash | 基于客户端 IP 哈希,固定 IP 转发至固定服务器 | 需会话保持的场景(如登录状态) |
| least_conn | 分发至当前并发连接数最少的服务器 | 后端服务器请求处理时间差异大 |
| hash $key | 基于自定义 key 哈希(如、cookie) | 缓存服务器、需按 URL/COOKIE 会话保持 |
| fair | 基于后端服务器响应时间分发,响应越快优先级越高 | 第三方模块,需单独编译 |
基于ngx_stream_proxy_module实现(编译时需--with-stream),工作在TCP/IP 四层协议栈,不解析应用层协议,支持 TCP/UDP 协议的负载均衡,适用于 MySQL、Redis、DNS 等非 HTTP 服务。
# 四层配置段,与 http 同级
stream {
# 定义 MySQL 后端服务器组
upstream mysql_server {
server 172.25.254.20:3306 max_fails=3 fail_timeout=30s;
server 172.25.254.30:3306 max_fails=3 fail_timeout=30s;
}
# 监听 TCP 3306 端口,转发至 MySQL 组
server {
listen 172.25.254.10:3306 tcp;
proxy_pass mysql_server;
proxy_connect_timeout 30s; # 连接超时
proxy_timeout 300s; # 转发超时
}
}
stream {
# 定义 DNS 后端服务器组
upstream dns_server {
server 172.25.254.20:53;
server 172.25.254.30:53;
}
# 监听 UDP 53 端口,转发至 DNS 组
server {
listen 172.25.254.10:53 udp;
proxy_pass dns_server;
proxy_timeout 1s;
proxy_responses 1; # UDP 协议,响应 1 个报文后终止会话
}
}


LNMP(Linux+Nginx+MySQL+PHP)是主流的动态网站架构,Nginx 不支持直接运行 PHP,需通过FastCGI 协议将 PHP 请求转发至PHP-FPM(FastCGI 进程管理器)处理,实现动态资源解析。
Nginx 通过fastcgi_pass指令转发 PHP 请求至 PHP-FPM,核心指令如下:
| 指令 | 功能 |
|---|---|
| fastcgi_pass 地址; | 转发 PHP 请求至 PHP-FPM(127.0.0.1:9000 / 本地套接字) |
| fastcgi_index index.php; | PHP 默认首页文件 |
| fastcgi_param 键 值; | 设置 FastCGI 参数,传递给 PHP-FPM |
| include fastcgi_params; | 引入 FastCGI 默认参数文件(必加) |
PHP-FPM 默认监听127.0.0.1:9000,需确保配置正确,启动 PHP-FPM 服务。
server {
listen 80;
server_name php.timinglee.org;
root /webdata/nginx/php/html; # PHP 站点根目录
index index.html index.php; # 支持 PHP 首页
# 匹配所有.php 文件,转发至 PHP-FPM
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000; # PHP-FPM 监听地址
fastcgi_index index.php; # 定义 PHP 脚本文件路径,必须正确
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params; # 引入默认参数
}
# 处理静态资源,Nginx 直接返回
location ~ \.(jpg|png|gif|css|js)$ {
expires 30d; # 浏览器缓存 30 天
}
}
在 PHP 站点根目录创建info.php,访问测试 PHP 是否解析成功:
<?php phpinfo(); ?>
访问http://php.timinglee.org/info.php,显示 PHP 信息页面即为配置成功。
为 PHP 添加内存缓存(如 Memcache、Redis),减少数据库请求,提升 PHP 处理效率,以 Memcache 为例:

OpenResty 是由章亦春团队开发的高性能 Web 平台,基于Nginx+LuaJIT实现,将 Lua 虚拟机嵌入 Nginx,支持通过 Lua 脚本扩展 Nginx 功能,无需修改 Nginx 源码。
核心优势:
# 安装依赖
dnf install gcc pcre-devel openssl-devel perl -y
# 创建运行用户
useradd -r -s /sbin/nologin nginx
# 下载源码并解压
wget https://openresty.org/download/openresty-1.17.8.2.tar.gz
tar xf openresty-1.17.8.2.tar.gz && cd openresty-1.17.8.2
# 配置编译参数
./configure --prefix=/apps/openresty \
--user=nginx --group=nginx \
--with-http_ssl_module --with-http_v2_module \
--with-http_realip_module --with-http_stub_status_module
# 编译并安装
make && make install
# 配置环境变量
ln -s /apps/openresty/bin/* /usr/bin/
# 启动服务
openresty
由淘宝网发起的 Nginx 二次开发版本,基于 Nginx 添加了大量高级功能(如动态模块、请求过滤、性能监控),专门针对大访问量网站优化,稳定性和性能经过淘宝、天猫等生产环境验证,开源免费。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online