精通 Nginx 配置:核心指令详解

通过这份关于核心配置指令的综合指南,释放 Nginx 的全部潜力。学习如何设置服务器块、管理位置、使用 `sendfile` 和 `gzip` 等指令优化性能、使用 SSL 保护您的网站,并了解常见的 Nginx 命令。非常适合寻求构建强大、高效的 Web 应用程序的开发人员和系统管理员。

30 浏览量

掌握 Nginx 配置:核心指令详解

Nginx 是一个功能强大、高性能的 Web 服务器和反向代理,已成为现代 Web 基础设施的基石。它的灵活性和效率很大程度上归功于其高度可配置的特性。然而,对于新手来说,要在众多配置指令中进行导航可能会让人望而生畏。本指南旨在通过解释您将遇到的一些最核心的指令,提供实用的示例和最佳实践,从而揭秘 Nginx 配置,帮助您有效地构建、优化和保护您的 Web 应用程序。

理解这些核心指令对于任何管理 Nginx 的人来说都至关重要。无论您是设置一个简单的静态网站、为微服务配置复杂的反向代理,还是优化性能,扎实掌握 Nginx 的配置语言都将使您能够充分发挥其潜力并更高效地排查问题。

Nginx 配置结构

在大多数 Linux 发行版中,Nginx 配置文件通常位于 /etc/nginx/ 目录中。主配置文件是 nginx.conf,它通常会包含来自 /etc/nginx/conf.d//etc/nginx/sites-available/(以及 /etc/nginx/sites-enabled/ 中的符号链接)等目录的其他配置文件。

Nginx 的配置是分层的,组织成块 (blocks)指令 (directives)。主要的块包括:

  • events:配置网络事件。
  • http:包含与 HTTP 协议相关的指令。
  • server:定义一个虚拟服务器。
  • location:指定如何处理特定 URI 的请求。

指令是控制 Nginx 行为的键值对。它们可以是全局的,也可以嵌套在块内。

核心指令详解

让我们深入了解一些最常用且重要的指令。

http

http 块包含全局应用于 HTTP 流量的配置。您可以在这里定义 Web 服务器的通用设置。

  • include:此指令允许您包含其他配置文件,有助于配置模块化。它通常用于分离不同网站或应用程序的配置。
    ```nginx
    http {
    include mime.types;
    default_type application/octet-stream;

    # 从 conf.d 目录包含服务器配置
    include /etc/nginx/conf.d/*.conf;
    

    }
    ```

  • log_format:为 Nginx 访问日志和错误日志定义自定义日志格式。这对于详细日志记录和分析至关重要。
    ```nginx
    http {
    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;
    error_log   /var/log/nginx/error.log;
    # ... 其他 http 指令
    

    }
    ```

  • sendfile:通过允许内核将文件直接从磁盘发送给客户端,绕过用户空间,从而优化文件传输。设置为 on 以提高性能。
    nginx http { sendfile on; # ... }

  • tcp_nopushtcp_nodelay:这些指令可以进一步优化 TCP 连接性能。tcp_nopush on; 告诉 Nginx 尝试在一个数据包中发送头部和响应的开头。tcp_nodelay on; 禁用 Nagle 算法。
    nginx http { tcp_nopush on; tcp_nodelay on; # ... }

server

每个 server 块定义一个虚拟服务器,允许 Nginx 在同一服务器上处理针对不同域名或 IP 地址的请求。

  • listen:指定服务器将监听传入连接的 IP 地址和/或端口。
    nginx server { listen 80; listen [::]:80; server_name example.com www.example.com; # ... }

  • server_name:定义服务器的名称。Nginx 使用它来匹配传入请求的 Host 头部。
    nginx server { listen 80; server_name mydomain.org *.mydomain.org; # ... }

  • root:设置请求的文档根目录。这是 Nginx 提供文件服务的基准目录。
    nginx server { listen 80; server_name localhost; root /var/www/html; index index.html index.htm; # ... }

  • index:指定当请求目录时(例如 /)要提供服务的默认文件。
    nginx server { # ... index index.html index.htm default.html; # ... }

  • error_page:为特定的 HTTP 状态码定义自定义错误页面。
    nginx server { # ... error_page 404 /404.html; location = /404.html { root /usr/share/nginx/html; internal; } # ... }

location

location 块用于匹配请求 URI 并确定 Nginx 应如何处理它们。这是您为应用程序的不同部分配置路由的地方。

  • 匹配 URI:Location 可以匹配精确字符串、前缀或正则表达式。
    ```nginx
    location /images/ {
    # 以 /images/ 开头的请求指令
    }

    location = /favicon.ico {
    # 精确匹配 /favicon.ico
    }

    location ~ .php$ {
    # 匹配以 .php 结尾的文件的正则表达式
    }
    ```

  • proxy_pass:用于反向代理设置中,将请求转发到上游服务器。
    nginx location /api/ { proxy_pass http://backend-service:8080/; 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; }

  • alias:类似于 root,但它更改了特定 location 内请求的基目录。它通常用于从不同路径提供静态资源。
    nginx location /static/ { alias /var/www/app/assets/; }
    注意:alias 用别名路径替换匹配到的 location 前缀,而 root 将 URI 附加到根路径之后。

  • try_files:按指定顺序检查文件是否存在,并提供找到的第一个文件,或返回指定的代码/URI。
    nginx location / { try_files $uri $uri/ /index.html; }
    这对于单页应用程序 (SPA) 很常见,可确保如果请求的文件或目录不存在,Nginx 会提供 index.html

安全与性能指令

  • ssl_certificatessl_certificate_key:配置 HTTPS 必不可少。这些指令指向您的 SSL 证书和私钥文件。
    ```nginx
    server {
    listen 443 ssl;
    server_name secure.example.com;

    ssl_certificate /etc/letsencrypt/live/secure.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/secure.example.com/privkey.pem;
    
    # ... 其他 SSL 设置
    

    }
    ```

  • gzip:启用或禁用对响应的 Gzip 压缩,显著减少传输大小并改善加载时间。
    nginx http { gzip on; gzip_vary on; gzip_proxied any; gzip_comp_level 6; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; # ... }

  • expires:控制静态资源的 ExpiresCache-Control 头部,指示浏览器和代理应缓存它们多长时间。
    nginx location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 30d; add_header Cache-Control "public"; }

常见的 Nginx 命令

要管理 Nginx 并应用配置更改,您会经常使用以下命令:

  • 测试配置:检查 Nginx 配置文件中的语法错误。
    bash sudo nginx -t

  • 重新加载配置:在不中断现有连接的情况下优雅地重新加载 Nginx 配置。
    bash sudo systemctl reload nginx # 或 sudo service nginx reload

  • 重启 Nginx:停止然后启动 Nginx 服务。
    bash sudo systemctl restart nginx # 或 sudo service nginx restart

  • 检查状态:显示 Nginx 服务的当前状态。
    bash sudo systemctl status nginx # 或 sudo service nginx status

总结

掌握 Nginx 配置是一个持续的过程,但理解这些核心指令奠定了坚实的基础。通过有效利用 server 块进行虚拟主机配置,利用 location 块进行请求路由,以及利用指令进行性能、安全和日志记录,您可以构建高效且健壮的 Web 应用程序。请记住,在重新加载或重启 Nginx 之前,请务必使用 nginx -t 测试您的配置更改,以避免停机。