Nginx配置完整手册:从入门到高可用运维实战

一、引言

Nginx,作为一款高性能的HTTP和反向代理服务器,已成为现代互联网架构的基石。它凭借其高并发、低内存占用以及无与伦比的稳定性,在全球范围内被广泛使用。其核心作用主要体现在三个方面:

反向代理:作为客户端和后端服务器之间的中介,隐藏真实服务器,实现请求的转发和安全控制。

负载均衡:将海量客户端请求分发到多个后端服务器,避免单点故障,提升系统吞吐量和可用性。

静态资源服务:高效处理静态文件(如HTML、CSS、JS、图片),因其高效的文件I/O模型而性能卓越。

所有这些功能都通过一个核心文件来定义——nginx.conf。此配置文件采用分层的、基于块的指令系统,理解其结构是掌握Nginx的关键。

二、配置文件基础架构

一个标准的nginx.conf文件遵循清晰的层级结构,从外到内依次是:

main (全局块)
├── events (Events块)
└── http (HTTP块)
    ├── ... (HTTP全局配置)
    └── server (Server块)
        ├── ... (Server全局配置)
        └── location (Location块)

1. 全局块(Global Block)

这是配置文件的顶层上下文,设置的指令影响Nginx的整体运行。

user nginx nginx;       # 定义运行Nginx进程的用户和组
worker_processes auto;   # 工作进程数,通常设置为CPU核心数或`auto`
error_log /var/log/nginx/error.log warn; # 错误日志路径及级别
pid /var/run/nginx.pid; # 存储主进程ID的文件
worker_rlimit_nofile 65535; # 一个进程能打开的最大文件描述符数

2. Events块(Events Block)

此块用于配置网络连接相关的参数,直接影响Nginx的并发处理能力。

events {
    worker_connections 1024;    # 每个工作进程的最大并发连接数
    use epoll;                  # 在Linux上使用高效的事件模型epoll
    multi_accept on;            # 允许一个工作进程同时接受多个新连接
}

最大客户端连接数估算公式:worker_processes * worker_connections。

3. HTTP块(HTTP Block)

这是Nginx HTTP功能配置的核心,所有与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;        # 启用高效文件传输
    tcp_nopush on;      # 在sendfile模式下,确保数据包被完整填充再发送
    keepalive_timeout 65; # 客户端长连接超时时间
    gzip on;            # 开启Gzip压缩,减少传输数据量
    gzip_types text/plain text/css application/json; # 指定压缩类型

    # 后续的server块将在此定义
    include /etc/nginx/conf.d/*.conf; # 引入其他server配置,便于模块化管理
}

4. Server块(Server Block)

此块用于定义一个虚拟主机,可以基于不同的域名或IP来提供不同的服务。

server {
    listen 80;                      # 监听端口
    server_name example.com www.example.com; # 绑定的域名,支持通配符和正则
    root /usr/share/nginx/html;     # 该虚拟主机的根目录
    index index.html index.htm;     # 默认索引文件

    # 在此可以定义多个location块
}

5. Location块(Location Block)

这是最灵活的配置单元,用于根据请求的URI进行精细化的路由和控制。其匹配规则和优先级是重点。

location [ = | ~ | ~* | ^~ ] /uri/ {
    # 配置指令
}

  • =:精确匹配。location = /login 只匹配 /login 请求。
  • ^~:前缀匹配,如果匹配成功,则不再进行正则匹配。
  • ~:区分大小写的正则匹配。
  • ~*:不区分大小写的正则匹配。
  • 无符号:普通前缀匹配。

优先级规则:=〉 ^~ 〉 按配置文件中的顺序(正则)〉 普通前缀匹配

示例

location /images/ {
    # 匹配以 /images/ 开头的任何请求
    alias /data/static/images/;
}

location ~* \.(gif|jpg|jpeg)$ {
    # 不区分大小写地匹配常见图片格式
    expires 30d; # 设置浏览器缓存
    add_header Cache-Control "public";
}

location = /admin {
    # 只精确匹配 /admin
    deny all; # 禁止访问
    return 403;
}

三、实战场景与配置示例

1. 反向代理配置

将请求转发到后端应用服务器(如Tomcat, Node.js, Django等)。

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

    location / {
        proxy_pass http://backend_server; # 指向upstream或具体地址
        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_connect_timeout 30s;
        proxy_read_timeout 60s;
        proxy_send_timeout 60s;
    }
}

2. 负载均衡策略

使用upstream块定义后端服务器组,并选择不同的负载均衡算法。

http {
    upstream backend_server {
        # 1. 轮询(默认)
        # server 192.168.1.101:8080;
        # server 192.168.1.102:8080;

        # 2. 加权轮询
        server 192.168.1.101:8080 weight=3; # 处理3倍请求
        server 192.168.1.102:8080 weight=1;

        # 3. IP哈希(保证同一客户端访问固定后端,解决会话保持)
        # ip_hash;

        # 4. 最少连接数
        # least_conn;

        # 健康检查(需要nginx-plus或集成第三方模块,如ngx_http_upstream_check_module)
        # server 192.168.1.103:8080 backup; # 备份服务器,当其他都不可用时启用
    }

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

        location / {
            proxy_pass http://backend_server;
        }
    }
}

3. SSL/TLS部署

启用HTTPS,保障数据传输安全。

server {
    listen 443 ssl http2; # 启用HTTP/2以提升性能
    server_name 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; # 禁用不安全的TLS版本
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    # 强制HTTPS重定向(可选,在另一个server块中)
    # server {
    #     listen 80;
    #     server_name example.com;
    #     return 301 https://$server_name$request_uri;
    # }

    location / {
        root /usr/share/nginx/html;
        index index.html;
    }
}

4. 访问控制与限流

保护服务免受滥用和攻击。

# IP黑白名单
location /admin/ {
    allow 192.168.1.0/24; # 允许内网IP段
    allow 203.0.113.1;    # 允许特定IP
    deny all;             # 拒绝其他所有IP
    return 403;
}

# 请求速率限制(限流)
http {
    limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s; # 定义限流zone

    server {
        location /api/ {
            limit_req zone=api burst=20 nodelay; # 应用限流
            proxy_pass http://api_backend;
            # 超过频率限制返回429
            limit_req_status 429;
        }
    }
}

# 连接数限制
http {
    limit_conn_zone $binary_remote_addr zone=addr:10m;

    server {
        location /download/ {
            limit_conn addr 1; # 同一IP同时只能有1个下载连接
        }
    }
}

四、性能优化技巧

1. 关键参数调优

# 全局块
worker_processes auto; # 与CPU核心数绑定
worker_rlimit_nofile 65535; # 提高文件描述符限制

events {
    worker_connections 65535; # 提高单进程连接数
    use epoll; # Linux高效事件模型
    multi_accept on;
}

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on; # 禁用Nagle算法,提高实时性
    keepalive_timeout 30; # 适当调整长连接超时
    keepalive_requests 1000; # 一个长连接可处理的请求数

    # 关闭不必要或敏感的版本信息
    server_tokens off;
}

2. 日志管理

  • 日志分割:使用logrotate工具或自定义脚本,避免日志文件过大。
  • 格式自定义:根据需求记录关键字段,避免记录无用信息消耗I/O。
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                '$status $body_bytes_sent "$http_referer" "$request_time"'
                '"$http_user_agent" "$http_x_forwarded_for"';
# 注意添加了$request_time,用于分析请求处理耗时

3. 缓存策略

  • 代理缓存:缓存后端应用的响应。
http {
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m
                     max_size=10g inactive=60m use_temp_path=off;

    server {
        location / {
            proxy_cache my_cache;
            proxy_cache_key "$scheme$request_method$host$request_uri";
            proxy_cache_valid 200 302 10m; # 200和302状态码缓存10分钟
            proxy_cache_valid 404 1m;
            proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
            add_header X-Cache-Status $upstream_cache_status; # 在响应头中显示缓存命中状态
            proxy_pass http://backend;
        }
    }
}

  • 浏览器缓存:通过设置expires和Cache-Control头,让浏览器缓存静态资源。
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 1y; # 缓存1年
    add_header Cache-Control "public, immutable";
}

五、常见问题排查

1. 配置文件语法检查

在重启Nginx前,建议进行语法检查。

nginx -t
# 输出:nginx: configuration file /etc/nginx/nginx.conf test is successful

2. 热重载

修改配置后,无需停止服务即可应用新配置。

# 重新加载配置(推荐)需要到nginx根目录 /usr/sbin/nginx -s reload
nginx -s reload

# 或者使用systemd
systemctl reload nginx

执行命令后Nginx主进程发送HUP信号,主进程会检查新配置的语法,然后启动新的工作进程,并优雅地关闭旧的工作进程。

3. 常见的错误处理

403 Forbidden

  • 检查root目录路径是否正确。
  • 检查文件权限和user指令指定的用户是否有读取权限。
  • 检查index文件是否存在。
  • 502 Bad Gateway
  • 后端服务是否启动并正常运行。
  • proxy_pass指向的地址和端口是否正确。
  • 防火墙规则是否阻止了Nginx到后端的连接。
  • 后端应用处理超时(检查proxy_read_timeout)。
  • 504 Gateway Timeout
  • 后端服务处理时间过长,增加proxy_read_timeout值。
  • 后端服务器资源(CPU、内存、数据库连接)耗尽。

六、高级功能与扩展

1. 动态配置管理

OpenResty:基于Nginx,集成了LuaJIT,允许使用Lua脚本在Nginx的各个处理阶段(如访问、内容、日志)实现复杂业务逻辑,实现动态路由、认证、限流等。

Consul-Template:与Consul服务发现集成,可以根据服务注册中心的变动,自动生成Nginx的Upstream配置并触发重载。

2. 安全加固实践

防止信息泄露:server_tokens off; 隐藏Nginx版本号。

安全头设置

add_header X-Frame-Options "SAMEORIGIN" always; # 防点击劫持
add_header X-Content-Type-Options "nosniff" always; # 防MIME类型嗅探
add_header X-XSS-Protection "1; mode=block" always; # 启用XSS过滤器
add_header Referrer-Policy "no-referrer-when-downgrade" always; # 控制Referer头

CSRF防护:可通过验证Referer头或使用OpenResty实现Token验证。

3. 监控与可视化

stub_status模块:内置模块,提供基本的状态信息。

location /nginx_status {
    stub_status on;
    access_log off;
    allow 127.0.0.1; # 只允许本地访问
    deny all;
}

访问
http://your-server/nginx_status会得到类似如下输出:

Active connections: 291
server accepts handled requests
16630948 16630948 31070465
Reading: 6 Writing: 179 Waiting: 106

Prometheus监控:使用nginx-prometheus-exporter或nginx-vts-exporter(需要编译VTS模块)将Nginx指标转换为Prometheus格式,再通过Grafana进行可视化展示。

七、总结与建议

配置文件管理的建议

模块化:不要将所有配置都写在主配置文件中。使用include指令将不同功能的配置(如SSL、gzip、upstream)和不同站点的配置(server块)拆分到/etc/nginx/conf.d/或
/etc/nginx/sites-available/下的独立文件中。

版本控制:将整个/etc/nginx/目录纳入Git等版本控制系统,任何修改都有据可查,便于回滚和团队协作。

注释清晰:为复杂的配置段添加注释,说明其目的和原理。

遵循最小权限原则:文件权限、用户设置都应遵循安全最佳实践。

学习资源

官方文档
https://nginx.org/en/docs/ - 最权威、最全面的参考。

Nginx Wiki:包含大量社区贡献的示例和教程
https://wiki.archlinuxcn.org/wiki/Nginx。

工具链

nginx -t:每次修改后建议检查一下语法。

ss / netstat**:检查端口监听和连接状态。

curl / httpie**:用于测试接口和HTTP头。

附录

生产环境标准配置模板

# === 全局块 ===
# 用户组
user  nobody;

# 工作进程数
worker_processes 1;

# 日志路径和日志级别
error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;

# 进程文件路径
pid logs/nginx.pid;

# === events块 ===
events {
    # 最大连接数
    worker_connections  1024;
        
    # 设置网络连接序列化
    accept_mutex on;
        
    # 一个进程是否同时接收多个网络连接
    multi_accept on;
        
    # 事件驱动模型
    use epoll;
}

# === http块 ===
http {
                # === http全局块 ===
    # 文件扩展名与文件类型映射表
    include  mime.types;
        
    # 默认文件类型
    default_type  application/octet-stream;
        
    # 是否开启服务日志
    access_log off;
        
    # 自定义服务日志格式
    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  logs/access.log  main;

    # 是否开启高效文件传输模式
    sendfile  on;
    # 每个进程每次最大传输值
    sendfile_max_chunk  100k;
    
    # 长连接超时事件
    keepalive_timeout  65;

    # 响应客户端的超时事件
    send_timeout 75;

    # 客户端请求头的区缓冲区大小
    client_header_buffer_size 32k;
        
    # 客户端请求头的最大缓冲区数量和大小
    large_client_header_buffers 8 32k;
        
    # 允许客户端请求的最大字节数
    client_max_body_size  10m;
        
    # 客户端请求体的缓冲区大小
    client_body_buffer_size  128k;
    
    # ---配置http_gzip模块---
    # 开启gzip压缩输出,可减少网络传输
    gzip  on;

    # 设置允许压缩的页面最小字节数
    gzip_min_length 1k;
        
    # 设置系统获取多少个单位的缓存用于存储gzip的压缩结果数据流
    gzip_buffers 4 16k;
        
    # 设置http协议的版本
    gzip_http_version 1.0;
        
    # 设置zip压缩比
    gzip_comp_level 6;
        
    # 匹配mime类型进行压缩
    gzip_types text/plain text/css application/json;
        
    # 设置开启或者关闭后端服务器返回的结果是否压缩
    gzip_proxied any;
        
    # 该配置和http头有关系,会在响应头加个vary:Accept-Encoding
    gzip_vray on;
        
    # ---配置http_proxy反向代理---
    # Nginx跟代理服务器连接超时时间
    proxy_connect_timeout 75;
        
    # Nginx与代理服务器两个成功的响应操作之间超时时间
    proxy_read_timeout 75;
        
    # Nginx传输文件至代理服务器的超时时间
    proxy_send_timeout 100;
        
    # 设置从代理服务器读取并保存用户头信息的缓冲区大小
    proxy_buffer_size 4k;
        
    # 设置代理缓冲区大小
    proxy_buffers 4 32k;
        
    # 设置高负荷下的缓冲大小
    proxy_busy_buffers_size 64k;
        
    # 设置最大临时文件大小,默认1024M
    proxy_max_temp_file_size 64k;
        
    # 限制每次写临时文件的大小
    proxy_temp_file_write_size 64k;
        
    # 指定临时文件所在的目录
    proxy_temp_path proxy_temp;

    # 定义tomcat地址
    upstream tomcat {
       server 192.168.138.100:8888;
    }
                
    # === HTTP-server块 ===
    server {
        # 监听端口
        listen 80;
                
        # 监听服务器地址
        server_name localhost;

        # 每个连接请求上限次数
        keepalive_requests 120;
                
        # 字符集
        charset utf-8;

        # 服务日志所在目录以及日志格式
        access_log  logs/host.access.log  main;

        # 错误页
        error_page 404 /404.html;
        error_page 500 502 503 504 /50x.html;
                                
        # === HTTP-server-location块 ===
        location / {
                # 服务器的默认网站根目录位置
                root /usr/share/nginx/html;
                        
                # 默认访问的文件名
                index index.html;
                        
                # 拒绝的IP
                deny 192.168.56.21;
                deny all;
                        
                # 允许的IP
                allow 192.168.56.10;
                allow all;        
        }
                
        # 设置响应头
        location / {
                # 设置允许跨域类型
                add_header Access-Control-Allow-Origin * always;
                                                
                # 是否允许信任证书
                add_header Access-Control-Allow-Credentials 'true' always;
                                                
                # 允许的请求头类型
                add_header Access-Control-Allow-Headers * always;
                                                
                # 设置允许的请求方式
                add_header Access-Control-Allow-Methods 'PUT,GET,POST,DELETE,OPTIONS' always;
                                                
                # 处理OPTIONS请求
                if ($request_method = 'OPTIONS') {
                        return 204;
                }
        }        
                
        # 设置反向代理服务器
        location / {
                # 反向代理服务器地址
                proxy_pass http://192.168.56.23;
                                                
                # 是否重定向代理服务器地址
                proxy_redirect off;

                # 设置向代理服务器发送请求时的请求头数据
                # cookie
                proxy_pass_header Set-Cookie;
                                                
                # 主机名
                proxy_set_header Host $host;
                                                
                # 真实IP
                proxy_set_header X-Real-Ip $remote_addr;
                                                
                # 表示Http请求端真实IP
                proxy_set_header X-Forwarded-For $remote_addr;
        }
    }
    # 配置ssl
    server {
        # 开启 ssl
        ssl on;
                                        
        # ssl证书路径
        ssl_certificate cert.pem;
                                        
        # ssl证书密钥
        ssl_certificate_key cert.key;
                                        
        # ssl缓存
        ssl_session_cache shared:SSL:1m;
                            
        # ssl会话超时时间
        ssl_session_timeout 5m;
                                        
        # ssl会话票据
        ssl_session_tickets off;
                                        
        # ssl协议版本
        ssl_protocols TLSv1.2;
                                        
        # ssl密码套件
        ssl_ciphers 'HIGH:!aNULL:!MD5';
                                        
        # 开启ssl服务密码套件
        ssl_prefer_server_ciphers on;
    }
}

常用配置参数速查表

指令

上下文

说明与示例

worker_processes

main

工作进程数,auto或CPU核心数

worker_connections

events

单进程最大并发连接数

listen

server

监听端口,listen 80; listen 443 ssl;

server_name

server

虚拟主机关联的域名

root

server, location

定义请求的根目录

index

server, location

定义默认索引文件

location

server

根据URI匹配并配置路由规则

proxy_pass

location, if

设置反向代理的后端地址

upstream

http

定义负载均衡的后端服务器组

ssl_certificate

server

指定SSL证书文件路径

allow/deny

http, server, location

基于IP的访问控制

limit_req_zone

http

定义请求限流的共享内存区域

通过本篇指南,相信大家应该已经对Nginx配置文件有了比较深刻的了解。从希望这篇文章能够帮助大家!本文转载至www.dunling.com盾灵导航 | 网站网址导航,实用AI工具大全 · 新一代办公/AI助手/AIGC tools软件集合导航网站!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值