【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
相关推荐
returnthem1 小时前
【Linux基础知识】Linux自动化运维:编写Shell脚本实现自动化任务
linux·运维·自动化
实在智能RPA1 小时前
零售行业上线Agent,能带来哪些运营价值?——2026年视角下的端到端智能自动化深度拆解
运维·自动化·零售
默|笙1 小时前
【Linux】线程同步与互斥_日志与线程池
android·linux·运维
一条咸鱼¥¥¥1 小时前
【运维笔记】华为防火墙远程接入用户开通与禁用方法
运维·网络·华为·远程用户
Asurplus1 小时前
【Ngrok】Linux运行内网穿透工具Ngrok
linux·运维·服务器·内网穿透·ngrok
无忧智库2 小时前
破局与狂范:大模型上线备案与全栈架构合规深度解构指南(PPT)
大数据·架构
ancktion2 小时前
ubuntu多gcc版本切换
linux·运维·ubuntu
Rabbit_QL2 小时前
【GPU 基础】架构与内存设计
架构
热爱Liunx的丘丘人2 小时前
21.内核和内核参数
linux·运维·服务器