如何防止整个服务器因一个网站超时而受到影响?

如何防止整个服务器因一个网站超时而受到影响?

自从我开始在服务器上托管网站以来,我遇到了 505、504 超时,以及托管在同一服务器上的其他网站(但这些其他网站没有问题)。

该服务器的操作系统是 Ubuntu16.04,并且具有 php7.0-fpm nginx,显然配置错误。

如何避免所有其他网站受到新托管网站超时的影响?或者如何完全避免这些超时(无需修复 php 错误,因为我与此无关)?

php 代码有很多错误。php7.0-fpm 日志显示超时。

/var/log/php7.0-fpm.log

[2018 年 3 月 26 日 20:29:54] 警告:[pool www] 子进程 17012,脚本 '/var/www/xxxxxx.com/index.php'(请求:“POST /index.php?function=my-profile”)执行超时(306.572078 秒),正在终止 [2018 年 3 月 26 日 20:29:54] 警告:[pool www] 子进程 17012 在启动后 1100.011016 秒因信号 15(SIGTERM)退出 [2018 年 3 月 26 日 20:29:54] 通知:[pool www] 子进程 19559 已启动

/var/log/nginx/error.log

Nginx 显示了很多 php 警告,我不太清楚应该看哪里。

/etc/nginx/nginx.conf

http {
    # ...
    fastcgi_buffers 8 16k;
    fastcgi_buffer_size 32k;
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    # ...
}

/etc/php/7.0/fpm/pool.d

pm = dynamic
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 6
pm.process_idle_timeout = 10s
pm.max_requests = 500

/etc/php/7.0/fpm

default_socket_timeout = 60
max_execution_time = 300
max_input_time = 60
memory_limit = 128M

服务器块包含此部分 /etc/nginx/global/wordpress.conf

# Deny access to any files with a .php extension in the uploads directory
# Works in sub-directory installs and also in multisite network
# Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban)
location ~* /(?:uploads|files)/.*\.php$ {
    deny all;
}

# Directives to send expires headers and turn off 404 error logging for Static assets
location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpe?g|gif|png|ico|zip|pdf|t?gz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|swf|bmp|txt|rtf|md)$ {
    access_log off;
    log_not_found off;
    expires max;

    # CORS headers; this is wide-open, you want to tight it up a bit
    add_header Cache-Control public;
    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Methods GET,OPTIONS;
    add_header Access-Control-Allow-Headers *;
}

# Attempted to match last if rules below fail.
location / {
    try_files $uri $uri/ /index.php?$args;
}

# Add trailing slash to */wp-admin requests.
rewrite /wp-admin$ $scheme://$host$uri/ permanent;

# Pass PHP scripts to PHP-FPM daemon
# Check: http://wiki.nginx.org/Pitfalls
location ~* \.php$ {
    # filter out problem conditions
    try_files $uri $uri/ =404;

    # bring in parameters
    include fastcgi.conf;

    # send requests to upstream
    # fastcgi_pass phpfpm;
    # fastcgi_pass 127.0.0.1:9000;
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    fastcgi_read_timeout 300;

}

答案1

尽管您不愿意,但您还是创造了与某人遭受 PHP-POOL 攻击时相同的情况。这意味着您遇到的情况正是如此,一个网站的 PHP 卡住了,其余网站因此无法运行。我强烈建议您采取以下措施:

为每个网站创建一个新的 PHP 池。您可以通过创建新的配置文件来实现这一点。在 CentOS 7 上,我将它们放在 /etc/php-fpm.d/mywebsite.conf 中。找到您当前的池配置文件,然后简单地将其复制到同一文件夹。然后您必须更改以下内容:

  • [我的网站]
  • 用户 = nginx
  • 组 = nginx
  • 监听 = /run/php/mywebsite.sock
  • listen.owner = nginx
  • listen.group = nginx
  • listen.mode = 0660

有些只需要取消注释,有些需要编辑。完成此操作后,对每个网站执行相同操作。然后在网站 nginx 配置中,将 替换fastcgi_pass unix:/run/php/php7.0-fpm.sock; 为 sock 文件的适当文件位置。重新启动 NginX 和 PHP-FPM,您就可以开始了。

另外... PHP 需要 128MB?这就像一根头发丝那么细。至少增加到 1024M,如果可以的话增加到 2048M。取决于您的 HW OFC。

相关内容