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

📅 2026/7/11 10:39:36
Nginx 全能实战指南:反向代理、动静分离、PHP集成与负载均衡深度解析
nginx 反向代理文章摘要本文全面介绍了 Nginx 的核心功能与应用实践涵盖反向代理、动静分离、PHP 集成以及负载均衡四大主题。首先详细解析了正向代理与反向代理的区别、配置方法及应用场景接着阐述了动静分离的原理与配置步骤通过实际案例演示了 Nginx 处理静态资源、后端处理动态请求的架构然后深入讲解了 Nginx 与 PHP-FPM 的集成方式包括本地 Socket 通信和跨主机 TCP 通信并以 WordPress 部署为例展示了完整应用部署流程最后系统介绍了负载均衡集群的概念、Nginx 七层与四层负载均衡配置、多种负载均衡算法轮询、加权轮询、IP哈希、最小连接数以及健康检查机制。文章通过丰富的配置示例和实战案例帮助读者掌握 Nginx 在实际生产环境中的综合应用。代理概念代理服务器分为正向代理和反向代理。正向代理正向代理是一个位于客户端和目标服务器之间的代理服务器中间服务器。为了从目标服务器取得内容客户端向代理服务器发送一个请求并且指定目标服务器之后代理向目标服务器转发请求将获得的内容返回给客户端。正向代理的情况下客户端必须要进行一些特殊的设置才能使用。正向代理需要主动设置代理服务器ip或者域名进行访问由设置的服务器ip或者域名去访问内容并返回。PC无法直接访问WEB服务器但代理服务器可以访问。代理服务器帮助 PC 请求页面并缓存到本地并将页面返回给 PC。注释PC 只需要浏览器设置代理服务器 IP 和端口即可PC 知道代理服务器和 WEB 服务器的存在。反向代理反向代理是指以代理服务器来接收客户端的请求然后将请求转发给内部网络上的服务器将从服务器上得到的结果返回给客户端此时代理服务器对外表现为一个反向代理服务器正向代理需要配置代理服务器而反向代理不需要做任何设置。反向代理是代理服务器为服务器收发请求使真实服务器对客户端不可见PC 访问 WEB服务并不知道访问的是代理服务器PC 以为代理服务器就是 WEB服务器。代理服务 WEB 服务器页面缓存到本地当 PC 访问时直接反馈给PC页面。注释PC 浏览器不需要做任何设置。PC 访问代理服务器就等于访问 WEBPC 并不知道真实 WEB 服务器的存在。反向代理用途负载平衡:反向代理服务器可以充当驻留在我们后端服务器前面的交通警察,并以提高速度和容量利用率的方式在一组服务器之间分 配客户端请求,同时确保没有任何服务器过载如果服务器未启动,则负载平衡器会将流量重定向到其余的在线服务器Web 加速:Nginx 反向代理用于压缩出站和入站数据,以及缓存常见请求的内容,这两者都加快了客户端和服务器之间的流量流动安全性和匿名性: 我们可以拦截前往我们后端服务器的客户端的请求,通过这样做,反向代理服务器可以保护他们的身份并作为对安 全攻击的额外防御反向代理配置当 NGINX 服务器代理请求时,它将请求发送到指定的服务器,获取响应,并将其发送回客户端可以使用指定的协议向 HTTP 服 务器或非 HTTP 服务器发送代理请求支持的协议包括 FastCGIuwsgiSCGI 和 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服务安装nginx服务安装后端真实web服务器修改nginx配置将请求转发至后端真实服务器nginx 动静分离什么是动静分离Nginx的动静分离原理是将动态请求和静态请求分开不能单纯的理解成只把动态页面和静态页面物理分离。严格意义上可以理解成使用nginx处理静态页面tomcat 或 PHP 处理动态页面nginx 动静分离配置IP主机名用途192.168.19.128httpd服务器192.168.19.129nginx前端静态服务器配置步骤:后端服务器使用httpd服务可以解析php动态页面yum -y install php*后端服务器准备动态测试页面cat index.php EOF ?php phpinfo(); ? EOF源码安装nginx配置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; }如遇到问题解决方法测试访问静态页面由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 组件phpPHP 语言核心库php-fpmPHP FastCGI 进程管理器用于管理 PHP 进程池php-mysqlndPHP MySQL 数据库驱动程序php-gdPHP 图形处理库用于处理图像 php-mbstringPHP 多字节字符串扩展提供了对多字节字符集的支持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 nginxgroup nginxlisten.owner nginxlisten.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-fpmlocation ~ \.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.0wget https://cn.wordpress.org/latest-zh_CN.zip系统要求推荐服务器运行PHP 8.3 或更高版本数据库软件可采用MySQL8.0 或更高版本也可采用MariaDB 10.6 或更高版本安装与配置 MySQLyum -y install mysql-serversystemctl start mysqld登录修改密码:ALTERUSERrootlocalhostIDENTIFIEDBYroot;flushprivileges;创建 wordpress 数据库create database wordpress;php配置原来配置的 php 是 8.0 版本的需要卸载安装 8.3 版本 以上安装 epel 和 remi 仓库yuminstallepel-releaserpm-ivhhttps://mirrors.aliyun.com/remi/enterprise/remi-release-9.rpm启用 php8.3 模块并安装 phpyum moduleenablephp:remi-8.3-yyuminstall-yphp php-fpm php-mysqlnd php-gd php-mbstring php-cli php-common php-xml现在的版本已是 php8.3php 配置也需要修改vim/etc/php-fpm.d/www.conf监听改为 9000 端口监听部署 wordpress 源码文件wordpress 下载好解压unziplatest-zh_CN.zip解压放到访问安装页面,完成安装如果之前做过其他实操记得注释掉该行不然会跳转到其他页面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小时高可用性负载均衡集群即把负载压力根据某种算法合理分配到集群中的每一台计算机上,以减轻主服务器的压力,降低对主服务 器的硬件和软件要求 比如:服务器计算节点或存储设备上,以提高系统的性能可伸缩性负载均衡集群♦ 负载均衡集群作用提高系统性能负载均衡技术将负载(请求或任务)分发到多个资源上使得系统能够处理更多的并发请求从而提高整体的处理能力和性能。实现高可用性负载均衡可以将负载分发到多个资源上当其中一个资源发生故障或不可用时负载均衡可以自动将请求转发到其他可用的资源。提高系统可伸缩性随着业务的增长负载均衡技术可以动态地增加或减少资源的数量根据实际负载情况进行扩展或收缩。优化资源利用负载均衡技术可以根据资源的性能、可用性和负载情况合理地分配请求或任务。♦ 负载均衡集分类按物理类型分类软件负载均衡如nginxhaproxylvs硬件负载均衡如F5按工作模式分类四层负载均衡四层的负载均衡就是基于IP端口的负载均衡, 用ip port接收请求,再转发到对应的机器。实现四层负载均衡的软件有F5硬件负载均衡器功能很好但是成本很高。Ivs重量级的四层负载软件nginx轻量级的四层负载软件带缓存功能正则表达式较灵活haproxy模拟四层转发较灵活七层负载均衡七层的负载均衡就是基于虚拟的 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; }backupbackup是指备份的机器相对于备份的机器来说其他的机器就相当于主要服务器只要当主要服务器不可用的时候才会 用到备用服务器。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 负载均衡算法-1round-robin(轮询) ☚ 这是默认值★ Nginx 负载均衡算法-2weight 加权轮询● 指定轮询的频率weight和访问率成正比用于后端服务器性能不均匀的情况★ Nginx 负载均衡算法-3ip_hash● 针对客户端 IPv4 地址按照C类网络提取相应的网络IP地址然后计算该C类网络地址的哈希值从而基于该哈希值进 行负载均衡。● 注意这会造成具备相同网络IP地址的客户端会被负载均衡到相同的后端服务器。★ Nginx 负载均衡算法-4least_conn(最小连接数)●下一个请求将被分配给活动连接最少的服务器摩尔狮★ 权重weighthttp { upstream ipHashLoadBalanceServer { ip_hash; server www.address1.com weight3; server www.address2.com; // default weight1 } 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 对每台服务器进行健康检查。 检查的方式有两种被动检查使用upstream模块自带的参数向服务器转发请求失败或者没有接收到响应nginx 就认为其不可用会停止一段时间不再向其转发 默认规则是如果失败了一次就停止转发10秒钟失败次数和停发时间是可以设定的。例如upstream backend { server backend1.example.com; server backend2.example.com max_fails3 fail_timeout30s; server backend3.example.com max_fails2; }max_fails 允许失败的次数超出后就认为不可用fail_timeout max_fails次失败后暂停的时间主动检查通过 upstream 负载均衡组中的 max_failsnumber 和 fail_timeouttime 来间接实现但还是会把请求转发给故障服务器的然后再转发给别的服务器这样就需要多一次转发。nginx_upstream_check_module为淘宝技术团队开发的nginx模块用来检测后端服务器的健康状态如果后端服务器不可用则请求不再转发到这台服务器