配置文件详解
配置文件结构
1. 主配置文件
Nginx的主配置文件通常位于 /etc/nginx/nginx.conf
,它采用层次化的块结构:
# 全局块
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# events块
events {
worker_connections 1024;
use epoll;
}
# http块
http {
# http全局块
include /etc/nginx/mime.types;
default_type application/octet-stream;
# server块
server {
# server全局块
listen 80;
server_name example.com;
# location块
location / {
root /var/www/html;
index index.html;
}
location /api/ {
proxy_pass http://backend;
}
}
# 可以有多个server块
server {
listen 443 ssl;
server_name secure.example.com;
# ...
}
}
2. 配置块层次
全局块
# 影响nginx全局的指令
user nginx; # 运行用户
worker_processes auto; # 工作进程数
error_log /var/log/nginx/error.log; # 错误日志
pid /run/nginx.pid; # PID文件位置
events块
events {
# 影响nginx服务器与用户的网络连接
worker_connections 1024; # 每个进程的最大连接数
use epoll; # 事件驱动模型
multi_accept on; # 是否允许同时接受多个连接
}
http块
http {
# HTTP相关的配置
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"';
# 包含其他配置文件
include /etc/nginx/conf.d/*.conf;
}
server块
server {
# 虚拟主机配置
listen 80; # 监听端口
server_name example.com; # 服务器名称
root /var/www/html; # 网站根目录
index index.html index.php; # 默认首页
# 访问日志
access_log /var/log/nginx/example.com.access.log main;
error_log /var/log/nginx/example.com.error.log;
}
location块
location / {
# 请求处理配置
root /var/www/html;
index index.html;
try_files $uri $uri/ =404;
}
location ~ \.php$ {
# PHP文件处理
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
核心指令详解
1. 全局指令
用户和进程
# 指定运行nginx的用户和组
user nginx nginx;
# 工作进程数量
worker_processes auto; # 自动检测CPU核心数
worker_processes 4; # 手动指定进程数
# 工作进程CPU亲和性
worker_cpu_affinity 0001 0010 0100 1000;
# 工作进程优先级
worker_priority -10;
# 工作进程打开文件数限制
worker_rlimit_nofile 65535;
错误日志
# 错误日志级别:debug, info, notice, warn, error, crit, alert, emerg
error_log /var/log/nginx/error.log warn;
error_log /var/log/nginx/error.log error;
# 关闭错误日志
error_log off;
2. events指令
events {
# 每个worker进程的最大连接数
worker_connections 1024;
# 事件驱动模型
use epoll; # Linux推荐
use kqueue; # FreeBSD推荐
# 是否允许同时接受多个连接
multi_accept on;
# 是否使用互斥锁
accept_mutex on;
accept_mutex_delay 500ms;
}
3. http指令
基本设置
http {
# MIME类型
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 字符集
charset utf-8;
# 服务器标识
server_tokens off; # 隐藏nginx版本号
# 文件传输
sendfile on; # 启用高效文件传输
tcp_nopush on; # 优化数据包传输
tcp_nodelay on; # 禁用Nagle算法
}
连接设置
http {
# 连接超时
keepalive_timeout 65; # 保持连接时间
keepalive_requests 100; # 保持连接请求数
# 客户端设置
client_max_body_size 10m; # 客户端请求体最大大小
client_body_timeout 60; # 客户端请求体超时
client_header_timeout 60; # 客户端请求头超时
# 发送超时
send_timeout 60;
}
缓冲区设置
http {
# 客户端缓冲区
client_body_buffer_size 128k;
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
# 输出缓冲区
output_buffers 1 32k;
postpone_output 1460;
}
4. server指令
监听设置
server {
# 基本监听
listen 80;
listen 443 ssl;
listen [::]:80; # IPv6
# 监听选项
listen 80 default_server; # 默认服务器
listen 80 reuseport; # 端口重用
listen 443 ssl http2; # HTTP/2支持
}
服务器名称
server {
# 精确匹配
server_name example.com;
# 通配符匹配
server_name *.example.com;
server_name example.*;
# 正则表达式匹配
server_name ~^(?<subdomain>.+)\.example\.com$;
# 多个域名
server_name example.com www.example.com;
}
根目录和索引
server {
# 网站根目录
root /var/www/html;
# 默认首页文件
index index.html index.htm index.php;
# 自动索引
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
5. location指令
匹配规则
# 精确匹配
location = /favicon.ico {
# 只匹配 /favicon.ico
}
# 前缀匹配
location /images/ {
# 匹配以 /images/ 开头的路径
}
# 优先前缀匹配
location ^~ /static/ {
# 优先匹配以 /static/ 开头的路径
}
# 正则表达式匹配(区分大小写)
location ~ \.(gif|jpg|png)$ {
# 匹配以 .gif, .jpg, .png 结尾的文件
}
# 正则表达式匹配(不区分大小写)
location ~* \.(gif|jpg|png)$ {
# 不区分大小写匹配图片文件
}
# 通用匹配
location / {
# 匹配所有请求
}
匹配优先级
# 优先级从高到低:
# 1. = 精确匹配
# 2. ^~ 优先前缀匹配
# 3. ~ 和 ~* 正则表达式匹配(按配置顺序)
# 4. 前缀匹配(最长匹配)
# 5. / 通用匹配
配置语法规则
1. 基本语法
# 指令以分号结尾
directive_name parameter1 parameter2;
# 块指令用大括号
block_directive {
directive_name parameter;
}
# 注释以#开头
# This is a comment
# 字符串可以用引号包围
directive_name "parameter with spaces";
directive_name 'single quoted parameter';
# 变量以$开头
set $variable_name value;
2. 变量使用
内置变量
# 请求相关
$request # 完整的请求行
$request_method # 请求方法 (GET, POST等)
$request_uri # 完整的请求URI
$uri # 当前请求的URI
$args # 请求参数
$query_string # 同$args
# 客户端相关
$remote_addr # 客户端IP地址
$remote_port # 客户端端口
$remote_user # 客户端用户名
$http_user_agent # 用户代理
$http_referer # 引用页面
# 服务器相关
$server_name # 服务器名称
$server_port # 服务器端口
$server_protocol # 服务器协议
$scheme # 协议方案 (http或https)
$host # 主机名
# 时间相关
$time_local # 本地时间
$time_iso8601 # ISO 8601时间格式
$msec # 毫秒时间戳
# 响应相关
$status # 响应状态码
$body_bytes_sent # 发送的字节数
$bytes_sent # 发送的总字节数
自定义变量
# 设置变量
set $custom_var "hello world";
set $backend_pool "pool1";
# 使用变量
proxy_pass http://$backend_pool;
add_header X-Custom-Header $custom_var;
# 变量作用域
server {
set $server_var "server level";
location / {
set $location_var "location level";
# 可以访问$server_var和$location_var
}
}
3. 条件判断
# if指令
if ($request_method = POST) {
return 405;
}
if ($http_user_agent ~* "bot|spider") {
return 403;
}
if ($uri ~* "\.(jpg|png|gif)$") {
expires 30d;
}
# 条件操作符
# = 等于
# != 不等于
# ~ 正则匹配(区分大小写)
# ~* 正则匹配(不区分大小写)
# !~ 正则不匹配(区分大小写)
# !~* 正则不匹配(不区分大小写)
# 文件判断
if (-f $request_filename) {
# 文件存在
}
if (!-f $request_filename) {
# 文件不存在
}
if (-d $request_filename) {
# 目录存在
}
if (-e $request_filename) {
# 文件或目录存在
}
配置文件组织
1. 模块化配置
主配置文件
# /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
# 基础配置
include /etc/nginx/mime.types;
include /etc/nginx/conf.d/default.conf;
# 包含所有站点配置
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
站点配置文件
# /etc/nginx/conf.d/example.com.conf
server {
listen 80;
server_name example.com www.example.com;
# 包含通用配置
include /etc/nginx/snippets/common.conf;
include /etc/nginx/snippets/ssl.conf;
location / {
root /var/www/example.com;
index index.html;
}
}
配置片段
# /etc/nginx/snippets/common.conf
# 通用安全头
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
# 隐藏服务器信息
server_tokens off;
# /etc/nginx/snippets/ssl.conf
# SSL配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
2. 配置验证
# 测试配置文件语法
nginx -t
# 测试特定配置文件
nginx -t -c /path/to/nginx.conf
# 显示配置文件内容
nginx -T
# 重新加载配置
nginx -s reload
systemctl reload nginx
最佳实践
1. 配置组织
- 使用模块化配置,将不同功能分离到不同文件
- 使用有意义的文件名和目录结构
- 添加适当的注释说明配置用途
2. 性能优化
- 合理设置worker_processes和worker_connections
- 启用sendfile和tcp_nopush
- 配置适当的缓冲区大小
3. 安全配置
- 隐藏nginx版本信息
- 设置适当的客户端请求限制
- 配置安全响应头
总结
本课程详细介绍了Nginx配置文件的结构和语法:
- 配置结构:全局块、events块、http块、server块、location块
- 核心指令:用户进程、连接设置、缓冲区配置
- 语法规则:指令语法、变量使用、条件判断
- 配置组织:模块化配置、配置验证
下一课预告
在下一课中,我们将学习虚拟主机配置,包括:
- 基于域名的虚拟主机
- 基于IP的虚拟主机
- 基于端口的虚拟主机
- 默认服务器配置
💡 小贴士:理解Nginx配置文件的层次结构是掌握Nginx的关键。建议多练习配置文件的编写和测试,熟悉各种指令的用法。
📚 文章对你有帮助?请关注我的公众号,万分感谢!
获取更多优质技术文章,第一时间掌握最新技术动态

关注公众号
第一时间获取最新技术文章

添加微信
技术交流 · 问题答疑 · 学习指导
评论讨论
欢迎留下你的想法和建议