自从我开始在服务器上托管网站以来,我遇到了 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。