我有一个在 node.js 和 express web 服务器上运行的网站。我使用 nginx 在域上运行网站并使用 ssl 证书。我在 Google 上搜索如何使用 nginx 保护服务器免受 ddos 攻击,我发现我应该在我的 nginx conf 文件中使用 limit_req 属性。但是当我使用这个并打开网站时,所有其他请求都失败了,我的意思是我打开网站,所有外部链接都失败了,如 css、js 和图像文件,在我的控制台中我看到很多这样的错误:
Failed to load resource: the server responded with a status of 503 (Service Temporarily Unavailable)
我知道问题是什么,我将用户请求限制为 10req/s,所有外部链接和文件都算作一个请求,达到 10 后所有其他请求都失败,但我不知道如何处理它,我不知道是否应该从我的快速代码或 nginx conf 中处理它。
我知道我应该让所有网站请求都算一次但我不知道该怎么做。
这是我的 nginx 配置:
# HTTP - redirect all requests to HTTPS
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
server {
#listen 80 default_server;
#listen [::]:80 default_server ipv6only=on;
server_name www.example.com domain.com;
return 301 https://example.com$request_uri;
}
map $sent_http_content_type $cacheable_types {
~image/ "max-age=864000";
default "";
}
server {
listen 443;
server_name www.examle.com;
ssl on;
# Use certificate and key provided by Let's Encrypt:
ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
location /{
return 301 https://example.com$request_uri;
}
server {
listen 443;
server_name example.com;
ssl on;
# Use certificate and key provided by Let's Encrypt:
ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
location /{
limit_req zone=one;
proxy_pass http://localhost:2000/;
}
}
答案1
您将代理的所有内容限制为 10r/s。如果您只想限制页面,则可以为 css/js 资源定义另一个位置,而不对它们进行限制。
server {
listen 443;
location ~* \.(jpg|jpeg|png|gif|css|js|ico)$ {
limit_req zone=one;
proxy_pass http://localhost:2000/;
}
location / {
proxy_pass http://localhost:2000/;
}
}
但是,你可能根本不应该为此烦恼。DDOS 攻击将压垮你的 Nginx 服务器,导致所有服务器都下线。
如果您确实需要 DDOS 保护,更好的方法是在网站前端使用 CloudFlare 或 CloudFront 等 CDN。确保您的 IP 不为人所知,否则可能会从其他 DNS 记录中泄露。CloudFront (AWS) 内置了很多 DDOS 保护。CloudFlare 付费计划将阻止 DDOS,无论大小。CloudFlare 免费计划会尝试一下,但如果规模太大,就会放弃。