У меня есть веб-сайт, работающий на node.js, и экспресс-веб-сервер. Я использую nginx для запуска веб-сайта в домене, а также использую сертификаты ssl. Я искал в Google, как защитить сервер от атак ddos с помощью nginx, и обнаружил, что мне следует использовать атрибут limit_req в моем файле конфигурации nginx. но когда я использую это, и я открываю веб-сайт, все остальные запросы терпят неудачу, я имею в виду, что я открываю веб-сайт, и все внешние ссылки не работают, такие как css, js и файлы изображений, а в моей консоли я вижу много этой ошибки:
Failed to load resource: the server responded with a status of 503 (Service Temporarily Unavailable)
Я знаю, в чем проблема, я ограничиваю запросы пользователей до 10 запросов / с, и все внешние ссылки и файлы считаются запросами, а после достижения 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/;
}
}
Вы ограничиваете все проксирование до 10р / с. Если вы хотите ограничить только страницы, вы можете определить другое местоположение для ресурсов 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, лучший подход - использовать CDN, например CloudFlare или CloudFront, перед вашим сайтом. Убедитесь, что ваш IP-адрес неизвестен, так как это может происходить из других записей DNS. CloudFront (AWS) имеет много встроенных средств защиты от DDOS. Платные планы CloudFlare будут стоять перед DDOS независимо от размера. CloudFlare free даст ему шанс, но откажется, если он станет слишком большим.