Nginx 日志中的访问控制策略主要包括以下几种:
基于 IP 的访问控制
-
allow 和 deny 指令:允许或拒绝特定的 IP 地址或 IP 段访问资源。这些指令可以设置在
server、location和http配置区段中。例如:location /secure/ { deny 192.168.1.1; allow 192.168.1.0/24; allow 10.1.1.0/16; deny all; }在这个配置中,只有 IP 地址为 192.168.1.1 或者 IP 段为 192.168.1.0/24 和 10.1.1.0/16 的客户端才能访问
/secure路径,其他所有 IP 地址将被拒绝访问。 -
geo 模块:对于更复杂的 IP 控制,可以使用
geo模块。例如:geo $allowed_ip { default 0; 192.168.1.0/24 1; 10.0.0.0/8 1; } server { location /admin/ { if ($allowed_ip = 0) { return 403; } # 其他配置。 } }这个配置表示,只有来自 192.168.1.0/24 和 10.0.0.0/8 网段的请求才能访问
/admin路径。
基于 HTTP 认证的访问控制
-
auth_basic 模块:提供基本的 HTTP 认证功能。例如:
location /private/ { auth_basic "Restricted Area"; auth_basic_user_file /etc/nginx/.htpasswd; }这个配置要求客户端在访问
/private路径时输入正确的用户名和密码。
基于请求方法的访问控制
-
limit_except 指令:限制特定的 HTTP 方法。例如,只允许 GET 和 POST 请求访问某个路径:
location /api/ { limit_except GET POST { deny all; } # 其他配置。 }在这个配置中,除了 GET 和 POST 方法外,其他所有方法的请求都会被拒绝。
基于速率的访问控制
-
limit_req 模块:限制客户端在一定时间内的请求速率。例如,限制每秒 1 个请求:
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; server { location /search/ { limit_req zone=one burst=5; # 其他配置。 } }这个配置限制了来自每个客户端的请求速率,超过限制的请求将被拒绝。
日志记录和轮转
-
access_log 指令:用于记录客户端请求的访问日志,包含请求时间、客户端 IP、响应状态等关键信息。可以通过
path参数指定日志文件存储路径,通过format参数指定日志格式。例如: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; }这个配置会将所有的 HTTP 请求记录到
/var/log/nginx/access.log文件中。 -
日志轮转:使用
logrotate管理 Nginx 日志轮转,以防止日志文件过大。例如:/var/log/nginx/*.log { daily missingok rotate 14 compress delaycompress notifempty create 0640 www-data adm sharedscripts postrotate [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid` endscript }这个配置会每天轮转一次日志文件,并保留最近的 14 个备份。
通过以上策略,Nginx 可以有效地控制对服务器资源的访问,提高服务器的安全性和性能。