我已经设置了php5-fpm绑定到/var/run/php5-fpm.
/etc/php5/fpm/pool.d/www.conf
listen = /var/run/php5-fpm/$pool.sock
Run Code Online (Sandbox Code Playgroud)
问题是它不会自动创建php5-fpm目录。当我重新启动机器时,目录消失了。
如何在启动时自动创建它?或者这个问题有其他解决方案吗?
我最近将一个客户端迁移到运行 Nginx + PHP-FPM 的 EC2 实例。当我第一次设置服务器时,我设置pm=static了 40 个工作进程。一周左右后,我决定尝试pm=dynamic最多 200 名工人和最少 30 名工人。
我注意到在静态设置下,40 个进程占用了大约 2.3GB 的内存,而在动态设置下,我看到 60 个进程仅使用 1.2GB 内存的峰值。
请参阅下面来自 New Relic 的图表,我的注释为红色。

可以看到,在 11/25 白天,我从静态更改为动态并重新启动了 php-fpm。之后我们可以看到48个进程只占用了990MB,60个进程只占用了1.2GB内存。
什么可能导致静态和动态管理之间的这种差异?难道是动态的,我将最大请求数设置为 50?也许静态内存使用更多是由于内存泄漏而不是 php-fpm 的内部问题?
我正在针对 Web 服务运行负载测试。这是一个运行在 php-fpm 和 nginx 上的 php 应用程序,带有 fastcgi。有一个 MySQL 后端仅用于小型读取。
我总是看到一个奇怪的模式:性能稳定并随着流量的增加而可预见地增加,但在高峰期变得不稳定:CPU 使用率不断波动。
这是我看到的性能模式(用 可视化nmon):

下降总是与我的负载测试工具 - locust.io - 在它完成上升到我为测试设置的峰值水平时的短暂暂停同时发生。
我的假设:在这短暂的时刻,php-fpm主人认为负载已经消失并开始杀死工人;当流量在片刻之后全面恢复时,它无法足够快地响应。
我不太明白的是为什么它永远无法完全回到它的摆动中:我看到负载均衡器后面的所有 4 个应用程序服务器无限期地出现这种波动。
这是我的 php-fpm 池配置:
[www]
user = www-data
group = www-data
listen = /var/run/php5-fpm.sock
listen.group = www-data
listen.mode = 0660
pm = dynamic
pm.max_children = 100
pm.start_servers = 40
pm.min_spare_servers = 40
pm.max_spare_servers = 100
pm.max_requests = 10000
Run Code Online (Sandbox Code Playgroud)
我已经确认这不是数据库的问题 - 在将 MySQL 读取从站的数量增加一倍后,我看到了完全相同的行为。
这是什么原因造成的?我怎样才能阻止它?
编辑:
这是一个图表,展示了我所看到的。请注意,故障率通常会在 user_count 达到峰值时出现峰值,然后逐渐回落。

我正在尝试从 PHP Web 应用程序连接到 PostgreSQL Unix 域套接字。相关系统组件:
PostgreSQL 正在侦听标准端口 5432,我在 127.0.0.1:5432 通过 TCP/IP 使用它没有问题,但是当我尝试连接到它的 Unix 域套接字时,出现以下错误:
Cannot connect to database: SQLSTATE[08006] [7] could not connect to server:
No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
Run Code Online (Sandbox Code Playgroud)
文件/tmp/.s.PGSQL.5432存在,我可以使用psql连接:
$ psql -Uusername db_name
psql (9.3.5)
Type "help" for help.
db_name=>
Run Code Online (Sandbox Code Playgroud)
所以从 PostgreSQL 方面应该没有问题。或者有吗? …
所以,我已经像这样设置了 FastCGI 缓存:
location ~ \.php(/.*)?$ {
fastcgi_cache RWI;
fastcgi_cache_valid 200 60m;
set $nocache 0;
if ($request_method = POST)
{
set $nocache 1;
}
if ($http_cookie ~ (rwi_userid*|rwi_password*)) {
set $nocache 1;
}
if ($request_uri ~* "/(vb/admincp/)") {
set $nocache 1;
}
fastcgi_no_cache $nocache;
fastcgi_cache_bypass $nocache;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass "unix:/var/www/vhosts/system/{domain}/php-fpm.sock";
include /etc/nginx/fastcgi.conf;
}
Run Code Online (Sandbox Code Playgroud)
在server{}块的顶部,我有:
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=RWI:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
add_header X-Cache $upstream_cache_status;
Run Code Online (Sandbox Code Playgroud)
问题是我的 PHP 脚本 (vBulletin) 总是发送 Pragma & Cache-Control private。当上述规则不适用时,有没有办法忽略这些标头并强制 FastCGI …
我正在努力完成在 php-fpm 上实现 chroot 的最后一步,Apache 2.4 在 CentOS 7 上运行。
我已经成功设置并测试了没有 chroot 的 php-fpm 连接。但是,一旦我将 chroot 指令添加到 /etc/php-fpm.d/file.conf 中的 conf 文件中,我就会得到一个“找不到文件”的消息,正如许多其他人所经历的那样。
这是我的 php-fpm conf 文件:
[site1.com]
user = user1
group = user1
listen = /var/run/php-fpm/site1.com.sock
listen.owner = user1
listen.group = user1
php_admin_value[disable_functions] = exec,passthru,shell_exec,system
php_admin_flag[allow_url_fopen] = on
php_admin_value[short_open_tag] = On
php_admin_value[doc_root] = /
php_admin_value[error_log] = /logs/php-errors
php_admin_flag[log_errors] = on
pm = ondemand
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3 …Run Code Online (Sandbox Code Playgroud) 闻起来像重复,我知道,但我现在已经尝试了这个设置 5 次,但我仍然无法让它工作。大多数配置对于 chroot 和多服务器等都很复杂,但我现在已将其简化为最简单的配置。我想了解如何以最简单的形式使用 nginx 设置 fpm...请耐心等待。
当前设置:
添加到 /etc/nginx/conf.d/default.conf
location ~ \.php$ {
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
Run Code Online (Sandbox Code Playgroud)
对 /etc/php-fpm.d/www.conf 的添加和更改
listen = /var/run/php-fpm/php-fpm.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
Run Code Online (Sandbox Code Playgroud)
添加文件/usr/share/nginx/html/info.php
<?php phpinfo();?>
Run Code Online (Sandbox Code Playgroud)
启动了两个服务
systemctl start nginx.service
systemctl start php-fpm.service
Run Code Online (Sandbox Code Playgroud)
最后 tail -f /var/log/nginx/error.log
2015/11/09 12:18:01 [错误] 28638#0:*1 FastCGI 在标准错误中发送:“主脚本未知”,同时从上游读取响应头,客户端:xx.xxx.xxx.xxx,服务器:本地主机,请求:“GET /info.php HTTP/1.1”,上游:“fastcgi://unix:/var/run/php-fpm/php-fpm.sock:”,主机:“xxx.xx.xxx.xx”
所以似乎FPM找不到脚本,我已经设法理解了,但是根据配置,脚本文件名是文档根目录和脚本名称。脚本名称为 …
我试图让 PHP-FPM 以 root 身份运行一个池,但我似乎无法调整 init.d 启动参数。
它在从 CLI 启动 PHP-FPM 时起作用(使用sudo php-fpm7.0 -DRy /etc/php/7.0/fpm/php-fpm.conf,但我无法使用service命令(sudo service php7.0-fpm (re)start。所以每次服务器重新启动时,PHP-FPM 都会失败,我必须运行此命令。
我试图把文件“PHP-fpm7.0”在/etc/default与线DAEMON_ARGS="--daemonize --fpm-config $CONFFILE -R",我甚至尝试添加-R参数的do_start函数/etc/init.d/php7.0-fpm直接,但我不断收到please specify user and group other than root错误。
有什么办法可以让我在启动时和service命令中工作吗?
题外话:我知道所有的风险,我知道为什么我不应该这样做,但我还是想这样做。我需要运行一些脚本来创建目录、执行 chown 命令等,并且池将专用于 nginx 服务器块使用的后端,该后端只能在一个特定的 URL 路径上从私有 192.168.1.X 网络内访问。
作为替代方案,我可以设置一个以 root 身份执行 PHP 脚本的 cron 脚本,但这种方法会花费我更多的时间。
我安装了 php 5.5 (fpm) 和 nginx 1.10(gzip 配置为 1)。在 ubuntu 上运行。
当我“回应”一个大输出(超过 2 mb)时,它突然停止在 520 kb 左右。
但是当我在 php-cli 上运行相同的程序时,将整个内容“回显”到终端上没有问题。
通过 adminer 下载 mysql 转储也中途停止。我的意思是下载不完整的文件(如果正确的总输出大几 MB)。
如何解决这个问题?
我的程序没有任何问题。即使是一个足够长的简单循环,也可以在特定字节限制处停止回声“hello world”。
我不确定这个问题是由 nginx 端还是 php 端引起的。
我有一个从这个 repo克隆的 LEMP 堆栈的 docker 设置。
在运行窗口 10 的开发机器上一切正常,但是当我将图像推送到 docker hub 并将其拉到我的 VPS 上时,无论我做什么,我总是收到此错误:
[emerg] 1#1: host not found in upstream "php-fpm:9000" in /etc/nginx/conf.d/upstream.conf:1
Run Code Online (Sandbox Code Playgroud)
此错误来自两个文件。
这是代码:
RUN echo "upstream php-upstream { server ${PHP_UPSTREAM_CONTAINER}:${PHP_UPSTREAM_PORT}; }" > /etc/nginx/conf.d/upstream.conf \
&& rm /etc/nginx/conf.d/default.conf
Run Code Online (Sandbox Code Playgroud)
第二个 来自这个 Nginx default.conf 文件
这是代码:
location ~ \.php$ {
...
fastcgi_pass php-upstream;
...
}
Run Code Online (Sandbox Code Playgroud)
我说这两个文件是 b/c 其他地方没有引用 php-upstream 的原因。
我已经尝试了添加/删除主机、添加depends_on、更改 nginx、php 版本、禁用 selinux 的所有可能组合,但它不起作用。我总是在生产中遇到相同的错误,但在本地服务器上一切正常。
php-fpm ×10
nginx ×6
php ×2
apache-2.4 ×1
cache ×1
centos ×1
centos7 ×1
docker ×1
fastcgi ×1
init.d ×1
linux ×1
load-testing ×1
performance ×1
php-cli ×1
php5 ×1
php7 ×1
postgresql ×1
root ×1