我们有一个运行 nginx 和 PHP-FPM 的负载相当大的服务器。我们在这台服务器上有 6 个网站,运行 PHP-FPM 和 nginx。软件都是 vBulletin 3.8 和 WordPress。数据库位于单独的服务器上。
现在,因为这些是非常受欢迎的网站,我们通常一次有 7-8,000 名访问者在线,每个页面大部分都会访问数据库。我相信这是我们问题的根源。
因为我们在 MySQL 服务器上有这么多大型数据库,而且因为查询可以,老实说,在软件中会好很多,我认为 MySQL 有时会无法及时将结果返回给 PHP,从而产生级联效应,最终导致一切停止,直到我们重新加载 PHP-FPM。在我们这样做之后,一切又开始正常了。
我在解决此问题时遇到问题的原因是我无法从日志中真正辨别出任何内容。在 MySQL 慢查询日志中,当停机发生时,我看不到任何有趣的内容。在 nginx 日志中,我看到数以千计的条目说读取请求超时或连接超时(到 PHP-FPM)。在 PHP-FPM 日志中,我看到很多行说“执行超时(31 秒),终止
所以在这一点上我完全不知道去哪里寻找问题。显然,无论发生什么事,都是因为这些脚本有时执行得不够快(通常它们会在一秒钟内加载,但会发生一些事情导致加载时间猛增)。这种情况一天发生很多次,对我们来说已经成为一个相当大的问题。
现在我只有一个 crontab 来每 10 分钟为 php5-fpm 重新加载提供服务,它可以解决崩溃问题。当然,当PHP重新加载时,nginx会抛出502网关错误,所以也不是很好的解决方案。
PHP 正在运行 APC 缓存,如果这很重要的话。我在一些地方读到 APC 在某些情况下会导致挂起。
任何指针都会有所帮助。我真的不想一直担心这台机器。
当然可以提供更多信息。只要让我知道你需要什么。
更新:我只是将 apc.php 复制到一个网络根目录并访问它以查看我们的统计信息。事情看起来不错。然后我单击链接转到用户统计数据,然后 BOOM 服务器立即挂起。我重新加载了 php-fpm,然后重新加载了用户统计页面,它运行良好。等了一分钟,再次重新加载,服务器再次挂起。
所以这肯定似乎与 APC 相关。问题是 - 我们如何解决它?
APC 配置:
[apc]
apc.enabled="1"
apc.stat = "1"
apc.max_file_size = "2M"
apc.localcache = "1"
apc.localcache.size = "256"
apc.shm_segments = "1" …Run Code Online (Sandbox Code Playgroud) 我在 docker 容器中有 php-fpm,在Dockerfile我编辑 fpm 配置文件 ( /etc/php5/fpm/pool.d/www.conf) 以设置要访问的访问日志和要访问的/var/log/fpm-access.log错误日志/var/log/fpm-php.www.log:
# Do some php-fpm config
# Redirect worker stdout and stderr into main error log
# Activate the fpm access log
# Enable display errors
# Enable the error log
RUN sed -i '/^;catch_workers_output/ccatch_workers_output = yes' /etc/php5/fpm/pool.d/www.conf && \
sed -i '/^;access.log/caccess.log = /var/log/fpm-access.log' /etc/php5/fpm/pool.d/www.conf && \
sed -i '/^;php_flag\[display_errors\]/cphp_flag[display_errors] = off' /etc/php5/fpm/pool.d/www.conf && \
sed -i '/^;php_admin_value\[error_log\]/cphp_admin_value[error_log] = /var/log/fpm-php.www.log' /etc/php5/fpm/pool.d/www.conf && \
sed …Run Code Online (Sandbox Code Playgroud) 我有 Apache2 与 PHP + PHP-FPM 配置根据:
http://wiki.apache.org/httpd/PHP-FPM
我正在编写一个脚本,需要很长时间才能在内部 Vhost 上执行,但一直超时,如果脚本在 30 秒内执行,一切都会完美运行。
我的 apache 日志告诉我:
[Wed Apr 17 21:57:23.075175 2013] [proxy_fcgi:error] [pid 9263:tid 140530454267648] (70007)The timeout specified has expired: [client 58.169.202.172:49017] AH01075: Error dispatching request to :, referer:
Run Code Online (Sandbox Code Playgroud)
尝试运行脚本时,我在503 Service Unavailable执行时间刚好 30 秒后得到了一个。从逻辑上讲,这意味着我有一个超时指令或设置为 30 秒,但我在 Vhost 的配置中有这些:
Timeout 600
<IfModule proxy_module>
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9001/home/pyrokinetiq/scripts/$1 timeout=600
ProxyTimeout 600
</IfModule>
Run Code Online (Sandbox Code Playgroud)
(php-fpm 对我来说在端口 9001 上运行)
我也试过把Timeout和ProxyTimeout放在httpd.conf没有区别的地方。
似乎有另一个特定于 的超时设置mod_proxy_fcgi,但我找不到它。我从官方 tarball 安装了 Apache2 httpd,似乎没有一个 …
我在一台 RHEL5 服务器上的 PHP 5.2.10 下运行了 nginx 0.7x + PHP-FPM,但试图在第二台服务器上的 PHP 5.3.3 中的捆绑 PHP-FPM 下复制该设置,我有每次有 GET 时都会遇到权限错误的问题。
FPM启动了,确认fastcgi在9000上监听,但是每次做GET的时候,在nginx日志中看到这个错误:
2010/08/12 23:38:53 [crit] 5019#0: *5 stat() "/home/noisepages/www/" failed (13: Permission denied), client: 24.215.173.141, server: dev.noisepages.com, request: "GET / HTTP/1.1", host: "dev.noisepages.com"
Run Code Online (Sandbox Code Playgroud)
Barebones nginx.conf.default 至少可以工作。这是我的 nginx.conf
server {
listen 80;
server_name dev.noisepages.com;
root /home/noisepages/www;
index index.html index.htm index.php;
access_log logs/dev.access.log;
error_log logs/dev.error.log;
location / {
if (-f $request_filename) {
expires 30d;
break;
}
# this sends all non-existing file or directory requests to …Run Code Online (Sandbox Code Playgroud) 我一直在四处寻找,但找不到直接的答案,如果有人可以澄清这一点,将不胜感激,谢谢!
location ~ \.php$ {
try_files $uri = 404;
fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
Run Code Online (Sandbox Code Playgroud)
或/与?
upstream php {
server unix:/run/php-fpm/php-fpm.sock;
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
再会。
虽然这篇文章讨论了与我在成功安装后偶尔提供空白页的类似设置,但除了空白页之外,我无法提供任何内容。有没有存在的错误/var/log/nginx/error.log,/var/log/php-fpm.log或/var/log/nginx/us/sharonrhodes/blog/error.log。
php-fpm.conf:
[全球的] pid = 运行/php-fpm/php-fpm.pid error_log = 日志/php-fpm.log log_level = 通知 [万维网] 听 = 127.0.0.1:9000 听.所有者 = www 听.group = www 听.mode = 0660 用户 = www 组 = www pm = 动态 pm.max_children = 50 pm.start_servers = 20 pm.min_spare_servers = 5 pm.max_spare_servers = 35 pm.max_requests = 500
nginx.conf:
用户 www;
worker_processes 1;
error_log /var/log/nginx/error.log 通知;
pid /var/run/nginx.pid;
事件{
worker_connections … 我试图找出 PHP 错误在我的设置中的位置。我正在运行 nginx 作为 PHP-FPM 的反向代理,但我没有看到我的应用程序生成的各种E_NOTICE或E_WARNING消息。我知道它们正在发生的唯一原因是响应失败和 NewRelic 捕获堆栈跟踪。
这是日志配置:
配置文件
proxy_intercept_errors on;
fastcgi_intercept_errors on;
Run Code Online (Sandbox Code Playgroud)
配置文件
error_reporting = E_ALL
display_errors = Off
display_startup_errors = Off
log_errors = On
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
track_errors = On
error_log = syslog
Run Code Online (Sandbox Code Playgroud)
php-fpm.conf
[global]
error_log = /var/log/php-fpm/fpm-error.log
[www]
access.log = /var/log/php-fpm/access.log
access.format = "%t \"%m %r%Q%q\" %s %{mili}dms %{kilo}Mkb %C%%"
catch_workers_output = yes
php_flag[display_errors] = on
php_admin_flag[log_errors] = true
Run Code Online (Sandbox Code Playgroud)
配置文件
:syslogtag, contains, …Run Code Online (Sandbox Code Playgroud) 我正在运行 PHP-FPM 和 Nginx,偶尔出于某种原因,我必须重新启动服务器。一旦服务器再次运行,nginx 服务会自动启动,但是 PHP-FPM 不会。当我sudo /etc/init.d/php-fpm restart在重新启动后立即运行命令并获得结果时,可以看到这一点:
$ sudo /etc/init.d/php-fpm restart
Stopping php-fpm: [FAILED]
Starting php-fpm: [ OK ]
Run Code Online (Sandbox Code Playgroud)
这是预期的行为吗?使 PHP-FPM 自动启动的最佳方法是什么?是否有任何配置选项,或者我是否必须将命令添加到 Linux 启动脚本之一?
谢谢。
我有一个基于 Linode 1024 VPS 的网络服务器
还有一些基于 WordPress 3.3.1 的博客。其中之一是一个简单的博客,带有默认配置、主题和“Hello World”帖子,用于测试服务器。另一个是从其他服务器克隆的博客,有近 10k 个帖子和超过 10k 条评论。这个博客每天有大约 5k 个唯一身份。
服务器在测试博客的 ab 测试上给出了很好的数字,但与克隆博客相同的测试是不可能的:ab 测试负载服务器太多,我不得不停止该过程,这无论如何使 ab 显示这真是糟糕的结果。
htop 在正常操作时也显示“正常”负载,但在 ab 测试期间显示正常的大负载。
还有一件奇怪的事情发生了(对我来说最重要):第一个字节的时间非常高,但在那之后等待网站加载速度非常快。这可以使用 tools.pingdom.com 等服务轻松测试,从而得出此结果。请注意表示“等待时间”的黄色区域。
为什么会这样?可能的想法:
如果有人需要更多信息,
我试图找出我可以在我的 VPS 上安装的最好的 Apache MPM。我看到了一些基准测试,MPM Worker 似乎比 Prefork 性能更好,但出于某种原因,每个人似乎都推荐 Prefork 而不是 Worker 用于 PHP 设置。
这仅仅是因为某些 PHP 函数不是线程安全的吗?只是setlocale()想到,但我将在每个实例上使用相同的语言环境,所以我认为这不会成为问题。我的 VPS 内存不足,我觉得工作 MPM 更适合我的需求,但是我不确定。
有人可以帮我下定决心吗?谢谢!
PS:我还研究了 nginx 和 lighttpd。nginx 看起来很棒,但我试图避免从源代码编译,我仍然不太明白 php-fpm 的用途。关于 lighttpd - 用它设置 PHP/FCGI 非常容易,但我听说它有内存泄漏。这仍然是真的吗?
php-fpm ×10
nginx ×7
php ×3
apache-2.2 ×2
linux ×2
logging ×2
php5 ×2
wordpress ×2
amazon-linux ×1
arch-linux ×1
docker ×1
fastcgi ×1
http ×1
httpd.conf ×1
init.d ×1
lighttpd ×1
mod-proxy ×1
mysql ×1
rewrite ×1
varnish ×1