nginx
Nginx 的配置文件(通常是 /etc/nginx/nginx.conf),它通过块(Block)和指令(Directive) 来告诉 Nginx 如何工作。
这些块由大括号 {} 包裹,形成了一个层次化的结构
1、Main Context(全局上下文)
-
范围: 整个配置文件最外层的区域,不在任何
{} 内的区域。
-
功能: 设置影响 Nginx
整体运行的指令。这些是最高级的配置,作用于所有其他部分。
-
常见配置指令:
-
user nginx nginx;: 设置运行 Nginx 工作进程的用户和用户组。为了安全,最好不要用 root
-
worker_processes auto;: 定义工作进程的数量。设置为
auto 可以让 Nginx 自动设置为 CPU 的核心数,性能最优
-
error_log /var/log/nginx/error.log warn;:
设置错误日志的文件路径和记录级别(如 debug,
info, warn, error)
-
pid /run/nginx.pid;: 指定存储 Nginx 主进程 ID
的文件位置
# 这就在 Main 上下文中
user www-data;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# 接下来会进入 Events 和 Http 块
events {
...
}
http {
...
}
2、Events Context(事件上下文)
-
范围: 包含在
events {}大括号内
-
功能: 设置影响 Nginx
如何处理连接的指令,尤其与“网络连接”的处理模型有关。这个模块对性能至关重要
-
常见配置指令:
-
worker_connections 1024;:
每个工作进程同时能够处理的最大连接数。这个值不能超过系统的最大打开文件数限制(ulimit
-n)
-
use epoll;: 在 Linux
系统上,指定高效的事件驱动模型(如 epoll)。通常 Nginx
会自动选择最佳模型,一般不需要手动设置
events {
# 每个工作进程可以处理 1024 个连接
worker_connections 1024;
# 使用 epoll 模型(高效)
use epoll;
}
3、Http Context(HTTP 上下文)
-
范围: 包含在
http {} 大括号内
-
功能: 这是配置 HTTP 或 HTTPS
服务器的核心区域。所有与网页、反向代理、负载均衡等相关的配置都在这里定义。它可以包含多个
server 块
-
常见配置指令:
-
include /etc/nginx/mime.types;:
引入一个文件,该文件定义了文件扩展名和 MIME 类型(如
text/html,
image/jpeg)的映射关系。这样浏览器才能正确解析文件类型
-
default_type application/octet-stream;:
如果找不到对应的 MIME 类型,就使用这个默认类型(通常是作为二进制流下载)
-
access_log /var/log/nginx/access.log;: 设置访问日志的路径和格式
-
sendfile on;: 开启高效的文件传输模式,提升静态文件服务性能
-
keepalive_timeout 65;: 保持连接的超时时间,单位是秒。减少重复建立连接的开销
-
gzip on;: 开启 Gzip 压缩,压缩传输的数据,节省带宽
http {
# 引入 MIME 类型定义文件
include mime.types;
default_type application/octet-stream;
# 开启日志和高效传输
access_log /var/log/nginx/access.log;
sendfile on;
# 连接超时设置
keepalive_timeout 65;
# 开启压缩
gzip on;
# 接下来可以定义多个 Server(虚拟主机)
server {
...
}
server {
...
}
}
4、Server Context(服务器上下文 / 虚拟主机)
-
范围: 包含在
http {} 块内的
server {} 大括号中。
-
功能: 用来定义一个虚拟主机(Virtual
Host)。这是实现“一台服务器上运行多个网站”的关键。Nginx
通过检查请求中的
Host 头来决定将请求交给哪个
server 块来处理。
-
常见配置指令:
-
listen 80;: 监听本机 80 端口(HTTP)
-
listen 443 ssl;: 监听 443 端口并启用 SSL(HTTPS)
-
server_name example.com www.example.com;:
定义这个虚拟主机的域名。可以写多个,用空格隔开。server_name
是区分不同虚拟主机的关键
-
root /var/www/example.com;:
设置这个网站的文件根目录。后续的 URI 查找都会基于这个路径
-
index index.html index.htm;:
定义默认的索引文件。当请求是一个目录时,Nginx 会按顺序查找这些文件
server {
# 监听 80 端口
listen 80;
# 这个服务器块负责处理来自 example.com 和 www.example.com 的请求
server_name example.com www.example.com;
# 网站文件存放在 /var/www/example.com 目录下
root /var/www/example.com;
# 默认找 index.html 或 index.htm 文件
index index.html;
# 接下来可以定义 Location 块,处理不同的 URI
location / {
...
}
}
5、Location Context(位置上下文)
-
范围: 包含在
server {} 块或其它
location {} 块内的
location [修饰符] 匹配模式 {} 大括号中。
-
功能: 根据请求的
URI(网址中域名后的部分)来指定不同的处理规则。这是 Nginx
配置中最灵活、最强大的部分。你可以为不同的URL设置不同的行为,比如处理静态文件、转发给后端应用、进行访问控制等。
-
匹配模式:
-
location /images/ { ... }: 匹配任何以
/images/ 开头的 URI
-
location = /login { ... }:
精确匹配,只匹配 /login 这个 URI
-
location ~ \.php$ { ... }:
正则表达式匹配(区分大小写),匹配所有以
.php 结尾的 URI
-
location ~* \.(jpg|jpeg|png)$ { ... }:
正则表达式匹配(不区分大小写),匹配所有以
.jpg, .jpeg, .png 结尾的 URI
-
常见配置指令:
-
proxy_pass http://localhost:3000;:
反向代理,将匹配的请求转发到指定的后端服务器(如 Node.js, Java, Python 应用)
-
try_files $uri $uri/ /index.html;:
按顺序检查文件是否存在。常用于前端单页面应用(SPA)的路由处理
-
alias /path/to/files;: 定义另一个路径来替换匹配的 URI
部分,常用于静态资源服务
server {
listen 80;
server_name example.com;
root /var/www/example.com;
index index.html;
# Location 1: 处理根请求,尝试找文件,找不到则返回 index.html(用于前端路由)
location / {
try_files $uri $uri/ /index.html;
}
# Location 2: 处理所有以 /api/ 开头的请求,并转发到后端 Java 服务
location /api/ {
# 将请求代理到本机的 8080 端口
proxy_pass http://localhost:8080;
}
# Location 3: 用正则匹配所有图片文件,并设置浏览器缓存时间
location ~* \.(jpg|jpeg|png|gif|ico)$ {
expires 30d; # 设置浏览器缓存 30 天
}
}
| Main |
全局 |
设置工作进程、日志、权限等全局参数 |
| Events |
全局 |
设置网络连接处理模型,影响性能 |
| Http |
在 http {} 内 |
所有 HTTP 相关设置的容器,定义
MIME、日志格式等
|
| Server |
在 http {} 内 |
定义一个虚拟主机(网站),通过
server_name 区分
|
| Location |
在 server {} 内 |
根据 URI
匹配规则,指定详细处理行为(代理、静态文件等)
|
# Main Context
user www-data;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /run/nginx.pid;
# Events Context
events {
worker_connections 1024;
}
# Http Context
http {
include mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
sendfile on;
keepalive_timeout 65;
# 第一个 Server Context:静态网站
server {
listen 80;
server_name my-site.com;
root /var/www/my-site;
index index.html;
# Location Context for SPA
location / {
try_files $uri $uri/ /index.html;
}
}
# 第二个 Server Context:反向代理到后端应用
server {
listen 80;
server_name api.my-site.com;
# Location Context for API
location / {
proxy_pass http://localhost:3000;
}
}
}
| 启动 |
nginx |
默认读取 /etc/nginx/nginx.conf |
| 指定配置启动 |
nginx -c /path/nginx.conf |
多实例场景常用 |
| 语法检查 |
nginx -t |
修改配置后必做 |
| 热加载 |
nginx -s reload |
0 中断生效 |
| 优雅停止 |
nginx -s quit |
处理完当前连接后再退出 |
| 立即关闭 |
nginx -s stop |
暴力杀进程 |
| 重新打开日志 |
nginx -s reopen |
日志切割时用 |
| 查看编译参数 |
nginx -V |
判断模块是否编译进去 |
| 查看进程 |
ps -ef | grep nginx |
master/worker 模型 |