Php 为什么即使在升级我的服务器后,我的站点上也会不时出现错误502?

Php 为什么即使在升级我的服务器后,我的站点上也会不时出现错误502?,php,mysql,nginx,codeigniter-3,bad-gateway,Php,Mysql,Nginx,Codeigniter 3,Bad Gateway,我试图检查并阅读有关此错误的文章,但直到现在我还无法修复此错误。我使用Cloudflare来保护我的站点。如何修复错误502坏网关 我的网站目前运行在Digital Ocean(PHP7.2-Codeigniter 3、MySQL和Nginx)上,我最近升级了我的服务器,因为我认为这可能是因为我的网站流量。我以前使用5美元的droplet,现在我使用15美元(2个vCPU和2GB Ram) Nginx错误日志: 以下是配置: server { listen 80;

我试图检查并阅读有关此错误的文章,但直到现在我还无法修复此错误。我使用Cloudflare来保护我的站点。如何修复错误502坏网关

我的网站目前运行在Digital Ocean(PHP7.2-Codeigniter 3、MySQL和Nginx)上,我最近升级了我的服务器,因为我认为这可能是因为我的网站流量。我以前使用5美元的droplet,现在我使用15美元(2个vCPU和2GB Ram)

Nginx错误日志:

以下是配置:

server {
        listen 80;
        root /var/www/<site_dir>;
        index index.php index.html index.htm index.nginx-debian.html;
        server_name <domain>;

        #location ~* \.(ico|css|js|gif|jpe?g|png)(\?[0-9]+)?$ {
        #        expires max;
        #        log_not_found off;
        #}

        location / {
                try_files $uri $uri/ /index.php;
        }

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        }

        location ~ /\.ht {
                deny all;
        }

        # Deny for accessing codes
        location ~ ^/(application|system|tests)/ {
            return 403;
        }
}

server {
        listen 80 default_server;
        server_name _;
        return 404;
}
服务器{
听80;
root/var/www/;
index.php index.html index.htm index.nginx-debian.html;
服务器名称;
#位置~*\(\?[0-9]+)?${
#最大值;
#未发现注销日志;
#}
地点/{
尝试_文件$uri$uri//index.php;
}
位置~\.php${
包括snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
}
位置~/\.ht{
否认一切;
}
#拒绝访问代码
位置^/(应用|系统|测试){
返回403;
}
}
服务器{
监听80个默认_服务器;
服务器名称;
返回404;
}
我使用htop检查了我的资源


有什么建议吗?

所以我查看了日志以确认问题所在。我不喜欢服务器,所以当我旋转水滴时,我将其作为默认设置

在检查
/var/log/php7.2-fpm.log
时,它显示:

警告:[池WWW ]服务器到达PM.Max儿童设置(5),考虑提高它的

所以我根据这个答案提出:

我还通过提升辅助进程优化了php fpm

worker_processes  2; #my server has 2 vCPU cores
worker_connections  1024;
()

到目前为止,每当我的服务器在web请求上遇到峰值时,这就解决了我的问题

所以我根据这个答案提出:

而且很容易让互联网上的任何人都能在短时间内关闭你的网站

在任何情况下,链接的答案都不可能是好的,但我将在下面解释为什么您的特定服务器规格不好

pm.max_children = 4000
再加上
pm=ondemand
,这意味着随着流量足够快地进入,PHP-FPM将继续分叉越来越多的进程,直到出现最多4k子进程。一个典型的PHP-FPM工作进程平均消耗80MB的RAM。将其乘以4k,服务器仅此设置就需要320 GB(!!!)的RAM

pm.max_requests = 0
现在这个。它控制一个给定的PHP-FPM工作者在回收并替换为新的请求之前将处理多少请求。您通常总是希望在某个时候回收PHP-FPM工作进程,因为PHP本身及其扩展本身就是一个容易发生内存泄漏的软件。因此,如果没有循环利用,那么很有可能每个进程平均80MB的内存会随着时间的推移变得越来越“胖”,因此即使320GB的RAM也不足以处理流量

任何人都可以通过这些设置来杀死一个网站:使用任何能够连续发出许多请求(甚至不需要并行)的软件,从命令行上的
curl
,到SEO Frog Spider等GUI工具。由于它们不断发出许多请求,从而导致PHP-FPM工作人员几乎无限(最多4k)的分叉,最终服务器一旦出现内存不足的情况,就会开始停止进程以获取可用RAM

这种杀戮的典型选择是MySQL进程,一旦内核牺牲了它,您的网站就会停止工作

至于如何以合理的方式配置PHP-FPM,您需要实际测量PHP-FPM工作进程“权重”的多少,才能正确设置
max_children

但是,您可以根据需要进行简单的计算和进一步的微调。假设我们考虑到规定的平均值为80MB。拿你的服务器RAM,减去MySQL“吃”的东西,以及任何其他住宅程序。假设这是500 MB。因此,PHP-FPM工作人员还有1500 MB的空间

1500/80=这就给您留下了
pm.max\u children=19

当然,你需要:

  • pm.max_requests
    调整为最多10000(最安全的是500或更低,例如100)。从不
    0
    (这意味着没有回收)
  • 配置一些交换,这样即使是19个PHP工作进程也会导致内存不足,您的网站也会保持在线
随着时间的推移,当您监控交换使用情况时(
free-m
是您的朋友),您可以知道进一步提高PHP-FPM工作人员是否安全,但如果有什么不同的话,在现代框架中,每个工作人员的容量可能会超过80MB,您可能需要降低

但这正是正确使用PHP-FPM的方法。真正的解决方案是在应用程序内外高效缓存:

内部:Codeigniter缓存

外部:Varnish,NGINX FastCGI缓存


外部:Cloudflare缓存已启用HTML输出(缓存所有内容策略)。

我知道我有点晚了,但谢谢您的回答。我实际使用以下配置配置了php fpm:。它工作得很好,有时我的并发请求高于正常请求,我的站点速度会减慢。但我再也没有经历过502错误了。然而,由于这种配置非常昂贵,可能会破坏我的网站,我将尝试计算pm.max_的孩子们,看看会有什么结果。
pm.max_requests = 0