🚀 Nginx 基础配置核心指南
本备忘录旨在为您提供 Nginx 配置文件的全面指南,确保您能轻松理解并高效管理您的 Nginx 服务器。
⚙️ Nginx 的核心配置文件
Nginx 的核心配置文件通常命名为 nginx.conf
,其标准路径位于 /etc/nginx/nginx.conf
。
您可以通过运行 nginx -t
命令来:
- 🔍 检查配置文件语法是否正确:确保您的每一次修改都是有效的。
- 📌 定位当前正在使用的配置文件路径:避免在多个配置文件中混淆。
🌳 1. 配置文件的结构
Nginx 配置文件由一系列指令组成,每个指令都包含一个指令名和一个或多个参数。这些元素之间使用空格分隔,并以分号 ;
结束。参数可以根据需要使用单引号或双引号括起来。
Nginx 配置文件的结构清晰,主要分为以下几个上下文块:
# 🌐 全局块 (Global Context)
worker_processes 1; # 定义 worker 进程数量
events {
# 📡 events 块 (Events Context)
# 配置网络 I/O 相关参数
}
http {
# 🌍 http 块 (HTTP Context)
# 配置 HTTP 服务器的全局参数
server {
# 🖥️ server 块 (Server Context)
# 定义一个虚拟主机 (Virtual Host)
location / {
# 📍 location 块 (Location Context)
# 配置请求的路由规则和处理方式
}
}
}
1.1 🌐 全局块 (Global Context)
全局块是配置文件的最顶层,用于设置影响 Nginx 服务器整体运行的指令。这些配置对所有 Nginx 进程生效。
典型配置项包括:
用户与用户组:指定 Nginx 进程运行的权限。
# ⚠️ 注意:user 指令只能在全局块配置。
# 默认情况下,Nginx 可能会使用'nobody'或'nginx'用户。
# 如果注释掉或设为'nobody',将使用非特权用户运行,提高安全性。
# user [user] [group];
user nginx; # 推荐为 Nginx 创建专门的用户,提高安全性。
Worker 进程数:定义 Nginx 处理请求的并发进程数量。
# ⚠️ 注意:worker_processes 指令只能在全局块配置。
# 通常设置为 CPU 核心数,以最大限度地利用多核处理器。
# 'auto' 模式可以自动检测 CPU 核心数。
worker_processes auto; # 推荐使用 auto,Nginx 会自动优化。
# worker_processes 1; # 示例:单进程
错误日志路径及级别:记录 Nginx 运行时出现的错误信息。
# error_log <path> [level];
# level 可以是 debug, info, notice, warn, error, crit, alert, emerg
error_log /var/log/nginx/error.log warn; # 警告级别及以上错误会被记录。
PID 文件路径:记录 Nginx 主进程的进程 ID。
pid /var/run/nginx.pid; # 用于进程管理,如停止、重启 Nginx。
配置文件引入:允许将配置拆分为多个文件,提高可维护性。
# include /etc/nginx/conf.d/*.conf; # 示例:引入其他配置目录下的所有.conf文件。
1.2 📡 events 块 (Events Context)
events
块用于配置 Nginx 服务器的网络 I/O 模型以及连接相关参数。
events {
# 🌐 网络 I/O 模型:指定 Nginx 使用的 I/O 多路复用机制。
# ⚠️ 注意:use 指令只能在 events 块中配置。
# Linux 系统推荐使用 epoll,FreeBSD 推荐 kqueue,Windows 推荐 win_aio。
# Nginx 通常会根据系统自动选择最佳模型,因此常常无需显式声明。
# use epoll; # 示例:Linux 系统常用
# ⚡️ 最大连接数:每个 worker 进程允许打开的最大连接数。
# 这个值对服务器性能至关重要,需根据服务器资源和业务需求合理设置。
# 它包括客户端连接、代理连接等。
worker_connections 1024; # 示例:每个 worker 进程可以处理 1024 个连接
}
1.3 🌍 http 块 (HTTP Context)
http
块是 Nginx 配置文件的核心部分,包含了对 HTTP 服务器的全局设置,以及一个或多个 server
块。
重要的 HTTP 全局配置项包括:
引入 MIME Type 文件:定义文件类型与内容类型的映射关系。
include /etc/nginx/mime.types; # 必不可少,确保 Nginx 正确识别文件类型。
默认内容类型:当 Nginx 无法识别文件类型时,使用的默认 Content-Type
。
default_type application/octet-stream; # 通常用于处理未知文件类型或强制下载。
高效文件传输模式:优化文件发送效率。
sendfile on; # 开启 sendfile 模式,允许 Nginx 直接在内核中传输文件,减少 CPU 开销。
# sendfile_max_chunk 1m; # 可选:设置 sendfile 最大传输片段大小,默认为 0 (不限制)。
长连接超时时间:保持客户端与 Nginx 之间长连接的有效时间。
keepalive_timeout 65; # 客户端在这段时间内可重复使用同一连接发送请求。
# keepalive_requests 100; # 可选:单个 keep-alive 连接允许处理的最大请求数。
访问日志配置:记录所有 HTTP 请求。
# access_log <path> [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log /var/log/nginx/access.log main; # 将访问日志写入指定路径并使用 'main' 格式。
# 📝 日志格式定义:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'; # 定义 'main' 日志格式,包含常用信息。
Gzip 压缩:对传输内容进行压缩,减少网络带宽消耗。
# gzip on; # 💡 启用 Gzip 压缩:可以显著提升网页加载速度。
# gzip_min_length 1k; # 压缩的最小文件大小:小于此大小的文件不进行压缩。
# gzip_comp_level 2; # 压缩级别 (1-9):级别越高压缩率越高,但 CPU 消耗越大。
# gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; # 指定要压缩的文件类型。
# gzip_buffers 16 8k; # 用于压缩的缓冲区数量和大小。
# gzip_vary on; # 在响应头中添加 Vary: Accept-Encoding,告知代理服务器根据 Accept-Encoding 头缓存。
上游服务器组 (upstream
):定义一组后端服务器,常用于反向代理和负载均衡。
upstream www.example.com { # 定义一个名为 www.example.com 的上游服务器组
# 负载均衡算法:
# 默认是轮询 (Round Robin)。
# ip_hash; # 基于客户端 IP 地址散列:确保同一客户端的请求始终发送到同一后端服务器,解决 Session 共享问题。
# least_conn; # 最少连接数:将请求发送到当前连接数最少的服务器。
# fair; # (需要第三方模块) 根据后端响应时间进行加权。
# url_hash; # (需要第三方模块) 根据 URL 散列。
# 定义后端服务器:
# server <address> [parameters];
server 192.168.50.11:80 weight=3; # 服务器地址,并设置权重,权重越高,被分配到的概率越大。
server 192.168.50.12:80; # 默认权重为 1。
server 192.168.50.13:80;
# 其他参数:
# max_fails=3 fail_timeout=30s; # 在 30 秒内失败 3 次,则认为服务器宕机 30 秒。
# backup; # 备用服务器,当所有非 backup 服务器都失效时才启用。
# down; # 标记服务器永久性下线。
}
1.4 🖥️ server 块 (Server Context)
server
块用于配置单个虚拟主机。一个 http
块可以包含多个 server
块,每个 server
块监听不同的端口或域名,从而实现多站点托管。
server {
# 👂 监听地址和端口:
# listen [ip]:port [default_server] [ssl] [http2] ...;
# listen 指令非常灵活,可以指定多个 IP 和端口,也可以使用通配符。
# 常见示例:
# listen 127.0.0.1:80; # 监听来自 127.0.0.1 的 80 端口请求。
# listen 80; # 监听来自所有 IP 的 80 端口请求 (默认行为)。
# listen *:80; # 同上。
# listen 443 ssl; # 监听 443 端口并启用 SSL/TLS。
listen 80; # 监听所有 IPv4 地址的 80 端口
# listen [::]:80; # 监听所有 IPv6 地址的 80 端口
# 🌐 服务器名称 (`server_name`):指定虚拟主机的域名。
# server_name [name ...] | [regex ...];
# 支持精确匹配、通配符匹配和正则表达式匹配。
server_name localhost; # 精确匹配
# server_name example.org www.example.org; # 多个精确匹配
# server_name *.example.org; # 通配符匹配 (匹配所有以 .example.org 结尾的域名)
# server_name ~^www\d+\.example\.net$; # 正则匹配 (匹配 www1.example.net, www2.example.net 等)
# 📍 location 块 (Location Context):配置请求的路由规则。
# 一个 `server` 块可以包含多个 `location` 块,每个 `location` 匹配不同的 URI。
# location [=|~|~*|^~|@] /uri/ { ... }
# 匹配优先级 (从高到低):
# 1. `=` 精确匹配:只有完全匹配上才能生效,匹配成功后立即停止搜索。
# 2. `^~` 前缀匹配:普通字符匹配,如果匹配成功,则不再匹配正则表达式 location。
# 3. `~` 区分大小写的正则匹配。
# 4. `~*` 不区分大小写的正则匹配。
# 5. `/` 通用匹配:所有请求都会匹配上,作为最终的默认匹配。
location / { # 默认的通用匹配,捕获所有未被其他 location 匹配的请求。
root /usr/share/nginx/html; # 指定请求的根目录,可以是绝对路径或相对路径。
index index.html index.htm; # 指定默认文件,如果请求的是目录,则会在目录下查找这些文件。
}
# 常见 location 匹配示例:
location = / { # 精确匹配根路径 "/"
root /usr/share/nginx/html;
index index.html index.htm;
}
location ^~ /images/ { # 前缀匹配:匹配以 "/images/" 开头的请求。
root /usr/share/nginx/html; # 例如:/images/a.png 会到 /usr/share/nginx/html/images/a.png
# expires 30d; # 缓存图片 30 天
}
location ~* \.(gif|jpg|jpeg|png)$ { # 不区分大小写正则匹配:匹配以指定图片格式结尾的请求。
root /usr/share/nginx/html;
# log_not_found off; # 对于这类静态资源,可以关闭文件未找到的日志,减少日志量。
}
# 更多的正则匹配示例:
# location !~ \.(gif|jpg|jpeg)$ { # 不匹配以 gif、jpg 或 jpeg 结尾的请求 (区分大小写)。
# deny all; # 拒绝访问。
# }
# location !~* \.(gif|jpg|jpeg)$ { # 不匹配以 gif、jpg 或 jpeg 结尾的请求 (不区分大小写)。
# # ...
# }
# 错误页面处理 (`error_page`):
error_page 500 502 503 504 /50x.html; # 当出现这些 HTTP 错误码时,返回 /50x.html 页面。
location = /50x.html { # 定义 /50x.html 页面的位置
root /usr/share/nginx/html;
}
# ✨ 反向代理示例:
# location /api/ {
# proxy_pass http://www.example.com; # 将请求转发到 upstream 定义的后端服务器组。
# proxy_set_header Host $host; # 转发原始 Host 头。
# proxy_set_header X-Real-IP $remote_addr; # 转发真实客户端 IP。
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 处理多级代理。
# }
# 🔒 SSL/TLS 配置示例 (通常在 listen 443 ssl; 后面):
# ssl_certificate /etc/nginx/ssl/example.com.crt; # SSL 证书路径
# ssl_certificate_key /etc/nginx/ssl/example.com.key; # SSL 私钥路径
# ssl_protocols TLSv1.2 TLSv1.3; # 推荐只使用最新和安全的协议版本。
# ssl_ciphers 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE'; # 优化加密套件选择。
# ssl_ prefer_server_ciphers on; # 服务器优先于客户端选择加密套件。
# add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; # 启用 HSTS。
}
🛠️ Nginx 的常用命令
掌握这些 Nginx 命令对于日常管理和维护至关重要:
命令 | 功能简介 | 备注 |
nginx | 🚀 启动 Nginx 服务器 | 默认以前台模式启动,通常配合 systemd 或 init.d 在后台运行。 |
nginx -c filename | 📂 指定配置文件启动 | 当您有多个配置文件或配置文件不在默认路径时使用。 |
nginx -V | ℹ️ 查看 Nginx 版本及编译参数 | 用于调试、确认安装的 Nginx 模块或配置。 |
nginx -t | ✔️ 测试配置文件语法正确性并定位路径 | 强烈推荐在修改配置文件后运行此命令,避免配置错误导致服务启动失败。 |
nginx -s quit | gracefully 优雅停止 Nginx | 等待当前所有请求处理完毕后退出,避免影响用户体验。 |
nginx -s stop | 🛑 快速停止 Nginx | 立即终止所有进程,可能导致正在处理的请求中断。 |
nginx -s reload | 🔄 重新加载配置文件 | 最常用命令。不中断服务的情况下,加载新的配置。 |
nginx -s reopen | ✏️ 重新打开日志文件 | 在日志轮转后,强制 Nginx 重新打开日志文件句柄。 |