nginx配置详解(二)
前一篇基本覆盖了nginx常用配置信息,但稍显简略,新增详细篇章。
Nginx 是一款高性能的开源 Web 服务器、反向代理服务器和负载均衡器,由 Igor Sysoev 于 2002 年开发,并于 2004 年首次发布。它以高效、稳定和低资源消耗著称,广泛用于处理静态文件、动态请求代理以及 HTTPS 加密传输。根据 W3Techs 的统计,Nginx 在全球 Web 服务器市场占有率超过 30%,是许多大型网站的首选(如 Netflix、Dropbox 等)。
Nginx 的强大之处在于其模块化的配置系统。配置文件通常名为 nginx.conf,采用基于块(block)的语法结构,每个块用大括号 {} 包围。配置指令以分号 ; 结尾,支持变量、条件判断和包含外部文件。Nginx 配置分为几个主要上下文(context):全局上下文、events、http、server、upstream、location 等。
Nginx 配置文件的结构概述
Nginx 配置文件的顶层是全局上下文,不属于任何块。常见的结构如下:
- 全局指令:影响整个 Nginx 进程。
- events 块:配置事件驱动模型和连接处理。
- http 块:HTTP 模块的核心配置,包含服务器和虚拟主机设置。
- mail 或 stream 块:可选,用于邮件代理或 TCP/UDP 代理。
- 包含文件:使用 include 指令加载外部配置文件,便于模块化管理。
配置文件的解析是自上而下的,指令的优先级取决于上下文:子上下文覆盖父上下文。
详细介绍配置中的各种字段
以下按上下文分类,列出常见指令及其含义、默认值、用法示例。指令分为简单指令(key value;)和块指令(key { ... })。
1. 全局上下文(Main Context)
这些指令位于配置文件的最外层,控制 Nginx 的整体行为。
- worker_processes:定义工作进程数。默认:auto(自动检测 CPU 核心数)。 示例:worker_processes auto; 作用:Nginx 使用 master-worker 模型,master 进程管理 worker 进程。建议设置为 CPU 核心数,以充分利用多核。
- worker_rlimit_nofile:每个 worker 进程的最大打开文件数。默认:无(受系统限制)。 示例:worker_rlimit_nofile 65535; 作用:防止文件描述符耗尽,高并发场景下需调高。
- error_log:错误日志路径和级别。默认:logs/error.log error;。 示例:error_log /var/log/nginx/error.log warn; 作用:记录错误信息,级别从 debug 到 emerg。
- pid:master 进程的 PID 文件路径。默认:logs/nginx.pid。 示例:pid /var/run/nginx.pid; 作用:用于进程管理,如重启或停止。
- user 和 group:运行 worker 进程的用户和组。默认:nobody nobody。 示例:user www-data; 作用:提升安全性,避免 root 权限运行。
- include:包含其他配置文件。 示例:include /etc/nginx/conf.d/*.conf; 作用:模块化配置,便于管理多个站点。
2. events 块
配置事件处理模型,优化连接处理。
- worker_connections:每个 worker 进程的最大连接数。默认:512。 示例:worker_connections 1024; 作用:包括客户端和后端连接,总连接数 = worker_processes * worker_connections。
- multi_accept:是否允许 worker 进程同时接受多个新连接。默认:off。 示例:multi_accept on; 作用:提高高并发性能。
- use:事件模型选择(如 epoll、kqueue)。默认:auto。 示例:use epoll; 作用:Linux 系统推荐 epoll,BSD 系统推荐 kqueue。
- accept_mutex:是否使用互斥锁处理新连接。默认:on。 示例:accept_mutex on; 作用:防止惊群效应(thundering herd)。
3. http 块
HTTP 模块的核心,包含全局 HTTP 设置。
- access_log:访问日志路径和格式。默认:logs/access.log combined。 示例:access_log /var/log/nginx/access.log main; 作用:记录请求细节,可自定义格式如 log_format。
- log_format:自定义日志格式。默认:combined。 示例:log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'; 作用:支持变量如 $remote_addr(客户端 IP)、$request(请求行)。
- sendfile:是否使用 sendfile 零拷贝传输文件。默认:off。 示例:sendfile on; 作用:高效传输静态文件。
- tcp_nopush 和 tcp_nodelay:TCP 优化。默认:off。 示例:tcp_nopush on; tcp_nodelay on; 作用:nopush 结合 sendfile 打包数据,nodelay 禁用 Nagle 算法减少延迟。
- keepalive_timeout:保持连接超时。默认:75s。 示例:keepalive_timeout 60s; 作用:复用连接,减少开销。
- gzip:启用 Gzip 压缩。默认:off。 示例:gzip on; gzip_types text/plain application/json; 作用:压缩响应,节省带宽。
- server_tokens:是否在响应头显示 Nginx 版本。默认:on。 示例:server_tokens off; 作用:隐藏版本信息,提升安全性。
- client_max_body_size:客户端请求体最大大小。默认:1m。 示例:client_max_body_size 10m; 作用:限制上传文件大小。
4. upstream 块
定义后端服务器组,用于负载均衡。
- server:后端服务器地址和权重。 示例:upstream backend { server 192.168.1.1:8080 weight=3; server 192.168.1.2:8080; } 作用:weight 指定权重,默认为 1。支持 backup(备份服务器)、down(标记下线)等参数。
- ip_hash 或 hash:负载均衡算法。默认:round-robin(轮询)。 示例:ip_hash; 作用:ip_hash 基于客户端 IP 哈希,确保会话粘性。
- keepalive:与后端保持连接数。默认:无。 示例:keepalive 32; 作用:复用连接,提高性能。
5. server 块
虚拟主机配置,位于 http 块内。可有多个 server 块。
- listen:监听端口和地址。默认:80。 示例:listen 80; listen 443 ssl; 作用:支持 IPv6、reuseport(多 worker 共享端口)。对于 HTTPS,需添加 ssl。
- server_name:虚拟主机名。默认:_(匹配所有)。 示例:server_name example.com www.example.com; 作用:基于主机头匹配,支持正则如 ~^www\.。
- ssl_certificate 和 ssl_certificate_key:HTTPS 证书路径。 示例:ssl_certificate /etc/nginx/ssl/cert.pem; ssl_certificate_key /etc/nginx/ssl/key.pem; 作用:启用 TLS/SSL,支持多个证书(SNI)。
- return:直接返回响应。 示例:return 444; 作用:用于兜底服务器,返回状态码如 301 重定向或 444(关闭连接无响应)。
- root:文档根目录。默认:html。 示例:root /var/www/html; 作用:静态文件路径。
- index:默认索引文件。默认:index.html index.htm。 示例:index index.php index.html; 作用:目录请求时尝试的文件。
6. location 块
位于 server 块内,匹配 URI 并处理请求。
- location:URI 匹配规则。 示例:location / { ... } 或 location ~ \.php$ { ... } 作用:前缀匹配(/)、精确匹配(= /)、正则匹配(~ 或 ~* 不区分大小写)、内部重定向(@name)。
- proxy_pass:反向代理到后端。 示例:proxy_pass http://backend; 作用:转发请求到 upstream 或 URL。
- proxy_set_header:设置代理头。 示例:proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; 作用:传递客户端信息到后端。
- try_files:尝试文件存在性。 示例:try_files $uri $uri/ =404; 作用:检查文件或目录,不存在则返回 404。
- rewrite:URL 重写。 示例:rewrite ^/old/(.*)$ /new/$1 permanent; 作用:重定向,支持正则和标志(permanent 为 301)。
- limit_req:请求限速。 示例:limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; limit_req zone=one burst=5; 作用:防止 DDoS,zone 定义键和内存,rate/burst 控制速率和突发。
其他常见指令包括 if(条件判断,但不推荐滥用)、map(变量映射)、geo(基于 IP 的地理映射)等。
配置注意事项
- 变量:Nginx 支持内置变量如 $http_user_agent、$args(查询参数)。自定义变量用 set。
- 模块:Nginx 是模块化的,指令取决于加载的模块(如 ngx_http_ssl_module)。
- 测试配置:使用 nginx -t 检查语法错误。
- 重载:nginx -s reload 平滑重载配置。
- 安全性:启用 HTTPS、限制访问(如 allow/deny)、隐藏版本。
- 性能优化:结合缓存(如 proxy_cache)、Gzip 和连接池。
示例:一个常规的 nginx.conf 配置文件
以下是一个支持 HTTP 和 HTTPS 的示例配置文件。它包括反向负载均衡(upstream 定义两个后端服务器),并有一个兜底服务器返回 444 状态码(关闭连接无响应)。假设后端服务器在 192.168.1.100:8080 和 192.168.1.101:8080,证书文件。
# 全局配置
user www-data;
worker_processes auto;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log warn;
events {
worker_connections 1024;
multi_accept on;
use epoll;
}
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"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# 负载均衡 upstream
upstream backend {
server 192.168.1.100:8080 weight=1;
server 192.168.1.101:8080 weight=1;
keepalive 32;
}
# 主服务器:支持 HTTP 和 HTTPS,反向代理到 upstream
server {
listen 80;
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# HTTP 到 HTTPS 重定向
if ($scheme != "https") {
return 301 https://$host$request_uri;
}
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# 静态文件示例
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
root /var/www/html;
expires 30d;
}
}
# 兜底服务器:返回 444(关闭连接无响应)
server {
listen 80 default_server;
listen 443 ssl default_server;
server_name _;
ssl_certificate /etc/nginx/ssl/default.crt; # 默认证书,如果需要
ssl_certificate_key /etc/nginx/ssl/default.key;
return 444;
}
}
完成配置后nginx -t配置检验,ok之后nginx -s reload热加载即可。

浙公网安备 33010602011771号