nginxhttp 模块主要包括以下几类内容:

  1. 基础设置

    • 全局配置:涉及基本的服务器行为和默认设置。
    • 日志配置:配置访问日志和错误日志的格式和存储位置。
    • 文件处理:配置文件类型、默认 MIME 类型等。
  2. 性能优化

    • 缓存:包括内容缓存、代理缓存等。
    • 压缩:启用 Gzip 等压缩方式以减少传输数据量。
    • 连接管理:配置保持连接、超时等参数。
  3. 安全设置

    • SSL/TLS 配置:配置 HTTPS,指定证书路径和加密协议。
    • 访问控制:限制访问权限,如基于 IP 的访问控制。
    • 请求速率限制:限制请求速率以防止服务器过载和防止DDoS攻击。
    • 限制连接数:限制每个客户端或每个会话的最大连接数,保护服务器资源
  4. 代理和负载均衡

    • 反向代理:将请求转发到后台服务器。
    • 负载均衡:将请求分发到多个后台服务器。
  5. 重写和重定向

    • URL 重写:基于特定规则修改 URL。
    • 重定向:将请求重定向到另一个 URL。
  6. 静态和动态内容处理

    • 静态文件处理:配置如何处理静态文件,如设置缓存时间。
    • 动态内容处理:处理动态内容,如通过 FastCGI、uwsgi、proxy 等将请求传递给后台应用。
  7. 错误处理

    • 自定义错误页面:为不同的 HTTP 错误代码设置自定义错误页面。

分类说明

  1. 基础设置
    • include:包含其他配置文件。
    • default_type:设置默认 MIME 类型。
    • server:定义虚拟服务器。
    • location:定义请求的处理方式。
  2. 性能优化
    • sendfile:启用高效文件传输。
    • tcp_nopush:减少网络包的数量。
    • tcp_nodelay: 禁用 Nagle 算法,从而在有小的网络数据包时减少延迟,适用于需要低延迟的应用场景
    • keepalive_timeout:设置保持连接的超时时间。
    • gzip:启用 Gzip 压缩。
    • gzip_types:指定需要压缩的文件类型。
    • proxy_cache/proxy_cache_path:定义缓存路径、缓存区域大小和其他相关参数。
    • ssl_session_cache:配置 SSL 会话缓存。
    • ssl_session_timeout:设置 SSL 会话缓存的超时时间。
    • ssl_session_tickets:启用或禁用会话票据。
  3. 安全设置
    • ssl_certificate:指定 SSL 证书文件路径。
    • ssl_certificate_key:指定 SSL 证书密钥文件路径。
    • ssl_protocols:设置支持的 SSL/TLS 协议。
    • allow/deny:基于 IP 的访问控制。
    • limit_req_zone/limit_req: 设置共享内存区域和速率限制。
    • limit_conn_zonelimit_conn: 定义一个共享内存区域,存储每个键的连接数,应用连接数限制。
  4. 代理和负载均衡
    • proxy_pass:将请求转发到后台服务器。
    • proxy_set_header:设置代理请求的头部信息。
    • upstream:定义负载均衡的后台服务器组。
    • server(在 upstream 中):定义单个后台服务器。
  5. 重写和重定向
    • rewrite:基于正则表达式重写 URL。
    • return:返回特定的 HTTP 状态码或重定向到指定 URL。
  6. 静态和动态内容处理
    • root:设置根目录。
    • index:设置默认的索引文件。
    • expires:为静态文件设置缓存时间。
    • fastcgi_pass:将请求传递给 FastCGI 服务器。
    • uwsgi_pass:将请求传递给 uWSGI 服务器。
  7. 错误处理
    • error_page:指定自定义错误页面。
    • location(结合 error_page):定义错误页面的具体处理方式。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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;

sendfile on;
keepalive_timeout 65;
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

# 定义共享内存区域,名称为one,大小为10MB,按客户端IP地址限速
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

server {
listen 80;
server_name example.com;

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

# 应用请求速率限制
limit_req zone=one burst=5 nodelay;
}

location /api {
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;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
}

关于请求限制速率

可以防止恶意请求DDoS攻击。通过限制每个IP地址的请求速率,可以有效减少恶意用户和机器人对服务器的攻击,保护服务器资源。还可以优化服务器性能资源利用率。在流量高峰期,通过控制每个IP地址的请求速率,避免单个用户占用过多资源,确保所有用户都能获得较好的访问体验

limit_req_zone 指令在 http 块中定义,它指定一个共享内存区域用于存储速率限制信息。它通常与 limit_req 指令一起使用,后者在特定的 serverlocation 块中应用速率限制。

用法:

1
limit_req_zone key zone=name:size rate=rate;

key:用于区分客户端的变量,例如 $binary_remote_addr 表示客户端的 IP 地址。

zone=name:size:共享内存区域的名称和大小,用于存储速率限制信息。

rate=rate:指定允许的请求速率,例如 1r/s 表示每秒 1 个请求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
http {
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;

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

location /api {
limit_req zone=mylimit burst=20 delay=10;
proxy_pass http://backend_api_server;
}

error_page 503 /rate_limit.html;
location = /rate_limit.html {
root /usr/share/nginx/html;
internal;
}
}
}

  • limit_req_zone
    • $binary_remote_addr:使用客户端的二进制远程地址作为键值。
    • zone=one:10m:定义一个名为 one 的共享内存区域,大小为 10MB。
    • rate=1r/s:每秒允许一个请求。
  • limit_req
    • zone=one:使用名为 one 的共享内存区域。
    • burst=5:允许瞬间突发的请求数量。即在超出速率限制时,额外允许 5 个请求。
    • nodelay:立即处理突发的请求,不进行排队。
  • error_page 503
    • 自定义错误页面,当请求被限制时,返回 503 状态码并显示 /rate_limit.html 页面。

请求连接数限制

限制连接数是一种保护服务器资源、提高安全性和稳定性的重要方法。可以通过 limit_conn_zonelimit_conn 指令来实现每个客户端或每个会话的最大连接数限制。

limit_conn_zone 指令用于定义一个共享内存区域,该区域将存储每个键的连接数。该指令在 http 块中定义。

1
limit_conn_zone key zone=name:size;
  • key:用于区分客户端的变量,例如 $binary_remote_addr 表示客户端的 IP 地址。
  • zone=name:size:共享内存区域的名称和大小,用于存储连接数信息。

limit_conn 指令用于在特定的 serverlocation 块中应用连接数限制。

1
limit_conn zone_name number;
  • zone_name:与 limit_conn_zone 中定义的共享内存区域名称一致。
  • number:允许的最大连接数。

限制每个客户端的连接数

http 块中定义共享内存区域,并在 serverlocation 块中应用连接数限制:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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;
}
}

upstream backend {
server 127.0.0.1:8080;
}
}
  • limit_conn_zone $binary_remote_addr zone=addr:10m;:定义了一个名为 addr 的共享内存区域,大小为 10 MB,用于存储每个客户端 IP 地址的连接数。
  • limit_conn addr 10;:在 location 块中应用连接数限制,每个客户端 IP 地址最多允许 10 个并发连接。

限制每个会话的连接数

如果希望限制特定会话(例如基于某个 cookie 值)的连接数,可以使用自定义变量:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
http {
limit_conn_zone $session_id zone=session:10m;

server {
listen 80;
server_name example.com;

location / {
set $session_id $cookie_sessionid;
limit_conn session 5;
proxy_pass http://backend;
}
}

upstream backend {
server 127.0.0.1:8080;
}
}
  • limit_conn_zone $session_id zone=session:10m;:定义了一个名为 session 的共享内存区域,大小为 10 MB,用于存储每个会话的连接数。
  • set $session_id $cookie_sessionid;:将客户端的会话 ID 存储在变量 $session_id 中。
  • limit_conn session 5;:在 location 块中应用连接数限制,每个会话最多允许 5 个并发连接。

了解 Nginx 中常用的变量,如 $binary_remote_addr$cookie_*$request_uri 等,用于定义连接数限制的键。

共享内存区域:了解共享内存区域的配置和管理,用于存储连接数信息。

连接数限制策略:学习不同的连接数限制策略,如按客户端 IP 地址、按会话等。

性能和安全性:理解连接数限制对服务器性能和安全性的影响,以及如何配置以防止资源滥用和攻击。

https配置

HTTPS(超文本传输安全协议,HyperText Transfer Protocol Secure)是HTTP的安全版本。它通过TLS(传输层安全协议,Transport Layer Security)来加密数据传输,从而保护数据的机密性和完整性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
server {
listen 80;
server_name bzblog.net;

location / {
# 配置你的根目录
root /var/www/your_domain;
index index.html;
}

# 重定向HTTP到HTTPS
location /.well-known/acme-challenge/ {
allow all;
root /var/www/letsencrypt;
}

# 重定向所有HTTP请求到HTTPS
if ($scheme = http) {
return 301 https://$server_name$request_uri;
}
}

server {
listen 443 ssl;
server_name your_domain.com;

ssl_certificate /etc/letsencrypt/live/bzblog.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/bzblog.net/privkey.pem;

ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on; # 配置 SSL/TLS 连接时选择加密套件优先级的选项。on 优先使用服务器端配置的加密套件列表。
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";

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

通过正确配置 ssl_session 相关指令,可以显著提高 Nginx 的 SSL/TLS 性能,减少握手的开销,并提高连接的安全性和稳定性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
http {
# 配置一个 10 MB 的共享内存区域,用于存储 SSL 会话。
ssl_session_cache shared:SSL:10m;

# 设置 SSL 会话缓存的超时时间。在超时时间内,客户端可以复用已有的 SSL 会话,而不需要重新握手。
ssl_session_timeout 10m;

# 启用或禁用会话票据。会话票据是一种在服务器端存储会话数据的机制,可以减少会话恢复时的服务器负载。
ssl_session_tickets on;

server {
listen 443 ssl;
server_name example.com;

ssl_certificate /path/to/certificate.crt;
ssl_certificate_key /path/to/private.key;

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

官方http模块参考