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_processes
、user
),配置通常位于文件顶部。 - 事件模块:配置网络事件处理(如
worker_connections
、use epoll
),控制Nginx的IO模型,配置位于文件顶部。 - 配置模块:支持配置文件的“包含”机制(如
include mime.types
),实现配置拆分与复用。
2. Nginx的工作原理
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作为静态资源服务器(仅处理客户端连接):
五、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模块)
// 其他工具(wget
、lrzsz
)用于下载文件和上传下载。
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
选项)→info
→notice
→warn
→error
→crit
(严重错误)→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核)。
8核CPU配置:worker_cpu_affinity 00000001 00000010 ... 10000000;
(8个worker进程分别绑定1timer_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.com
和www.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地址 | 核心职责 |
---|---|---|
Nginx | 192.168.100.10 | 接收客户端HTTP请求,处理静态资源,转发PHP请求到PHP节点 |
MySQL | 192.168.100.20 | 提供数据库服务(已提前部署,本节仅做后续配置) |
PHP | 192.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服务(加载新配置)