当前位置: 首页 > news >正文

Nginx配置详解

1. 全局块

示例
user nginx; # 运行Nginx的工作进程的用户和组
worker_processes auto; # 工作进程数,通常设置为CPU核心数
error_log /var/log/nginx/error.log warn; # 错误日志位置与级别
pid /var/run/nginx.pid; # 存储主进程ID的文件路径

# 设置工作进程的最大打开文件数限制
worker_rlimit_nofile 2048;

# 包含其他配置文件(如果有)
include /etc/nginx/conf.d/*.conf;

# 工作进程的CPU亲和性设置
worker_cpu_affinity auto;

# 日志轮转
env NGINX_LOG_ROTATE=1;
  • user:指定运行Nginx工作进程的用户和组。通常使用非特权用户以提高安全性。
  • worker_processes:定义工作进程数量。auto会根据CPU核心数自动调整。对于多核CPU,建议设置为CPU核心数或略高于此值。
  • error_log:错误日志的位置和记录等级(如warn, error, crit等)。可以设置不同的日志级别以控制日志输出量。
  • pid:存放Nginx主进程ID的文件路径。用于管理Nginx进程。
  • worker_rlimit_nofile:设置每个工作进程可以打开的最大文件数。这对于高并发场景非常重要。
  • include:包含其他配置文件,便于管理和扩展。例如,将虚拟主机配置放在单独的文件中。
  • worker_cpu_affinity:绑定工作进程到特定的CPU核心,减少上下文切换开销。
  • env:设置环境变量,例如用于日志轮转。

2. Events 块

示例
events {
    worker_connections 1024; # 每个工作进程可以同时处理的最大连接数
    use epoll; # 在Linux系统上使用epoll模型提高效率
    multi_accept on; # 当接收到新连接时,立即接受所有等待中的连接
    accept_mutex on; # 启动accept锁机制,防止惊群效应
    accept_mutex_delay 50ms; # 设置accept锁的延迟时间
}
  • worker_connections:每个工作进程可以同时处理的最大连接数。结合worker_processes来计算最大并发连接数。
  • use:指定使用的事件驱动模型(在Linux上推荐使用epoll,在FreeBSD上使用kqueue)。
  • multi_accept:允许工作进程在接受到新的连接通知后立即接受所有等待中的连接,提高处理效率。
  • accept_mutex:启用或禁用accept锁机制,防止多个工作进程同时尝试接受连接导致的性能问题。
  • accept_mutex_delay:设置accept锁的延迟时间,以平衡性能和公平性。

3. HTTP 块

这是Nginx的核心部分,几乎所有的Web服务器配置都在这里完成。

MIME类型
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; # 访问日志的位置和使用的日志格式
  • log_format:定义日志格式,支持多种变量。可以自定义日志格式以满足特定需求。
  • access_log:指定访问日志的位置和使用的日志格式。可以通过日志分析工具进行流量分析。
性能优化相关配置
sendfile on; # 开启高效传输模式
tcp_nopush on; # 减少网络包的数量
tcp_nodelay on; # 提高响应速度
keepalive_timeout 65; # 长连接超时时间
gzip on; # 开启Gzip压缩以减少传输数据量
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 1000; # 只对超过1KB的数据进行压缩
gzip_proxied any; # 对代理请求也启用压缩
gzip_buffers 16 8k; # 设置Gzip缓冲区大小
gzip_http_version 1.1; # 启用HTTP/1.1协议下的Gzip压缩
gzip_comp_level 6; # 设置Gzip压缩级别
  • sendfile:启用或禁用sendfile()方法,用于高效传输静态文件。
  • tcp_nopush:减少网络包的数量,配合sendfile使用。
  • tcp_nodelay:提高响应速度,适用于小数据包的即时发送。
  • keepalive_timeout:长连接超时时间,保持客户端连接一段时间。
  • gzip:开启Gzip压缩以减少传输数据量。
  • gzip_types:指定哪些MIME类型的内容需要压缩。
  • gzip_min_length:只对超过一定大小的数据进行压缩。
  • gzip_proxied:对代理请求也启用压缩。
  • gzip_buffers:设置Gzip缓冲区大小。
  • gzip_http_version:启用HTTP/1.1协议下的Gzip压缩。
  • gzip_comp_level:设置Gzip压缩级别(1-9),数值越大压缩率越高但消耗更多CPU资源。
Server 块

每个server块代表一个虚拟主机或网站。

基本配置
server {
    listen 80; # 监听端口
    server_name example.com www.example.com; # 服务器名称或域名

    root /usr/share/nginx/html; # 网站根目录
    index index.html index.htm; # 默认首页文件

    location / {
        try_files $uri $uri/ =404; # 尝试查找请求的文件或目录,如果不存在返回404
    }

    error_page 404 /404.html; # 自定义404错误页面
    location = /404.html {
        root /usr/share/nginx/errors; # 自定义错误页面存放位置
    }
}
SSL/TLS 配置示例
server {
    listen 443 ssl; # 监听SSL端口
    server_name example.com;

    ssl_certificate /etc/nginx/ssl/example.com.crt; # SSL证书路径
    ssl_certificate_key /etc/nginx/ssl/example.com.key; # SSL证书密钥路径

    ssl_protocols TLSv1.2 TLSv1.3; # 启用的SSL协议版本
    ssl_ciphers HIGH:!aNULL:!MD5; # 使用的加密套件
    ssl_prefer_server_ciphers on; # 强制服务器选择加密套件

    ssl_session_cache shared:SSL:10m; # 设置共享缓存
    ssl_session_timeout 10m; # 设置会话超时时间

    ssl_stapling on; # 启用OCSP stapling
    ssl_stapling_verify on; # 启用OCSP stapling验证
    resolver 8.8.8.8 8.8.4.4 valid=300s; # 设置DNS解析器
    resolver_timeout 5s; # 设置DNS解析超时时间

    location / {
        root /usr/share/nginx/html;
        index index.html index.htm;
    }
}
  • ssl_certificate 和 ssl_certificate_key:指定SSL证书和密钥路径。
  • ssl_protocols:启用的SSL协议版本,建议仅启用TLSv1.2及以上版本。
  • ssl_ciphers:指定使用的加密套件。
  • ssl_prefer_server_ciphers:强制服务器选择加密套件。
  • ssl_session_cache:设置共享缓存以提高SSL会话复用效率。
  • ssl_session_timeout:设置会话超时时间。
  • ssl_stapling 和 ssl_stapling_verify:启用OCSP stapling以提高证书验证效率。
  • resolver 和 resolver_timeout:设置DNS解析器和超时时间。
反向代理配置
server {
    listen 80;
    server_name proxy.example.com;

    location / {
        proxy_pass http://backend_server; # 转发请求到后台服务器
        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;

        proxy_connect_timeout 60s; # 设置连接超时时间
        proxy_read_timeout 60s; # 设置读取超时时间
        proxy_send_timeout 60s; # 设置发送超时时间

        proxy_buffer_size 128k; # 设置代理缓冲区大小
        proxy_buffers 4 256k; # 设置代理缓冲区数量和大小
        proxy_busy_buffers_size 256k; # 设置忙时缓冲区大小
        proxy_temp_file_write_size 512k; # 设置临时文件写入大小

        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; # 设置故障转移策略
    }
}
  • proxy_pass:转发请求到后台服务器。
  • proxy_set_header:设置转发头信息,以便后台服务器获取客户端的真实信息。
  • proxy_connect_timeoutproxy_read_timeoutproxy_send_timeout:设置连接、读取和发送超时时间。
  • proxy_buffer_sizeproxy_buffersproxy_busy_buffers_sizeproxy_temp_file_write_size:设置代理缓冲区相关参数。
  • proxy_next_upstream:设置故障转移策略,当出现指定错误时尝试下一个上游服务器。
负载均衡配置
upstream backend_servers {
    server backend1.example.com weight=3; # 权重分配
    server backend2.example.com;
    server backend3.example.com;

    least_conn; # 使用最少连接策略
    hash $remote_addr consistent; # 使用一致性哈希算法

    keepalive 32; # 保持活动连接池大小
}

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

    location / {
        proxy_pass http://backend_servers;
        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;
    }
}
  • upstream:定义一组上游服务器。
  • weight:设置服务器权重,权重高的服务器接收更多请求。
  • least_conn:使用最少连接策略,优先选择当前连接数最少的服务器。
  • hash:使用一致性哈希算法,确保相同客户端请求总是被分发到同一台服务器。
  • keepalive:保持活动连接池大小,减少TCP连接建立的开销。

4. 高级用法

缓存配置
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

server {
    location / {
        proxy_cache my_cache;
        proxy_pass http://backend_server;
        proxy_cache_valid 200 302 10m; # 缓存状态码200和302响应10分钟
        proxy_cache_valid 404 1m; # 缓存状态码404响应1分钟
        add_header X-Cache-Status $upstream_cache_status; # 添加缓存状态头部

        proxy_cache_methods GET HEAD; # 仅缓存GET和HEAD请求
        proxy_cache_min_uses 3; # 请求至少三次才缓存
        proxy_cache_lock on; # 启用缓存锁,避免缓存穿透
        proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; # 使用过期缓存应对错误
    }
}
  • proxy_cache_path:定义缓存路径、层级结构、键空间、最大大小和不活跃时间。
  • proxy_cache:启用缓存并指定缓存区域。
  • proxy_cache_valid:设置不同状态码的缓存时间。
  • add_header:添加自定义响应头,方便调试和监控。
  • proxy_cache_methods:仅缓存特定HTTP方法的请求。
  • proxy_cache_min_uses:请求至少几次才缓存。
  • proxy_cache_lock:启用缓存锁,避免缓存穿透。
  • proxy_cache_use_stale:在某些情况下使用过期缓存,提高可用性。
访问控制
location /admin/ {
    allow 192.168.1.0/24; # 允许特定IP段访问
    deny all; # 拒绝其他所有IP访问

    auth_basic "Restricted Area"; # 启用基本认证
    auth_basic_user_file /etc/nginx/.htpasswd; # 指定密码文件

    satisfy any; # 满足任一条件即可访问
}
  • allow 和 deny:基于IP地址的访问控制。
  • auth_basic 和 auth_basic_user_file:启用基本认证并指定密码文件。
  • satisfy any:满足任一条件即可访问,即允许通过IP白名单或用户名密码认证。
限流配置
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

server {
    location /search/ {
        limit_req zone=one burst=5 nodelay; # 设置每秒请求数限制,并允许突发5个请求

        limit_req_status 503; # 设置限流状态码
        limit_conn_zone $binary_remote_addr zone=addr:10m; # 定义连接限制区域
        limit_conn addr 10; # 每个IP最多10个并发连接
    }
}
  • limit_req_zone:定义限流区域和速率。
  • limit_req:应用限流规则,指定区域、突发容量和是否延迟处理。
  • limit_req_status:设置限流状态码。
  • limit_conn_zone:定义连接限制区域。
  • limit_conn:应用连接限制规则,指定区域和最大连接数。

注意事项

       在修改完配置后,通过nginx -t命令检查配置文件的有效性,并使用nginx -s reload重新加载配置以应用更改生效。

相关文章:

  • 加入二极管的NE555 PWM 电路
  • 使用python实现线性回归
  • 修改DOSBox的窗口大小
  • 启动你的RocketMQ之旅(四)-Producer启动和发送流程(下)
  • 国产开源AI平台Cherry Studio详解:联网搜索升级与ChatBox对比指南
  • spring.profiles.active和spring.profiles.include的使用及区别说明
  • 基于html的俄罗斯方块小游戏(附程序)
  • MCAL-I/O驱动
  • 考研408数据结构第三章(栈、队列和数组)核心易错点深度解析
  • 01_NLP基础之文本处理的基本方法
  • 附录-Python — 包下载缓慢,配置下载镜像
  • 河南理工XCPC萌新选拔赛
  • SEO长尾词优化进阶法则
  • 【3天快速入门WPF】11-附加属性
  • 绪论(3)
  • AtCoder Beginner Contest 001(A - 積雪深差、B - 視程の通報、C - 風力観測、D - 感雨時刻の整理)题解
  • 如何通过Python网络爬虫技术应对复杂的反爬机制?
  • 物联网同RFID功能形态 使用场景的替代品
  • Mac OS Homebrew更换国内镜像源(中科大;阿里;清华)
  • 数据结构秘籍(四) 堆 (详细包含用途、分类、存储、操作等)
  • 南阳网站推广效果/福建seo关键词优化外包
  • 网站建设策划书是由谁编写的/百度搜索引擎算法
  • 如何做wap网站/百度官方
  • 东莞制作手机网站/常见的网络推广方式
  • 手机网站被拦截怎么解除/女生学电子商务好吗
  • 有什么比较好的做海报网站/一媒体app软件下载老版本