Jiankun
发布于 2025-02-13 / 5 阅读
0
0

Nginx 配置文件详解

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 工作进程运行的用户。
    • 通常建议使用非特权用户(如 nginxwww-data)以增强安全性。
    • 当 Nginx 启动时,主进程(master process)通常以 root 用户身份运行,因为需要绑定到特权端口(如 80 或 443)。
    • 但是,工作进程(worker processes)不需要以 root 用户运行,因为这会带来安全风险。
    • 通过 user 指令,可以指定工作进程以一个低权限的用户(如 nginxwww-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 UnavailableConnection 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;
    将请求的协议(httphttps)转发给上游服务器,确保后端服务知道原始请求的协议。


Nginx 中 proxy_connect_timeoutclient_body_timeout 的配置位置

在 Nginx 配置中,proxy_connect_timeoutclient_body_timeout 的配置位置取决于它们的作用范围和具体需求。这两个指令可以在 server 块中全局定义,也可以在 location 块中针对特定路径或服务进行细化配置。以下是它们的适用场景和最佳实践:

  • server:可以为整个虚拟主机统一设置超时时间。

  • location:如果某些特定路径或服务需要不同的超时时间,可以在 location 块中覆盖或重新定义。

最佳实践

  1. 全局配置(server 块):如果大部分请求的超时时间需求一致,建议在 server 块中统一配置,减少重复代码,便于管理和维护。

  2. 特定路径覆盖(location 块):如果某些路径需要特殊的超时时间,可在 location 块中覆盖全局设置,为特定服务提供更灵活的配置。

  3. 避免重复:如果 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_certificatessl_certificate_key

    • 指定 SSL 证书和私钥文件的路径,用于验证服务器身份和解密客户端数据。
  • ssl_session_cachessl_session_timeout

    • 配置 SSL 会话缓存和超时时间,减少重复的 SSL 握手,提升性能。
  • ssl_ciphersssl_prefer_server_ciphers

    • 定义允许使用的加密算法,并启用服务器优先选择加密算法,增强安全性。

2. 代理相关的 HTTPS 配置

当 Nginx 作为反向代理时,代理相关的配置也需要支持 HTTPS。

  • proxy_set_header X-Forwarded-Proto $scheme;

    • 将请求的协议(httphttps)转发给上游服务器,确保后端服务知道原始请求的协议。
  • proxy_pass

    • 如果后端服务支持 HTTPS,可以将请求转发为 HTTPS,保持端到端的加密。

3. 客户端和代理超时设置

这些参数虽然不直接与 HTTPS 的加密机制相关,但在 HTTPS 环境下仍然适用,用于优化性能和安全性。

  • client_body_timeoutclient_header_timeout

    • 设置客户端请求的超时时间,确保在 HTTPS 环境下不会因为客户端延迟而导致连接问题。
  • proxy_connect_timeoutproxy_read_timeoutproxy_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 头部。
  • proxy_pass

    • 指定 WebSocket 请求的代理目标地址,例如 http://backend-server:port
  • 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 头部。
  • proxy_set_header X-Forwarded-Proto $scheme;

    • 将请求的协议(httphttps)转发给上游服务器。

评论