目录

Nginx-技术解析与-LNMP-架构实战部署报告

目录

Nginx 技术解析与 LNMP 架构实战部署报告

Nginx 技术解析与 LNMP 架构实战部署报告

一、Nginx简介

Nginx是一款轻量级Web服务器/反向代理服务器,同时支持电子邮件(IMAP/POP3)代理功能,凭借高稳定性、低资源消耗和强并发能力,成为主流服务器软件之一。

  • 开发背景:由俄罗斯程序员Igor Sysoev开发,最初为俄国大型入口网站及搜索引擎Rambler设计,首个公开版本(0.1.0)于2004年10月4日发布,2011年6月发布稳定版1.0.4。
  • 许可证与开源属性:基于类BSD许可证开源,可免费用于商业与个人场景,显著降低企业部署成本。
  • 核心优势:以“内存占用少、并发能力强”为核心特点,官方测试支持5万个并发连接,实际生产环境中可稳定承载2-3万并发;且配置简单、文档丰富,易于运维。
  • 国内应用:百度、京东、新浪、网易、腾讯、淘宝等头部互联网企业均采用Nginx作为核心服务器组件。

二、Nginx的特性与优点

1. 核心特性

Nginx的特性围绕“高性能、多功能”设计,覆盖Web服务与代理的核心需求:

  • 高并发支撑:在高连接并发场景下可替代Apache,官方测试支持5万并发连接,远超同类型Web服务器。
  • 高效事件模型:基于epoll(Linux)和kqueue(BSD)开发,大幅提升IO处理效率,减少资源浪费。
  • 多角色支持:既能作为Web服务器直接运行PHP等程序,也能作为HTTP反向代理服务器转发请求,还可充当负载均衡器分发流量。
  • 高性能底层:采用C语言编写,系统资源开销低、CPU使用率高,性能优于Perlbal等同类工具。

2. 核心优点

Nginx的优点从“性能、成本、运维、功能”多维度体现,适配各类场景需求:

  • 高并发连接:实际生产环境可稳定承载2-3万并发连接,满足大型网站流量需求。
  • 低内存消耗:3万并发连接下,10个Nginx进程仅消耗约150M内存(单进程约15M),资源利用率极高。
  • 配置简单易懂:配置文件语法简洁,逻辑与程序代码类似,新手易上手。
  • 低成本部署:开源免费,无需购买F5 BIG-IP、NetScaler等硬件负载均衡设备(成本十多万至几十万),降低企业支出。
  • 灵活Rewrite规则:可根据域名、URL路径将请求分发到不同后端服务器群组,适配复杂业务路由。
  • 内置健康检查:反向代理场景下,若后端Web服务器宕机,Nginx会自动剔除故障节点,不影响前端访问。
  • 带宽优化:支持GZIP压缩减少响应体积,可配置浏览器本地缓存Header,降低带宽消耗。
  • 高稳定性:作为反向代理时,宕机概率极低,保障服务连续可用。
  • 模块化设计:模块支持动态编译,可按需扩展功能(如缓存、SSL、防盗链)。
  • 完善外围支持:官方文档全面,社区活跃,二次开发案例多,第三方模块丰富。
  • 热部署能力:可在不停止服务的情况下重载配置文件,实现“零 downtime”更新。
  • 性能优化特性:支持事件驱动、异步IO(AIO)、内存映射(mmap)等技术,进一步提升处理效率。

三、Nginx的功能及应用类别

1. 基本功能

Nginx的基本功能覆盖Web服务与代理的核心场景,满足基础业务需求:

  • 静态资源服务器:直接托管HTML、图片、JS/CSS等静态资源,支持缓存打开的文件描述符,提升读取速度。
  • 多协议反向代理:支持HTTP、SMTP、POP3协议的反向代理,转发请求到后端服务。
  • 缓存与负载均衡:可配置缓存减轻后端压力,同时通过负载均衡将流量分发到多个后端节点,提升服务可用性。
  • 多语言运行支持:兼容FastCGI(如PHP-FPM,适配LNMP架构)、uWSGI(适配Python)等协议,支持运行动态语言程序。
  • 模块化过滤:通过内置模块实现GZIP压缩、SSI(服务器端包含)、图片大小调整等功能。
  • SSL加密:支持配置SSL证书,实现HTTPS加密传输,保障数据安全。

2. 扩展功能

扩展功能进一步丰富Nginx的适用场景,适配复杂业务需求:

  • 多类型虚拟主机:支持基于域名(Name-based)和IP(IP-based)的虚拟主机,实现“一台服务器托管多个网站”。
  • 长连接支持:支持HTTP Keepalive,减少TCP连接建立/关闭的开销,提升访问速度。
  • 平滑升级:可在不停止服务的情况下升级Nginx版本,保障业务连续性。
  • 日志定制:支持定制访问日志格式,可配置日志缓冲区提升存储性能,便于日志分析。
  • URL重写与别名:通过Rewrite实现URL美化,支持路径别名(Alias)映射到不同目录。
  • 访问控制:可基于IP地址、用户认证(如Basic Auth)限制访问,保障资源安全。
  • 流量控制:支持速率限制(如每秒请求数)和并发数限制,防止恶意请求压垮服务。

3. 应用类别

Nginx的应用场景围绕“Web服务、代理、集成开发”展开,覆盖主流技术架构:

  • 动态语言运行:结合FastCGI运行PHP、JSP、Perl等动态程序(如LNMP架构中,Nginx转发PHP请求到PHP-FPM)。
  • 反向代理与负载均衡:作为前端入口,转发请求到后端多台Web服务器,实现流量分发与故障容错(如电商秒杀场景)。
  • 静态资源托管:直接运行静态HTML网页、图片库等,利用Nginx的高性能降低后端服务器压力。
  • 新技术集成:与Docker、Kubernetes等容器技术结合实现服务编排,或与Redis、Elasticsearch等中间件配合提升性能。

四、Nginx的模块与工作原理

1. Nginx的模块分类

Nginx的模块是功能实现的核心载体,按“结构”“功能”“必要性”可分为不同类别,逻辑清晰且易于扩展。

(1)按结构分类
  • 核心模块:Nginx运行的基础模块,不可禁用,包括:
    • HTTP模块:处理HTTP请求的核心逻辑(如请求解析、响应构建)。
    • EVENT模块:管理网络事件(如连接监听、IO处理)。
    • MAIL模块:支持SMTP/POP3协议的代理功能。
  • 基础模块:默认启用的功能模块,支撑常用场景,包括:
    • HTTP Access模块:实现IP访问控制。
    • HTTP FastCGI模块:适配FastCGI协议(如PHP-FPM)。
    • HTTP Proxy模块:实现反向代理功能。
    • HTTP Rewrite模块:支持URL重写。
  • 第三方模块:由社区或用户开发的扩展模块,按需编译,包括:
    • HTTP Upstream模块:增强负载均衡功能(如加权轮询、IP哈希)。
    • Request Hash模块:基于请求参数实现哈希路由。
    • HTTP Access Key模块:基于密钥控制访问。
(2)按功能分类
  • Handlers(处理器模块):直接处理请求并生成响应,修改Header信息,每个请求仅由一个Handlers模块处理(如处理静态资源的ngx_http_static_module)。
  • Filters(过滤器模块):对Handlers模块的输出内容进行修改(如GZIP压缩、图片裁剪),最终由Nginx输出给客户端。
  • Proxies(代理器模块):与后端服务交互(如FastCGI、HTTP后端),实现代理与负载均衡(如ngx_http_proxy_module)。
(3)按必要性分类(基本模块)

基本模块是Nginx默认集成的核心组件,编译时不可禁用:

  • 核心模块:提供进程管理、安全控制等基础指令(如worker_processesuser),配置通常位于文件顶部。
  • 事件模块:配置网络事件处理(如worker_connectionsuse epoll),控制Nginx的IO模型,配置位于文件顶部。
  • 配置模块:支持配置文件的“包含”机制(如include mime.types),实现配置拆分与复用。

2. Nginx的工作原理

https://i-blog.csdnimg.cn/direct/c5a2757e9b3c433f9707da482db36d3e.png#pic_center

Nginx的工作原理围绕“静态编译、进程架构、连接处理”展开,保障高性能与高稳定性。

(1)模块编译与加载
  • Nginx模块采用静态编译方式:模块直接编译进Nginx二进制文件,启动后自动加载;与Apache的“动态加载so文件”不同,首先将模块编译为一个so文件,然后在配置文件中指定是否进行加载。
  • 配置解析时,每个模块可能参与请求处理,但同一请求的同一环节仅由一个模块完成(如Handlers模块唯一),避免功能冲突。
(2)进程架构:Master-Worker模型

启动nginx时,会启动一个Master进程,主要用来产生worker线程,一个worker线程用来处理n个request。

  • Master进程:不处理客户端请求,仅负责“进程管理”与“配置生效”:
    • 生成Worker进程;
    • 监听配置重载、版本升级、日志切割等用户操作;
    • 监控Worker进程状态,若Worker异常退出,自动重启新Worker。
  • Worker进程:负责处理实际的网络请求,所有Worker进程平等竞争请求,通过“互斥锁”避免资源争抢。
(3)连接处理:解决惊群现象与负载均衡
  • 惊群现象与解决
    若多个Worker同时监听同一端口,新连接到来时所有Worker会收到通知,仅一个Worker能成功 accept 连接,其余均失败——此为“惊群现象”。
    Nginx通过accept_mutex(互斥锁) 解决:同一时刻仅一个Worker能获取锁并 accept 连接,其他Worker跳过竞争,避免资源浪费。
  • 连接负载均衡(ngx_accept_disabled变量)
    Nginx通过变量ngx_accept_disabled控制Worker是否竞争accept_mutex锁,公式为:
    ngx_accept_disabled = 单进程总连接数 / 8 - 空闲连接数
    ngx_accept_disabled > 0时,Worker主动放弃竞争锁,数值越大放弃次数越多,实现Worker间的连接数平衡,避免单个Worker过载。
(4)连接池与最大连接数
  • 连接池机制:每个Worker有独立的连接池,大小由worker_connections配置(默认1024),池内存储ngx_connection_t结构(非真实连接),通过“空闲连接链表”(free_connections)复用连接,减少创建/销毁开销。
  • 最大连接数计算
    • 若Nginx作为静态资源服务器(仅处理客户端连接):
      最大并发连接数 = worker_processes(Worker进程数) × worker_connections(单Worker连接数)
    • 若Nginx作为反向代理服务器(需同时连接客户端与后端服务):
      最大并发连接数 = (worker_processes × worker_connections) / 2
      (每个并发请求需占用“客户端-nginx”和“nginx-后端”两个连接)

五、Nginx部署步骤(带解释备注)

1. 关闭防火墙和SELinux
// 临时关闭防火墙(立即生效,重启后失效)
systemctl stop firewalld
// 永久关闭防火墙(重启后生效)
systemctl disable firewalld

// 临时关闭SELinux(立即生效,重启后失效)
setenforce 0
// 永久关闭SELinux(需重启,编辑配置文件将SELINUX=enforcing改为SELINUX=disabled)
vim /etc/selinux/config

// 备注:关闭防火墙和SELinux是为了避免其拦截Nginx的网络请求(如80端口),简化初期部署测试;生产环境需按需配置规则而非直接关闭。

2. 添加yum源
// 安装编译工具集(如gcc、make等,用于源码编译用本地yum源安装)
[root@hrz1 ~]# yum -y groupinstall "Development Tools"
// 删除系统原有yum源配置(避免冲突)
[root@hrz1 ~]# rm -rf /etc/yum.repos.d/ * 

// 下载阿里云CentOS 7的基础yum源(国内镜像,速度更快)
[root@hrz1 ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

// 安装EPEL源(提供额外的开源软件包,部分依赖需要)
[root@hrz1 ~]# yum install -y epel-release.noarch  

// 备注:yum源是软件包管理的仓库,替换为国内镜像可加速下载;EPEL源补充了官方源未包含的常用软件。

3. 创建Nginx运行用户
[root@hrz1 ~]# useradd -r -M -s /sbin/nologin nginx

// 备注:
// -r:创建系统用户(ID在系统用户范围内,通常<1000)
// -M:不创建家目录(无需登录,节省资源)
// -s /sbin/nologin:禁止该用户登录系统(仅用于运行Nginx进程,提高安全性)
// Nginx默认以该用户身份运行,避免使用root权限,降低安全风险。

4. 安装依赖工具和库

// 安装Nginx编译和运行所需的依赖库
[root@hrz1 ~]# yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++ make zlib-devel wget lrzsz 

// 备注:
// pcre-devel:支持正则表达式(Nginx URL匹配依赖)
// openssl-devel:支持SSL/TLS(用于HTTPS)
// gd-devel:支持图片处理模块(如http_image_filter_module
// zlib-devel:支持数据压缩(如gzip模块)
// 其他工具(wgetlrzsz)用于下载文件和上传下载。

5. 准备日志目录并授权
// 创建Nginx日志存储目录
[root@hrz1 ~]# mkdir -p /var/log/nginx

// 授权nginx用户和组拥有该目录(确保Nginx可写入日志)
[root@nginx ~]# chown -R nginx.nginx /var/log/nginx

// 备注:Nginx运行中会生成访问日志(access.log)和错误日志(error.log),需确保运行用户(nginx)有读写权限。

6. 解压Nginx源码包
// 查看当前目录下的源码包
[root@hrz1 ~]# ls
nginx-1.24.0.tar.gz

// 解压源码包到/usr/local/目录(源码编译常用路径)
[root@hrz1 ~]# tar -zxvf nginx-1.24.0.tar.gz -C /usr/local/

// 备注:-C /usr/local/指定解压路径,便于后续集中管理源码和安装文件。

7. 编译安装Nginx
// 进入解压后的源码目录
[root@hrz1 ~]# cd /usr/local/nginx-1.24.0/ 

// 配置编译参数(指定安装路径、用户、模块等)
[root@hrz1 nginx-1.24.0]# ./configure \
--prefix=/usr/local/nginx \  // 指定安装目录
--user=nginx \                // 指定运行用户
--group=nginx \               // 指定运行用户组
--with-debug \                // 启用调试模式(便于排查问题)
--with-http_ssl_module \      // 启用SSL模块(支持HTTPS)
--with-http_realip_module \   // 启用真实IP模块(获取客户端真实IP)
--with-http_image_filter_module \  // 启用图片处理模块
--with-http_gunzip_module \   // 启用gunzip解压模块
--with-http_gzip_static_module \  // 启用静态gzip压缩模块
--with-http_stub_status_module \  // 启用状态监控模块(查看连接数等)
--http-log-path=/var/log/nginx/access.log \  // 访问日志路径
--error-log-path=/var/log/nginx/error.log    // 错误日志路径

// 编译源码(将源码转换为可执行文件)
[root@hrz1 nginx-1.24.0]# make

// 安装编译后的文件到指定目录(--prefix指定的/usr/local/nginx)
[root@hrz1 nginx-1.24.0]# make install

// 备注:./configure用于定制Nginx功能,根据需求启用模块;make编译生成二进制文件,make install完成安装。

8. 配置环境变量
// 将Nginx的sbin目录(包含nginx命令)添加到系统PATH
[root@hrz1 nginx-1.24.0]# echo 'export PATH=/usr/local/nginx/sbin:$PATH' > /etc/profile.d/nginx.sh

// 立即生效环境变量(无需重启)
[root@hrz1 nginx-1.24.0]#  . /etc/profile.d/nginx.sh 

// 备注:添加环境变量后,可直接在任意目录使用nginx命令,无需输入完整路径(如/usr/local/nginx/sbin/nginx)。

9. 启动Nginx并验证
// 启动Nginx服务
[root@hrz1 nginx-1.24.0]# nginx

// 查看监听的TCP端口(确认80端口是否启动)
[root@hrz1 nginx-1.24.0]# ss -anlt
State      Recv-Q Send-Q Local Address:Port                Peer Address:Port              
LISTEN     0      128                *:111                            *:*                  
LISTEN     0      128                *:80                             *:* 

// 备注:Nginx默认监听80端口(HTTP),ss -anlt可查看所有监听的TCP端口,若80端口处于LISTEN状态,说明启动成功。

10. 测试自定义配置文件
// 停止当前运行的Nginx
[root@hrz1 nginx-1.24.0]# nginx -s stop 

// 进入默认配置文件目录
[root@hrz1 nginx-1.24.0]# cd /usr/local/nginx/conf/

// 复制默认配置文件到/opt/目录(用于测试自定义配置)
[root@hrz1 conf]#  cp nginx.conf /opt/
[root@hrz1 conf]# cp mime.types /opt/  // 复制MIME类型配置文件(Nginx识别文件类型依赖)

// 使用/opt/目录下的自定义配置文件启动Nginx
[root@hrz1 conf]# nginx -c /opt/nginx.conf 
[root@hrz1 nginx-1.24.0]# ss -anlt
State      Recv-Q Send-Q Local Address:Port                Peer Address:Port              
LISTEN     0      128                *:111                            *:*                  
LISTEN     0      128                *:80                             *:* 

// 备注:-c参数用于指定非默认路径的配置文件,常用于测试修改后的配置;mime.types定义了文件扩展名与MIME类型的映射,必须与nginx.conf配合使用。

六、Nginx配置文件详解

一、主配置文件与加载逻辑

Nginx的配置文件体系以“主配置文件为核心,细分文件为补充”,首先明确核心文件的路径与加载规则:

  • 主配置文件路径:默认安装后,主配置文件为 /usr/local/nginx/conf/nginx.conf(若自定义安装路径,对应路径为 [安装路径]/conf/nginx.conf)。
  • 默认加载规则:启动Nginx时,若不指定配置文件,服务会自动读取上述默认路径的 nginx.conf
  • 自定义配置文件:可通过启动参数 -c 指定任意路径的配置文件,例如:
    nginx -c /opt/custom_nginx.conf(常用于测试新配置或多实例部署)。

二、Nginx常见配置文件及作用

Nginx的配置文件按功能拆分,不同文件负责不同模块,避免主配置文件过于臃肿,各文件作用如下:

配置文件名核心作用
nginx.conf全局核心配置文件,包含全局参数、事件模型、HTTP协议基础配置,是服务启动的“入口配置”。
mime.types定义“文件扩展名”与“MIME类型”的映射关系(如 .html 对应 text/html),确保浏览器能正确识别文件类型(避免下载而非解析)。
fastcgi.conf专门用于配置Nginx与FastCGI服务(如PHP-FPM)的交互规则,包含FastCGI参数传递、请求转发逻辑。
proxy.conf存储反向代理相关的通用配置(如代理超时时间、请求头传递、缓存策略),可通过include引入主配置,减少重复代码。
sites.conf用于管理“虚拟主机”配置(即多个网站的独立配置),每个网站的域名、根目录、端口等可在此集中定义。

三、nginx.conf核心结构与参数详解

nginx.conf 采用分段式结构,各段作用范围不同,核心层级为:main(全局段)→ events(事件段)→ http(HTTP协议段),其中 http 段内可嵌套 server(虚拟主机)location(请求匹配),整体逻辑如下:
main(全局)events(连接处理)http(协议级)server(虚拟主机)location(URL匹配)

1. 核心概念:配置文件中的变量

Nginx配置支持变量,用于动态获取请求信息或自定义值,分为两类:

  • 内置变量:由Nginx模块自带,无需定义即可使用,常用示例:
    • $remote_addr:客户端IP地址
    • $request_uri:客户端请求的完整URI(含参数)
    • $status:HTTP响应状态码(如200、404)
  • 自定义变量:通过 set 变量名 变量值 定义,仅在当前配置块(如 server/location)内生效,示例:
    set $my_var "test_env";(定义变量 $my_var,值为 test_env
2. main 全局配置段(作用于整个Nginx服务)

main 段是配置文件的最外层,定义服务级别的基础参数,主要分为“调试定位”“必备运行”“性能优化”三类参数。

(1)调试与问题定位相关参数

用于开发或运维阶段排查问题,生产环境需根据需求调整:

  • daemon {on|off};
    作用:控制Nginx是否以“守护进程”(后台)方式运行。
    说明:调试时设为 off(前台运行,日志直接输出到终端,便于实时查看错误);生产环境设为 on(后台运行,不占用终端)。
  • master_process {on|off};
    作用:控制是否启用“master-worker”进程模型(Nginx的核心多进程架构)。
    说明:调试时可设为 off(单进程运行,简化问题定位);生产环境必须设为 on(master进程管理worker进程,提高并发与稳定性,worker进程负责处理实际请求)。
  • error_log 位置 级别;
    作用:配置错误日志的存储路径与日志详细程度,是排查问题的核心依据。
    关键说明:
    • 位置选项
      • 本地文件:/var/log/nginx/error.log(常用,需确保Nginx有写入权限)
      • 标准错误输出:stderr(调试时用,输出到终端)
      • 远程syslog:syslog:server=192.168.1.100:514(日志发送到远程日志服务器)
      • 内存缓冲区:memory:10m(日志暂存内存,减少磁盘IO,适合高并发场景)
    • 级别选项(从低到高,级别越高,记录的日志越少,生产环境建议 warn 及以上):
      debug(最详细,需编译时启用 --with-debug 选项)→ infonoticewarnerrorcrit(严重错误)→ alert(需立即处理)→ emerg(系统级紧急错误)
(2)正常运行必备参数

这类参数是Nginx启动与稳定运行的基础,必须正确配置:

  • user USERNAME [GROUPNAME];
    作用:指定运行“worker进程”的用户与用户组(核心安全配置)。
    说明:严禁使用root用户(避免worker进程被攻击后获取系统最高权限),通常创建专用用户(如前文部署时创建的 nginx 用户),配置示例:user nginx nginx;(用户与组均为 nginx)。
  • pid /path/to/pid_file;
    作用:指定Nginx守护进程(master进程)的PID文件路径,用于管理服务(如停止、重启)。
    示例:pid /var/run/nginx.pid;(PID文件存储在系统默认进程文件目录,便于运维工具识别)。
  • worker_rlimit_nofile number;
    作用:限制所有worker进程可打开的“最大文件描述符数量”(Nginx处理连接、读取文件均需占用文件描述符)。
    说明:默认值为1024,生产环境需调大(如设为65535),且需确保系统级限制(/etc/security/limits.conf)同步调整,避免“文件描述符耗尽”错误。
  • worker_rlimit_core size;
    作用:限制所有worker进程生成的“核心转储文件(core dump)”总大小(core dump用于程序崩溃时的问题排查)。
    说明:保持默认即可(通常为 unlimited),若无需排查崩溃问题,可设为 0 禁用。
(3)性能优化参数

这类参数直接影响Nginx的并发能力与资源占用,需根据服务器硬件配置(CPU、内存)调整:

  • worker_processes n;
    作用:指定启动的“worker进程数量”(worker进程是实际处理请求的进程)。
    优化原则:设为服务器CPU核心数或核心数-1(避免进程间上下文切换过多),例如4核CPU设为 4,8核CPU设为 8;若服务器有超线程,可设为逻辑核心数(如4核8线程设为 8)。
  • worker_cpu_affinity cpumask ...;
    作用:将worker进程“绑定到指定CPU核心”(避免进程在不同核心间切换,减少缓存失效开销)。
    说明:cpumask 用8位二进制表示CPU核心(1表示启用该核心),示例:
    4核CPU配置:worker_cpu_affinity 0001 0010 0100 1000;(4个worker进程分别绑定14核);
    8核CPU配置:worker_cpu_affinity 00000001 00000010 ... 10000000;(8个worker进程分别绑定1
    8核)。
  • timer_resolution interval;
    作用:设置计时器解析度(控制 gettimeofday() 系统调用的频率,该调用用于获取系统时间,频繁调用会增加CPU开销)。
    示例:timer_resolution 100ms;(每100ms调用一次,减少系统调用次数,高并发场景建议配置)。
  • worker_priority number;
    作用:设置worker进程的“nice值”(即进程优先级,范围-20~19,值越小优先级越高)。
    优化建议:设为 -5-10(高于普通进程,确保Nginx在CPU资源紧张时优先处理请求),避免设为 -20(避免抢占系统核心进程资源)。
3. events 事件配置段(控制连接处理方式)

events 段专门配置Nginx的“事件驱动模型”,决定如何处理客户端连接,仅作用于连接层面,不涉及业务逻辑:

events {
    accept_mutex on;        # 负载均衡锁:on表示多个worker轮流响应新连接(避免“惊群效应”)
    lock_file /var/run/nginx.lock;  # accept_mutex使用的互斥锁文件路径(默认无需修改)
    use epoll;              # 指定事件模型:Linux推荐epoll(高效处理高并发),BSD推荐kqueue
    worker_connections 1024; # 单个worker进程可处理的“最大并发连接数”
}

关键参数说明:

  • accept_mutex on;:开启后,master进程会按“轮询”方式将新连接分配给worker进程,避免多个worker同时争抢连接(即“惊群效应”),减少CPU浪费。
  • use epoll;:Nginx支持多种事件模型(select/poll/epoll等),其中 epoll 是Linux内核的高效事件模型,支持百万级并发,建议留空让Nginx自动识别系统最优模型(无需手动指定)。
  • worker_connections 1024;:单个worker的最大连接数,需结合 worker_processes 计算“理论最大并发”(公式:总并发 ≈ worker_processes × worker_connections),生产环境建议设为10240~65535(需同步调整系统文件描述符限制)。
4. http 协议配置段(HTTP服务核心逻辑)

http 段是Nginx处理HTTP/HTTPS请求的核心配置区域,由 ngx_http_core_module 模块引入,包含“协议级全局配置、负载均衡、虚拟主机、请求匹配”等逻辑,结构如下:

http {
    # 1. HTTP全局基础配置
    include mime.types;          # 引入MIME类型映射文件(必须配置,否则无法识别文件类型)
    default_type application/octet-stream;  # 未知文件类型的默认处理方式(下载而非解析)
    keepalive_timeout 65;        # 长连接超时时间:客户端与服务端建立连接后,空闲65秒自动断开
    gzip on;                     # 启用gzip压缩:减少响应数据体积,提升传输速度

    # 2. 负载均衡配置(定义后端服务集群,用于反向代理)
    upstream backend_servers {
        server 192.168.1.100:8080 weight=5;  # 后端服务1,权重5(权重越高,分配到的请求越多)
        server 192.168.1.101:8080;           # 后端服务2,默认权重1
        server 192.168.1.102:8080 backup;    # 备份服务:仅当主服务全部下线时启用
    }

    # 3. 虚拟主机配置(一个server对应一个网站,支持多域名)
    server {
        listen 80;                  # 监听端口:HTTP默认80,HTTPS默认443(需配置SSL)
        server_name www.example.com example.com;  # 绑定的域名(多个域名用空格分隔)
        root /var/www/example;      # 该网站的根目录(请求会从该目录读取文件)

        # 4. 请求匹配配置(按URL路径处理请求,优先级高于server段)
        location / {                # 匹配所有以“/”开头的请求(即所有请求的默认处理)
            index index.html index.htm;  # 默认首页:访问域名时,优先读取index.html
        }

        location ~ \.php$ {         # 正则匹配:所有以.php结尾的请求(用于PHP解析)
            fastcgi_pass 127.0.0.1:9000;  # 转发到PHP-FPM服务(默认端口9000)
            fastcgi_index index.php;      # PHP默认首页
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  # 传递脚本路径(关键参数,避免404)
            include fastcgi_params;       # 引入FastCGI通用参数(如请求头、环境变量)
        }
    }
}
(1)http 段核心子模块说明
  • upstream 负载均衡:用于反向代理场景,将客户端请求分发到多个后端服务,实现“高可用”与“负载分担”,常用参数:
    • weight=数值:配置服务权重(默认1);
    • backup:标记为备份服务;
    • down:标记为下线服务(临时剔除)。
  • server 虚拟主机:一个 server 对应一个独立网站,通过 listen(端口)和 server_name(域名)区分不同网站,例如:
    同一服务器可配置两个 server,分别监听 80 端口,绑定 www.a.comwww.b.com,实现“一台服务器运行两个网站”。
  • location 请求匹配:按URL路径或正则表达式匹配请求,执行不同逻辑(如静态文件处理、PHP解析、反向代理),匹配优先级:
    精确匹配(location = /xxx)> 正则匹配(location ~ /xxx)> 前缀匹配(location /xxx)> 默认匹配(location /)。
(2)网络连接相关参数(http/server 段通用)

这类参数控制HTTP连接的超时与传输行为,影响用户体验与服务稳定性:

  • keepalive_requests number;:单个长连接允许的“最大请求数”(默认100),例如设为1000,避免频繁建立连接。
  • keepalive_disable [msie6|safari|none];:为指定浏览器禁用长连接(如 keepalive_disable msie6;,因IE6对长连接支持差)。
  • tcp_nodelay on;:长连接场景下启用TCP_NODELAY选项(默认on),避免数据缓冲延迟,提升实时性(如动态页面、API请求)。
  • client_header_timeout number;:读取HTTP请求头的超时时间(默认60秒),超时则关闭连接(避免恶意客户端占用连接)。
  • client_body_timeout number;:读取HTTP请求体(如表单提交、文件上传)的超时时间(默认60秒)。
  • send_timeout number;:发送响应给客户端的超时时间(默认60秒),超时则关闭连接(避免客户端长时间不接收数据)。
5. 关键配置场景:FastCGI(PHP解析)配置

在LNMP(Linux+Nginx+MySQL+PHP)架构中,Nginx本身不解析PHP,需通过FastCGI转发给PHP-FPM处理,核心配置示例(location 段):

location ~ \.php$ {
    root /var/www/example;                  # 网站根目录(需与server段的root一致)
    fastcgi_pass 127.0.0.1:9000;           # PHP-FPM的地址与端口(本地用127.0.0.1:9000,远程用后端IP)
    fastcgi_index index.php;                # PHP默认首页
    # 关键参数:传递PHP脚本的真实路径($document_root是网站根目录,$fastcgi_script_name是请求的PHP文件名)
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;                 # 引入FastCGI通用参数(如$remote_addr、$request_method)
}

注意SCRIPT_FILENAME 必须配置正确,否则PHP-FPM会因“找不到脚本文件”返回404错误。

七、LNMP架构部署

LNMP架构即 Linux + Nginx + MySQL + PHP,本次部署采用分布式节点设计(各组件独立服务器),明确各节点职责与通信逻辑,步骤如下:

一、架构规划与前置说明

1. 节点IP与角色分配
节点角色IP地址核心职责
Nginx192.168.100.10接收客户端HTTP请求,处理静态资源,转发PHP请求到PHP节点
MySQL192.168.100.20提供数据库服务(已提前部署,本节仅做后续配置)
PHP192.168.100.30解析PHP脚本,与MySQL交互获取数据,返回结果给Nginx
2. 通用前置操作(所有节点执行)

所有节点需先完成基础环境配置,避免后续依赖安装或服务通信失败:

# 1. 关闭防火墙(临时+永久,测试环境简化;生产环境需开放必要端口:80/443/3306/9000)
systemctl stop firewalld
systemctl disable firewalld

# 2. 关闭SELinux(临时+永久,避免权限拦截)
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

# 3. 配置YUM源
rm -rf /etc/yum.repos.d/*
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
yum install -y epel-release.noarch  # 安装EPEL源,补充额外依赖
yum clean all && yum makecache      # 清理缓存并生成新缓存

二、MySQL节点(192.168.100.20):后续配置(已部署基础服务)

MySQL已提前部署,需补充手册路径配置库文件加载配置,确保系统能正常识别MySQL工具与依赖:

# 1. 配置MySQL手册路径(让man命令能找到MySQL的帮助文档)
vim /etc/man_db.conf
# 在"MANDATORY_MANPATH"行后添加MySQL手册路径,最终如下:
MANDATORY_MANPATH                       /usr/local/mysql/man  # 新增:MySQL手册所在目录(需与实际安装路径一致)

# 2. 配置MySQL库文件加载(让系统启动时自动加载MySQL的动态链接库,避免依赖缺失)
vim /etc/ld.so.conf.d/mysql.conf
# 写入MySQL库文件路径(需与实际安装路径一致),内容如下:
/usr/local/mysql/lib  # MySQL库文件目录(含libmysqlclient.so等核心库)

# 3. 生效库文件配置(无需重启,立即加载)
ldconfig

三、PHP节点(192.168.100.30):安装与配置

PHP需以PHP-FPM(FastCGI进程管理器) 模式运行,才能与Nginx通信,步骤分为“安装依赖→配置PHP源→安装PHP→配置FPM→测试验证”。

1. 安装PHP编译与运行依赖

依赖包用于支持PHP的核心功能(如XML解析、HTTPS、图片处理、数据库连接等):

yum -y install libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel \
libcurl libcurl-devel libicu-devel libjpeg libjpeg-devel libpng libpng-devel \
openldap-devel pcre-devel freetype freetype-devel gmp gmp-devel readline \
readline-devel libxslt libxslt-devel php-mysqlnd

// 关键依赖说明:
// - libxml2-devel:支持PHP XML解析模块
// - openssl-devel:支持PHP HTTPS相关功能
// - libjpeg-devel/libpng-devel:支持PHP处理图片(如GD库)
// - php-mysqlnd:PHP连接MySQL的驱动(替代旧的mysql扩展)

2. 配置PHP源(安装高版本PHP 7.0)

CentOS 7官方YUM源的PHP版本较低(5.4),需通过Remi源安装PHP 7.0(稳定性与兼容性较好):

# 1. 安装Remi源(提供高版本PHP)
yum -y install https://rpms.remirepo.net/enterprise/remi-release-7.rpm

# 2. 启用Remi PHP 7.0仓库(指定安装PHP 7.0版本)
yum-config-manager --enable remi-php70  # 若提示"yum-config-manager未找到",需先安装yum-utils:yum install -y yum-utils
3. 安装PHP及核心扩展

安装PHP主程序、FPM服务及常用扩展(满足大多数Web应用需求):

yum -y install php php-cli php-fpm php-mysqlnd php-zip php-devel php-gd \
php-mbstring php-curl php-xml php-pear php-bcmath php-json php-redis

// 扩展说明:
// - php-fpm:PHP-FPM服务(核心,与Nginx通信)
// - php-gd:图片处理扩展(如生成验证码、压缩图片)
// - php-mbstring:多字节字符串处理(支持中文等非英文)
// - php-redis:Redis缓存扩展(提升应用性能)

4. 配置PHP-FPM(关键:与Nginx通信)

PHP-FPM默认配置需修改监听地址允许访问的客户端,确保Nginx节点能正常转发请求:

# 编辑PHP-FPM的默认池配置文件(管理PHP进程的核心配置)
vim /etc/php-fpm.d/www.conf

# 1. 修改监听方式:从"本地sock文件"改为"IP:端口"(支持跨节点通信)
;listen = /run/php-fpm/www.sock  # 注释默认的sock监听(仅本地可用)
listen = 0.0.0.0:9000            # 新增:监听所有IP的9000端口(PHP-FPM默认端口)

# 2. 限制允许访问的客户端(仅允许Nginx节点IP,提升安全性)
listen.allowed_clients = 192.168.100.10  # 仅Nginx节点(192.168.100.10)可连接
5. 生成PHP测试页面(验证解析)

创建测试页面,用于后续验证PHP是否正常解析:

# 1. 创建PHP网站根目录(需与Nginx配置的root路径一致)
mkdir -p /var/www/html

# 2. 生成测试页面(phpinfo()会输出PHP所有配置信息)
vim /var/www/html/index.php
# 写入以下内容:
<?php
  phpinfo();  // 输出PHP环境信息(验证解析是否正常)
?>

# 3. 授权目录权限(PHP-FPM默认运行用户为apache,需确保有读写权限)
chown -R apache.apache /var/www/html/  # 所有者设为apache(与php-fpm运行用户一致)
6. 启动PHP-FPM并设置开机自启
systemctl start php-fpm.service    # 启动PHP-FPM服务
systemctl enable php-fpm.service   # 设置开机自启
systemctl status php-fpm.service   # 验证服务状态(需显示"active (running)")

# 验证端口监听(确保9000端口已启动)
ss -anlt | grep 9000  # 输出应包含"LISTEN     0      128        0.0.0.0:9000"

四、Nginx节点(192.168.100.10):整合PHP(核心步骤)

Nginx需通过FastCGI协议转发PHP请求到PHP节点,需修改主配置文件,实现“静态资源本地处理,PHP请求远程转发”。

1. 部署Nginx(参考前文步骤)

若未部署Nginx,需先完成源码编译安装(参考“五、Nginx部署”步骤),确保Nginx正常启动(监听80端口)。

2. 修改Nginx配置文件(整合PHP)

编辑Nginx主配置文件,添加PHP请求的转发规则:

vim /usr/local/nginx/conf/nginx.conf  # 编辑Nginx主配置

# 找到"http {}"块中的"server {}"节点,修改以下两个location块:

# 1. 默认请求location(处理静态资源,优先解析PHP首页)
location / {
    root       /var/www/html;  # 改为PHP节点的网站根目录(与PHP的/var/www/html一致)
    index  index.php index.html index.htm;  # 新增index.php作为默认首页(优先加载PHP)
}

# 2. PHP请求location(正则匹配所有.php结尾的请求,转发到PHP节点)
location ~ \.php$ {  # "~"表示正则匹配,匹配所有以.php结尾的URL
    root           /var/www/html;  # 与PHP节点的网站根目录一致(Nginx需知道脚本路径)
    fastcgi_pass   192.168.100.30:9000;  # 转发到PHP节点的9000端口(PHP-FPM监听地址)
    fastcgi_index  index.php;  # PHP默认首页(请求根目录时加载index.php)
    # 关键参数:指定PHP脚本的真实路径(必须与PHP节点的脚本路径一致,否则404)
    fastcgi_param  SCRIPT_FILENAME  /var/www/html/$fastcgi_script_name;
    include        fastcgi_params;  # 引入FastCGI通用参数(如请求头、环境变量)
}

// 配置核心说明:
// - root /var/www/html:Nginx虽不解析PHP,但需知道脚本路径,用于传递给PHP-FPM;
// - fastcgi_pass:PHP节点的IP:端口(核心转发规则,确保请求能到PHP-FPM);
// - SCRIPT_FILENAME:必须正确!格式为“PHP网站根目录 + $fastcgi_script_name(请求的PHP文件名)”,否则PHP-FPM找不到脚本,返回404错误。

3. 验证Nginx配置并重启服务
# 1. 测试配置文件语法(必须先验证,避免配置错误导致Nginx启动失败)
nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
# 2. 重启Nginx(让配置生效)
nginx -s stop   # 停止当前Nginx服务
nginx           # 启动Nginx服务(加载新配置)

https://i-blog.csdnimg.cn/direct/44d07bc26d9541be8b7e597dff2277c1.png