我的服务器运行的是 Ubuntu 14/Apache2.4.7,它有一个 htaccess 重定向,强制所有请求使用 HTTPS。通常,它响应很快。但是,我最近修改了我的 SSL 配置,将使用的密码限制为更现代的设置,以防止 heartbleed、beast 和其他漏洞,并确保使用现代加密方法。
最近我收到了一些投诉,这些投诉似乎与这些更改无关(见下文),我的机器有时会变得迟缓。这些投诉表明它可能与握手或建立连接有关:
我遇到页面间歇性缓慢加载的情况,并根据所使用的浏览器显示各种浏览器状态消息;全部都是等待建立安全连接。
我编写了一个使用 cURL 连接一千次的 PHP 脚本。我昨晚很晚才运行它,速度似乎不是问题。我尝试连接到 https 和 http 并遵循上面的重定向。所有请求都在 3.5 秒或更短的时间内完成,绝大多数 (96-98%) 在 1.5 秒内完成。
我于今天上午 10:30 运行了相同的脚本,大约 10% 的请求花费的时间超过 1.5 秒,许多请求花费的时间更长。最长的时间约为 17 秒。
我的研究和直觉告诉我,虽然 https 握手比 http 连接更复杂,但这个问题可能可以通过调整我的 apache 配置来解决(例如,最大请求工作线程数) 设置。服务器的负载平均值几乎从未超过 1.5 左右,而且看起来有足够的内存可用。
有人能建议我如何缩小这里的瓶颈以及我可以采取哪些步骤来解决它吗?任何帮助都将不胜感激。
编辑:我访问了 #apache IRC 频道并询问了那里的人,友好的人们提醒我注意这个服务器位于预分叉模式并且 MinSpareServers、MaxSpareServers、StartServers 和 MaxRequestWorkers 都是默认的或经过调整的,但仍然相当低。
他们坚决认为生产服务器不应该使用 prefork 模式,并向我推荐了几个链接:
- Apache MPM 活动- 描述 apache 事件模式
- 在 Apache httpd 上运行 PHP- 在 apache 上运行 php 的选项列表
- openssl_seal()、PHP 和 Apache2handle 的故事- 需要注意的 php 漏洞描述
据我所知,解决这些性能问题的办法可能是安装 Apache 以在事件模式下运行,但我的网站很复杂,使用了一些进程分叉之类的东西。我希望作为权宜之计,有人可以建议进行调整最小备用服务器数,最大备用服务器数,启动服务器,最大请求工作线程数
curl_getinfo
编辑2: PHP 函数报告的典型慢速请求的细目:
elapsed: 17.6722049713
ssl_verify_result: 0
total_time: 17.671187
namelookup_time: 0.000051
connect_time: 0.065855
pretransfer_time: 16.787012
starttransfer_time: 17.340403
redirect_time: 0.261569
答案1
事实证明,Ubuntu 安装 apache 和 php7 的软件包似乎除了 prefork 之外没有提供任何其他东西,真糟糕。在这种情况下,我不得不使用 prefork,这根本不是理想的解决方案,但直到我有更多关于如何获得其中一个的信息推荐配置工作,这是我唯一的选择。
我编辑了文件 /etc/apache2/mods-available/mpm_prefork.conf:
sudo nano /etc/apache2/mods-available/mpm_prefork.conf
并将 MaxRequestWorkers 设置增加到 300。笔记为了做到这一点,我还必须添加 ServerLimit 设置 300,或者将 MaxRequestWorkers 限制为 ServerLimit 的默认值 256:
StartServers 5
MinSpareServers 5
MaxSpareServers 10
# changed in response to slow connect/handshaking time complaints
ServerLimit 300
# note this value is constrained by ServerLimit, which defaults to 256
MaxRequestWorkers 300
MaxConnectionsPerChild 0
这些设置似乎缓解了缓慢的问题。我在一天中的繁忙时间使用了我的 PHP 测试脚本,所有请求都在 3.5 秒或更短的时间内完成,绝大多数请求在 1.5 秒内完成。我还使用 apache bench 和高并发值进行了测试,我可以看到服务器通过生成工作程序做出响应,但我仍然有足够的可用 RAM:
ab -n 1000 -c 100 "https://example.com/"
我使用以下方法检查了 RAM:
free -h
目前看来这是可行的,但是我无法让 apache 使用 ubuntu 安装程序来使用 fastCGI,这非常令人失望。