01-单机部署与基础认知
01-单机部署与基础认知
1. 阶段定位
第一阶段是 Nginx 七阶段学习路线的入门基础阶段,目标不是记住大量配置项,而是先建立对 Nginx 的整体认知,掌握一台单机 Nginx 从安装、启动、配置、访问、日志查看到基础排障的完整闭环。
学习这一阶段时,需要把 Nginx 当成一个运行在操作系统上的网络服务来看,而不是只把它当成一份 nginx.conf 配置文件。你需要理解:
1 | 用户浏览器 / curl |
本阶段完成后,你应该具备下面能力:
- 能在 Linux 服务器上独立安装并启动 Nginx。
- 能说清 Nginx 是什么、适合做什么、不适合做什么。
- 能理解 Nginx 的典型目录、配置文件、日志文件和运行用户。
- 能读懂最小可运行的
nginx.conf。 - 能配置一个基础静态站点并通过浏览器或
curl访问。 - 能使用
nginx -t、systemctl、nginx -s reload完成基础管理。 - 能排查启动失败、配置错误、端口占用、权限不足、远程访问失败等常见问题。
2. 学习边界
第一阶段只解决“单机部署与基础认知”,不要过早扩展到复杂代理、负载均衡、HTTPS、缓存、限流和源码。
2.1 本阶段重点
- Nginx 的角色定位。
- Nginx 与 Apache、Tomcat、Spring Boot 内置 Web 容器的区别。
- 包管理器安装 Nginx。
- 源码编译安装 Nginx。
- Nginx 目录结构。
- 主配置文件结构。
- master/worker 进程模型。
- systemd 服务管理。
- 静态资源访问。
- 基础日志查看。
- 基础命令使用。
- 常见入门故障排查。
2.2 本阶段暂不深入
下面内容后续阶段再系统学习:
server_name的复杂匹配规则。location的优先级细节。rewrite和变量体系。proxy_pass反向代理细节。upstream负载均衡算法。- HTTPS、HTTP/2、证书续期。
- gzip、brotli、缓存和性能调优。
- 限流、限并发、访问控制。
- 高可用、灰度发布、热升级。
- Nginx 源码和模块开发。
3. Nginx 是什么
Nginx,读作 Engine X,是一个高性能的 HTTP Server、反向代理服务器、负载均衡器和通用 TCP/UDP 代理服务器。
在常见互联网架构中,Nginx 通常位于流量入口层:
1 | 用户 |
Nginx 最常见的使用场景包括:
| 场景 | 说明 |
|---|---|
| 静态资源服务器 | 直接提供 HTML、CSS、JS、图片、字体、下载文件 |
| 反向代理 | 代理请求到后端 Tomcat、Spring Boot、Node.js、Go、PHP 等应用 |
| 负载均衡 | 将请求分发到多台后端服务 |
| HTTPS 入口 | 统一处理 TLS 证书、HTTPS 握手、HTTP/2 |
| API 网关前置层 | 做基础入口控制、Header 透传、访问日志、超时控制 |
| 缓存层 | 缓存静态文件或后端响应,降低后端压力 |
| 限流限并发 | 控制入口请求速率和连接数量 |
| TCP/UDP 代理 | 使用 stream 模块代理 MySQL、Redis、TCP 服务等 |
第一阶段先重点掌握“静态资源服务器”和“单机 HTTP 服务”两个基础角色。
4. Nginx 的核心特点
4.1 高并发能力强
Nginx 采用事件驱动、异步非阻塞 IO 和 master/worker 多进程模型。相比一个连接一个线程的传统模型,Nginx 可以用较少进程处理大量并发连接。
简化理解:
1 | 传统线程模型:一个请求 -> 一个线程 -> 阻塞等待 IO |
这也是 Nginx 适合作为入口层和静态资源服务的关键原因。
4.2 配置清晰
Nginx 以配置文件为核心,典型配置结构是:
1 | main |
这种结构非常适合描述 HTTP 服务的层级关系。
4.3 资源占用低
Nginx 通常使用少量 worker 进程即可处理较高并发。相比传统应用服务器,它在静态资源、连接保持、请求转发等场景中资源消耗更低。
4.4 模块化能力强
Nginx 由核心框架加模块组成。常见能力如 HTTP、SSL、gzip、rewrite、proxy、stream 等都来自模块。可以通过下面命令查看当前 Nginx 编译了哪些模块:
1 | nginx -V |
输出中重点关注:--prefix、--conf-path、--sbin-path、--modules-path、--with-http_ssl_module、--with-http_v2_module、--with-stream、--with-pcre、--with-zlib、--with-openssl。
5. Nginx 与常见 Web 组件对比
5.1 Nginx 与 Apache
| 对比项 | Nginx | Apache HTTP Server |
|---|---|---|
| 并发模型 | 事件驱动、异步非阻塞 | 多进程/多线程模型为主 |
| 静态资源性能 | 很强 | 较强 |
| 反向代理 | 常用且高效 | 支持,但现代入口层更常用 Nginx |
| 配置风格 | 层级块配置 | 指令式配置,支持 .htaccess |
| 内存占用 | 通常较低 | 并发高时可能更高 |
| 常见定位 | 入口代理、静态资源、负载均衡 | 传统 Web Server、兼容历史生态 |
5.2 Nginx 与 Tomcat
| 对比项 | Nginx | Tomcat |
|---|---|---|
| 类型 | Web Server / 反向代理 | Java Servlet 容器 |
| 是否运行 Java Web 应用 | 不直接运行 | 直接运行 WAR/Servlet 应用 |
| 静态资源能力 | 强 | 一般 |
| 动态业务处理 | 不负责业务逻辑 | 负责 Java Web 业务逻辑 |
| 常见关系 | 位于 Tomcat 前面 | 位于 Nginx 后面 |
典型架构:用户 -> Nginx -> Tomcat / Spring Boot。
5.3 Nginx 与 Spring Boot 内置 Web 容器
Spring Boot 内置 Tomcat、Jetty 或 Undertow,可以直接监听端口提供 HTTP 服务。Nginx 通常放在 Spring Boot 前面,承担统一域名入口、HTTPS 证书卸载、静态资源服务、反向代理、访问日志、超时控制以及后续负载均衡和限流职责。Spring Boot 则负责业务接口、业务逻辑、数据库访问、权限认证和事务处理。
6. 实验环境准备
6.1 推荐系统
| 系统 | 适合程度 | 说明 |
|---|---|---|
| Rocky Linux / AlmaLinux / CentOS Stream | 高 | 适合学习企业服务器环境 |
| Ubuntu Server | 高 | 包管理简单,适合快速实验 |
| Debian | 高 | 稳定,适合服务端环境 |
| WSL2 | 中 | 适合个人本机练习,但网络行为和真实服务器略有差异 |
| Docker 容器 | 中 | 适合快速实验,但不适合第一阶段完全替代系统服务学习 |
6.2 推荐机器配置
| 配置项 | 建议 |
|---|---|
| CPU | 1-2 核即可 |
| 内存 | 1-2 GB 即可 |
| 磁盘 | 10 GB 以上 |
| 网络 | 能从本机访问虚拟机或服务器 |
| 权限 | 具备 root 或 sudo 权限 |
6.3 必备命令
1 | curl --version |
| 命令 | 用途 |
|---|---|
curl |
发起 HTTP 请求,验证 Nginx 响应 |
wget |
下载文件或测试 HTTP 访问 |
systemctl |
管理 Nginx 服务 |
ps |
查看 Nginx 进程 |
ss |
查看端口监听 |
tail |
查看日志尾部 |
less |
翻看日志和配置 |
grep |
搜索日志关键字 |
sudo |
以管理员权限执行命令 |
7. 安装方式总览
Nginx 常见安装方式有三种:
| 安装方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 系统包管理器安装 | 简单、稳定、易管理 | 版本可能偏旧,模块选择有限 | 入门学习、普通服务器 |
| 官方源安装 | 版本较新,维护规范 | 需要配置官方仓库 | 生产环境常用 |
| 源码编译安装 | 模块可控,路径可控,便于学习源码 | 步骤复杂,升级维护成本高 | 深入学习、自定义模块 |
第一阶段建议两种方式都做一遍:
- 先用包管理器安装,快速跑起来。
- 再用源码编译安装,理解目录、模块和编译参数。
8. 使用包管理器安装 Nginx
8.1 Ubuntu / Debian 安装
更新软件源:
1 | sudo apt update |
安装 Nginx:
1 | sudo apt install -y nginx |
查看版本:
1 | nginx -v |
查看编译参数:
1 | nginx -V |
启动服务:
1 | sudo systemctl start nginx |
设置开机自启:
1 | sudo systemctl enable nginx |
查看状态:
1 | sudo systemctl status nginx |
浏览器访问:
1 | http://服务器IP/ |
或者使用 curl:
1 | curl -I http://127.0.0.1/ |
8.2 Rocky Linux / AlmaLinux / CentOS Stream 安装
安装 EPEL 或启用系统仓库后安装:
1 | sudo dnf install -y nginx |
如果系统使用 yum:
1 | sudo yum install -y nginx |
启动服务:
1 | sudo systemctl start nginx |
查看状态:
1 | sudo systemctl status nginx |
查看监听端口:
1 | sudo ss -lntp | grep nginx |
访问测试:
1 | curl -I http://127.0.0.1/ |
8.3 防火墙放行 HTTP
如果本机能访问 127.0.0.1,但远程浏览器访问不了服务器 IP,常见原因是防火墙或云安全组未放行。
Ubuntu 常见 ufw:
1 | sudo ufw status |
Rocky / CentOS 常见 firewalld:
1 | sudo firewall-cmd --state |
云服务器还需要检查云厂商安全组:
- 入方向放行 TCP 80。
- 如果后续使用 HTTPS,放行 TCP 443。
- 如果测试自定义端口,例如 8088,也要放行对应端口。
9. 使用源码编译安装 Nginx
源码编译不是第一阶段生产必备能力,但非常适合用来理解 Nginx 的组成、模块和安装路径。
9.1 安装编译依赖
Ubuntu / Debian:
1 | sudo apt update |
Rocky / AlmaLinux / CentOS Stream:
1 | sudo dnf groupinstall -y "Development Tools" |
9.2 下载源码
建议进入 /usr/local/src:
1 | cd /usr/local/src |
说明:版本号可按实际情况替换。生产环境选择版本时应优先选择官方稳定版。
9.3 配置编译参数
示例编译参数:
1 | sudo ./configure \ |
常见参数解释:
| 参数 | 说明 |
|---|---|
--prefix |
Nginx 安装根目录 |
--sbin-path |
nginx 可执行文件路径 |
--conf-path |
主配置文件路径 |
--pid-path |
pid 文件路径 |
--error-log-path |
错误日志默认路径 |
--http-log-path |
访问日志默认路径 |
--with-http_ssl_module |
启用 HTTPS SSL 模块 |
--with-http_v2_module |
启用 HTTP/2 模块 |
--with-http_gzip_static_module |
启用 gzip 静态预压缩模块 |
--with-http_stub_status_module |
启用基础状态页模块 |
--with-stream |
启用 TCP/UDP stream 代理模块 |
9.4 编译与安装
1 | sudo make |
查看安装目录:
1 | ls -lah /usr/local/nginx |
查看版本与编译参数:
1 | /usr/local/nginx/sbin/nginx -v |
9.5 启动源码安装版 Nginx
检查配置:
1 | sudo /usr/local/nginx/sbin/nginx -t |
启动:
1 | sudo /usr/local/nginx/sbin/nginx |
查看进程:
1 | ps -ef | grep nginx |
访问:
1 | curl -I http://127.0.0.1/ |
停止:
1 | sudo /usr/local/nginx/sbin/nginx -s stop |
优雅退出:
1 | sudo /usr/local/nginx/sbin/nginx -s quit |
重新加载配置:
1 | sudo /usr/local/nginx/sbin/nginx -s reload |
10. Nginx 典型目录结构
包管理器安装和源码安装的路径不同,但核心文件类型是一致的。
10.1 包管理器安装常见路径
Ubuntu / Debian 常见路径:
| 路径 | 说明 |
|---|---|
/usr/sbin/nginx |
nginx 可执行文件 |
/etc/nginx/nginx.conf |
主配置文件 |
/etc/nginx/conf.d/ |
子配置目录 |
/etc/nginx/sites-available/ |
可用站点配置目录,Debian 系常见 |
/etc/nginx/sites-enabled/ |
已启用站点配置目录,Debian 系常见 |
/var/log/nginx/access.log |
访问日志 |
/var/log/nginx/error.log |
错误日志 |
/usr/share/nginx/html/ |
默认静态资源目录 |
/run/nginx.pid |
Nginx pid 文件常见位置 |
/lib/systemd/system/nginx.service |
systemd 服务文件常见位置 |
Rocky / CentOS 常见路径:
| 路径 | 说明 |
|---|---|
/usr/sbin/nginx |
nginx 可执行文件 |
/etc/nginx/nginx.conf |
主配置文件 |
/etc/nginx/conf.d/ |
子配置目录 |
/var/log/nginx/access.log |
访问日志 |
/var/log/nginx/error.log |
错误日志 |
/usr/share/nginx/html/ |
默认静态资源目录 |
/run/nginx.pid |
pid 文件常见位置 |
/usr/lib/systemd/system/nginx.service |
systemd 服务文件常见位置 |
10.2 源码安装常见路径
如果使用前文参数安装:
| 路径 | 说明 |
|---|---|
/usr/local/nginx/ |
安装根目录 |
/usr/local/nginx/sbin/nginx |
nginx 可执行文件 |
/usr/local/nginx/conf/nginx.conf |
主配置文件 |
/usr/local/nginx/html/ |
默认静态资源目录 |
/usr/local/nginx/logs/access.log |
访问日志 |
/usr/local/nginx/logs/error.log |
错误日志 |
/usr/local/nginx/logs/nginx.pid |
pid 文件 |
10.3 路径差异的本质
路径不同并不影响 Nginx 的核心工作方式。真正需要掌握的是:
1 | nginx 可执行文件在哪里 |
使用下面命令可以快速定位当前 Nginx 的真实编译路径:
1 | nginx -V 2>&1 | tr ' ' '\n' | grep -- '--.*path\|--prefix' |
如果系统里存在多个 Nginx,一定要确认当前执行的是哪一个:
1 | which nginx |
11. Nginx 主配置文件结构
一个最小化的 nginx.conf 通常包含下面结构:
1 | user nginx; |
11.1 main 全局块
main 不是显式写出来的块,而是配置文件最外层上下文。
| 指令 | 示例 | 说明 |
|---|---|---|
user |
user nginx; |
worker 进程运行用户 |
worker_processes |
worker_processes auto; |
worker 进程数量 |
error_log |
error_log /var/log/nginx/error.log warn; |
错误日志路径和级别 |
pid |
pid /run/nginx.pid; |
master 进程 pid 文件 |
include |
include modules/*.conf; |
引入其他配置文件 |
11.2 events 块
events 块定义连接处理相关参数。
1 | events { |
| 指令 | 说明 |
|---|---|
worker_connections |
单个 worker 可同时打开的最大连接数 |
use |
指定事件模型,通常不需要手动设置 |
multi_accept |
一个事件到来时是否尽可能多接收连接,入门阶段了解即可 |
粗略最大连接能力可以这样理解:
1 | 理论连接上限 ≈ worker_processes × worker_connections |
但真实上限还受操作系统文件描述符限制、CPU、内存、网络带宽、后端能力、keepalive、反向代理上游连接等因素影响。
11.3 http 块
http 块是 HTTP 服务的核心上下文,绝大多数 Web 配置都写在这里或其子块中。
| 指令 | 说明 |
|---|---|
include mime.types; |
引入文件扩展名与 Content-Type 的映射 |
default_type |
默认响应类型 |
log_format |
定义访问日志格式 |
access_log |
定义访问日志路径和格式 |
sendfile |
使用高效文件传输 |
keepalive_timeout |
HTTP keepalive 连接保持时间 |
include conf.d/*.conf; |
引入多个 server 配置 |
11.4 server 块
server 块表示一个虚拟主机,可以理解成一个站点或一个监听入口。
1 | server { |
| 指令 | 说明 |
|---|---|
listen |
监听 IP 和端口 |
server_name |
匹配域名或 Host |
root |
静态资源根目录 |
index |
默认首页文件 |
access_log |
当前 server 的访问日志 |
error_log |
当前 server 的错误日志 |
第一阶段先掌握:一个 server 可以监听一个端口,也可以配置一个域名入口。
11.5 location 块
location 块用于匹配 URI 路径,并决定如何处理请求。
1 | location / { |
请求 GET /index.html,如果 root 是 /usr/share/nginx/html,最终查找文件就是 /usr/share/nginx/html/index.html。
第一阶段只需要掌握最基础的前缀匹配。复杂优先级留到第二阶段。
12. 基础指令详解
12.1 user
1 | user nginx; |
user 指定 worker 进程使用哪个系统用户运行。master 进程通常由 root 启动,worker 会切换到普通用户以降低安全风险。
查看进程用户:
1 | ps -eo user,pid,ppid,cmd | grep nginx |
常见现象:
1 | root 1001 1 nginx: master process nginx |
12.2 worker_processes
1 | worker_processes auto; |
| 配置 | 说明 |
|---|---|
worker_processes 1; |
一个 worker,适合学习实验 |
worker_processes auto; |
自动按 CPU 核心数设置,生产常见 |
worker_processes 4; |
手动指定 4 个 worker |
入门建议使用 auto。
12.3 worker_connections
1 | events { |
表示每个 worker 最大连接数。注意它不是整个 Nginx 的总连接数,而是单个 worker 的连接上限。
12.4 pid
1 | pid /run/nginx.pid; |
pid 文件记录 master 进程 ID。执行 reload、stop、quit 时,Nginx 会根据 pid 找到 master 进程并发送信号。
1 | cat /run/nginx.pid |
12.5 error_log
1 | error_log /var/log/nginx/error.log warn; |
错误日志用于记录启动错误、配置问题、权限问题、连接失败、上游错误等信息。
| 级别 | 说明 |
|---|---|
debug |
调试级别,需要 debug 编译支持 |
info |
普通信息 |
notice |
重要通知 |
warn |
警告,常用默认级别 |
error |
错误 |
crit |
严重错误 |
alert |
需要立即处理 |
emerg |
系统不可用级别 |
入门阶段建议使用 warn 或 error。
12.6 access_log
1 | access_log /var/log/nginx/access.log; |
访问日志记录每一次 HTTP 请求的访问信息,例如客户端 IP、请求时间、URI、状态码、响应大小等。
1 | sudo tail -f /var/log/nginx/access.log |
12.7 include
1 | include /etc/nginx/conf.d/*.conf; |
include 用于引入其他配置文件,核心作用是拆分配置,避免所有内容都堆在一个 nginx.conf 中。
1 | /etc/nginx/nginx.conf |
注意:被 include 的文件内容会被放入当前位置解析;子配置必须放在正确上下文中,例如 server 应该放在 http 内。
12.8 root
1 | location / { |
root 表示静态资源根目录。Nginx 会将 root 与 URI 拼接成真实文件路径。
1 | root /data/www; |
12.9 index
1 | index index.html index.htm; |
index 表示访问目录时默认查找的首页文件。例如访问 http://example.com/,Nginx 会尝试查找 root目录/index.html 和 root目录/index.htm。
13. master/worker 进程模型
Nginx 采用 master/worker 多进程模型。
1 | master process |
13.1 master 进程职责
master 进程主要负责管理,不直接处理普通 HTTP 请求。
职责包括:
- 读取和校验配置。
- 绑定监听端口。
- 创建 worker 进程。
- 接收 reload、stop、quit 等信号。
- 管理 worker 生命周期。
- 平滑重载配置。
- 处理日志重新打开。
13.2 worker 进程职责
worker 进程负责实际处理客户端连接和 HTTP 请求。
职责包括:
- 接收客户端连接。
- 读取 HTTP 请求。
- 匹配 server/location。
- 读取静态文件。
- 返回 HTTP 响应。
- 写入访问日志。
- 后续阶段还会负责代理 upstream。
13.3 查看进程
1 | ps -ef | grep nginx |
常见输出:
1 | root 1001 1 0 10:00 ? 00:00:00 nginx: master process /usr/sbin/nginx |
更清晰的树形查看:
1 | pstree -p | grep nginx |
如果没有 pstree,可以安装:
1 | sudo apt install -y psmisc |
13.4 reload 时发生了什么
执行:
1 | sudo nginx -s reload |
或:
1 | sudo systemctl reload nginx |
大致过程:
1 | 1. master 收到 reload 信号 |
这就是 Nginx reload 通常不会中断已有请求的原因。
注意:
- reload 不是 restart。
- reload 不会强制杀死正在处理请求的旧 worker。
- 如果配置错误,reload 会失败,但旧 worker 通常继续工作。
- 修改监听端口、证书、日志路径等配置后,都应先
nginx -t再 reload。
14. systemd 管理 Nginx
多数现代 Linux 发行版使用 systemd 管理服务。
14.1 常用命令
| 命令 | 说明 |
|---|---|
sudo systemctl start nginx |
启动 Nginx |
sudo systemctl stop nginx |
停止 Nginx |
sudo systemctl restart nginx |
重启 Nginx |
sudo systemctl reload nginx |
平滑重载配置 |
sudo systemctl status nginx |
查看服务状态 |
sudo systemctl enable nginx |
设置开机自启 |
sudo systemctl disable nginx |
取消开机自启 |
sudo systemctl is-enabled nginx |
查看是否开机自启 |
sudo journalctl -u nginx |
查看 systemd 服务日志 |
14.2 reload 与 restart 区别
| 操作 | 行为 | 是否更平滑 | 使用场景 |
|---|---|---|---|
reload |
重新加载配置,平滑替换 worker | 是 | 修改配置后优先使用 |
restart |
停止后重新启动服务 | 否 | 服务异常、升级后、reload 不适用时 |
stop |
停止服务 | 否 | 停机维护 |
start |
启动服务 | - | 服务未运行时 |
生产环境修改配置通常流程:
1 | sudo nginx -t |
不要养成“改完配置直接 restart”的习惯。
14.3 journalctl 查看服务日志
查看最近日志:
1 | sudo journalctl -u nginx -n 50 |
持续跟踪:
1 | sudo journalctl -u nginx -f |
查看本次启动后的日志:
1 | sudo journalctl -u nginx -b |
15. nginx 命令行用法
15.1 查看版本
1 | nginx -v |
输出示例:
1 | nginx version: nginx/1.26.2 |
15.2 查看编译参数
1 | nginx -V |
这个命令非常重要,能确认当前 Nginx 的模块和路径。
建议学习时重点观察:
1 | configure arguments: |
15.3 检查配置
1 | sudo nginx -t |
配置正确时:
1 | nginx: the configuration file /etc/nginx/nginx.conf syntax is ok |
配置错误时,Nginx 会指出错误文件和行号,例如:
1 | nginx: [emerg] unexpected "}" in /etc/nginx/conf.d/test.conf:12 |
15.4 指定配置文件检查
1 | sudo nginx -t -c /etc/nginx/nginx.conf |
源码安装版:
1 | sudo /usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf |
15.5 发送信号
1 | sudo nginx -s reload |
| 信号 | 说明 |
|---|---|
reload |
平滑重载配置 |
stop |
快速停止 |
quit |
优雅退出,等待请求处理完成 |
reopen |
重新打开日志文件,常用于日志切割 |
15.6 打印配置文件内容
部分版本支持:
1 | sudo nginx -T |
nginx -T 会测试配置,并输出完整配置,包括 include 后的内容。它很适合排查“实际加载了哪些配置”。
注意:输出中可能包含证书路径、内部域名等敏感信息,生产环境复制给他人前要脱敏。
16. 第一个静态站点实验
16.1 创建站点目录
1 | sudo mkdir -p /data/www/stage01 |
创建首页:
1 | cat <<'EOF' | sudo tee /data/www/stage01/index.html |
设置权限:
1 | sudo chmod -R 755 /data/www/stage01 |
如果 worker 用户是 nginx 或 www-data,需要确保它能读取该目录。检查目录权限:
1 | namei -l /data/www/stage01/index.html |
16.2 新增 server 配置
创建配置文件:
1 | sudo vi /etc/nginx/conf.d/stage01.conf |
写入:
1 | server { |
16.3 检查并加载配置
1 | sudo nginx -t |
如果是源码安装版:
1 | sudo /usr/local/nginx/sbin/nginx -t |
16.4 本机访问验证
1 | curl -I http://127.0.0.1:8088/ |
预期状态码:HTTP/1.1 200 OK,预期正文包含 Nginx Stage 01 OK。
16.5 远程访问验证
从宿主机或另一台机器访问:
1 | curl -I http://服务器IP:8088/ |
如果访问失败,按顺序检查:Nginx 是否启动、是否监听 8088、服务器防火墙是否放行、云安全组是否放行、服务器 IP 是否正确、是否存在 SELinux 权限限制。
查看监听端口:
1 | sudo ss -lntp | grep 8088 |
17. 默认站点与自定义站点
包管理器安装后通常会有默认站点。常见默认配置可能在:
1 | /etc/nginx/conf.d/default.conf |
默认首页可能在:
1 | /usr/share/nginx/html/index.html |
17.1 修改默认首页
1 | echo 'Hello Nginx' | sudo tee /usr/share/nginx/html/index.html |
17.2 不建议直接删除默认配置
学习阶段可以保留默认配置,然后新增自己的 stage01.conf。这样便于对比默认 80 端口站点和自定义 8088 端口站点。
如果需要禁用默认站点,建议先备份:
1 | sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak |
Debian 系如果使用 sites-enabled:
1 | sudo rm /etc/nginx/sites-enabled/default |
18. 日志基础
Nginx 最重要的两个日志是:
1 | access.log 访问日志 |
18.1 access.log
访问日志示例:
1 | 192.168.1.10 - - [11/Jul/2026:10:20:30 +0800] "GET / HTTP/1.1" 200 220 "-" "curl/8.0.1" |
| 字段 | 示例 | 说明 |
|---|---|---|
| 客户端 IP | 192.168.1.10 |
请求来源 IP |
| 时间 | [11/Jul/2026:10:20:30 +0800] |
请求时间 |
| 请求行 | GET / HTTP/1.1 |
方法、URI、协议 |
| 状态码 | 200 |
HTTP 响应状态 |
| 响应大小 | 220 |
返回字节数 |
| Referer | - |
来源页面 |
| User-Agent | curl/8.0.1 |
客户端标识 |
实时观察访问日志:
1 | sudo tail -f /var/log/nginx/access.log |
发起请求:
1 | curl http://127.0.0.1/ |
观察日志是否新增。
18.2 error.log
错误日志用于排查问题。常见错误包括:
| 错误 | 常见原因 |
|---|---|
bind() ... failed (98: Address already in use) |
端口被占用 |
permission denied |
文件、目录或端口权限不足 |
open() ... failed (2: No such file or directory) |
文件不存在 |
directory index ... is forbidden |
目录没有 index,且禁止列目录 |
connect() failed |
后续代理阶段中后端连接失败 |
查看错误日志:
1 | sudo tail -n 100 /var/log/nginx/error.log |
18.3 为站点单独配置日志
1 | server { |
这样不同站点日志更清晰,便于排查。
19. HTTP 基础认知
Nginx 是 HTTP Server,因此需要掌握最基础的 HTTP 概念。
19.1 请求报文
一个 HTTP 请求大致包含请求行、请求头、空行和请求体。
1 | GET /index.html HTTP/1.1 |
19.2 响应报文
一个 HTTP 响应大致包含状态行、响应头、空行和响应体。
1 | HTTP/1.1 200 OK |
19.3 常见状态码
| 状态码 | 含义 | 入门阶段常见原因 |
|---|---|---|
200 |
成功 | 文件存在并正常返回 |
301/302 |
重定向 | 配置了 return/rewrite 或目录补 / |
403 |
禁止访问 | 权限不足、目录无 index、禁止访问 |
404 |
未找到 | URI 对应文件不存在,root 路径拼错 |
500 |
服务端内部错误 | 配置或后端异常,第一阶段较少见 |
502 |
Bad Gateway | 代理后端失败,后续阶段重点 |
503 |
服务不可用 | 服务过载或人为返回 |
504 |
Gateway Timeout | 代理后端超时,后续阶段重点 |
第一阶段重点排查:200、403、404。
19.4 curl 常用方法
1 | curl -I http://127.0.0.1/ |
20. 配置文件拆分建议
第一阶段可以采用简单清晰的拆分方式。
主配置:
1 | # /etc/nginx/nginx.conf |
站点配置:
1 | # /etc/nginx/conf.d/stage01.conf |
建议:nginx.conf 保留全局配置;每个站点单独一个 conf.d/*.conf 文件;文件名要能表达用途;修改前先备份;修改后必须执行 nginx -t。
21. 基础排障方法论
排查 Nginx 问题不要靠猜,按链路逐层确认。
21.1 总体排查链路
1 | 服务是否运行 |
21.2 服务启动失败
查看状态:
1 | sudo systemctl status nginx |
检查配置:
1 | sudo nginx -t |
查看系统日志:
1 | sudo journalctl -u nginx -n 100 |
查看错误日志:
1 | sudo tail -n 100 /var/log/nginx/error.log |
| 现象 | 原因 | 处理 |
|---|---|---|
| 配置语法错误 | 少分号、多括号、上下文错误 | 根据 nginx -t 行号修复 |
| 端口占用 | 80 或自定义端口已被其他进程占用 | 查出进程,释放端口或换端口 |
| 权限不足 | 普通用户启动或日志目录无权限 | 使用 sudo 或修复权限 |
| 路径不存在 | 日志路径、root 路径不存在 | 创建目录并授权 |
21.3 端口占用
1 | sudo ss -lntp | grep ':80' |
如果端口被占用,可以停止占用端口的服务、修改 Nginx listen 端口,或确认是否启动了两个不同路径的 Nginx。源码安装版和包管理器安装版可能同时存在,导致端口冲突。
21.4 本机可访问,远程不可访问
本机测试:
1 | curl -I http://127.0.0.1:8088/ |
服务器 IP 测试:
1 | curl -I http://服务器IP:8088/ |
远程机器测试:
1 | curl -I http://服务器IP:8088/ |
| 检查项 | 命令或位置 |
|---|---|
| Nginx 是否监听 | `sudo ss -lntp |
| 是否只监听 127.0.0.1 | 查看 listen 配置 |
| 系统防火墙 | ufw status 或 firewall-cmd --list-all |
| 云安全组 | 云控制台入方向规则 |
| 服务器 IP | ip addr |
| 路由和网络 | ping、traceroute、telnet、nc |
21.5 403 Forbidden
常见原因:访问的是目录但目录中没有 index.html、Nginx worker 用户没有读取权限、上级目录没有执行权限、SELinux 阻止访问,或配置了 deny 访问控制。
排查命令:
1 | sudo tail -n 50 /var/log/nginx/error.log |
修复示例:
1 | sudo chmod -R 755 /data/www/stage01 |
如果是 SELinux 环境,可以先查看状态:
1 | getenforce |
学习阶段如果确认是 SELinux 导致,可临时验证:
1 | sudo setenforce 0 |
注意:生产环境不要简单粗暴关闭 SELinux,应配置正确上下文。
21.6 404 Not Found
常见原因:URI 对应文件不存在、root 配置错误、文件名大小写不一致、配置未 reload,或请求进入了另一个 server。
排查方法:
1 | sudo nginx -T | grep -n "stage01\|root\|listen" |
理解 root 拼接规则非常重要:
1 | location / { |
请求 /index.html 时查找:
1 | /data/www/stage01/index.html |
21.7 配置改了不生效
排查顺序:是否修改了正确文件、是否执行 nginx -t、是否执行 reload、reload 是否成功、是否有多个 Nginx 实例、请求是否进入目标 server、浏览器是否有缓存。
1 | which nginx |
21.8 日志没有写入
常见原因:请求没有进入该 server、配置了单独日志但看错文件、日志目录不存在、worker 用户没有写权限、日志文件被删除后未执行 reopen 或 reload。
1 | sudo nginx -T | grep -n "access_log\|error_log" |
22. 常见错误配置示例
22.1 少写分号
错误:
1 | worker_processes auto |
正确:
1 | worker_processes auto; |
Nginx 指令通常以分号结尾,块结构以 {} 包裹。
22.2 server 写在错误位置
错误:
1 | server { |
如果它写在 main 最外层,就会报错。
正确:
1 | http { |
如果 nginx.conf 中已经有:
1 | http { |
则 conf.d/*.conf 中可以直接写 server。
22.3 root 路径理解错误
配置:
1 | location /static/ { |
请求:
1 | /static/app.js |
实际文件路径:
1 | /data/www/static/app.js |
很多新手误以为是 /data/www/app.js,这个差异在后续学习 alias 时会更重要。
22.4 修改配置后直接 restart
不推荐:
1 | sudo systemctl restart nginx |
推荐:
1 | sudo nginx -t |
22.5 没看 error.log
很多问题 curl 只能看到状态码,真正原因在 error.log。
1 | sudo tail -n 100 /var/log/nginx/error.log |
23. 第一阶段必做实验清单
实验 1:包管理器安装 Nginx
目标:快速安装并启动 Nginx。
1 | sudo apt update |
验收:systemctl status nginx 显示 running;curl -I 返回 200 或默认欢迎页相关状态;能找到 nginx.conf、access.log、error.log。
实验 2:查看编译参数
目标:理解当前 Nginx 的安装路径和模块。
1 | nginx -v |
验收:能找到 --conf-path、--error-log-path,并能说明是否启用了 http_ssl_module。
实验 3:源码编译安装 Nginx
目标:理解源码安装流程和目录。
1 | cd /usr/local/src |
验收:/usr/local/nginx 目录存在;能启动源码安装版 Nginx;能说明源码安装版和包管理器安装版路径差异。
实验 4:配置自定义静态站点
目标:新增一个监听 8088 的静态站点。
1 | sudo mkdir -p /data/www/stage01 |
配置:
1 | server { |
验收:curl http://127.0.0.1:8088/ 返回 Nginx Stage 01 OK;ss -lntp 能看到 8088 监听;access.log 有访问记录。
实验 5:故意写错配置并排查
目标:熟悉 nginx -t 报错。
1 | server { |
执行:
1 | sudo nginx -t |
验收:能根据报错找到具体文件和行号,并能修复错误后通过 nginx -t。
实验 6:观察 reload 前后 worker 变化
目标:理解平滑重载。
1 | ps -ef | grep nginx |
验收:能识别 master 进程、worker 进程,并能说明 reload 会生成新 worker,旧 worker 平滑退出。
实验 7:排查远程访问失败
目标:掌握基础网络排查。
1 | curl -I http://127.0.0.1:8088/ |
验收:能判断是 Nginx 未监听、系统防火墙、云安全组还是访问地址错误。
24. 第一阶段命令速查表
| 命令 | 作用 |
|---|---|
nginx -v |
查看版本 |
nginx -V |
查看版本和编译参数 |
sudo nginx -t |
检查配置语法 |
sudo nginx -T |
输出完整配置 |
sudo nginx -s reload |
平滑重载配置 |
sudo nginx -s stop |
快速停止 |
sudo nginx -s quit |
优雅退出 |
sudo nginx -s reopen |
重新打开日志 |
sudo systemctl start nginx |
启动服务 |
sudo systemctl stop nginx |
停止服务 |
sudo systemctl restart nginx |
重启服务 |
sudo systemctl reload nginx |
平滑重载服务 |
sudo systemctl status nginx |
查看服务状态 |
sudo systemctl enable nginx |
设置开机自启 |
sudo journalctl -u nginx -n 100 |
查看服务日志 |
| `sudo ss -lntp | grep nginx` |
| `ps -ef | grep nginx` |
sudo tail -f /var/log/nginx/access.log |
实时查看访问日志 |
sudo tail -f /var/log/nginx/error.log |
实时查看错误日志 |
curl -I http://127.0.0.1/ |
查看响应头 |
curl -v http://127.0.0.1/ |
查看请求细节 |
25. 第一阶段知识检查
完成学习后,尝试回答下面问题。
25.1 基础概念
- Nginx 是什么?常见使用场景有哪些?
- Nginx 和 Tomcat 的定位有什么区别?
- 为什么 Nginx 适合作为静态资源服务器?
- 为什么 Nginx 能处理较高并发?
- Nginx 在典型 Web 架构中通常放在哪一层?
25.2 安装与目录
- 包管理器安装和源码安装有什么区别?
- 如何查看当前 Nginx 的配置文件路径?
/etc/nginx/nginx.conf的作用是什么?/var/log/nginx/access.log和/var/log/nginx/error.log分别记录什么?- 如何判断系统中是否有多个 Nginx?
25.3 配置结构
main、events、http、server、location分别是什么?worker_processes和worker_connections有什么区别?include的作用是什么?root如何和 URI 拼接成文件路径?- 修改配置后为什么要先执行
nginx -t?
25.4 进程与管理
- master 进程负责什么?
- worker 进程负责什么?
reload和restart有什么区别?stop和quit有什么区别?nginx -s reopen常用于什么场景?
25.5 排障能力
- Nginx 启动失败应该先看什么?
- 端口占用如何排查?
- 本机能访问,远程不能访问,可能是什么原因?
- 403 常见原因有哪些?
- 404 常见原因有哪些?
26. 第一阶段过关标准
达到下面标准,才算真正完成第一阶段。
26.1 操作能力
- 能独立使用包管理器安装 Nginx。
- 能独立源码编译安装 Nginx。
- 能启动、停止、重载 Nginx。
- 能设置 Nginx 开机自启。
- 能配置一个自定义端口的静态站点。
- 能通过浏览器和
curl验证访问结果。
26.2 配置理解
- 能说明
nginx.conf的基本层级结构。 - 能解释
events、http、server、location的作用。 - 能解释
user、worker_processes、worker_connections、pid的作用。 - 能解释
access_log、error_log的作用。 - 能理解
include如何拆分配置。
26.3 进程理解
- 能区分 master 和 worker。
- 能通过
ps查看 Nginx 进程。 - 能解释 reload 的基本过程。
- 能判断 Nginx 是否正常监听端口。
26.4 排障能力
- 能根据
nginx -t修复语法错误。 - 能根据
systemctl status和journalctl判断服务状态。 - 能根据
ss判断端口监听和占用。 - 能根据 access.log 和 error.log 定位基础访问问题。
- 能排查 403、404、端口占用、防火墙和权限问题。
27. 推荐练习顺序
建议严格按照下面顺序练习:
1 | 认识 Nginx 定位 |
不要一边学第一阶段,一边跳到反向代理和 HTTPS。基础命令、目录、配置结构和日志排查熟练后,后续阶段会轻松很多。
28. 学习笔记模板
建议每次实验按下面格式记录:
1 | ## 实验名称 |
这样可以把零散命令沉淀为自己的经验库。
29. 本阶段常见误区
- 只会执行
apt install nginx,不知道配置文件在哪里。 - 修改配置后不执行
nginx -t。 - 把 reload 和 restart 混为一谈。
- 不看 error.log,只看浏览器报错页面。
- 看到 403 就以为 Nginx 坏了,忽略文件权限和 index 文件。
- 看到 404 就以为服务没启动,忽略 root 路径拼接。
- 不区分包管理器安装和源码安装路径。
- 同时启动两个 Nginx,导致端口冲突。
- 云服务器远程访问失败时,只检查 Nginx,不检查安全组。
- 使用 root 用户随意运行服务,不关注 worker 运行用户。
30. 阶段总结
第一阶段的核心是“跑起来、看得懂、会排查”。真正掌握本阶段后,你应该能清楚说明:
1 | Nginx 是什么 |
完成本阶段后,再进入第二阶段“配置体系与请求匹配”,重点学习配置上下文、指令继承、server 匹配、location 优先级、rewrite 和变量体系。那时你会从“能跑起来”进入“能写正确配置”的阶段。
