当前位置: 首页 > news >正文

Nginx 全能实战指南:反向代理、动静分离、PHP集成与负载均衡深度解析

nginx 反向代理

文章摘要:本文全面介绍了 Nginx 的核心功能与应用实践,涵盖反向代理、动静分离、PHP 集成以及负载均衡四大主题。首先详细解析了正向代理与反向代理的区别、配置方法及应用场景;接着阐述了动静分离的原理与配置步骤,通过实际案例演示了 Nginx 处理静态资源、后端处理动态请求的架构;然后深入讲解了 Nginx 与 PHP-FPM 的集成方式,包括本地 Socket 通信和跨主机 TCP 通信,并以 WordPress 部署为例展示了完整应用部署流程;最后系统介绍了负载均衡集群的概念、Nginx 七层与四层负载均衡配置、多种负载均衡算法(轮询、加权轮询、IP哈希、最小连接数)以及健康检查机制。文章通过丰富的配置示例和实战案例,帮助读者掌握 Nginx 在实际生产环境中的综合应用。

代理概念

代理服务器分为正向代理和反向代理。

  • 正向代理

正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从目标服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转发请求,将获得的内容返回给客户端。正向代理的情况下,客户端必须要进行一些特殊的设置才能使用。
正向代理需要主动设置代理服务器ip或者域名进行访问,由设置的服务器ip或者域名去访问内容并返回。

  1. PC无法直接访问WEB服务器,但代理服务器可以访问。
  2. 代理服务器帮助 PC 请求页面并缓存到本地,并将页面返回给 PC。

注释:PC 只需要浏览器设置代理服务器 IP 和端口即可,PC 知道代理服务器和 WEB 服务器的存在。

  • 反向代理

反向代理是指以代理服务器来接收客户端的请求,然后将请求转发给内部网络上的服务器,将从服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器。

正向代理需要配置代理服务器,而反向代理不需要做任何设置。反向代理是代理服务器,为服务器收发请求,使真实服务器对客户端不可见。

  1. PC 访问 WEB服务,并不知道访问的是代理服务器,PC 以为代理服务器就是 WEB服务器。
  2. 代理服务 WEB 服务器页面缓存到本地,当 PC 访问时直接反馈给PC页面。

注释:PC 浏览器不需要做任何设置。PC 访问代理服务器就等于访问 WEB,PC 并不知道真实 WEB 服务器的存在。

  • 反向代理用途

负载平衡:反向代理服务器可以充当驻留在我们后端服务器前面的交通警察,并以提高速度和容量利用率的方式在一组服务器之间分 配客户端请求,同时确保没有任何服务器过载。如果服务器未启动,则负载平衡器会将流量重定向到其余的在线服务器。

Web 加速:Nginx 反向代理用于压缩出站和入站数据,以及缓存常见请求的内容,这两者都加快了客户端和服务器之间的流量流动。

安全性和匿名性: 我们可以拦截前往我们后端服务器的客户端的请求,通过这样做,反向代理服务器可以保护他们的身份并作为对安 全攻击的额外防御。

反向代理配置

当 NGINX 服务器代理请求时,它将请求发送到指定的服务器,获取响应,并将其发送回客户端。可以使用指定的协议向 HTTP 服 务器或非 HTTP 服务器发送代理请求。支持的协议包括 FastCGI、uwsgi、SCGI 和 Memcached。

要将请求传递到 HTTP 代理服务器,使用 proxy_pass 指令。

例如:

location /some/path/ { proxy_pass http://www.example.com/; }

要将请求传递到非 HTTP 代理服务器,请使用适当的 **_pass 指令:

fastcgi_pass:将请求传递给 fastCGI 服务器。

uwsgi_pass:将请求传递给 uwsgi 服务器。

scgi_pass:将请求传递给 SCGI 服务器。

memcached_pass:将请求传递给 memcached 服务器。

应用:

客户端-----nginx代理服务器----后端httpd服务

  1. 安装nginx服务
  2. 安装后端真实web服务器
  3. 修改nginx配置,将请求转发至后端真实服务器

nginx 动静分离

  • 什么是动静分离

Nginx的动静分离,原理是将动态请求和静态请求分开,不能单纯的理解成只把动态页面和静态页面物理分离。严格意义上,可以理解成使用nginx处理静态页面,tomcat 或 PHP 处理动态页面。

  • nginx 动静分离配置
IP主机名用途
192.168.19.128httpd服务器
192.168.19.129nginx前端静态服务器

配置步骤:

  1. 后端服务器使用httpd服务(可以解析php动态页面)
yum -y install php*
  1. 后端服务器准备动态测试页面
cat > index.php << EOF <?php phpinfo(); ?> EOF
  1. 源码安装nginx
  2. 配置nginx实现动静分离
# 动静分离:Httpd的<php动态页面> location ~ \.php$ { ## 执行:反向代理,实现<动静分离>,向后端转发<http Request请求包> proxy_pass http://www02.test.com; ## 在向后端转发的<http Request请求包>的<头部>中,插入【X-Real-IP: 客户端的真实IP地址】 proxy_set_header X-Real-IP \$remote_addr; } location / { root html; index index.html index.htm; }

如遇到问题:

解决方法:

  1. 测试访问

静态页面由nginx相应请求

动态页面由后端http服务相应请求

nginx 与 php 集成

php 概念

PHP是一种开源服务器端脚本语言, PHP通常用于服务器端Web开发,包括构建Web应用程序、Web服务、CMS、博客、论坛等等。许 多流行的Web框架,都是用PHP编写的。PHP也可以用于命令行脚本、系统管理和其他一些用途。

  • php的安装环境配置
yum install php php-fpm php-mysqlnd php-gd php-mbstring

安装以上 PHP 组件:

php:PHP 语言核心库

php-fpm:PHP FastCGI 进程管理器,用于管理 PHP 进程池

php-mysqlnd:PHP MySQL 数据库驱动程序

php-gd:PHP 图形处理库,用于处理图像 php-mbstring:PHP 多字节字符串扩展,提供了对多字节字符集的支持

  • php-fpm配置

PHP-FPM(FastCGI Process Manager) 是一个PHP FastCGI 进程管理器。FastCGI可以理解为一种协议,用于web服务器(nginx、 Apache) 和处理程序间进行通信,是一种应用层通信协议。

安装:

yum install -y php-fpm

配置:/etc/php-fpm.d/www.conf

将 user 和 group 设置为 Nginx 用户和组:

user = nginx

group = nginx

listen.owner = nginx

listen.group = nginx

原理图解:

nginx 与 php 集成

  • nginx 配置
location ~ \.php$ { root /home/01_html; try_files $uri =404; fastcgi_pass unix:/var/run/php-fpm/www.sock; #通过sock文件通信 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }

也可使用 fastcgi_pass 指定 127.0.0.1:9000 作为 PHP-FPM 的后端地址,而不是使用 Unix 域套接字文件路径

location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; # 使用 TCP socket通信 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }

在 Nginx 和 PHP-FPM 之间通信时,可以使用TCP socket或Unix域套接字文件两种方式。

使用TCP socket(例如127.0.0.1:9000)的优点是:

1、可以跨越不同的机器和网络进行通信。

2、可以通过防火墙和网络设备进行配置和限制。

使用 Unix 域套接字文件(例如/run/php-fpm/www.sock)的优点是:

1、比TCP socket更快更高效,因为它不需要进行网络通信。

2、更安全,因为 Unix 域套接字文件只能被本地进程访问,而不是通过网络进行访问。

● nginx与php-fpm跨主机通信

● nginx与php-fpm跨主机通信

php-fpm配置:

设置:<php-fpm管理器实例>侦听<外部访问>

sed -i -r 's/^\s*listen\s*=.*/listen = 0.0.0.0:9000/' /etc/php-fpm.d/www.conf

设置:<php-fpm管理器实例>允许接收<外部访问>(本案例:仅允许<Nginx服务器>的访问)

如果使用; 分号(;listen.allowed_clients = xxx)来注释掉,则允许接收:所有的<外部访问>

sed -i -r 's/^\s*listen.allowed_clients\s*=.*/listen.allowed_clients = 192.168.19.129/' /etc/php-fpm.d/www.conf systemctl restart php-fpm
location ~ \.php$ { fastcgi_pass 192.168.19.129:9000; # 使用 TCP socket 跨主机通信 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }

案例部署

基于php开发的开源博客平台wordpress

下载链接:https://cn.wordpress.org/download/

  • 版本: wordpress-7.0
wget https://cn.wordpress.org/latest-zh_CN.zip
  • 系统要求:推荐服务器运行PHP 8.3 或更高版本;数据库软件可采用MySQL8.0 或更高版本,也可采用MariaDB 10.6 或更高版本。
  1. 安装与配置 MySQL:
yum -y install mysql-server
systemctl start mysqld

登录修改密码:

ALTERUSER'root'@'localhost'IDENTIFIEDBY'root';flushprivileges;

创建 wordpress 数据库

create database wordpress;
  1. php配置

原来配置的 php 是 8.0 版本的,需要卸载安装 8.3 版本 以上

安装 epel 和 remi 仓库

yuminstallepel-releaserpm-ivhhttps://mirrors.aliyun.com/remi/enterprise/remi-release-9.rpm

启用 php8.3 模块并安装 php

yum moduleenablephp:remi-8.3-yyuminstall-yphp php-fpm php-mysqlnd php-gd php-mbstring php-cli php-common php-xml

现在的版本已是 php8.3

php 配置也需要修改

vim/etc/php-fpm.d/www.conf

监听改为 9000 端口监听

  1. 部署 wordpress 源码文件

wordpress 下载好,解压

unziplatest-zh_CN.zip

解压放到

  1. 访问安装页面,完成安装

如果之前做过其他实操记得注释掉该行,不然会跳转到其他页面

vim/usr/local/nginx/conf/nginx.conf

把/scripts 修改为确切的值

添加 php 后缀索引

重载

nginx-sreload

地址栏输入地址后直接跳转安装页面

192.168.19.128/wp-admin/

在 /usr/local/nginx/html/下创建 wp-config.php 文件将配置规则复制粘贴进去,然后点击运行安装程序。

输入信息后点击安装就安装成功了

登录后就是这个样子!

负载均衡集群介绍

集权概念

集群(Cluster)是指一组独立的计算机系统构成的一个松耦合的多处理器系统,它们之间通过网络实现进程间的通信。应用 程序可以通过网络共享内存进行消息传送,实现分布式计算机。通俗一点来说,就是让若干台计算机联合起来工作(服务),可 以是并行的,也可以是做备份。

  • 集群分类

高可用集群:利用集群管理软件,当主服务器故障时,备份服务器能够自动接管主服务器的工作,并及时切换过去,以实 现对用户的不间断服务。保障关键服务的7X24小时高可用性。

负载均衡集群:即把负载压力根据某种算法合理分配到集群中的每一台计算机上,以减轻主服务器的压力,降低对主服务 器的硬件和软件要求。 比如:服务器、计算节点或存储设备上,以提高系统的性能、可伸缩性。

负载均衡集群

♦ 负载均衡集群作用

  • 提高系统性能

负载均衡技术将负载(请求或任务)分发到多个资源上,使得系统能够处理更多的并发请求,从而提高整体的处理能力和性能。

  • 实现高可用性

负载均衡可以将负载分发到多个资源上,当其中一个资源发生故障或不可用时,负载均衡可以自动将请求转发到其他可用的资源。

  • 提高系统可伸缩性

随着业务的增长,负载均衡技术可以动态地增加或减少资源的数量,根据实际负载情况进行扩展或收缩。

  • 优化资源利用

负载均衡技术可以根据资源的性能、可用性和负载情况,合理地分配请求或任务。

♦ 负载均衡集分类

按物理类型分类:

软件负载均衡,如nginx,haproxy,lvs

硬件负载均衡:如F5

按工作模式分类:

  1. 四层负载均衡

四层的负载均衡就是基于IP端口的负载均衡, 用ip port接收请求,再转发到对应的机器。

实现四层负载均衡的软件有:

  • F5:硬件负载均衡器,功能很好,但是成本很高。
  • Ivs:重量级的四层负载软件
  • nginx:轻量级的四层负载软件,带缓存功能,正则表达式较灵活
  • haproxy:模拟四层转发,较灵活
  1. 七层负载均衡

七层的负载均衡,就是基于虚拟的 URL 或主机 IP 的负载均衡,根据虚拟的 url 或 IP,主机名接收请求,再转向相应的处理服务器。

实现七层负载均衡的软件有:

  • haproxy:全面支持七层代理,会话保持,标记,路径转移;
  • nginx:只在 http 协议和 mailt 协议上功能比较好,性能与 haproxy 差不多;
  • apache:功能较差
  • Mysql proxy:功能尚可。

总的来说,-般是lvs做4层负载; nginx做7负载。

nginx 负载均衡配置

7 层负载均衡配置

♦ 负载均衡模块

ngx_http_proxy_module proxy代理模块,用于把请求抛给后端的服务器节点,或是 upstream 服务器池

ngx_http_upstream_module 负载均衡模块,实现服务器的负载均衡节点配置,以及健康检查

♦ upstream 模块

★ 了解:upstream 配置段

● 功能:定义一个<后端服务器池>的<命名实体>

▲ <后端服务器池>中的<各个服务器>可以指定不同的<weight权重>,默认为1

● 语法:

upstream NAME { server name [parameters] ... }

♦ NAME ☚ <upstream配置段>的<实体名称>

▲ 后续可以直接通过来引用<相应的 upstream 配置段>

▲ 注意:NAME 名称中,不要有 _下划线

server 指令

功能:定义<后端服务器池>中的<服务器>

语法:server name [parameters]

parameters 注解:

♦ weight = NUMBER 设置:服务器权重(权重越大,就会被分配更多的任务)

▲ 默认为 1

♦ fail_timeout = TIME 设置:<请求超时>的<时间阈值>

▲ 默认为 10秒

♦ max_fails = NUMBER 设置:在<fail_timeout 时间阈值>之内,允许的<重试次数>

▲ 可以达到<健康检查>的目的

▲ 默认为 1次,如果设置为 0,则关闭<健康检查>

♦ down 标记:<服务器>处于<离线状态>

♦ backup 指定:<备用服务器>

▲ 仅在所有的<非备份服务器>都宕机或繁忙时,方可启用

▲ 注意:<ip_hash算法>不支持<backup参数>

down:

假如有一台主机是出了故障,或者下线了,要暂时移出,那可以把它标为down,表示请求是会略过这台主机的。

.... upstream downServer { server www.address1.com; // 或者ip+端口 , 不需要加入http/https前缀 server www.address2.com down; }

backup

backup是指备份的机器,相对于备份的机器来说,其他的机器就相当于主要服务器,只要当主要服务器不可用的时候,才会 用到备用服务器。

upstream backupServer { server www.address1.com; // 或者ip+端口,不需要加入http/https前缀 server www.address2.com backup; }

配置示例:

http { upstream [自定义负载均衡机制名称] { server [ip地址]:[端口值]; server [ip地址]:[端口值]; server [ip地址]:[端口值]; server [ip地址]:[端口值]; } server { listen [nginx监听端口]; server_name [head中的host对应的值] location / { proxy_pass http:// [你的负载均衡机制名称,对应上面upstream的值]; } } }

配置示例:

http { upstream web { server 192.168.100.150; server 192.168.100.160; } server { listen 80; server_name www.web.com; location / { proxy_pass http://web; } } }

4 层负载均衡

四层负载均衡数据包是在底层就进行了分发,而七层负载均衡数据包则在最顶端进行分发,所以四层负载均衡的效率比七层负载 均衡的要高。四层负载均衡不识别域名,而七层负载均衡识别域名。

♦ stream模块 注意stream模块的位置,要在http模块上方,同时proxy_pass的书写方式也有不同。

nginx 负载均衡算法

负载均衡算法

★ Nginx 负载均衡算法-1:round-robin(轮询) ☚ 这是:默认值

★ Nginx 负载均衡算法-2:weight 加权轮询

● 指定轮询的频率,weight和访问率成正比,用于后端服务器性能不均匀的情况

★ Nginx 负载均衡算法-3:ip_hash

● 针对<客户端 IPv4 地址>,按照<C类网络>提取<相应的网络IP地址>,然后计算<该C类网络地址>的<哈希值>,从而基于<该哈希值>进 行<负载均衡>。

● 注意:这会造成具备<相同网络IP地址>的<客户端>,会被<负载均衡>到<相同的后端服务器>。

★ Nginx 负载均衡算法-4:least_conn(最小连接数)

●<下一个请求>将被分配给<活动连接最少的服务器>摩尔狮

★ 权重weight

http { upstream ipHashLoadBalanceServer { ip_hash; server www.address1.com weight=3; server www.address2.com; // default weight=1 } server { listen 80; location / { proxy_pass http://loadBalanceServer; } } }

★ ip_hash 客户端ip地址被用作hash key来判断客户端请求应该发送到哪个服务器,这种方法保证了来自相同客户端的请求总是发送到相同 服务器

upstream myapp1 { ip_hash; server srv1.example.com; server srv2.example.com; server srv3.example.com; }

★ least_conn(最小连接数) nginx会尽量不让负载繁忙的应用服务器上负载过多的请求,相反的,会把新的请求发送到比较不繁忙的服务器。

upstream myapp1 { least_conn; server srv1.example.com; server srv2.example.com; server srv3.example.com; }

健康检查

如果服务器组内有机器出现问题,nginx就不再向其转发请求了,那么 nginx 如何知道某台服务器是否能正常?这就需要 nginx 对每台服务器进行健康检查。 检查的方式有两种:

  1. 被动检查(使用upstream模块自带的参数)

向服务器转发请求失败,或者没有接收到响应,nginx 就认为其不可用,会停止一段时间不再向其转发 默认规则是,如果失败了一次,就停止转发10秒钟,失败次数和停发时间是可以设定的。

例如:

upstream backend { server backend1.example.com; server backend2.example.com max_fails=3 fail_timeout=30s; server backend3.example.com max_fails=2; }

max_fails 允许失败的次数,超出后就认为不可用

fail_timeout max_fails次失败后,暂停的时间

  1. 主动检查

通过 upstream 负载均衡组中的 max_fails=number 和 fail_timeout=time 来间接实现,但还是会把请求转发给故障服务器的,然后再转发给别的服务器,这样就需要多一次转发。nginx_upstream_check_module为淘宝技术团队开发的nginx模块,用来检测后端服务器的健康状态,如果后端服务器不可用,则请求不再转发到这台服务器。

http://www.jsqmd.com/news/1166826/

相关文章:

  • 如何3分钟检测微信单向好友?WechatRealFriends终极完整指南
  • 广东产教融合科技研究院2026年电气自动化招生报名简章 - 升学指导教育资讯
  • FFXIV TexTools:3步轻松安装和管理《最终幻想14》模组
  • 格式化字符串漏洞深度利用:从数据泄露到任意地址写的3种攻击链构造
  • LV3296条码扫描模块与PIC32MX695F512L的硬件集成与优化
  • 2026年媒体发稿平台推荐:15万+高权重新闻源矩阵赋能品牌传播,四级权威信源全覆盖铸就信任基石 - GEORANK
  • Ubuntu实用知识总结
  • UART 一对多通信 3 种硬件方案对比:二极管法 vs IO控制法 vs RS485
  • Nintendo Switch NAND管理工具:从数据备份到系统修复的完整解决方案
  • 2026宁波口碑好的华东地区电液推杆选购参考 - 起跑123
  • Perplexity学术搜索深度优化实战(2024最新API与语义解析机制解密)
  • UE4小车跟随视角与抖动效果:5分钟快速实现与高级调优
  • 连锁餐饮POS系统:助力餐饮品牌实现多门店智能化管理
  • llm.cpp:面向本地大模型部署的C++底层推理运行时
  • AI隐私三把锁:DeepSeek、豆包、腾讯元宝数据开关全指南
  • Perplexity代码搜索的“黑盒”终于打开:基于逆向HTTP流量+AST比对的底层工作流图谱(仅限本期披露)
  • 三星AI技术架构解析:从芯片优化到商业落地的工程实践
  • AI自我改进系统:从原理到工程实践的全流程指南
  • 【YOLO】之理解预训练和微调
  • 2026 年济南精修打胶打胶收口门缝打胶本地靠谱施工测评分享 - LYL仔仔
  • GitHub访问缓慢的三大技术痛点及Fast-GitHub解决方案
  • 109、RealBasicVSR 实战:真实场景视频超分的端到端解决方案
  • gtsam的安装过程及lego-loam问题总结
  • 如何让Kodi直接播放115网盘视频:完整解决方案指南
  • 2026年7月华东地区电液推杆选购实用指南 - 起跑123
  • 51单片机驱动16*32点阵屏:74HC595与74HC154级联实战,实现4字滚动显示
  • 从“规则驱动”到“目标驱动”的生死跃迁(AI Agent颠覆RPA底层逻辑全图谱):含12个行业落地失败复盘与3套迁移路径图
  • 阴阳师自动化脚本完全指南:告别重复劳动,智能托管你的游戏日常
  • 温州智能包装机机械选购指南:主流厂家客观对比、选型避坑与行业落地案例解析 - 国麟测评
  • Cyber Engine Tweaks 终极指南:5个技巧解锁《赛博朋克2077》完全掌控权