Nginx 基础入门
2026/3/20大约 10 分钟
Nginx 基础入门
Nginx 简介
什么是 Nginx
Nginx 是一款高性能的开源 HTTP 服务器和反向代理服务器,由俄罗斯程序员 Igor Sysoev 于 2004 年首次发布。它以其高并发、低内存消耗和稳定性著称,被广泛应用于互联网领域。
Nginx 最初是为了解决 C10K 问题(即同时处理 10000 个并发连接)而设计的,如今它已经成为全球最流行的 Web 服务器之一,据统计,全球约 34% 的网站使用 Nginx 作为 Web 服务器。
Nginx 的核心特性
| 特性 | 描述 |
|---|---|
| 高并发 | 基于事件驱动架构,单机可处理数十万并发连接 |
| 低内存消耗 | 相比 Apache,内存占用减少约 50% |
| 热部署 | 支持不停机更新配置和升级程序 |
| 高可靠性 | Master-Worker 进程模型,Worker 崩溃不影响整体服务 |
| 模块化设计 | 丰富的官方和第三方模块支持 |
| 反向代理 | 支持 HTTP、HTTPS、SMTP、POP3、IMAP 协议 |
| 负载均衡 | 内置多种负载均衡算法 |
| 静态文件处理 | 高效处理静态资源,性能优异 |
Nginx vs Apache vs Tomcat
| 对比项 | Nginx | Apache | Tomcat |
|---|---|---|---|
| 设计理念 | 事件驱动、异步非阻塞 | 进程/线程驱动 | Servlet 容器 |
| 并发模型 | epoll/kqueue | prefork/worker | 线程池 |
| 并发能力 | 极高(10W+) | 中等(1W+) | 中等 |
| 内存消耗 | 低 | 高 | 中 |
| 静态资源 | 极强 | 强 | 弱 |
| 动态内容 | 需配合后端 | mod_php 等 | 原生支持 Java |
| 配置复杂度 | 简洁 | 复杂 | 中等 |
| 主要用途 | 反向代理、负载均衡、静态服务 | 全能型 Web 服务器 | Java Web 应用服务器 |
选型建议
- 纯静态网站:首选 Nginx,性能最优
- PHP 应用:Nginx + PHP-FPM 或 Apache + mod_php
- Java 应用:Nginx 作为前端代理 + Tomcat/Jetty 后端
- 高并发场景:必选 Nginx 作为入口
Nginx 架构解析
进程模型
Nginx 采用 Master-Worker 多进程架构:
Master 进程职责:
- 读取和验证配置文件
- 管理 Worker 进程(启动、停止、重启)
- 接收外部信号(如 reload、stop)
- 监控 Worker 进程状态,异常退出时自动重启
Worker 进程职责:
- 处理客户端请求
- 提供反向代理和负载均衡
- 缓存处理
- 各 Worker 之间相互独立,互不影响
事件驱动模型
Nginx 使用事件驱动架构,核心是 I/O 多路复用:
不同操作系统的 I/O 多路复用实现:
| 操作系统 | 实现方式 | 特点 |
|---|---|---|
| Linux 2.6+ | epoll | 高效,O(1) 复杂度,支持边缘触发 |
| FreeBSD/macOS | kqueue | 高效,功能丰富 |
| Solaris | /dev/poll | 中等效率 |
| Windows | select | 效率较低,连接数限制 |
模块化架构
Nginx 采用高度模块化设计:
安装 Nginx
Linux 系统安装
CentOS/RHEL (Yum)
# 安装 EPEL 仓库
sudo yum install -y epel-release
# 安装 Nginx
sudo yum install -y nginx
# 启动 Nginx
sudo systemctl start nginx
# 设置开机自启
sudo systemctl enable nginx
# 检查状态
sudo systemctl status nginx
# 查看版本
nginx -v
Ubuntu/Debian (Apt)
# 更新软件源
sudo apt update
# 安装依赖
sudo apt install -y curl gnupg2 ca-certificates lsb-release
# 安装 Nginx
sudo apt install -y nginx
# 启动 Nginx
sudo systemctl start nginx
# 设置开机自启
sudo systemctl enable nginx
# 检查状态
sudo systemctl status nginx
# 查看版本
nginx -v
源码编译安装
# 安装编译依赖
# CentOS
sudo yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel
# Ubuntu
sudo apt install -y build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev
# 下载 Nginx 源码
cd /usr/local/src
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0
# 配置编译选项
./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--with-stream \
--with-stream_ssl_module \
--with-pcre
# 编译并安装
make && sudo make install
# 创建软链接
sudo ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
# 验证安装
nginx -v
Docker 安装
# 拉取官方镜像
docker pull nginx:latest
# 运行容器
docker run -d \
--name nginx \
-p 80:80 \
-p 443:443 \
-v /data/nginx/html:/usr/share/nginx/html \
-v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /data/nginx/logs:/var/log/nginx \
nginx:latest
# 查看运行状态
docker ps | grep nginx
Windows 安装
- 访问 Nginx 官网下载页
- 下载 Windows 版本(如
nginx-1.24.0.zip) - 解压到指定目录(如
C:\nginx) - 打开命令提示符,进入 Nginx 目录
cd C:\nginx
# 启动 Nginx
start nginx
# 检查是否运行
tasklist /fi "imagename eq nginx.exe"
# 停止 Nginx
nginx -s stop
# 重新加载配置
nginx -s reload
验证安装
# 检查 Nginx 版本
nginx -v
# 检查详细版本信息和编译参数
nginx -V
# 测试配置文件语法
nginx -t
# 访问默认页面
curl http://localhost
浏览器访问 http://服务器IP,看到 Welcome to nginx! 页面即安装成功。
目录结构
包管理器安装的目录结构
/etc/nginx/ # 主配置目录
├── nginx.conf # 主配置文件
├── conf.d/ # 额外配置目录
│ └── default.conf # 默认站点配置
├── sites-available/ # 可用站点配置(Debian/Ubuntu)
├── sites-enabled/ # 已启用站点配置(Debian/Ubuntu)
├── mime.types # MIME 类型映射
├── fastcgi.conf # FastCGI 配置
├── fastcgi_params # FastCGI 参数
├── uwsgi_params # uWSGI 参数
├── scgi_params # SCGI 参数
└── modules-enabled/ # 已启用模块
/var/log/nginx/ # 日志目录
├── access.log # 访问日志
└── error.log # 错误日志
/usr/share/nginx/html/ # 默认网站根目录
├── index.html # 默认首页
└── 50x.html # 错误页面
/var/cache/nginx/ # 缓存目录
/run/nginx.pid # PID 文件
源码编译安装的目录结构
/usr/local/nginx/ # 安装根目录
├── conf/ # 配置目录
│ ├── nginx.conf # 主配置文件
│ ├── mime.types # MIME 类型
│ └── ...
├── html/ # 网站根目录
│ ├── index.html
│ └── 50x.html
├── logs/ # 日志目录
│ ├── access.log
│ ├── error.log
│ └── nginx.pid
└── sbin/ # 可执行文件
└── nginx
基本命令
启停管理
# 启动 Nginx
nginx # 使用默认配置启动
nginx -c /path/to/nginx.conf # 指定配置文件启动
# 停止 Nginx
nginx -s stop # 快速停止(强制终止)
nginx -s quit # 优雅停止(等待请求处理完毕)
# 重载配置
nginx -s reload # 重新加载配置文件(不中断服务)
# 重新打开日志文件
nginx -s reopen # 用于日志切割后重新打开日志
# 使用 systemctl(推荐)
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
sudo systemctl reload nginx
sudo systemctl status nginx
配置检查
# 测试配置文件语法
nginx -t
# 测试配置并显示配置内容
nginx -T
# 测试指定配置文件
nginx -t -c /path/to/nginx.conf
# 显示版本
nginx -v
# 显示版本和编译参数
nginx -V
# 显示帮助
nginx -h
信号控制
Nginx 支持通过信号直接控制 Master 进程:
# 获取 Master 进程 PID
cat /run/nginx.pid
# 或
ps aux | grep "nginx: master"
# 发送信号
kill -TERM <pid> # 快速关闭
kill -QUIT <pid> # 优雅关闭
kill -HUP <pid> # 重载配置
kill -USR1 <pid> # 重新打开日志
kill -USR2 <pid> # 平滑升级
kill -WINCH <pid> # 优雅关闭 Worker 进程
信号说明:
| 信号 | 作用 | 对应命令 |
|---|---|---|
| TERM/INT | 快速关闭 | nginx -s stop |
| QUIT | 优雅关闭,等待请求处理完毕 | nginx -s quit |
| HUP | 重载配置,用新配置启动新 Worker | nginx -s reload |
| USR1 | 重新打开日志文件 | nginx -s reopen |
| USR2 | 平滑升级 Nginx 可执行文件 | - |
| WINCH | 优雅关闭 Worker 进程 | - |
第一个配置示例
最简配置
# /etc/nginx/nginx.conf
# 运行用户
user nginx;
# Worker 进程数,通常设置为 CPU 核心数
worker_processes auto;
# 错误日志
error_log /var/log/nginx/error.log warn;
# PID 文件
pid /run/nginx.pid;
# 事件模块配置
events {
# 单个 Worker 最大连接数
worker_connections 1024;
# 使用 epoll(Linux)
use epoll;
}
# HTTP 模块配置
http {
# 引入 MIME 类型
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 日志格式
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;
# 连接超时
keepalive_timeout 65;
# Gzip 压缩
gzip on;
gzip_types text/plain text/css application/json application/javascript;
# 引入其他配置
include /etc/nginx/conf.d/*.conf;
}
简单站点配置
# /etc/nginx/conf.d/example.conf
server {
# 监听端口
listen 80;
listen [::]:80;
# 域名
server_name example.com www.example.com;
# 网站根目录
root /var/www/example;
# 默认首页
index index.html index.htm;
# 字符集
charset utf-8;
# 访问日志
access_log /var/log/nginx/example.access.log;
error_log /var/log/nginx/example.error.log;
# 默认路由
location / {
try_files $uri $uri/ =404;
}
# 静态资源缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
# 禁止访问隐藏文件
location ~ /\. {
deny all;
}
}
测试配置
# 创建网站目录
sudo mkdir -p /var/www/example
# 创建测试页面
sudo tee /var/www/example/index.html << 'EOF'
<!DOCTYPE html>
<html>
<head>
<title>Welcome to Nginx!</title>
<meta charset="utf-8">
</head>
<body>
<h1>Hello, Nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed.</p>
</body>
</html>
EOF
# 设置权限
sudo chown -R nginx:nginx /var/www/example
# 测试配置
sudo nginx -t
# 重载配置
sudo nginx -s reload
# 测试访问
curl http://localhost
常见问题
1. 端口被占用
# 查看端口占用
sudo netstat -tlnp | grep :80
# 或
sudo ss -tlnp | grep :80
# 杀死占用进程或修改 Nginx 监听端口
2. 权限问题
# 检查目录权限
ls -la /var/www/example
# 修改所有者
sudo chown -R nginx:nginx /var/www/example
# 修改权限(目录755,文件644)
sudo find /var/www/example -type d -exec chmod 755 {} \;
sudo find /var/www/example -type f -exec chmod 644 {} \;
3. SELinux 问题(CentOS/RHEL)
# 检查 SELinux 状态
getenforce
# 临时关闭
sudo setenforce 0
# 永久关闭(需重启)
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 或者设置正确的 SELinux 上下文
sudo chcon -R -t httpd_sys_content_t /var/www/example
4. 防火墙问题
# CentOS/RHEL (firewalld)
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
# Ubuntu (ufw)
sudo ufw allow 'Nginx Full'
sudo ufw status
总结
本章介绍了 Nginx 的基础知识:
- Nginx 简介:高性能 Web 服务器,解决 C10K 问题
- 架构特点:Master-Worker 进程模型 + 事件驱动 + 模块化设计
- 安装方式:包管理器、源码编译、Docker
- 目录结构:配置文件、日志、网站目录的位置
- 基本命令:启停、配置检查、信号控制
- 第一个配置:简单的静态网站配置示例