Nginx高级进阶架构实战篇
1.Nginx-Proxy代理
1.1 正向代理

1.1.1 含义及原理
**正向代理是位于客户端和目标服务器之间的代理服务器,代表客户端向目标服务器发送请求。**正向代理主要服务于客户端。客户端明确知道目标服务器的存在,并通过配置代理服务器来转发请求。Nginx 在此场景中充当客户端的出口网关。
bash
# 原理介绍
客户端 → 正向代理服务器 → 目标服务器
# 正向代理(中介租房):
你想租房(访问网站),你找到中介(正向代理),中介帮你联系房东(目标服务器),房东不知道你是谁,只知道是中介来的
1.1.2 主要特点
- 代理的是客户端
- 目标服务器不知道真实的客户端是谁
- 客户端需要明确配置代理服务器地址
缺点 :Nginx原生正向代理功能较弱,通常用Squid等替代
1.1.3 使用场景
- 翻墙访问被限制的网站
- 隐藏客户端真实 IP
- 加速访问(缓存静态资源)
- 访问控制(过滤特定内容)
- 公司内部上网管理
1.2 反向代理介绍

1.2.1 含义及原理
**类似于转发器,反向代理位于客户端和目标服务器之间,代表目标服务器接收客户端请求。**反向代理主要服务于服务端。客户端仅与反向代理服务器通信,并不知晓后端实际处理请求的服务器集群。Nginx 在此场景中充当流量的统一入口与调度中心。
bash
# 原理介绍
客户端 → 反向代理服务器 → 后端服务器集群
# 反向代理(公司总机):
你想找某公司客服(访问服务),拨打公司总机(反向代理),总机转接到具体客服(后端服务器),你不知道客服分机号,只知道公司总机号码
1.2.2 主要特点
- 代理的是服务器端
- 客户端不知道真实的服务器是谁
- 客户端无需特殊配置
- 对客户端完全透明
1.2.3 使用场景
- 负载均衡
- 高可用性(故障转移)
- 缓存静态内容
- SSL 终端(统一管理证书)
- 安全防护(隐藏后端服务器)
- 动静分离
- 微服务网关
1.2.4 模拟-基础反向代理
bash
# cat /etc/hosts
...省略...
172.25.254.44 Nginx-1
172.25.254.45 Nginx-2
172.25.254.46 Nginx-FX
[root@Nginx-1 ~]# echo "Backend From Server 172.25.254.44" > /usr/share/nginx/html/index.html
[root@Nginx-1 ~]# systemctl restart nginx
[root@Nginx-2 ~]# echo "Backend From Server 172.25.254.45" > /usr/share/nginx/html/index.html
[root@Nginx-2 ~]# systemctl restart nginx
bash
[root@NginxFX ~]# vim /etc/nginx/nginx.conf
...省略...
http {
upstream backend_servers {
server 172.25.254.44;
server 172.25.254.45;
}
...省略...
server {
listen 80;
server_name _;
location / {
proxy_pass http://backend_servers;
}
}
...省略...
}
...省略...
[root@NginxFX ~]# nginx -t
[root@NginxFX ~]# systemctl restart nginx
]# for i in {1..10};do curl 172.25.254.46;done
Backend From Server 172.25.254.44
Backend From Server 172.25.254.45
Backend From Server 172.25.254.44
Backend From Server 172.25.254.45
Backend From Server 172.25.254.44
Backend From Server 172.25.254.45
Backend From Server 172.25.254.44
Backend From Server 172.25.254.45
Backend From Server 172.25.254.44
Backend From Server 172.25.254.45

2.动态网站架构
2.1 架构分类
| 资源文件识别 | 语言识别 | 框架识别 |
|---|---|---|
index.php |
开源php |
Windows/Linux+nginx+php+mysql |
index.py |
开源python |
Windows/Linux+apache+python+mysql |
index.jsp |
商业java |
windows/Linux+tomcat+JDK+Oracle |
index.asp |
商业c# |
Windows+iis+asp.net+sql-server/oracle/mogodb |
2.2 模拟LNMP动态页面环境部署流程
2.2.1 关闭火墙及SELinux、部署Nginx
bash
[root@Nginx-1 ~]# systemctl disable --now firewalld
[root@Nginx-1 ~]# getenforce
Disabled
[root@Nginx-1 ~]# yum install -y nginx
[root@Nginx-1 ~]# systemctl enable --now nginx
[root@Nginx-1 ~]# systemctl status nginx
[root@Nginx-1 ~]# netstat -antlupe | grep nginx
# 浏览器访问:http://172.25.254.44:80

2.2.2 部署php
bash
[root@Nginx-1 ~]# yum install -y php php-fpm php-mysqlnd gd php-gd
# php-fpm:php接收动态请求的程序
# php-mysqlnd:php链接mysql的程序
# php-gd:图形库程序(GD库可以处理图片,或者生成图片)
[root@Nginx-1 ~]# systemctl enable --now php-fpm
[root@Nginx-1 ~]# systemctl status php-fpm
[root@Nginx-1 ~]# ll /run/php-fpm/ | grep sock
srw-rw----+ 1 root root 0 Apr 14 19:22 www.sock
[root@Nginx-1 ~]# vim /etc/nginx/conf.d/default.conf
...省略...
location ~ \.php$ {
root /usr/share/nginx/html/;
fastcgi_pass unix:/run/php-fpm/www.sock; # 更改
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 更改/scripts为$document_root
include fastcgi_params;
}
...省略...
[root@Nginx-1 ~]# vim /usr/share/nginx/html/index.php
<?php
phpinfo();
?>
[root@Nginx-1 ~]# systemctl restart nginx
# 浏览器访问 http://172.25.254.44/index.php

bash
[root@Nginx-1 ~]# vim /etc/nginx/conf.d/default.conf
location / {
root /usr/share/nginx/html;
index index.php index.html index.htm;# index.php 放到 index.html前面
}
[root@Nginx-1 ~]# systemctl restart nginx
# 浏览器访问 http://172.25.254.44 也可以直接看到php动态页面了

2.3FastCGI与PHP-FPM
2.3.1 概述
简单来说:FastCGI 是一种通信协议,而 PHP-FPM 是该协议在 PHP 环境下的官方进程管理器。两者是"规范"与"实现"的关系。
| 名称 | 定位 | 类比 |
|---|---|---|
| FastCGI | 语言无关的通信协议/接口规范 | 像"HTTP 协议"定义浏览器和服务器怎么对话 |
| PHP-FPM | PHP 官方提供的 FastCGI 进程管理程序 | 像"Nginx 服务程序"具体实现了 HTTP 协议并处理请求 |
2.3.2 FastCGI是什么?(协议层)
2.3.2.1 诞生背景:解决 CGI 的性能瓶颈
- 传统 CGI :每次请求 Web 服务器都会
fork一个新进程 → 加载 PHP 解释器 → 解析执行脚本 → 返回结果 → 销毁进程。高并发下 CPU/内存开销极大。 - FastCGI :采用常驻进程 + 连接复用模式。进程启动后不退出,通过 Socket(TCP 或 Unix Domain Socket)持续接收请求,处理完一个后等待下一个,避免重复初始化。
2.3.2.2 工作原理
客户端 → Web服务器(Nginx/Apache) → [FastCGI协议] → FastCGI工作进程 → 返回结果 → Web服务器 → 客户端
- Web 服务器负责静态资源、SSL、负载均衡,遇到动态请求时通过
fastcgi_pass转发。 - FastCGI 进程只负责执行脚本、返回标准输出。
- 协议本身支持长连接、多路复用、环境变量传递、标准输入/输出流等。
2.3.3 PHP-FPM是什么?(实现层)
2.3.3.1 基本定位
- 全称:
PHP FastCGI Process Manager - 自 PHP 5.3.3 起内置于 PHP 核心 ,取代了老旧的
spawn-fcgi和第三方 FastCGI 管理器。 - 它是一个守护进程(Daemon),负责管理一组 PHP Worker 进程池。
2.3.3.2 核心能力
| 功能 | 说明 |
|---|---|
| 进程池管理 | 支持 static(固定数量)、dynamic(动态伸缩)、ondemand(按需启动)三种模式 |
| 优雅重载 | systemctl reload php-fpm 不中断正在处理的请求,平滑加载新配置/代码 |
| 故障隔离 | 单个 Worker 崩溃不会影响其他请求,自动回收并重启新进程 |
| 监控与诊断 | 内置 /status 状态页、慢请求日志(slowlog)、内存/执行时间限制、实时连接数统计 |
| 权限隔离 | 支持 user/group 配置,可按站点运行不同身份,提升安全性 |
2.3.3.3 典型配置片段 (www.conf)
ini
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.process_idle_timeout = 10s
slowlog = /var/log/php-fpm/slow.log
request_slowlog_timeout = 3s