Nginx配置详解:如何搭建生产级Web服务器 – wiki基地


Nginx配置详解:如何搭建生产级Web服务器

引言

在现代互联网架构中,Web服务器作为连接用户与后端应用的关键一环,其性能、稳定性和安全性至关重要。Nginx(发音为 “engine-x”)以其高性能、高并发处理能力、低资源消耗以及丰富的模块功能,成为了业界构建生产级Web服务器和反向代理的首选。无论是搭建静态网站、作为动态应用(如Node.js, Python, PHP)的反向代理,还是实现负载均衡、缓存、SSL卸载等复杂功能,Nginx都能游刃有余。

本文将深入探讨Nginx的核心配置,从基础安装到高级优化与安全实践,旨在提供一个全面的指南,帮助您搭建并维护一个稳定、高效、安全的生产级Web服务器。

第一部分:Nginx基础与安装

1. Nginx为何如此强大?

在深入配置之前,我们先来回顾Nginx的核心优势:

  • 高性能与高并发: Nginx采用事件驱动、异步非阻塞的架构,能够处理数万乃至数十万的并发连接,远超传统进程/线程模型的服务器。
  • 低资源消耗: 相较于Apache等服务器,Nginx在处理相同并发量时,内存和CPU占用率更低。
  • 出色的静态文件服务: Nginx在提供静态内容方面表现卓越,是快速加载网站的首选。
  • 强大的反向代理与负载均衡: Nginx是实现应用层负载均衡和构建微服务网关的理想工具。
  • SSL/TLS支持: 原生支持HTTPS,并能进行SSL卸载,减轻后端服务器压力。
  • 模块化设计: 丰富的模块生态系统,可以轻松扩展功能。
  • 灵活的配置: 直观且强大的配置语法,能够实现各种复杂的路由和请求处理逻辑。

2. 安装Nginx

在生产环境中,通常推荐通过发行版官方仓库或Nginx官方仓库进行安装。这里以主流的Linux发行版Ubuntu和CentOS为例。

a) Ubuntu/Debian系统

“`bash

更新apt包列表

sudo apt update

安装Nginx

sudo apt install nginx

启动Nginx服务并设置为开机自启

sudo systemctl start nginx
sudo systemctl enable nginx

检查Nginx状态

sudo systemctl status nginx
“`

b) CentOS/RHEL系统

“`bash

安装EPEL仓库(Nginx通常在其中)

sudo yum install epel-release -y

安装Nginx

sudo yum install nginx -y

启动Nginx服务并设置为开机自启

sudo systemctl start nginx
sudo systemctl enable nginx

检查Nginx状态

sudo systemctl status nginx
“`

c) 验证安装

安装完成后,在浏览器中访问您的服务器IP地址或域名,如果看到Nginx的欢迎页面(”Welcome to nginx!”),则表示安装成功。

3. Nginx常用命令

管理Nginx服务:

  • sudo systemctl start nginx: 启动Nginx服务。
  • sudo systemctl stop nginx: 停止Nginx服务。
  • sudo systemctl restart nginx: 重启Nginx服务(会停止再启动,有短暂中断)。
  • sudo systemctl reload nginx: 平滑重启Nginx服务(重新加载配置文件,不中断现有连接)。生产环境推荐此方式。
  • sudo systemctl status nginx: 查看Nginx服务状态。
  • sudo systemctl enable nginx: 设置Nginx开机自启。
  • sudo systemctl disable nginx: 关闭Nginx开机自启。

Nginx配置相关:

  • sudo nginx -t: 测试Nginx配置文件语法是否正确。这是在重新加载配置前必做的步骤。
  • sudo nginx -s reload: 重新加载配置文件(与systemctl reload nginx效果相同)。
  • sudo nginx -v: 查看Nginx版本。
  • sudo nginx -V: 查看Nginx版本及编译参数(包含已安装的模块信息)。

4. Nginx文件结构

理解Nginx的文件结构对于配置至关重要:

  • /etc/nginx/: Nginx主配置文件目录。
    • nginx.conf: Nginx的主配置文件,包含全局设置。
    • conf.d/: 包含额外的配置文件,通常用于存放各个虚拟主机的配置(*.conf)。
    • sites-available/: 存放所有可用的虚拟主机配置文件,但未启用。
    • sites-enabled/: 存放已启用的虚拟主机配置文件,通常是指向sites-available/中文件的符号链接。
    • snippets/: 存放可重用的配置片段,如SSL参数、fastcgi参数等。
  • /var/log/nginx/: Nginx的日志文件目录,包括访问日志(access.log)和错误日志(error.log)。
  • /usr/share/nginx/html/: Nginx默认的网站根目录(静态文件)。
  • /run/nginx.pid/var/run/nginx.pid: Nginx主进程的PID文件。

第二部分:核心配置详解

Nginx的配置基于指令(directives)和块(blocks)。最外层是main块(或称全局上下文),它不显式声明。然后是eventshttp等顶层块。

1. nginx.conf 主配置文件

“`nginx

全局设置

user www-data; # Nginx工作进程运行的用户和组 (Ubuntu/Debian通常为www-data, CentOS为nginx)
worker_processes auto; # 工作进程数量,推荐设置为CPU核心数或auto

error_log /var/log/nginx/error.log warn; # 错误日志路径和级别 (debug, info, notice, warn, error, crit, alert, emerg)
pid /run/nginx.pid; # Nginx主进程的PID文件路径

事件模型配置

events {
worker_connections 1024; # 每个工作进程的最大连接数
# use epoll; # Linux下推荐使用epoll模型,其他系统可能有不同,Nginx通常会自动选择最优
multi_accept on; # 告诉Nginx在收到一个新连接通知时,尽可能多地接受连接
}

HTTP服务器配置

http {
include /etc/nginx/mime.types; # 包含MIME类型映射文件
default_type application/octet-stream; # 默认的MIME类型

# 日志格式
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; # 开启sendfile优化,提高静态文件传输性能
tcp_nopush on; # 配合sendfile使用,减少网络包数量
tcp_nodelay on; # 实时发送数据,提高交互性(适用于小数据包)
keepalive_timeout 65; # 客户端保持连接的超时时间,单位秒
types_hash_max_size 2048; # MIME类型哈希表的最大尺寸

# Gzip压缩
gzip on; # 开启gzip压缩
gzip_vary on; # 在响应头中添加Vary: Accept-Encoding,告知代理服务器缓存压缩和未压缩版本
gzip_proxied any; # 代理请求也进行压缩 (off, expired, no-cache, no-store, private, no_last_modified, no_etag, auth, any)
gzip_comp_level 6; # 压缩级别 (1-9, 6是推荐值)
gzip_buffers 16 8k; # 压缩缓冲区数量和大小
gzip_http_version 1.1; # 对HTTP/1.1及以上版本请求进行压缩
gzip_min_length 1000; # 只有大于此长度的响应才进行压缩
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; # 指定压缩类型

# 虚拟主机配置
include /etc/nginx/conf.d/*.conf; # 包含conf.d目录下所有.conf文件
# 或 include /etc/nginx/sites-enabled/*; # 如果使用sites-available/sites-enabled结构

}
“`

关键指令解释:

  • user: Nginx工作进程运行的用户。出于安全考虑,不建议使用root用户。
  • worker_processes: Nginx工作进程数。通常设置为CPU核心数或auto
  • error_log: 定义错误日志路径和记录级别。warn是一个平衡的级别,既能发现问题又不会产生过多日志。
  • events块:配置Nginx网络连接处理模型。
    • worker_connections: 每个工作进程能够打开的最大并发连接数。实际的最大连接数是 worker_processes * worker_connections
  • http块:配置所有HTTP服务器的行为。
    • include mime.types: 引入MIME类型映射,让Nginx知道如何处理不同文件类型。
    • default_type: 当文件类型无法识别时的默认MIME类型。
    • log_format: 定义访问日志的格式。main格式是常用的。
    • access_log: 访问日志路径和使用的日志格式。
    • sendfile on: 启用sendfile系统调用,允许Nginx直接从磁盘读取数据并发送到网络,减少CPU拷贝次数,提高静态文件传输效率。
    • tcp_nopush on: 与sendfile配合使用,在Linux下,它会等到缓冲区满或文件传输结束时才发送数据,减少网络包数量,提高吞吐量。
    • tcp_nodelay on: 禁用Nagle算法,确保小数据包能立即发送,提高实时交互性,但可能增加网络开销。
    • keepalive_timeout: 客户端和服务器之间保持长连接的超时时间。适当增加可以减少TCP连接建立的开销。
    • gzip: 开启Gzip压缩,可以显著减少传输的数据量,提高网站加载速度。需要注意gzip_types指定要压缩的文件类型。

2. server 块:定义虚拟主机

一个server块定义了一个虚拟主机,它处理特定域名或IP地址的请求。

“`nginx

HTTP虚拟主机

server {
listen 80; # 监听端口,默认为80
listen [::]:80; # 监听IPv6地址的80端口

server_name example.com www.example.com; # 定义服务器名称/域名,多个域名用空格分隔
                                        # 可以使用通配符如 *.example.com,或正则表达式 ~^www\d+\.example\.com$

root /var/www/example.com; # 网站根目录
index index.html index.htm index.nginx-debian.html; # 默认索引文件,按顺序查找

# 错误页面
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;

# 配置一个location块来处理所有请求
location / {
    try_files $uri $uri/ =404; # 尝试查找文件,如果不存在则查找目录,最后返回404错误
                               # $uri: 当前请求的URI
                               # $uri/: 尝试查找URI对应的目录下的index文件
                               # =404: 如果前面都找不到,则返回HTTP 404错误
}

# 其他location块可以定义特定的URI处理逻辑
# location ~ \.php$ { ... } # 处理PHP文件

}
“`

关键指令解释:

  • listen: 指定服务器监听的IP地址和端口。listen 80;表示监听所有IPv4地址的80端口。listen 443 ssl;用于HTTPS。
  • server_name: 定义虚拟主机名称。Nginx根据Host头字段匹配请求到对应的server块。_default_server可以作为默认的捕获所有未匹配域名的虚拟主机。
  • root: 定义网站的根目录。当Nginx接收到请求时,它会在此目录下查找对应的文件。
  • index: 定义默认的索引文件列表。当请求一个目录时,Nginx会按顺序查找这些文件。
  • error_page: 定义自定义错误页面。

3. location 块:URI请求匹配

location块是Nginx中最灵活和强大的部分之一,它根据URI来匹配请求并执行相应的处理逻辑。

匹配规则:

修饰符 描述 示例
(无) 前缀匹配。匹配给定URI前缀的请求,不区分大小写。 location /images/
= 精确匹配。只有URI与指定字符串完全匹配时才处理。 location = /login
~ 正则表达式匹配。区分大小写。 location ~ \.php$
~* 正则表达式匹配。不区分大小写。 location ~* \.(jpg|jpeg|gif|png)$
^~ 前缀匹配。如果匹配成功,则停止进一步的正则匹配。 location ^~ /static/

匹配优先级:

  1. = 精确匹配。
  2. ^~ 最长前缀匹配。
  3. ~~* 正则表达式匹配(如果多个正则匹配,按配置顺序的第一个)。
  4. (无修饰符) 最长前缀匹配。

示例:

“`nginx
server {
listen 80;
server_name example.com;
root /var/www/example.com;

# 默认处理所有请求,如果文件或目录不存在则返回404
location / {
    try_files $uri $uri/ =404;
}

# 精确匹配 /login 路径
location = /login {
    return 200 "This is the login page.";
}

# 处理所有静态文件 (js, css, 图片等),设置较长缓存时间
location ~* \.(js|css|gif|jpg|jpeg|png|ico)$ {
    expires 30d; # 设置浏览器缓存30天
    add_header Cache-Control "public";
    access_log off; # 静态文件通常不需要记录访问日志
}

# 处理PHP文件,将请求转发给PHP-FPM
location ~ \.php$ {
    include snippets/fastcgi-php.conf; # 包含PHP-FPM相关配置
    fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # PHP-FPM监听的socket
    # fastcgi_pass 127.0.0.1:9000; # 或者TCP端口
}

# 禁止访问隐藏文件 (.ht*等)
location ~ /\.ht {
    deny all;
}

}
“`

第三部分:生产级Nginx高级特性

1. 反向代理 (Reverse Proxy)

Nginx作为反向代理,可以将客户端请求转发到后端的一个或多个服务器,并将后端服务器的响应返回给客户端。这是部署动态Web应用(如Node.js、Python Gunicorn/uWSGI、Java Tomcat等)的常见方式。

“`nginx
server {
listen 80;
server_name api.example.com;

location / {
    proxy_pass http://backend_servers; # 将请求转发到名为 backend_servers 的上游服务器组
    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链
    proxy_set_header X-Forwarded-Proto $scheme; # 转发协议 (http或https)

    proxy_redirect off; # 禁用Nginx修改后端服务器的响应头中的Location和Refresh字段

    # 缓冲区配置
    proxy_buffers 4 32k; # 缓冲区数量和大小
    proxy_buffer_size 64k; # 单个请求缓冲区大小
    proxy_busy_buffers_size 64k; # 忙缓冲区大小

    # 超时配置
    proxy_connect_timeout 60s; # Nginx与后端服务器建立连接的超时时间
    proxy_send_timeout 60s; # Nginx向后端服务器发送请求的超时时间
    proxy_read_timeout 60s; # Nginx从后端服务器读取响应的超时时间

    # 错误页
    proxy_intercept_errors on; # 截取后端服务器的错误响应
    error_page 502 503 504 /custom_50x.html; # 定义自定义错误页面
}

}

上游服务器组定义(通常放在http块内或单独的conf文件)

upstream backend_servers {
server 192.168.1.100:8000;
server 192.168.1.101:8000;
}
“`

关键代理指令:

  • proxy_pass: 核心指令,指定后端服务器的地址。
  • proxy_set_header: 允许Nginx修改或添加请求头,对于后端服务器获取客户端真实IP和协议至关重要。
  • proxy_redirect: 用于重写后端服务器返回的LocationRefresh响应头,确保重定向到正确的外部地址。
  • proxy_buffers / proxy_buffer_size / proxy_busy_buffers_size: 缓冲区设置,影响大文件下载和高并发时的性能。
  • proxy_connect_timeout / proxy_send_timeout / proxy_read_timeout: 超时设置,防止后端服务器无响应导致Nginx资源耗尽。

2. 负载均衡 (Load Balancing)

结合upstream块,Nginx可以作为强大的负载均衡器,将请求分发到多个后端服务器,提高应用的可用性和可伸缩性。

“`nginx
http {
upstream backend_api {
# 负载均衡算法:
# 1. 默认:轮询 (Round Robin) – 依次向每台服务器分发请求
server 192.168.1.10:8080 weight=5; # weight: 权重,数字越大,被分配的请求越多
server 192.168.1.11:8080 weight=1;

    # 2. least_conn: 最少连接数 - 转发给当前连接数最少的服务器
    # least_conn;
    # server 192.168.1.10:8080;
    # server 192.168.1.11:8080;

    # 3. ip_hash: 基于客户端IP的哈希 - 确保来自同一IP的请求始终转发到同一服务器,适用于需要会话持久性的场景
    # ip_hash;
    # server 192.168.1.10:8080;
    # server 192.168.1.11:8080;

    # 4. hash key [consistent]: 基于任意键的哈希 - 例如URI、Header等,可以实现更精细的控制
    # hash $request_uri consistent;
    # server 192.168.1.10:8080;
    # server 192.168.1.11:8080;

    # 服务器状态:
    server 192.168.1.12:8080 max_fails=3 fail_timeout=30s; # max_fails: 失败多少次认为服务器不可用
                                                           # fail_timeout: 服务器被标记为不可用后,多长时间内不再转发请求
    server 192.168.1.13:8080 backup; # backup: 备用服务器,只有当其他非backup服务器都不可用时才启用
    server 192.168.1.14:8080 down; # down: 暂时停止使用此服务器
}

server {
    listen 80;
    server_name app.example.com;

    location / {
        proxy_pass http://backend_api; # 将请求转发到上游服务器组
        # ... 其他 proxy_set_header 等配置 ...
    }
}

}
“`

负载均衡策略:

  • 轮询 (Round Robin): 默认策略,按顺序循环将请求分发给后端服务器。可以通过weight参数调整权重。
  • 最少连接 (Least Connections): 将请求分发给当前连接数最少的服务器。适用于请求处理时间差异较大的场景。
  • IP哈希 (IP Hash): 根据客户端IP地址的哈希值将请求分发给后端服务器,确保同一IP的客户端始终访问同一台服务器,适用于需要会话持久性的场景。
  • 通用哈希 (Generic Hash): 根据用户定义的键(如URI、请求头)的哈希值进行分发。

服务器状态指令:

  • max_fails / fail_timeout: 用于健康检查,当后端服务器在fail_timeout时间内连续失败max_fails次后,Nginx会认为其失效,并在fail_timeout时间后再次尝试。
  • backup: 标记为备用服务器,只在所有主服务器都失效时才使用。
  • down: 标记服务器已离线,Nginx不会再转发请求给它。

3. SSL/TLS (HTTPS) 配置

为网站启用HTTPS是生产环境的强制要求,它能加密客户端与服务器之间的通信,保护数据隐私和完整性。

a) 获取SSL证书

最常见和推荐的方式是使用Let’s Encrypt,通过certbot工具自动化获取和续期。

“`bash

安装certbot (Ubuntu)

sudo apt install certbot python3-certbot-nginx -y

获取并配置证书 (示例:yourdomain.com 和 www.yourdomain.com)

sudo certbot –nginx -d yourdomain.com -d www.yourdomain.com

测试自动续期

sudo certbot renew –dry-run
“`

b) Nginx SSL配置

certbot会自动修改Nginx配置,生成一个包含SSL配置的server块。通常会包含以下内容:

“`nginx
server {
listen 443 ssl http2; # 监听443端口,启用SSL和HTTP/2协议
listen [::]:443 ssl http2;

server_name yourdomain.com www.yourdomain.com;

ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; # 证书路径
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; # 私钥路径

# 推荐的SSL/TLS安全设置
ssl_protocols TLSv1.2 TLSv1.3; # 仅允许使用安全的TLSv1.2和TLSv1.3协议
ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256'; # 限制使用的加密套件,排除不安全的
ssl_prefer_server_ciphers on; # 服务器优先选择加密套件
ssl_session_timeout 1d; # SSL会话缓存超时时间
ssl_session_cache shared:SSL:10m; # SSL会话缓存大小
ssl_session_tickets off; # 禁用SSL会话票证 (Ticket)
ssl_stapling on; # 开启OCSP Stapling,减少客户端验证证书的时间
ssl_stapling_verify on; # 验证OCSP响应
resolver 8.8.8.8 8.8.4.4 valid=300s; # DNS解析器,用于OCSP Stapling
resolver_timeout 5s;

# HSTS (HTTP Strict Transport Security)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; # 强制浏览器在指定时间内只通过HTTPS访问

# 其他安全头
add_header X-Frame-Options "DENY" always; # 防止点击劫持
add_header X-Content-Type-Options "nosniff" always; # 防止MIME类型嗅探
add_header X-XSS-Protection "1; mode=block" always; # 启用浏览器XSS过滤器

root /var/www/yourdomain.com;
index index.html;

location / {
    try_files $uri $uri/ =404;
}

}

HTTP到HTTPS的重定向

server {
listen 80;
listen [::]:80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$host$request_uri; # 永久重定向所有HTTP请求到HTTPS
}
“`

关键SSL指令:

  • listen 443 ssl: 告知Nginx监听443端口并启用SSL。
  • ssl_certificate / ssl_certificate_key: 指定SSL证书和私钥的路径。
  • ssl_protocols: 指定允许的SSL/TLS协议版本。推荐禁用TLSv1.0和TLSv1.1。
  • ssl_ciphers: 指定允许的加密套件,应禁用不安全的弱加密算法。
  • ssl_prefer_server_ciphers on: 让服务器优先选择加密套件,而不是客户端。
  • add_header Strict-Transport-Security: 开启HSTS,强制浏览器在指定时间内使用HTTPS访问。
  • return 301 https://$host$request_uri;: 实现HTTP到HTTPS的永久重定向。

4. 安全最佳实践

  • 隐藏Nginx版本信息: 避免暴露Nginx版本给潜在攻击者。
    nginx
    # 在http块内或全局块内
    server_tokens off;
  • 限制请求方法: 如果不需要,禁用PUT、DELETE等请求方法。
    nginx
    location /upload {
    limit_except GET POST { deny all; }
    # ...
    }
  • 拒绝恶意IP或User-Agent:
    “`nginx
    # 在http块内或server块内
    map $http_user_agent $bad_bot {
    default 0;
    “~SemrushBot” 1;
    “~
    AhrefsBot” 1;
    }

    server {
    # …
    if ($bad_bot) {
    return 403;
    }
    # …
    }
    * **速率限制 (Rate Limiting):** 防止恶意请求或DDoS攻击。nginx

    在http块内定义限制区域

    name: 区域名称, zone_size: 存储会话的内存大小, rate: 请求速率限制 (e.g., 1r/s, 10r/m)

    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=5r/s;

    server {
    # …
    location /api/login {
    limit_req zone=mylimit burst=10 nodelay; # burst: 允许的突发请求数量, nodelay: 不延迟处理突发请求
    # …
    }
    }
    “`
    * 禁用不必要的模块: 仅编译或启用Nginx所需的模块,减少攻击面。
    * 文件权限: 确保Nginx用户对网站文件只有读权限,对日志目录有写权限。

5. 性能优化进阶

  • 缓存静态文件: 除了Gzip压缩,利用浏览器缓存可以显著提升用户体验。
    nginx
    location ~* \.(jpg|jpeg|gif|png|css|js|ico|woff2|woff|ttf|svg|eot)$ {
    expires 30d; # 缓存30天
    add_header Cache-Control "public"; # 允许公共缓存
    access_log off; # 不记录静态文件访问日志
    log_not_found off; # 不记录未找到静态文件的错误
    }
  • 代理缓存 (Proxy Cache): 对于反向代理的后端动态内容,Nginx可以缓存其响应,减少后端服务器负载。
    “`nginx
    http {
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m max_size=1g;
    proxy_cache_key “$scheme$request_method$host$request_uri”; # 定义缓存键

    server {
        listen 80;
        server_name example.com;
    
        location / {
            proxy_cache my_cache; # 启用缓存
            proxy_cache_valid 200 302 10m; # 200和302响应缓存10分钟
            proxy_cache_valid 404 1m; # 404响应缓存1分钟
            proxy_cache_bypass $http_pragma $http_authorization; # 不缓存带有特定头的请求
            add_header X-Proxy-Cache $upstream_cache_status; # 添加缓存状态头
    
            proxy_pass http://backend;
        }
    }
    

    }
    * **`client_max_body_size`:** 限制客户端上传文件的大小。nginx

    在http, server 或 location 块中

    client_max_body_size 100M; # 允许最大上传100MB文件
    * **`open_file_cache`:** 缓存文件句柄,减少文件系统I/O。nginx

    在http块内

    open_file_cache max=1000 inactive=20s; # 缓存1000个文件句柄,20秒不活动清除
    open_file_cache_valid 30s; # 缓存有效期
    open_file_cache_min_uses 2; # 访问两次以上才缓存
    open_file_cache_errors on; # 缓存文件查找错误
    “`

6. 日志与监控

  • 自定义日志格式: 除了main,可以定义更详细的日志格式。
    nginx
    log_format combined_plus '$remote_addr - $remote_user [$time_local] '
    '"$request" $status $body_bytes_sent '
    '"$http_referer" "$http_user_agent" '
    '$upstream_addr $request_time $upstream_response_time';
    access_log /var/log/nginx/access.log combined_plus;
  • 日志轮转 (Log Rotation): 使用logrotate定期归档和删除旧日志文件,防止磁盘空间耗尽。logrotate通常会自动配置Nginx日志,位于/etc/logrotate.d/nginx
  • Nginx Stub Status模块: 开启Nginx自带的状态页面,用于监控Nginx的连接数、请求数等基本指标。
    nginx
    # 编译Nginx时需开启 --with-http_stub_status_module
    # 在server块中
    location /nginx_status {
    stub_status on;
    access_log off;
    allow 127.0.0.1; # 仅允许本地访问
    deny all;
    }

第四部分:真实场景配置示例

1. 静态网站配置

“`nginx
server {
listen 80;
listen [::]:80;
server_name static.example.com;

root /var/www/static_site;
index index.html index.htm;

# 静态文件缓存
location ~* \.(jpg|jpeg|gif|png|css|js|ico|woff2|woff|ttf|svg|eot)$ {
    expires 30d;
    add_header Cache-Control "public, no-transform";
    access_log off;
    log_not_found off;
}

# 处理所有非静态文件请求
location / {
    try_files $uri $uri/ =404;
}

error_page 404 /404.html;
location = /404.html {
    internal;
}

}
“`

2. Node.js 应用反向代理配置

假设Node.js应用监听在 http://127.0.0.1:3000

“`nginx
server {
listen 80;
listen [::]:80;
server_name nodeapp.example.com;

location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade; # 支持WebSocket
    proxy_set_header Connection 'upgrade'; # 支持WebSocket
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    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;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
    root /usr/share/nginx/html; # 可以放一个友好的错误页面
}

}
“`

3. PHP (WordPress) 应用配置 (通过PHP-FPM)

“`nginx
server {
listen 80;
listen [::]:80;
server_name wordpress.example.com;

root /var/www/wordpress; # WordPress安装目录
index index.php index.html index.htm;

# 默认location块,处理非PHP文件和目录
location / {
    try_files $uri $uri/ /index.php?$args; # 重要的重写规则,确保WordPress的URL路由正常工作
}

# 静态文件缓存
location ~* \.(css|js|gif|jpg|jpeg|png|ico|woff2|woff|ttf|svg|eot)$ {
    expires 30d;
    add_header Cache-Control "public, no-transform";
    access_log off;
    log_not_found off;
}

# 处理PHP文件请求
location ~ \.php$ {
    include snippets/fastcgi-php.conf; # 包含fastcgi_params等常用配置
    fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # 替换为您的PHP-FPM版本和socket路径
    # fastcgi_pass 127.0.0.1:9000; # 或者使用TCP端口

    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_intercept_errors on; # 允许Nginx处理PHP脚本产生的错误
}

# 禁止访问敏感文件
location ~ /\.ht {
    deny all;
}

error_page 404 /404.php; # WordPress通常使用404.php处理未找到页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
    root /usr/share/nginx/html;
}

}
“`

结论

Nginx是一个功能强大、性能卓越的Web服务器和反向代理工具。通过本文的详细介绍,您应该对Nginx的安装、核心配置、高级特性(反向代理、负载均衡、SSL/TLS)以及生产环境下的安全和性能优化有了深入的理解。

搭建一个生产级的Nginx服务器不仅仅是复制粘贴配置,更重要的是理解每个指令背后的含义和其对服务器行为的影响。在实际部署中,请务必根据您的具体需求、应用架构和服务器资源进行调整和优化。持续的学习、测试和监控是确保Nginx服务器长期稳定、高效运行的关键。

Nginx的世界广阔而深邃,除了上述内容,还有如地理位置模块、限流模块、认证模块、WebSockets支持等更多高级功能等待探索。希望本文能成为您Nginx之旅的一个坚实起点。祝您配置愉快!


字数统计:约3500字。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部