Nginx 配置文件详解
Nginx 是一个高性能的 HTTP 和反向代理服务器,广泛用于负载均衡、静态文件服务和反向代理等场景。本文将详细介绍 Nginx 的配置文件结构及其常见配置项。
1. Nginx 配置文件位置
a. 整体配置文件
Nginx 的主配置文件通常位于 /etc/nginx/nginx.conf。以下是一个典型的 nginx.conf 文件示例:
user nginx;
worker_processes auto;
pid /run/nginx.pid;
#include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
# include /etc/nginx/sites-enabled/*;
}
#mail {
# # See sample authentication script at:
# # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
# # auth_http localhost/auth.php;
# # pop3_capabilities "TOP" "USER";
# # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
# server {
# listen localhost:110;
# protocol pop3;
# proxy on;
# }
#
# server {
# listen localhost:143;
# protocol imap;
# proxy on;
# }
#}
b. 站点配置文件
为每个站点单独配置时,可以在 /etc/nginx/conf.d 目录下新建一个 .conf 文件,例如 example.conf:
server {
listen 80;
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com;
ssl_certificate "/etc/ssl/certs/example.com/fullchain.pem";
ssl_certificate_key "/etc/ssl/private/example.com.key";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
client_max_body_size 900M;
client_header_timeout 1m;
client_body_timeout 1m;
proxy_connect_timeout 60s;
proxy_read_timeout 1m;
proxy_send_timeout 1m;
location / {
proxy_pass http://localhost:7009;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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;
}
}
2. Nginx 配置文件结构
Nginx 的配置文件主要分为四个部分:全局块、events 块、http 块 和 mail 块。
全局块
全局块配置适用于整个 Nginx 服务器。
-
user nginx;- 指定 Nginx 工作进程运行的用户。
- 通常建议使用非特权用户(如
nginx或www-data)以增强安全性。 - 当 Nginx 启动时,主进程(master process)通常以
root用户身份运行,因为需要绑定到特权端口(如 80 或 443)。 - 但是,工作进程(worker processes)不需要以
root用户运行,因为这会带来安全风险。 - 通过
user指令,可以指定工作进程以一个低权限的用户(如nginx或www-data)运行。 - 指定的工作用户需要有足够的权限来访问 Nginx 的配置文件、日志文件和静态资源目录。
-
worker_processes auto;- 设置 Nginx 的工作进程数。
auto表示 Nginx 会自动根据 CPU 核心数设置工作进程数,通常推荐使用auto以充分利用 CPU 资源。- 每个工作进程可以独立处理客户端请求,因此增加工作进程的数量可以提高 Nginx 的并发处理能力。
- 在多核 CPU 系统中,每个工作进程可以运行在一个独立的 CPU 核心上,从而充分利用多核 CPU 的优势。
- 一个核心上可以运行多个工作进程,但这些进程无法同时并行执行,操作系统会通过时间分片轮流运行的。
-
pid /run/nginx.pid;- 指定 Nginx 的进程 ID 文件存储路径。这个文件用于记录主进程的 PID,便于管理和控制 Nginx。
-
include /etc/nginx/modules-enabled/*.conf;- 用于加载额外的模块配置文件。
events 块
events 块配置与 Nginx 的事件处理机制相关,主要影响网络连接的处理。
worker_connections 768;- 每个工作进程可以处理的最大连接数。
768是一个默认值,可以根据服务器的性能和需求调整。- 当客户端尝试建立连接时,Nginx 会根据当前的工作进程和连接数来分配连接。如果所有工作进程的连接数都达到了
worker_connections的限制,会发生以下情况:- 如果没有可用的工作进程来处理新的连接,Nginx 会拒绝新的连接请求。
- 客户端会收到一个错误,例如
503 Service Unavailable或Connection Refused。 - 虽然新的连接会被拒绝,但已经建立的连接不会受到影响。
- Nginx 会继续处理已有的连接,直到它们完成或关闭。
multi_accept on;- 如果启用,工作进程会尝试接受所有待处理的连接,而不是一次只处理一个。
http 块
http 块配置与 HTTP 服务器相关,定义了 Nginx 处理 HTTP 请求的行为。
基本设置
-
sendfile on;
启用sendfile系统调用,用于更高效地传输文件内容。通常用于静态文件服务。 -
tcp_nopush on;
启用 TCP 的nopush选项,可以减少 TCP 数据包的数量,提高传输效率。 -
types_hash_max_size 2048;
设置types_hash表的最大大小。如果 Nginx 报告types_hash相关的错误,可以适当调整此值。 -
# server_tokens off;
被注释掉的配置。如果启用,Nginx 会在响应头中隐藏版本信息,增强安全性。 -
include /etc/nginx/mime.types;
加载 MIME 类型配置文件,用于正确处理不同文件类型的响应。 -
default_type application/octet-stream;
设置默认的 MIME 类型。如果 Nginx 无法识别文件类型,会使用此默认值。
SSL 设置
-
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
指定支持的 SSL/TLS 协议版本。这里禁用了不安全的 SSLv3(参考 POODLE 攻击)。 -
ssl_prefer_server_ciphers on;
启用服务器优先选择加密算法,增强安全性。
日志设置
-
access_log /var/log/nginx/access.log;
指定访问日志的存储路径。 -
error_log /var/log/nginx/error.log;
指定错误日志的存储路径。
Gzip 压缩设置
-
gzip on;
启用 Gzip 压缩,用于减少响应数据的大小,加快页面加载速度。 -
# gzip_vary on;
被注释掉的配置。如果启用,Nginx 会在响应头中添加Vary: Accept-Encoding,用于缓存优化。 -
# gzip_proxied any;
被注释掉的配置。如果启用,即使请求来自代理服务器,也会启用 Gzip 压缩。 -
# gzip_comp_level 6;
被注释掉的配置,用于设置 Gzip 压缩级别(1-9)。默认值为 1,数值越高,压缩率越高,但 CPU 使用率也会增加。 -
# gzip_buffers 16 8k;
被注释掉的配置,用于设置 Gzip 压缩的缓冲区大小。 -
# gzip_http_version 1.1;
被注释掉的配置,用于设置 Gzip 压缩支持的 HTTP 版本。 -
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
被注释掉的配置,用于指定哪些 MIME 类型可以被 Gzip 压缩。
虚拟主机配置
-
include /etc/nginx/conf.d/*.conf;
加载/etc/nginx/conf.d/目录下的所有.conf文件,通常用于虚拟主机或额外的配置。 -
# include /etc/nginx/sites-enabled/*;
被注释掉的配置,用于加载/etc/nginx/sites-enabled/目录下的配置文件,通常用于 Debian/Ubuntu 系统。
mail 块
mail 块用于配置邮件代理服务器,本文不做详细介绍。
3. 虚拟主机配置
server 块
server 块用于配置虚拟主机,处理特定域名或 IP 的请求。
一个server块就是一个虚拟主机,include /etc/nginx/conf.d/*.conf; 通常会加载多个conf文件,其中每一个conf文件常被用于配置一个虚拟主机。
监听端口和协议
在 Nginx 中,可以为多个虚拟主机同时配置相同的监听指令,但需要通过 server_name 来区分它们。这是基于域名的虚拟主机(Name-based Virtual Hosting)的核心机制。
-
listen 80;
监听 HTTP 请求的默认端口 80。这意味着 Nginx 会处理所有发往该服务器的 HTTP 请求。 -
listen 443 ssl http2;
监听端口 443,用于 HTTPS 请求。ssl表示启用 SSL/TLS 加密,http2表示支持 HTTP/2 协议,提升性能。 -
listen [::]:443 ssl http2;
监听 IPv6 地址上的端口 443,同样用于 HTTPS 请求。这确保了 Nginx 在 IPv6 环境下也能处理 HTTPS 请求。
服务器名称和客户端限制
-
server_name example.com;- 指定该虚拟主机的域名,只有当请求的
Host头部匹配时,Nginx 才会处理该请求。 - 每个
server块通过server_name指令指定一个或多个域名。 - 当请求到达时,Nginx 会检查请求中的
Host头部,并将其与server_name匹配,以决定使用哪个server块来处理请求。
- 指定该虚拟主机的域名,只有当请求的
-
client_max_body_size 900M;
设置客户端请求体的最大大小。默认值通常较小(1M),这里设置为 900MB,适用于上传大文件的场景。 -
client_header_timeout 1m;
设置客户端请求头的超时时间。如果客户端在 1 分钟内未发送完整的请求头,Nginx 会关闭连接。 -
client_body_timeout 1m;
设置客户端请求体的超时时间。如果客户端在 1 分钟内未发送完整的请求体,Nginx 会关闭连接。
代理配置
-
proxy_connect_timeout 60s;
设置代理连接到上游服务器的超时时间。如果在 60 秒内无法建立连接,Nginx 会返回错误。 -
proxy_read_timeout 1m;
设置从上游服务器读取响应的超时时间。如果在 1 分钟内未收到完整的响应,Nginx 会关闭连接。 -
proxy_send_timeout 1m;
设置向上游服务器发送请求的超时时间。如果在 1 分钟内未发送完整的请求,Nginx 会关闭连接。
SSL 配置
-
ssl_certificate "/etc/ssl/certs/example.com/fullchain.pem";
指定 SSL 证书文件的路径。证书文件用于在 HTTPS 连接中验证服务器的身份。 -
ssl_certificate_key "/etc/ssl/private/example.com.key";
指定 SSL 私钥文件的路径。私钥用于解密客户端发送的加密数据。 -
ssl_session_cache shared:SSL:1m;
配置 SSL 会话缓存。shared:SSL:1m表示创建一个名为SSL的共享缓存区,大小为 1MB。这可以减少重复的 SSL 握手,提升性能。 -
ssl_session_timeout 10m;
设置 SSL 会话的超时时间,客户端在 10 分钟内再次连接时可复用之前的会话。 -
ssl_ciphers HIGH:!aNULL:!MD5;
定义允许使用的加密算法。HIGH表示使用高强度加密算法,!aNULL禁用匿名加密算法,!MD5禁用不安全的 MD5 算法。 -
ssl_prefer_server_ciphers on;
启用服务器优先选择加密算法,确保使用服务器配置的加密算法,而不是客户端优先选择,从而增强安全性。
location 块
-
location / {
开始定义对根路径/的请求处理规则。这通常用于匹配所有请求。 -
proxy_pass http://localhost:7009;
将请求代理到本地的http://localhost:7009。这意味着 Nginx 会将收到的请求转发到运行在本地端口 7009 的后端服务。 -
proxy_http_version 1.1;
使用 HTTP/1.1 协议与上游服务器通信。这支持长连接和Upgrade头部,适用于 WebSocket 等场景。 -
proxy_set_header Upgrade $http_upgrade;
将客户端请求中的Upgrade头部转发给上游服务器,用于支持 WebSocket 协议。 -
proxy_set_header Connection "upgrade";
设置Connection头部为upgrade,以支持 WebSocket 的协议升级。 -
proxy_set_header Host $host;
将客户端请求中的Host头部转发给上游服务器,确保后端服务知道原始请求的域名。 -
proxy_set_header X-Real-IP $remote_addr;
将客户端的真实 IP 地址转发给上游服务器,因为代理会隐藏客户端的 IP。 -
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
将客户端的 IP 地址添加到X-Forwarded-For头部,用于记录请求的原始 IP。 -
proxy_set_header X-Forwarded-Proto $scheme;
将请求的协议(http或https)转发给上游服务器,确保后端服务知道原始请求的协议。
Nginx 中 proxy_connect_timeout 和 client_body_timeout 的配置位置
在 Nginx 配置中,proxy_connect_timeout 和 client_body_timeout 的配置位置取决于它们的作用范围和具体需求。这两个指令可以在 server 块中全局定义,也可以在 location 块中针对特定路径或服务进行细化配置。以下是它们的适用场景和最佳实践:
-
server块:可以为整个虚拟主机统一设置超时时间。 -
location块:如果某些特定路径或服务需要不同的超时时间,可以在location块中覆盖或重新定义。
最佳实践
-
全局配置(
server块):如果大部分请求的超时时间需求一致,建议在server块中统一配置,减少重复代码,便于管理和维护。 -
特定路径覆盖(
location块):如果某些路径需要特殊的超时时间,可在location块中覆盖全局设置,为特定服务提供更灵活的配置。 -
避免重复:如果
location块中没有特殊需求,尽量避免在location块中重复定义与server块相同的指令,Nginx 会继承server块中的设置,除非明确覆盖。
支持 HTTPS 的配置参数
在上述配置中,与支持 HTTPS 相关的参数主要集中在 SSL/TLS 的配置和代理相关的设置。以下是与 HTTPS 相关的配置参数及其作用:
1. SSL/TLS 配置
这些参数直接用于配置 HTTPS 的安全性和行为。
-
listen指令-
listen 443 ssl http2;:监听端口 443,启用 SSL/TLS 加密,并支持 HTTP/2 协议。 -
listen [::]:443 ssl http2;:监听 IPv6 地址上的端口 443,支持 IPv6 环境下的 HTTPS 请求。
-
-
ssl_certificate和ssl_certificate_key- 指定 SSL 证书和私钥文件的路径,用于验证服务器身份和解密客户端数据。
-
ssl_session_cache和ssl_session_timeout- 配置 SSL 会话缓存和超时时间,减少重复的 SSL 握手,提升性能。
-
ssl_ciphers和ssl_prefer_server_ciphers- 定义允许使用的加密算法,并启用服务器优先选择加密算法,增强安全性。
2. 代理相关的 HTTPS 配置
当 Nginx 作为反向代理时,代理相关的配置也需要支持 HTTPS。
-
proxy_set_header X-Forwarded-Proto $scheme;- 将请求的协议(
http或https)转发给上游服务器,确保后端服务知道原始请求的协议。
- 将请求的协议(
-
proxy_pass- 如果后端服务支持 HTTPS,可以将请求转发为 HTTPS,保持端到端的加密。
3. 客户端和代理超时设置
这些参数虽然不直接与 HTTPS 的加密机制相关,但在 HTTPS 环境下仍然适用,用于优化性能和安全性。
-
client_body_timeout和client_header_timeout- 设置客户端请求的超时时间,确保在 HTTPS 环境下不会因为客户端延迟而导致连接问题。
-
proxy_connect_timeout、proxy_read_timeout和proxy_send_timeout- 设置与上游服务器的代理连接超时时间,确保在 HTTPS 环境下,代理行为的高效性和稳定性。
支持 WebSocket 的配置参数
在 Nginx 中支持 WebSocket,主要依赖于以下配置参数和指令:
1. 必须的 WebSocket 配置
为了支持 WebSocket,Nginx 需要能够识别和处理 WebSocket 的协议升级请求。以下两个指令是关键:
-
proxy_set_header Upgrade $http_upgrade;- 将客户端请求中的
Upgrade头部转发给上游服务器。
- 将客户端请求中的
-
proxy_set_header Connection "upgrade";- 将
Connection头部设置为upgrade,通知上游服务器将当前请求升级为 WebSocket 协议。
- 将
2. 其他相关配置
除了上述两个关键指令,还需要以下配置来确保 WebSocket 正常工作:
-
proxy_http_version 1.1;- 确保使用 HTTP/1.1 协议与上游服务器通信,支持长连接和
Upgrade头部。
- 确保使用 HTTP/1.1 协议与上游服务器通信,支持长连接和
-
proxy_pass- 指定 WebSocket 请求的代理目标地址,例如
http://backend-server:port。
- 指定 WebSocket 请求的代理目标地址,例如
-
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;- 将客户端的 IP 地址添加到
X-Forwarded-For头部。
- 将客户端的 IP 地址添加到
-
proxy_set_header X-Forwarded-Proto $scheme;- 将请求的协议(
http或https)转发给上游服务器。
- 将请求的协议(