运维锅总详解Nginx

本文尝试从Nginx特性及优缺点、为什么具有文中所述的优缺点、Nginx工作流程、Nginx最佳实践及历史演进等角度对其进行详细分析。希望对您有所帮助。

Nginx特性及优缺点

Nginx简介

Nginx(发音为 “engine-x”)是一款高性能的开源Web服务器及反向代理服务器,也可以用作IMAP/POP3/SMTP邮件代理服务器。Nginx由Igor Sysoev于2002年开始开发,2004年正式发布。由于其高性能、稳定性和低系统资源消耗,Nginx迅速成为了全球最受欢迎的Web服务器之一。

Nginx的特点

  1. 高并发连接处理能力

    • Nginx采用事件驱动(asynchronous)架构,可以处理数以千计的并发连接,这使得它非常适合高并发请求的场景。
  2. 反向代理和负载均衡

    • Nginx可以作为反向代理服务器,将客户端请求分发到后端服务器,并支持多种负载均衡算法(如轮询、最小连接数、IP哈希等),以提高系统的扩展性和稳定性。
  3. 静态内容处理

    • Nginx在处理静态内容(如HTML、CSS、JavaScript、图片等)时表现出色,具有快速的文件处理能力。
  4. 模块化架构

    • Nginx采用模块化设计,可以根据需求加载和卸载不同的模块,从而扩展其功能。
  5. 低资源消耗

    • Nginx以其低内存和CPU消耗著称,适合在资源有限的环境中运行。
  6. 灵活的配置

    • Nginx的配置文件语法简洁且灵活,支持使用正则表达式进行复杂的请求重写和路由。
  7. SSL/TLS支持

    • Nginx具有完善的SSL/TLS支持,可以实现安全的HTTPS连接。
  8. 缓存功能

    • Nginx可以缓存后端服务器的响应,从而减少服务器负载和提高响应速度。

Nginx的优点

  1. 高性能

    • Nginx在高并发场景下表现卓越,能够处理大量并发连接而保持低资源消耗。
  2. 稳定性

    • Nginx以其高稳定性著称,适用于大规模的生产环境。
  3. 灵活性

    • Nginx的配置和扩展非常灵活,可以满足各种复杂场景的需求。
  4. 丰富的功能

    • 反向代理、负载均衡、静态文件处理、SSL/TLS支持、缓存功能等,使得Nginx成为功能强大的Web服务器。
  5. 社区支持

    • Nginx拥有庞大的用户社区和丰富的文档资源,用户可以方便地获取支持和帮助。

Nginx的缺点

  1. 学习曲线

    • 尽管Nginx配置灵活,但对于初学者来说,其配置语法和概念可能需要一些时间来掌握。
  2. 动态内容处理能力有限

    • 与Apache相比,Nginx的动态内容处理能力(如通过CGI、FastCGI等)相对较弱,需要依赖其他应用服务器(如PHP-FPM、Unicorn等)来处理。
  3. 模块支持不如Apache

    • 尽管Nginx有许多模块,但其第三方模块支持和数量不如Apache丰富。
  4. 配置变更重载

    • 每次修改配置文件后,Nginx需要重载配置,这可能会导致服务短暂中断。

总结

Nginx以其高性能、稳定性和灵活性在Web服务器和反向代理服务器领域占据了重要地位。虽然在某些方面(如动态内容处理和模块支持)可能不如Apache,但其优异的并发处理能力和低资源消耗使其成为处理高流量网站和应用的理想选择。

Nginx为什么具有上述优点

Nginx能够实现上述特性的原因主要归功于其独特的设计和架构。以下是一些关键原因:

1. 事件驱动架构

Nginx采用事件驱动(event-driven)的非阻塞架构,这使得它能够处理大量的并发连接,而不会因为等待I/O操作而阻塞。这种架构的优点包括:

  • 高并发处理能力:Nginx使用epoll(在Linux上)或kqueue(在FreeBSD上)等高效的事件通知机制,可以同时处理数以万计的并发连接。
  • 低资源消耗:非阻塞I/O和事件驱动的方式减少了每个连接的资源占用,尤其是内存和CPU。

2. 多进程模型

Nginx采用了多进程模型,其中包括一个主进程和多个工作进程。主进程负责管理配置和监控工作进程,而工作进程负责实际处理客户端请求。优点包括:

  • 稳定性和可靠性:即使一个工作进程崩溃,主进程仍然可以启动新的工作进程,保证服务的持续运行。
  • 高效利用多核CPU:多个工作进程可以分布在多个CPU核心上,充分利用现代多核处理器的优势。

3. 模块化设计

Nginx的模块化架构使其能够灵活地加载和卸载各种功能模块。每个模块负责特定的功能,如HTTP处理、反向代理、负载均衡、SSL/TLS支持等。这种设计带来了以下优点:

  • 可扩展性:可以根据需要添加或移除功能模块,满足不同的应用需求。
  • 易于维护:模块化设计使得代码更加清晰和可维护,方便开发和调试。

4. 高效的静态文件处理

Nginx在处理静态文件时表现出色,这得益于其优化的文件I/O操作和高效的缓存机制。具体来说:

  • 异步非阻塞I/O:利用操作系统提供的异步I/O接口,减少了文件I/O操作的阻塞时间。
  • 文件缓存:Nginx可以将静态文件缓存到内存中,加速后续的文件请求响应。

5. 强大的反向代理和负载均衡能力

Nginx内置了强大的反向代理和负载均衡功能,这主要是通过以下机制实现的:

  • 多种负载均衡算法:支持轮询、最小连接数、IP哈希等多种负载均衡算法,根据实际需求选择合适的策略。
  • 健康检查:定期检查后端服务器的健康状态,自动将故障服务器从负载均衡池中移除,提高系统的可用性。
  • 请求缓存:可以缓存后端服务器的响应,减少后端服务器的负载和请求延迟。

6. 灵活的配置和高效的重载机制

Nginx的配置文件语法简洁且灵活,支持复杂的请求路由和重写规则。同时,Nginx支持平滑重载配置文件,这使得配置变更无需停止服务,从而减少了服务中断时间。

7. SSL/TLS支持

Nginx内置了对SSL/TLS的支持,并进行了高度优化,可以提供安全的HTTPS连接。其优化措施包括:

  • 会话缓存:缓存SSL会话,减少握手的开销。
  • 硬件加速:支持利用硬件加速(如Intel AES-NI)来加速加密和解密操作。

8. 强大的社区和开发支持

Nginx拥有一个活跃的开发社区和强大的商业支持(Nginx Plus),这意味着它能够持续改进和更新,保持领先的技术优势。

综上所述,Nginx通过其高效的架构设计、灵活的模块化设计和优化的性能表现,实现了高并发处理能力、稳定性、低资源消耗等特点,成为Web服务器和反向代理服务器领域的重要选择。

Nginx为什么具有上述缺点

Nginx的缺点主要与其设计决策和特定功能的实现有关。以下是Nginx存在上述缺点的原因:

1. 学习曲线陡峭

原因

  • 配置复杂:尽管Nginx的配置文件语法简洁,但要充分利用其高级功能,用户需要掌握很多配置细节和高级用法。这对于新手来说,可能需要一定的学习时间。
  • 广泛的应用场景:Nginx可以用于多种应用场景(如Web服务器、反向代理、负载均衡等),每种应用场景都有其特定的配置和优化方式。

2. 动态内容处理

原因

  • 设计理念:Nginx最初设计的目标是高性能的静态内容服务和反向代理,而不是直接处理动态内容。处理动态内容的任务通常交给专门的应用服务器(如PHP-FPM、Unicorn等)。
  • 外部依赖:处理动态内容时,Nginx需要依赖外部的应用服务器,这增加了系统的复杂性和配置工作。

3. 第三方模块支持较少

原因

  • 开发社区和历史:虽然Nginx有很多第三方模块,但与Apache相比,其历史相对较短,模块生态系统不如Apache丰富。
  • 模块加载方式:Nginx不支持动态加载模块,所有模块必须在编译时编译进Nginx,这使得模块的安装和更新变得复杂。

4. 配置变更需要重载

原因

  • 进程模型:Nginx采用多进程模型,配置文件的变更需要通知主进程重新加载配置,并以无缝重启的方式应用新的配置。虽然Nginx的平滑重载机制已经尽量减少了服务中断时间,但仍然可能造成短暂的中断。
  • 设计权衡:为了保证配置变更的一致性和稳定性,Nginx选择了重载配置的方式,而不是在运行时动态应用配置变更。

总结

Nginx的缺点主要源自其设计决策和实现方式。这些缺点在一定程度上是高性能、稳定性和低资源消耗等优点的代价。用户在使用Nginx时,需要权衡这些优缺点,根据具体需求选择合适的工具和配置策略。例如,对于高性能和高并发需求的场景,Nginx是一个理想的选择,而对于需要直接处理动态内容的场景,可能需要配合其他应用服务器来使用。

Nginx工作流程

绘制Nginx工作流程的Mermaid图有助于理解其内部工作机制。以下是一个示例Mermaid图,展示了Nginx从接收请求到返回响应的工作流程:

静态文件
动态请求
客户端请求
监听端口
请求处理
是否缓存
从缓存读取响应
请求类型
读取静态文件
反向代理到后端服务器
后端服务器处理请求
后端服务器返回响应
存储响应到缓存
发送响应给客户端

这个图示详细说明了Nginx在接收到客户端请求后的处理流程:

  1. 客户端请求:客户端发出请求。
  2. 监听端口:Nginx监听特定端口(如80或443)接收请求。
  3. 请求处理:Nginx处理收到的请求。
  4. 是否缓存:检查请求的响应是否已缓存。
    • 如果是,直接从缓存读取响应。
    • 如果否,根据请求类型进行处理。
  5. 请求类型:检查请求是静态文件请求还是动态请求。
    • 静态文件请求:读取静态文件。
    • 动态请求:将请求反向代理到后端服务器。
  6. 后端服务器处理请求:后端服务器处理动态请求。
  7. 后端服务器返回响应:后端服务器返回处理结果。
  8. 存储响应到缓存:将响应存储到缓存中(如果配置了缓存)。
  9. 发送响应给客户端:将最终的响应发送回客户端。

你可以将这个Mermaid图粘贴到任何支持Mermaid图表的工具或Markdown编辑器中,生成可视化的Nginx工作流程图。

Nginx最佳实践

在生产环境中使用Nginx时,可以采用一些最佳实践配置来提高性能、安全性和稳定性。以下是一些常见的最佳实践配置示例:

1. 基础配置

配置文件结构

将配置文件分解为多个独立文件,便于管理和维护。例如,使用nginx.conf作为主配置文件,并将各个站点和模块的配置放在独立的文件中:

# /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
    worker_connections 1024;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

2. 反向代理和负载均衡

反向代理基本配置

使用反向代理将请求转发到后端服务器:

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;
        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 backend {
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}

server {
    listen 80;
    server_name example.com;

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

3. SSL/TLS配置

基本HTTPS配置

启用HTTPS并使用强加密:

server {
    listen 443 ssl;
    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;
    ssl_ciphers 'HIGH:!aNULL:!MD5';

    location / {
        root /var/www/html;
        index index.html index.htm;
    }
}
强化SSL安全性

添加HTTP/2支持和更强的安全配置:

server {
    listen 443 ssl http2;
    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;
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1h;
    ssl_session_tickets off;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;

    location / {
        root /var/www/html;
        index index.html index.htm;
    }
}

4. 缓存配置

启用代理缓存

设置缓存路径和缓存规则:

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_cache my_cache;
        proxy_cache_valid 200 1h;
        proxy_cache_valid 404 1m;
        proxy_pass http://backend;
        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;
    }
}

5. Gzip压缩

启用Gzip压缩

减少传输内容大小,提高传输效率:

http {
    gzip on;
    gzip_disable "msie6";

    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    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;
    include /etc/nginx/sites-enabled/*;
}

6. 安全配置

基础安全头

添加安全相关的HTTP头部:

server {
    listen 80;
    server_name example.com;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    location / {
        root /var/www/html;
        index index.html index.htm;
    }
}

7. 日志配置

自定义日志格式

定义并使用自定义的访问日志格式:

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;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

这些配置示例展示了一些Nginx在生产环境中的最佳实践,包括基本配置、反向代理、负载均衡、SSL/TLS、缓存、Gzip压缩、安全配置和日志配置。

还有一些其他的最佳实践配置,可以进一步优化Nginx在生产环境中的性能和安全性。

8. 限制请求速率

限制请求速率可以防止恶意用户发起大量请求,保护服务器资源:

http {
    # 定义请求速率限制区域
    limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;

    server {
        listen 80;
        server_name example.com;

        location / {
            # 应用请求速率限制
            limit_req zone=one burst=20 nodelay;
            proxy_pass http://backend;
            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;
        }
    }
}

9. 连接限制

限制每个IP地址的并发连接数,防止单个IP地址占用过多资源:

http {
    # 定义连接限制区域
    limit_conn_zone $binary_remote_addr zone=addr:10m;

    server {
        listen 80;
        server_name example.com;

        location / {
            # 应用连接限制
            limit_conn addr 10;
            proxy_pass http://backend;
            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;
        }
    }
}

10. 客户端超时设置

合理设置客户端请求和响应超时,避免长时间占用连接资源:

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

        client_body_timeout 12;
        client_header_timeout 12;
        send_timeout 10;

        location / {
            proxy_pass http://backend;
            proxy_read_timeout 30;
            proxy_connect_timeout 30;
            proxy_send_timeout 30;
            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;
        }
    }
}

11. 使用HTTP/2

启用HTTP/2可以提高性能,特别是在处理大量小文件时:

server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;

    location / {
        root /var/www/html;
        index index.html index.htm;
    }
}

12. 动态压缩和缓存

使用动态内容压缩和缓存来提高性能:

http {
    gzip on;
    gzip_disable "msie6";

    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_cache my_cache;
            proxy_cache_valid 200 1h;
            proxy_cache_valid 404 1m;
            proxy_pass http://backend;
            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;
        }
    }
}

13. 防止热链接

防止其他网站直接链接你的静态资源,消耗带宽:

server {
    listen 80;
    server_name example.com;

    location / {
        root /var/www/html;
        index index.html index.htm;
    }

    location ~ \.(jpg|jpeg|png|gif)$ {
        valid_referers none blocked example.com *.example.com;
        if ($invalid_referer) {
            return 403;
        }
    }
}

14. 日志分割

将错误日志和访问日志分开,便于问题排查和分析:

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 warn;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

15. 监控和统计

使用第三方工具或模块,如Nginx Amplify、Datadog或VTS模块,进行性能监控和统计:

# Example using VTS module
http {
    vhost_traffic_status_zone;

    server {
        listen 80;
        server_name example.com;

        location /status {
            vhost_traffic_status_display;
            vhost_traffic_status_display_format html;
        }

        location / {
            root /var/www/html;
            index index.html index.htm;
        }
    }
}

当然,还有一些更多的最佳实践配置可以进一步优化Nginx在生产环境中的性能、安全性和稳定性。以下是一些额外的最佳实践:

16. 防止DDoS攻击

限制每个IP的请求速率和连接数,以减缓或阻止DDoS攻击:

http {
    # 定义请求速率限制区域
    limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=5r/s;

    # 定义连接数限制区域
    limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;

    server {
        listen 80;
        server_name example.com;

        # 限制请求速率
        location / {
            limit_req zone=req_limit_per_ip burst=10 nodelay;
            limit_conn conn_limit_per_ip 10;
            proxy_pass http://backend;
            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;
        }
    }
}

17. 使用资源限制

限制每个工作进程的资源使用,防止单个请求占用过多资源:

worker_rlimit_nofile 100000;  # 设置每个工作进程可以打开的最大文件数

http {
    # 其它配置...
    server {
        listen 80;
        server_name example.com;

        location / {
            # 可能的资源限制设置
            limit_conn addr 10;
            limit_req zone=req_limit_per_ip burst=10;
            proxy_pass http://backend;
        }
    }
}

18. 优化反向代理缓存

进一步优化反向代理缓存配置,提高缓存效率:

http {
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
    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 1h;
            proxy_cache_valid 404 1m;
            proxy_cache_use_stale error timeout updating;
            proxy_pass http://backend;
            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;
        }
    }
}

19. 管理静态资源

优化静态资源的缓存策略,减少服务器负担:

server {
    listen 80;
    server_name example.com;

    location / {
        root /var/www/html;
        index index.html index.htm;
    }

    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        root /var/www/html;
        expires 30d;
        access_log off;
        add_header Cache-Control "public, must-revalidate, proxy-revalidate";
    }
}

20. 启用页面压缩和优化

启用页面压缩以减少传输数据量,并优化页面加载速度:

http {
    gzip on;
    gzip_disable "msie6";
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    # 启用压缩响应体
    gzip_static on;
    gzip_min_length 256;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

21. 使用IP黑名单

阻止特定IP地址或IP段访问服务器,增加安全性:

server {
    listen 80;
    server_name example.com;

    location / {
        deny 192.168.1.0/24;
        allow all;
        root /var/www/html;
        index index.html index.htm;
    }
}

22. 定期轮换和清理日志

配置日志轮换以防止日志文件过大,占用过多磁盘空间:

# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        if [ -f /run/nginx.pid ]; then
            kill -USR1 `cat /run/nginx.pid`
        fi
    endscript
}

23. 资源负载均衡

使用upstream定义更复杂的负载均衡策略:

upstream backend {
    server backend1.example.com weight=5;
    server backend2.example.com weight=5;
    server backend3.example.com weight=1;
    keepalive 16;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;
        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;
    }
}

24. 设置默认页面

配置自定义的404错误页面,提升用户体验:

server {
    listen 80;
    server_name example.com;

    location / {
        root /var/www/html;
        index index.html index.htm;
    }

    error_page 404 /404.html;
    location = /404.html {
        root /var/www/html;
        internal;
    }
}

25. 配置合理的文件上传限制

限制上传文件的大小,避免服务器资源被恶意占用:

server {
    listen 80;
    server_name example.com;

    client_max_body_size 10M;

    location / {
        root /var/www/html;
        index index.html index.htm;
    }
}

26. 配置 HTTP Strict Transport Security (HSTS)

HSTS 可以强制客户端使用 HTTPS 连接,增加安全性:

server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    location / {
        root /var/www/html;
        index index.html index.htm;
    }
}

27. 使用 Rate Limiting

对 API 或敏感资源使用速率限制,防止滥用:

http {
    limit_req_zone $binary_remote_addr zone=api_limit:10m rate=5r/s;

    server {
        listen 80;
        server_name example.com;

        location /api/ {
            limit_req zone=api_limit burst=10;
            proxy_pass http://backend;
            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;
        }
    }
}

28. 配置 Fail2ban

将 Nginx 与 Fail2ban 集成,自动阻止恶意 IP:

server {
    listen 80;
    server_name example.com;

    location / {
        root /var/www/html;
        index index.html index.htm;
    }

    # 记录拒绝访问的 IP 地址
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
}

Fail2ban 配置示例

# /etc/fail2ban/jail.local
[nginx-http-auth]
enabled = true
port    = http,https
filter  = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 3

[nginx-botsearch]
enabled = true
port    = http,https
filter  = nginx-botsearch
logpath = /var/log/nginx/access.log
maxretry = 5

29. 配置 Content Security Policy (CSP)

使用 CSP 防止 XSS 攻击:

server {
    listen 80;
    server_name example.com;

    add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://trusted.cdn.com; style-src 'self' https://trusted.cdn.com";

    location / {
        root /var/www/html;
        index index.html index.htm;
    }
}

30. 启用 Connection Pooling

对后端服务器启用连接池,减少连接建立开销:

http {
    upstream backend {
        server backend1.example.com;
        server backend2.example.com;
        keepalive 32;  # 启用连接池,保持32个长连接
    }

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://backend;
            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;
        }
    }
}

31. 监控健康检查

设置自定义的健康检查,以确保后端服务器的可用性:

http {
    upstream backend {
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com;

        keepalive 32;

        # 健康检查(需要第三方模块)
        health_check;
    }

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://backend;
            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;
        }
    }
}

32. 配置 WebSocket 支持

如果使用 WebSocket,确保配置支持 WebSocket 的代理:

server {
    listen 80;
    server_name example.com;

    location /ws/ {
        proxy_pass http://backend;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        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;
    }
}

33. 启用 tcp_nodelaytcp_nopush

优化 TCP 传输设置,提高性能:

http {
    tcp_nopush on;
    tcp_nodelay on;

    server {
        listen 80;
        server_name example.com;

        location / {
            root /var/www/html;
            index index.html index.htm;
        }
    }
}

34. 设置 worker_processesworker_connections

合理设置 worker_processesworker_connections,以匹配系统资源:

worker_processes auto;
worker_connections 1024;  # 根据服务器的负载和硬件资源调整

35. 配置 proxy_set_header 以确保正确的客户端 IP

确保正确传递客户端 IP 和原始请求头信息:

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;
        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;
    }
}

36. 使用 try_files 指令处理文件请求

优化静态文件的处理,避免不必要的内部重定向:

server {
    listen 80;
    server_name example.com;

    location / {
        root /var/www/html;
        try_files $uri $uri/ =404;
    }
}

37. 启用 rewrite_log 进行调试

启用重写日志帮助调试 URL 重写问题(仅在调试时启用):

http {
    rewrite_log on;
    server {
        listen 80;
        server_name example.com;

        location / {
            root /var/www/html;
            try_files $uri $uri/ =404;
        }
    }
}

38. 配置 Nginx 与 CDN 集成

将请求转发到 CDN,提高静态资源的分发效率:

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://cdn.example.com;
        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;
    }
}

39. 启用 Logging 轮转

使用 logrotate 配置定期轮转日志文件,保持日志文件的大小可控:

# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        if [ -f /run/nginx.pid ]; then
            kill -USR1 `cat /run/nginx.pid`
        fi
    endscript
}

40. 配置 include 指令管理复杂配置

使用 include 指令将不同的配置分到不同的文件,保持主配置文件简洁:

# /etc/nginx/nginx.conf
http {
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

41. 配置 DNS 解析

确保 Nginx 能够快速和可靠地解析 DNS 名称,避免连接延迟:

http {
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 10s;

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://backend;
            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;
        }
    }
}

42. 限制最大请求体大小

防止大请求体导致服务器资源被耗尽:

server {
    listen 80;
    server_name example.com;

    client_max_body_size 10M;  # 限制请求体最大为10MB

    location / {
        root /var/www/html;
        index index.html index.htm;
    }
}

43. 实现 URL 重写

根据需要重写 URL,以适应应用程序的要求:

server {
    listen 80;
    server_name example.com;

    location / {
        rewrite ^/old_path/(.*)$ /new_path/$1 permanent;
        root /var/www/html;
        index index.html index.htm;
    }
}

44. 优化 fastcgi 配置

对于使用 FastCGI 的应用程序,优化 FastCGI 配置以提高性能:

server {
    listen 80;
    server_name example.com;

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
    }
}

45. 使用 try_files 避免不必要的内部重定向

处理静态资源时使用 try_files 以避免不必要的内部重定向:

server {
    listen 80;
    server_name example.com;

    location / {
        root /var/www/html;
        try_files $uri $uri/ =404;
    }
}

46. 配置 denyallow 访问控制

基于 IP 地址进行访问控制,限制对敏感资源的访问:

server {
    listen 80;
    server_name example.com;

    location /admin {
        deny all;
        allow 192.168.1.0/24;  # 允许特定 IP 范围访问
        root /var/www/html;
        index index.html index.htm;
    }
}

47. 使用 rewrite 优化 SEO

对 SEO 友好的 URL 进行重写,优化搜索引擎的爬取:

server {
    listen 80;
    server_name example.com;

    location / {
        rewrite ^/products/([0-9]+)$ /product.php?id=$1 last;
        root /var/www/html;
        index index.html index.htm;
    }
}

48. 启用 proxy_buffering

在使用反向代理时启用 proxy_buffering 来优化缓存和性能:

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;
        proxy_buffering on;
        proxy_buffers 8 16k;
        proxy_buffer_size 32k;
        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;
    }
}

49. 配置 proxy_hide_header

隐藏或转发特定的 HTTP 响应头:

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;
        proxy_hide_header X-Powered-By;
        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;
    }
}

50. 启用 ssl_prefer_server_ciphers

强制使用服务器端的加密套件,提高 SSL/TLS 安全性:

server {
    listen 443 ssl http2;
    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;
    ssl_prefer_server_ciphers on;
    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';

    location / {
        root /var/www/html;
        index index.html index.htm;
    }
}

51. 配置 http2alpn

启用 HTTP/2 和 ALPN(应用层协议协商)以提高 HTTPS 性能:

server {
    listen 443 ssl http2;
    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;
    ssl_prefer_server_ciphers on;

    location / {
        root /var/www/html;
        index index.html index.htm;
    }
}

52. 配置 access_log 的日志级别

根据需要调整访问日志的详细程度:

server {
    listen 80;
    server_name example.com;

    access_log /var/log/nginx/access.log main;  # 使用 main 日志格式
    error_log /var/log/nginx/error.log warn;

    location / {
        root /var/www/html;
        index index.html index.htm;
    }
}

53. 配置 proxy_max_temp_file_size

控制代理缓存的临时文件大小:

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;
        proxy_max_temp_file_size 10m;  # 限制临时文件最大为10MB
        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;
    }
}

54. 配置 http { 的默认值

http 配置块中设置一些默认值,以便适用于所有服务器块:

http {
    include       mime.types;
    default_type  application/octet-stream;

    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 warn;

    # 其它 http 相关配置...
}

这些额外的最佳实践配置进一步增强了 Nginx 的性能、安全性和可维护性。通过根据具体的应用需求和环境特点,合理配置这些参数,可以显著提高 Nginx 服务器的稳定性、性能和安全性。

Nginx历史演进

最后,讲一下Nginx历史。Nginx的历史演进涵盖了其从最初版本到成为全球流行的高性能Web服务器和反向代理服务器的整个过程。以下是Nginx的主要历史演变阶段:

1. 初期开发(2002-2004)

  • 2002年: Igor Sysoev 开始开发 Nginx,最初目的是为了替代当时俄罗斯最大的新闻网站的现有Web服务器。Nginx的设计理念是为了高性能和高并发。

  • 2004年: Nginx的第一个正式版本发布。Nginx 0.1.0 版本发布,主要功能包括反向代理、负载均衡、支持FastCGI、AJP 以及HTTP、HTTPS协议。

2. 成熟阶段(2005-2008)

  • 2005年: Nginx 0.5.0 版本发布,引入了支持HTTP和HTTPS的反向代理功能,并开始支持更多的配置选项和模块。

  • 2007年: Nginx 0.6.0 版本发布,引入了对多个代理缓存的支持,以及对WebSocket的初步支持。

  • 2008年: Nginx 0.7.0 版本发布,增加了对IPv6的支持,并加入了负载均衡和流量控制等更多的功能。

3. 广泛应用阶段(2009-2013)

  • 2009年: Nginx 0.8.0 版本发布,增加了对SNI(Server Name Indication)的支持,使得多个SSL证书可以在同一IP上使用。

  • 2010年: Nginx 0.8.50 版本发布,Nginx开始支持HTTP/1.1,并进一步提升了性能和稳定性。

  • 2011年: Nginx 1.0.0 版本发布,标志着Nginx的正式稳定版的发布。这个版本引入了改进的性能特性和更多的模块,进一步推动了Nginx在生产环境中的使用。

  • 2012年: Nginx 1.2.0 版本发布,增加了对HTTP缓存的改进、改进了对SSL/TLS的支持,并引入了更多的负载均衡策略。

4. 快速发展阶段(2014-2018)

  • 2014年: Nginx 1.6.0 版本发布,增加了更多的模块,如动态模块的支持,以及增强了对HTTP/2的支持。

  • 2015年: Nginx 1.8.0 版本发布,包含了对更多HTTP/2特性的支持,如流量控制和头压缩。

  • 2016年: Nginx 1.10.0 版本发布,加入了更多的安全特性,包括改进的TLS支持。

  • 2017年: Nginx 1.12.0 版本发布,增强了对HTTP/2的支持,进一步改进了性能和安全性。

  • 2018年: Nginx 1.14.0 版本发布,增加了对更多缓存和压缩特性的支持,并改进了对动态模块的支持。

5. Nginx Plus 和商业化(2015-至今)

  • 2015年: Nginx Inc. 推出了 Nginx Plus,这是一个商业版本,提供了更多企业级的功能,如高级监控、负载均衡、以及技术支持等。

  • 2016年: Nginx Plus 1.11 版本发布,增加了对更多云环境的支持,包括AWS和Azure等。

  • 2019年: Nginx 1.16.0 版本发布,引入了更多的安全和性能优化,包括更好的HTTP/2支持和增强的负载均衡功能。

  • 2020年: Nginx 1.18.0 版本发布,进一步增强了对TLS 1.3的支持,并改进了对更多协议的兼容性。

  • 2021年: Nginx 1.20.0 版本发布,继续增强了性能、安全性,并引入了更多的功能,如改进的TLS协议支持和更多的动态模块支持。

6. 最新发展(2022-至今)

  • 2022年: Nginx 1.22.0 版本发布,进一步改进了性能,增加了更多对现代Web应用的支持,如更好的HTTP/3支持。

  • 2023年: Nginx 1.24.0 版本发布,继续增强对最新Web标准的支持,同时改进了容器化和微服务环境下的性能。

  • Nginx 3.0+: 未来版本将继续加强对云环境、微服务、以及现代Web应用的支持,提升性能和安全性。

主要里程碑总结

  1. 2004年: 首个正式版本发布。
  2. 2007年: 开始支持IPv6和更复杂的配置。
  3. 2011年: Nginx 1.0.0 发布,标志稳定版本的发布。
  4. 2015年: 推出 Nginx Plus,开始商业化。
  5. 2020年: 引入对最新TLS协议的支持。
  6. 2023年: 继续推进对最新Web标准的支持。

Nginx的历史演进展示了其从一个简单的高性能Web服务器逐步发展成一个功能强大、支持现代Web应用的综合解决方案的过程。随着技术的发展和用户需求的变化,Nginx继续在性能、安全性和功能性上不断改进和创新。

完。

一个秘密

希望对您有用!关注锅总,及时获得更多花里胡哨的运维实用操作!

图片

锅总个人博客

https://gentlewok.blog.csdn.net/

锅总微信公众号

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

锅总

谢谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值