我一直在阅读很多关于在 linux 下使用 fastcgi 设置 apache 的论坛帖子、教程等。我正在尝试为我的一些 ruby 开发(不是 rails)运行 fcgi,但我认为它应该适用于任何语言。请注意,我已经在我的 web box 上安装了 apache、fastcgi、ruby-fcgi 等。
从概念上讲,我很难接受。apache 是否根据需要生成指定的 fcgi 进程?我是否在 apache 旁边启动它们?基本上,我试图达到能够提出正确问题的地步,因此如果标题具有误导性,我深表歉意。
我的 PHP-CGI 无缘无故地开始提供空白页面,直到我重新启动该过程。
我想知道为什么。
不幸的是,PHP 的“生产”配置文件默认没有 error_log。我的 Nginx 错误日志也没有显示与 PHP 相关的错误。这可能是一个没有希望的案例,但我只是为了以防万一。
这是我的设置
任何想法可能导致错误?
更新
我想我已经隔离了这个问题。我一直在使用 Monit 在 PHP 开始空白时自动重新启动它。我的 PHP 错误日志是空白的。
但是我发现如果我禁用了一个名为 WP-SuperCache 的 Wordpress 插件,我的 PHP 将停止每大约 10 小时重置一次。到目前为止,我的 PHP 已经连续运行了 3 天。有没有人对此有任何建议?
我正在做一些关于这个主题的研究(谷歌搜索),但我能找到的只是 2-3 年前的帖子。我对今天的情况很感兴趣。你更偏向于哪个,为什么?
我想向您询问您所知道的 PHP/Apache 配置方法,以及它们的优缺点。我自己开始:
---------------- PHP 作为 Apache 模块----------------
优点:速度快,因为您不需要每次都启动 exe,尤其是在mpm-worker模式下。您还可以在此模式下使用各种PHP 加速器,如 APC 或 eAccelerator。
缺点:如果您在 mpm-worker 模式下运行 apache,您可能会面临稳定性问题,因为任何 php 脚本中的每个故障都会导致该 apache 进程的整个线程池不稳定。同样在这种模式下,所有脚本都代表 apache 用户执行。这不利于安全。mpm-worker 配置需要在线程安全模式下编译 PHP。至少 CentOS 和 RedHat 默认存储库没有线程安全的 PHP 版本,因此在这些操作系统上,您至少需要自己编译 PHP(有一种方法可以在 Apache 上激活 worker mpm)。线程安全的 PHP 二进制文件的使用被认为是实验性的和不稳定的。另外,许多 PHP 扩展不支持线程安全模式,或者没有在线程安全模式下进行良好测试。
---------------- PHP 作为 CGI ----------------
这似乎是最慢的默认配置,它本身似乎是一个“骗局”;)
---------------- PHP 作为 CGI 通过 mod_suphp ----------------
优点:suphp 允许您代表脚本文件所有者执行 php scipts。这样您就可以安全地将同一台机器上的不同站点分开。此外,suphp 允许每个虚拟主机使用不同的 php.ini 文件。
缺点:CGI 模式下的 PHP 意味着较低的性能。在这种模式下,你不能使用像 APC 这样的 php 加速器,因为每次产生新进程来处理脚本时,前一个进程的缓存都没用。顺便说一句,你知道在这个配置中应用一些加速器的方法吗?我听说了一些关于将 shm 用于 …
我正在运行 nginx 和 fastcgi 来运行 wordpress 博客。
运行一段时间后,我收到 502 个错误的网关错误。如果我重新启动服务器一切正常。
在 nginx 上运行的其他站点不受影响(它们不是基于 php 的),所以我在查看日志文件后发现它一定是 fastcgi 进程说上游客户端 127.0.0.1 没有响应。
我该如何重新启动?这个 fastcgi 进程是否有特殊的日志文件?
我有一个 64 位服务器,但只有 256MB 的 RAM。因此,我使用 fast-cgi 移至 nginx 服务器以连接到 PHP。我正在运行 PHP 5.3.6。
问题是,每隔两三天,当我尝试访问任何 PHP 页面时,就会出现服务器内部错误。唯一的方法是手动重启 php-fpm。这意味着我应该设置一些错误的参数,导致它窒息。下面我列出了相关的配置。
/etc/php-fpm.conf :-
include=/etc/php-fpm.d/*.conf
log_level = error
;emergency_restart_threshold = 0
;emergency_restart_interval = 0
;process_control_timeout = 0
Run Code Online (Sandbox Code Playgroud)
/etc/php-fpm.d/www.conf :-
[www]
pm = dynamic
pm.max_children = 10
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 5
pm.max_requests = 500
Run Code Online (Sandbox Code Playgroud)
/etc/nginx/php.conf :-
location ~ \.php {
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri; …Run Code Online (Sandbox Code Playgroud) 我目前正在测试 nginx 并设置了一些虚拟主机,方法是将每个虚拟主机的配置放在名为sites-enabled.
然后我要求 nginx 使用以下命令加载所有这些配置文件:
include C:/nginx/sites-enabled/*.conf;
Run Code Online (Sandbox Code Playgroud)
这是我当前的配置:
http {
server_names_hash_bucket_size 64;
include mime.types;
include C:/nginx/sites-enabled/*.conf;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
root C:/www-root;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
index index.html index.htm index.php;
}
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include …Run Code Online (Sandbox Code Playgroud) 这个问题的大多数答案是,设置 fastcgi_param SCRIPT_FILENAME 并且它会起作用(斜体格式被破坏了?!)。
我已经设置了这个变量(正确)但它仍然显示错误而不是 404 页面,因为问题的根源在这里:
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
Run Code Online (Sandbox Code Playgroud)
一个不存在的路径被传递给 php5-fpm,这反过来打印错误,在日志中看起来像:
FastCGI sent in stderr:
"Unable to open primary script: ... (No such file or directory)"
while reading response header from upstream
Run Code Online (Sandbox Code Playgroud)
所以在该行之前fastcgi_pass 必须有一个条件来检查文件是否真的存在,或者,如果fpm worker返回“file not found”,引导nginx返回404页面。
我怎样才能做到这一点?
我正在运行 Nginx 并通过 FastCGI 将 php 请求代理到 PHP-FPM 进行处理。我会随机收到 502 Bad Gateway 错误页面 - 我可以通过非常快速地点击我的 PHP 网站/刷新页面一两分钟来重现这个问题。当我收到 502 错误页面时,我所要做的就是刷新浏览器并且页面正确刷新。
这是我的设置:
nginx/0.7.64 PHP 5.3.2 (fpm-fcgi)(构建时间:2010 年 4 月 1 日 06:42:04)Ubuntu 9.10(最新 2.6 Paravirt)
我使用这个 ./configure 指令编译了 PHP-FPM
./configure --enable-fpm --sysconfdir=/etc/php5/conf.d --with-config-file-path=/etc/php5/conf.d/php.ini --with-zlib --with -openssl --enable-zip --enable-exif --enable-ftp --enable-mbstring --enable-mbregex --enable-soap --enable-sockets --disable-cgi --with-curl --with -curlwrappers --with-gd --with-mcrypt --enable-memcache --with-mhash --with-jpeg-dir=/usr/local/lib --with-mysql=/usr/bin/mysql -- with-mysqli=/usr/bin/mysql_config --enable-pdo --with-pdo-mysql=/usr/bin/mysql --with-pdo-sqlite --with-pspell --with-snmp --with- sqlite --with-tidy --with-xmlrpc --with-xsl
我的 php-fpm.conf 看起来像这样(相关部分):
...
<value name="pm">
<value …Run Code Online (Sandbox Code Playgroud) 我正在运行一个包含大量编码的文件。处理 500 个用户大约需要 55 秒,但现在我必须处理 1000 个用户。默认超时是 60 秒,所以我必须增加 FastCGI 读取超时。
我在 StackOverflow 上发现了这个问题,说我必须增加,fastcgi_read_timeout但我不知道把它放在哪里fastcgi.conf。