Nginx(六)

发布于:2024-10-18 ⋅ 阅读:(6) ⋅ 点赞:(0)

Nginx优化

# 用户和组
user www www;  # 指定 Nginx 运行的用户和组

# 隐藏服务器版本号
server_tokens off;  # 关闭服务器版本号显示,增强安全性

# 进程数设置为 CPU 核心数
worker_processes auto;  # 自动检测 CPU 核心数并设置相应的工作进程数

# CPU 亲和力设置
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;  # 将每个工作进程绑定到特定的 CPU 核心上,减少上下文切换

# 最大打开文件数,与 ulimit -n 保持一致
worker_rlimit_nofile 65535;  # 设置每个工作进程可以打开的最大文件描述符数

# 错误日志定义
error_log /var/log/nginx/error.log warn;  # 设置错误日志的路径和级别

# 进程文件
pid /var/run/nginx.pid;  # 设置 Nginx 进程 ID 文件的路径

# 事件模块配置
events {
    use epoll;  # 使用 epoll 事件模型,适用于 Linux 系统
    worker_connections 65535;  # 每个工作进程可以处理的最大连接数
}

# HTTP 模块配置
http {
    include mime.types;  # 包含 MIME 类型定义文件
    default_type application/octet-stream;  # 设置默认的 MIME 类型
    charset utf-8;  # 设置默认字符集为 UTF-8

    # 优化 Nginx 处理客户端请求的能力,特别是在处理大请求头和大请求体时
    server_names_hash_bucket_size 128;  # 设置 server_name 哈希表的桶大小,防止哈希冲突
    client_header_buffer_size 4k;  # 设置读取客户端请求头的缓冲区大小
    large_client_header_buffers 4 64k;  # 设置读取大型客户端请求头的缓冲区数量和大小
    client_max_body_size 8m;  # 设置客户端请求体的最大大小

    # 开启目录列表访问(仅在特定目录)
    location /public/ {
        autoindex on;  # 开启目录列表访问
        autoindex_exact_size on;  # 显示文件的确切大小
        autoindex_localtime on;  # 显示文件的本地时间
    }

    # 发送文件优化
    sendfile on;  # 启用 sendfile 优化,提高文件传输效率
    tcp_nopush on;  # 启用 TCP_NOPUSH 选项,减少网络拥塞
    tcp_nodelay on;  # 启用 TCP_NODELAY 选项,减少延迟

    # 连接超时时间
    keepalive_timeout 120;  # 设置保持连接的超时时间

    # 客户端请求头部的缓冲区大小
    client_header_buffer_size 32k;  # 设置读取客户端请求头的缓冲区大小

    # 打开文件缓存
    open_file_cache max=102400 inactive=20s;  # 设置打开文件缓存的最大文件数和缓存时间
    open_file_cache_valid 30s;  # 设置验证缓存有效性的频率
    open_file_cache_min_uses 1;  # 设置文件至少被访问的次数才被缓存

    # Gzip 压缩优化
    gzip on;  # 启用 Gzip 压缩
    gzip_min_length 256;  # 设置压缩的最小文件长度
    gzip_comp_level 5;  # 设置压缩级别
    gzip_types text/plain application/javascript application/json;  # 设置需要压缩的 MIME 类型

    # 定义限速 zone
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;  # 定义限速区域,每个 IP 每秒最多 1 个请求

    # 定义连接限制 zone
    limit_conn_zone $binary_remote_addr zone=perip:10m;  # 定义连接限制区域,每个 IP 最多 10 个并发连接

    # 服务器块配置
    server {
        listen 80;  # 监听 80 端口
        server_name www.wenzi.com;  # 设置服务器名称

        # 静态资源配置
        location / {
            root /var/www/wwwroot/wenzi.com;  # 设置网站根目录
            index index.html index.htm;  # 设置默认索引文件
        }

        # 设置静态文件缓存
        location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
            expires 30d;  # 设置静态文件的缓存时间为 30 天
            access_log off;  # 关闭访问日志
            add_header Cache-Control "public";  # 添加 Cache-Control 头

            # 防盗链和防爬虫优化
            valid_referers none blocked server_names ~\.(jpg|jpeg|png|gif|ico|css|js)$;  # 设置有效的 Referer
            if ($invalid_referer) {
                return 403;  # 如果 Referer 无效,返回 403 禁止访问
            }

            if ($http_user_agent ~* (bot|spider|crawl|slurp)) {
                return 403;  # 如果 User-Agent 匹配爬虫关键字,返回 403 禁止访问
            }
        }

        # 禁止通过 IP 地址访问网站
        if ($host = '') {
            return 444;  # 如果 Host 为空,返回 444 立即关闭连接
        }

        # 限制上传到资源目录的程序被访问
        location ~* ^/uploads/.*\.php$ {
            deny all;  # 禁止访问 uploads 目录下的 PHP 文件
        }

        # FastCGI 参数优化
        fastcgi_buffers 16 16k;  # 设置 FastCGI 缓冲区数量和大小
        fastcgi_buffer_size 32k;  # 设置 FastCGI 缓冲区大小
        fastcgi_cache_path /data/nginx/cache levels=1:2 keys_zone=FASTCGI:10m max_size=1g inactive=60m;  # 设置 FastCGI 缓存路径和参数

        # 处理 PHP 请求
        location ~ \.php$ {
            include fastcgi_params;  # 包含 FastCGI 参数文件
            fastcgi_pass unix:/run/php/php7.4-fpm.sock;  # 设置 FastCGI 代理地址
            fastcgi_index index.php;  # 设置默认的 PHP 索引文件
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  # 设置脚本文件路径

            # 启用 FastCGI 缓存
            fastcgi_cache FASTCGI;  # 启用 FastCGI 缓存
            fastcgi_cache_valid 200 60m;  # 设置缓存的有效时间
        }

        # 日志配置
        access_log /var/log/nginx/access.log main buffer=16k flush=10s;  # 设置访问日志的路径、格式、缓冲区大小和刷新间隔

        # 防止 DOS 攻击单 IP 并发连接的控制
        limit_conn perip 10;  # 限制每个 IP 地址的并发连接数为 10

        # 限制请求速率
        limit_req zone=one burst=10 nodelay;  # 限制请求速率,允许突发请求

        # 禁止恶意域名解析
        if ($host != 'www.wenzi.com') {
            return 444;  # 如果 Host 不是 www.wenzi.com,返回 444 立即关闭连接
        }

        # 配置错误页面
        error_page 404 /404.html;  # 设置 404 错误页面
        location = /404.html {
            internal;  # 设置 404 页面为内部页面
        }

        # 配置错误页面根据错误码指定网页反馈给用户
        error_page 500 502 503 504 /50x.html;  # 设置 500, 502, 503, 504 错误页面
        location = /50x.html {
            internal;  # 设置 500, 502, 503, 504 页面为内部页面
        }
    }

    # SSL 优化
    server {
        listen 443 ssl http2;  # 监听 443 端口,启用 SSL 和 HTTP/2
        server_name www.wenzi.com;  # 设置服务器名称
        ssl_certificate /etc/nginx/ssl/nginx.crt;  # 设置 SSL 证书路径
        ssl_certificate_key /etc/nginx/ssl/nginx.key;  # 设置 SSL 证书密钥路径
        ssl_protocols TLSv1.2 TLSv1.3;  # 设置支持的 SSL 协议版本
        ssl_ciphers HIGH:!aNULL:!MD5;  # 设置支持的加密套件

        # 其他 SSL 配置...
    }
}