【Nginx专项】高级进阶架构篇-Proxy正反向代理、FastCGI及PHP-FPM介绍

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.3FastCGIPHP-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
相关推荐
mixboot1 小时前
Linux 进程工作目录查看利器:pwdx 命令详解
linux·运维·服务器
盖小雅1 小时前
自动化排班如何破解劳动法合规难题:从规则冲突到可追溯的排班表
大数据·运维·机器学习·自动化
NiceCloud喜云2 小时前
Claude Code Routines 实战:三种触发器跑通云端自动化编码
android·运维·数据库·人工智能·自动化·json·飞书
之歆2 小时前
Day16_JavaScript 轮播图与事件工程实战(下篇)
服务器·开发语言·前端·javascript·网络·性能优化
会Tk矩阵群控的小木3 小时前
云控系统在TikTok多账号管理中的核心应用与技术实现
开发语言·php·开源软件·个人开发·tk矩阵
AI 小老六3 小时前
Claude Code 如何压缩上下文:Microcompact、Prompt Cache 与 cache_edits 工程拆解
数据库·人工智能·ai·语言模型·架构·系统架构
zhz52144 小时前
服务器等保加固实施报告
运维·服务器·信创·国密·等保
傻啦嘿哟4 小时前
降低首字延迟(TTFB):专线节点与TCP Fast Open的配置
开发语言·php