가벼운 부하에서 PHP-FPM 충돌 방지

가벼운 부하에서 PHP-FPM 충돌 방지

제가 호스팅하는 WordPress 사이트에서 DoS 공격을 받고 있습니다.

173.192.109.118 - - [30/Sep/2015:22:31:36 +0000] "POST /xmlrpc.php HTTP/1.0" 499 0 "-" "Mozilla/4.0 (compatible: MSIE 7.0; Windows NT 6.0)"

내 액세스 로그에 약 140개의 로그가 표시되고 nginx(약 10초가 걸리므로 초당 최대 14 요청) 502로 전환됩니다.

173.192.109.118 - - [30/Sep/2015:22:31:46 +0000] "POST /xmlrpc.php HTTP/1.0" 502 537 "-" "Mozilla/4.0 (compatible: MSIE 7.0; Windows NT 6.0)"

이 시점에서 PHP-FPM사이트를 복원하려면 다시 시작해야 합니다.

그래서 내 질문은 다음과 같습니다.한 명의 공격자가 충돌하는 것을 방지하기 위해 내가 할 수 있는 일이 있습니까 PHP-FPM?

내 (제한된) 경험의 대부분은 Apache에 관한 것이므로 조언은 다음과 같습니다.매우감사합니다.

나는 모든 것에 건전한 한계를 설정하려고 노력했습니다. 서버에는 로드 중인 RAM이 많기 때문에 문제가 되지 않는 것 같습니다. 방금 다음 튜토리얼에서 속도 제한기를 추가했습니다.https://www.howtoforge.com/rate-limiting-with-nginx, 그것이 고통을 지연시키는 것처럼 보이지만 여전히 충돌이 발생합니다 PHP-FPM.

/var/log/php5-fpm.log구성 파일에 /를 추가하는 것을 잊어버렸을 때 발생한 몇 가지 오류와 재시작 시 여러 개의 성공 줄 외에는 흥미롭거나 유용한 내용이 표시되지 않는 것 같습니다 .

[30-Sep-2015 23:03:51] ERROR: Unable to create or open slowlog(/usr/log/www.log.slow): No such file or directory (2)
[30-Sep-2015 23:03:51] ERROR: failed to post process the configuration
[30-Sep-2015 23:03:51] ERROR: FPM initialization failed
[30-Sep-2015 23:05:47] NOTICE: configuration file /etc/php5/fpm/php-fpm.conf test is successful

/etc/php5/fpm/pool.d/www.conf

[www]
user = www-data
group = www-data
listen = /var/run/php5-fpm.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.status_path = /status
ping.path = /ping
ping.response = pong
slowlog = /var/log/php-fpm_$pool.slow.log
request_slowlog_timeout = 30
request_terminate_timeout = 30
chdir = /

/etc/nginx/nginx.conf

user www-data;
worker_processes 4;
pid /run/nginx.pid;
events {
    worker_connections 768;
}
http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    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/x-javascript text/xml application/xml application/xml+rss text/javascript;

    limit_req_zone  $binary_remote_addr  zone=one:10m   rate=1r/s;

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

/etc/nginx/sites-enabled/example.com

server {
  server_name localhost www.example.com;
  return 301 http://example.com$request_uri;
}
server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;
    root /var/www/html;
    index index.php index.html index.htm;
    server_name example.com;

    client_max_body_size 500M;

    location / {
        try_files $uri $uri/ /index.php?q=$uri&$args;
    }

    error_page 404 /404.html;

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /var/www/html;
    }

    location ~*  \.(jpg|jpeg|png|gif|ico|css|js|woff)$ {
            expires 365d;
    }
        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
            limit_req zone=one burst=5;
        }

    location /status {
        fastcgi_pass php;
    }

    location /ping {
        fastcgi_pass php;
    }

    location ~ /\. {
        deny all;
    }
}

**업데이트**

PHP-FPM튜닝 에 대한 양질의 토론이 이루어지길 바라면서 제 질문을 좀 더 잘 반영하기 위해 제목을 업데이트했습니다.

두 번째 질문이자 첫 번째 질문보다 더 중요할 수 있으므로 다음과 같은 질문이 궁금합니다. 먼저 충돌 없이 사용 가능한 모든 서버 리소스를 활용하기 위해 PHP-FPM을 조정/강화하려면 어떻게 해야 합니까?

Apache/PHP는 그다지 효율적이지 않았을 수도 있지만 서버가 무릎을 꿇을 때까지 요청 처리를 중단하지 않았으며 공격이 끝나면 사이트가 백업되었습니다. 약간 과로해진 서비스를 수동으로 다시 시작해야 한다는 것은 다소 불쾌해 보입니다. (14 요청/초는 실제로 아무것도 아닙니다)

DoS 공격을 완화하기 위해 활용하는 아이디어에 동의 fail2ban하지만, 제가 정말로 걱정하는 것은 다음과 같은 경우/언제 어떤 일이 일어날 것인가입니다.정기적인트래픽이 초당 15 요청에 도달합니까?

답변1

기본적으로 다음과 같은 선택 사항이 있습니다.

  • 패킷 필터 차단 사용
  • 다음과 같이 nginx 차단을 사용하십시오.

location / { deny xx.xx.xx.xx; allow all; }

  • pm.max_children같은 수로 증가CPU 코어 x 2, 5는 너무 낮습니다. 증가시킨 후에는 초당 14개의 요청을 처리할 수 있을 것입니다. 실제로는 그렇게 큰 숫자는 아닙니다. 또한 limit_req요청 속도를 제한하기 위해 nginx 지시문을 사용하고 있으므로 다른 영역을 추가하고 더 낮은 버스트 크기 또는 nodelay.

관련 정보