AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 874642
Accepted
xendi
xendi
Asked: 2017-09-21 04:56:02 +0800 CST2017-09-21 04:56:02 +0800 CST 2017-09-21 04:56:02 +0800 CST

为高流量负载配置 Nginx + PHP-FPM

  • 772

我的 nginx 不断崩溃并在浏览器中报告“错误网关”错误。Nginx 和 PHP-FPM 没有预先配置来处理大流量负载。我必须systemctl restart php7.0-fpm每小时安排一个 cron 工作,以确保我的网站在它们离开时不会停留太久。让我们开始吧。

我从中得到的一些错误/var/log/php7.0-fpm.log:

[20-Sep-2017 12:08:21] NOTICE: [pool web3] child 3495 started
[20-Sep-2017 12:08:21] NOTICE: [pool web3] child 2642 exited with code 0 after 499.814492 seconds from start

[20-Sep-2017 12:32:28] WARNING: [pool web3] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 7 idle, and 57 total children

nginx 日志中没有任何内容对我产生影响。如果我让它运行太久而不重新启动它(PHP-FPM),我会收到网关错误。我已经尝试按照教程 3 次调整设置,但仍然不行。现在,我可能已经完成了各种设置,但无论哪种方式,它都无法正常工作。

/etc/nginx/nginx.conf:

user www-data;
worker_processes auto;
pid /run/nginx.pid;

worker_rlimit_nofile 100000;

events {
        worker_connections 4096;
        use epoll;
        multi_accept on;
}


http {
        sendfile on;
        reset_timedout_connection on;
        client_body_timeout 10;
        send_timeout 2;
        keepalive_timeout 30;
        keepalive_requests 100000;
        tcp_nopush on;
        tcp_nodelay on;
        types_hash_max_size 2048;
        fastcgi_read_timeout 300000;
        client_max_body_size 9000m;
        include /etc/nginx/mime.types;
        default_type application/octet-stream;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;
        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/javascript text/xml application/xml application/xml+rss text/javascript;

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
        open_file_cache max=200000 inactive=20s;
        open_file_cache_valid 30s;
        open_file_cache_min_uses 2;
        open_file_cache_errors on;

        access_log off;
}

/etc/php/7.0/fpm/php-fpm.conf:

    [www]

    pm = dynamic
    pm.max_spare_servers = 200
    pm.min_spare_servers = 100
    pm.start_servers = 100
    pm.max_children = 300

    [global]
    pid = /run/php/php7.0-fpm.pid
    error_log = /var/log/php7.0-fpm.log
    include=/etc/php/7.0/fpm/pool.d/*.conf

/etc/php/7.0/fpm/pool.d/www.conf:

[www]

user = www-data
group = www-data
listen = /run/php/php7.0-fpm.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 300
pm.start_servers = 100
pm.min_spare_servers = 100
pm.max_spare_servers = 200
pm.max_requests = 500

我的网站之一(/etc/php/7.0/fpm/pool.d/web3.conf):

[web3]

listen = /var/lib/php7.0-fpm/web3.sock
listen.owner = web3
listen.group = www-data
listen.mode = 0660

user = web3
group = client1

pm = dynamic
pm.max_children = 141
pm.start_servers = 20
pm.min_spare_servers = 20
pm.max_spare_servers = 35
pm.max_requests = 500

chdir = /

env[HOSTNAME] = $HOSTNAME
env[TMP] = /var/www/clients/client1/web3/tmp
env[TMPDIR] = /var/www/clients/client1/web3/tmp
env[TEMP] = /var/www/clients/client1/web3/tmp
env[PATH] = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

来自 htop 的资源/proc 使用情况:

在此处输入图像描述

nginx
  • 6 6 个回答
  • 16120 Views

6 个回答

  • Voted
  1. Best Answer
    Tero Kilkanen
    2017-09-22T12:46:57+08:002017-09-22T12:46:57+08:00

    问题在于您的数据库访问。您有多个使用 CPU 的 MySQL 进程,这表明执行数据库查询需要很长时间。

    您需要查看您的应用程序,寻找以下内容:

    1. 数据库查询得到了适当的优化。
    2. 数据库设计是高效的,并且有适当的索引。
    3. 应用程序有适当的数据缓存。

    然后,缓慢的数据库查询会导致 PHP-FPM 用尽处理客户端请求的可用子进程。这将导致502 Bad Gateway错误。您可以尝试增加池的pm.max_children设置web3,因为这会导致错误。这可以消除可伸缩性症状,但不能解决应用程序/数据库效率低下的根本原因。

    如果您不使用该www池,您可以将其移除以节省其使用的资源。

    的理想设置pm.max_requests为零,即 PHP 工作者永远不应该重新启动。如果您的 PHP 工作人员没有由于库的错误编码而泄漏内存,那么您可以在那里使用零。否则,您可以使用使工作人员的内存使用保持得当的任何值。关于这个设置,真的没有任何其他好的建议可以提供。

    在这里你可以用 nginx 设置做的不多,因为它是 PHP-FPM 有时不可用。您可以更改gzip_comp_level为1,这使得 nginx 花费更少的 CPU 压缩输出。但这与应用程序优化相比影响非常小。

    • 7
  2. symcbean
    2017-09-22T14:59:21+08:002017-09-22T14:59:21+08:00

    (这应该是一个评论,但它有点长)

    我的网站不断崩溃

    ....不是容量问题,除非您的服务器配置如此糟糕以至于 oom 杀手正在启动。而且不是您从日志中引用的错误。

    为什么你在一个有 12 GB RAM 的盒子上有半 GB 的交换空间?

    你的keepalive太高了。

    您已禁用访问日志记录(您的日志是开始查找容量问题的地方)。

    最上面的输出暗示了 mysql 性能的问题。

    您的 pm.max_requests 太低。

    你没有限制listen_backlog。

    您在这里向我们展示的所有内容都有问题,这只是冰山一角。投票结束

    • 1
  3. KIsmay
    2017-09-24T07:24:48+08:002017-09-24T07:24:48+08:00

    是离线的web3网站吗?此日志条目似乎暗示了原因:

    [20-Sep-2017 12:32:28] WARNING: [pool web3] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers)
    

    www 站点的 start_servers / max_spare_servers 的值非常高,但 web3 的值要低得多。

    你似乎没有内存不足,所以给 mysql 更多可能会有所帮助。除非您的 php 应用程序从不查询 mysql,否则将 mysql 排除在优化过程之外是一个错误。

    首先,您需要查看您的 mysql 配置。我相信大多数发行版在内存设置和线程数方面都相当保守。查找 mysql 示例配置,例如:my-large.cnf my-medium.cnf 并将它们与您的进行比较。基于 Debian 的发行版将它们放在 /usr/share/doc/mysql-server-xy/examples/ (其中 xy 是主要版本)

    在调整各种旋钮时,我建议进行小的调整。例如,将值从 8M 更改为 16M。

    如果它是您的 php 应用程序,您还需要查看 Tero Kilkanen 的回答所建议的慢查询日志。

    希望有帮助。

    • 1
  4. SEO DEVS
    2017-09-24T11:30:31+08:002017-09-24T11:30:31+08:00

    以我的经验,尤其是在大型网站上,php-fpm 使用了大量的处理器能力。如果没有可用的缓存并且它必须等待您的页面在本地加载和呈现然后缓存它然后服务器缓存,就会发生这种情况。我以前在大型网站上遇到过同样的问题。最好的办法是使用 httrack 抓取您的网站,在 httrack 中设置速度限制,以免服务器过载。这将构建您的 nginx 缓存,然后一旦构建缓存,您将看到页面的即时加载和很少的 cpu 或 ram 使用。主要原因实际上归结为页面渲染,这可能是由过多的 JS 或 CSS 或最有可能由许多 SQL 请求或配置不当的 sql 数据库引起的。确保索引经常使用的数据库表。

    • 0
  5. Wilson Hauck
    2017-09-24T12:40:56+08:002017-09-24T12:40:56+08:00

    htop 似乎表明与 MySQL 关联的 15 个 PID 中的每一个都使用了超过 1:nn.nn 的 TIME,并且每个都有至少 1G 的 VIRT RAM 正在使用中。由于您总共有 12 GB RAM,是时候与我们分享您的

    SHOW GLOBAL STATUS;
    SHOW GLOBAL VARIABLES;
    SHOW ENGINE INNODB STATUS;
    

    允许对您的 MySQL 配置进行一些合理的检查,即使这不是问题?1 天 11 小时的正常运行时间令人鼓舞。

    知道 PID 6148 在做什么,而 TIME 是 28:+ 吗?

    从@xendi 今天早些时候的回复中......“无论何时发生这种情况,所有站点上的所有页面,无论是什么脚本或内容,都会出现网关错误。所有页面和站点都会发生这种情况”
    你看过 php .ini session.gc_maxlifetime = nnnn 垃圾收集秒数是可能的原因吗?

    2017 年 9 月 24 日 nginx.conf 可能会产生影响的问题

    client_max_body_size 9000m;    # really 9G in one body?
    client_body_timeout 10;   # seconds to receive the client body seems short.
    open_file_cache max=200000 inactive=20s;   may be causing churn at 20s
    
    https://www.linode.com/docs/web-servers/nginx/configure-nginx-for-optimized-performance/     
    

    可能是一个有用的链接。

    • 0
  6. pbacterio
    2017-09-26T03:50:31+08:002017-09-26T03:50:31+08:00

    似乎都是关于记忆的。

    尽量减少php服务器的数量,限制php和mysql服务器的内存。

    • 0

相关问题

  • Gzip 与反向代理缓存

  • nginx 作为代理的行为

  • Nginx 学习资源 [关闭]

  • 提供 70,000 个静态文件 (jpg) 的最佳方式?

  • 在 Apache、LightTPD 和 Nginx Web 服务器上提供 PHP 5.x 应用程序的现状?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve