nginx配置详解(二)中都有哪些具体细节?

摘要:前一篇基本覆盖了nginx常用配置信息,但稍显简略,新增详细篇章。 Nginx 是一款高性能的开源 Web 服务器、反向代理服务器和负载均衡器,由 Igor Sysoev 于 2002 年开发,并于 2004 年首次发布。它以高效、稳定和低
前一篇基本覆盖了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热加载即可。