一、Nginx 概述:从起源到行业地位
Nginx(发音为 “engine x”)是一款高性能的开源 Web 服务器、反向代理服务器,同时具备负载均衡、内容缓存、TCP/UDP 代理及邮件代理等功能。它由俄罗斯工程师伊戈尔・赛索耶夫(Igor Sysoev)为Rambler.ru站点开发,于 2004 年 10 月 4 日以 2-clause BSD 许可协议发布首个公开版本。凭借其轻量级架构与卓越的高并发处理能力,Nginx 迅速在全球 Web 市场占据重要地位。
在国内,百度、京东、新浪等头部互联网企业均将 Nginx 作为核心 Web 服务器。据 Netcraft 统计,截至 2024 年,Nginx 在全球活跃网站的 Web 服务器市场份额已超 35%,成为高并发场景下的首选技术方案。
二、CentOS 7 环境搭建:Nginx 的安装与启动
2.1 安装依赖包
在 CentOS 7 系统中,Nginx 的安装需依赖gcc、pcre、zlib等编译工具。通过以下命令安装:
sudo yum install -y gcc pcre-devel zlib-devel
执行上述命令后,系统将自动下载并安装所需依赖包。
2.2 下载与编译 Nginx
从 Nginx 官方网站(Index of /download/)获取最新稳定版源码,本文以nginx-1.23.3为例:
wget https://nginx.org/download/nginx-1.23.3.tar.gz
tar -zxvf nginx-1.23.3.tar.gz
cd nginx-1.23.3
进入源码目录后,通过./configure命令配置编译参数:
./configure \
--prefix=/usr/local/nginx \
--conf-path=/etc/nginx/nginx.conf \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-http_stub_status_module
参数说明:
- --prefix:指定 Nginx 安装目录
- --conf-path:配置文件路径
- --pid-path:PID 文件路径
- --error-log-path:错误日志路径
- --http-log-path:访问日志路径
- --with-http_ssl_module:启用 SSL 模块
- --with-http_gzip_static_module:支持静态 Gzip 压缩
- --with-http_stub_status_module:启用状态统计模块
编译并安装:
make && sudo make install
2.3 启动与验证
安装完成后,可通过以下命令启动 Nginx:
sudo /usr/local/nginx/sbin/nginx
验证 Nginx 是否正常运行:
sudo netstat -tunlp | grep nginx
若出现类似下图所示的监听端口(默认 80端口),则表示 Nginx 已成功启动:
或者通过查看服务状态来监测是否启动:
sudo systemctl status nginx
如果出现下图中的 状态显示为active(running),则表示正常运行了。
三、Nginx 架构剖析:Master-Worker 模型
3.1 进程结构分析
Nginx 采用多进程架构,包含一个 master 进程与多个 worker 进程。通过ps -ef | grep nginx命令查看进程状态:
master 进程职责:
- 读取并校验配置文件(nginx.conf)
- 管理 worker 进程生命周期(启动、停止、重启)
- 接收信号(如SIGHUP用于重新加载配置)
worker 进程职责:
- 处理客户端请求,通过事件驱动模型实现高并发
- 共享 master 进程打开的文件描述符
3.2 事件驱动机制
Nginx 基于事件驱动的多路复用器(如 epoll、kqueue)处理网络 IO。以 epoll 为例,其通过epoll_wait函数高效监听大量文件描述符,当有事件发生时才唤醒进程处理请求,相比传统 BIO(阻塞式 IO)显著降低资源消耗。
四、配置文件详解:nginx.conf 的核心模块
Nginx 配置文件采用模块化结构,主要分为main、events、http三大块,其中http块下可嵌套多个server子模块。
4.1 全局配置(main 块)
user nginx nginx; # 指定运行用户和用户组
worker_processes auto; # 自动根据CPU核心数设置worker进程数
error_log /var/log/nginx/error.log warn; # 错误日志路径与级别
pid /var/run/nginx.pid; # PID文件路径
4.2 事件配置(events 块)
events {worker_connections 1024; # 每个worker进程最大连接数multi_accept on; # 允许同时接收多个新连接use epoll; # 使用epoll事件模型
}
4.3 HTTP 核心配置(http 块)
http {include mime.types; # 引入MIME类型定义default_type application/octet-stream; # 默认MIME类型log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"'; # 日志格式access_log /var/log/nginx/access.log main; # 访问日志路径与格式sendfile on; # 启用零拷贝传输tcp_nopush on; # 合并网络包tcp_nodelay on; # 禁用Nagle算法keepalive_timeout 65; # 长连接超时时间gzip on; # 启用Gzip压缩gzip_comp_level 6; # 压缩级别gzip_types text/plain application/json; # 压缩文件类型
}
4.4 虚拟主机配置(server 块)
server {listen 80; # 监听端口server_name example.com; # 域名location / {root /var/www/html; # 网站根目录index index.html; # 默认首页}error_page 500 502 503 504 /50x.html; # 错误页面映射location = /50x.html {root html;}
}
五、实战演练:搭建静态网站
5.1 准备网站文件
在/var/www/html目录下创建index.html文件:
sudo mkdir -p /var/www/html
sudo echo "<h1>Welcome to Nginx!</h1>" > /var/www/html/index.html
sudo chown -R nginx:nginx /var/www/html
5.2 配置虚拟主机
修改/etc/nginx/nginx.conf,添加或修改server块:
server {listen 80;server_name your_domain.com;location / {root /var/www/html;index index.html;}
}
5.3 重载配置并访问
sudo nginx -s reload
在浏览器输入服务器 IP 或域名,即可看到如下页面:
六、常见管理命令与故障排查
6.1 常用命令
命令 | 说明 |
sudo nginx | 启动 Nginx |
sudo nginx -s stop | 快速停止 Nginx |
sudo nginx -s quit | 优雅停止 Nginx |
sudo nginx -s reload | 重新加载配置文件 |
sudo nginx -t | 检查配置文件语法 |
6.2 故障排查
若 Nginx 无法启动,可通过以下步骤排查:
1、检查/var/log/nginx/error.log错误日志
2、使用nginx -t验证配置文件语法
3、确认端口占用情况(如80端口被其他进程占用)
本篇文章通过在Centos7环境下的实操案例,简单介绍了nginx的起源、基础架构、核心配置和典型的web应用。后续文章将持续更新nginx进阶的功能点和技术栈。