我花了几个小时弄清楚如何安装 Nginx + Ruby 企业版 + PHP5-fpm 和 MYSQL,最后都安装好了,一切似乎都开始正常了。
但由于某种原因,php 文件没有被处理。
.html 文件工作正常,但是当我尝试查看 .php 文件时,它看起来好像不存在,即使它确实存在。有趣的是,当我尝试查看一个不存在的 .html 文件时,我收到了一个很好的 Nginx 404 消息,但是当我查看一个 .php 文件时,它甚至没有给我。
所以我的新手理解,看起来配置有问题,或者 Nginx 和 PHP-fpm 没有相互交谈。
我一直在查看 nginx 配置文件的许多其他示例,我确信这方面没问题。好吧……无论如何,这是conf文件的相关部分:
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/eman/$fastcgi_script_name;
include fastcgi_params;
}Run Code Online (Sandbox Code Playgroud)
和
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;Run Code Online (Sandbox Code Playgroud)
任何帮助是极大的赞赏。
编辑:以下是从测试 php 文件“ http://eman.id.au/test.php ”返回的标头:
HTTP/1.1 404 Not Found =>
Server => nginx/0.8.54
Date => Thu, …Run Code Online (Sandbox Code Playgroud) 我有以下 nginx vhost 配置:
server {
listen 80 default_server;
access_log /path/to/site/dir/logs/access.log;
error_log /path/to/site/dir/logs/error.log;
root /path/to/site/dir/webroot;
index index.php index.html;
try_files $uri /index.php;
location ~ \.php$ {
if (!-f $request_filename) {
return 404;
}
fastcgi_pass localhost:9000;
fastcgi_param SCRIPT_FILENAME /path/to/site/dir/webroot$fastcgi_script_name;
include /path/to/nginx/conf/fastcgi_params;
}
}
Run Code Online (Sandbox Code Playgroud)
我想重定向所有与 index.php 存在的文件不匹配的请求。这适用于目前大多数 URI,例如:
example.com/asd
example.com/asd/123/1.txt
Run Code Online (Sandbox Code Playgroud)
无论是中asd或asd/123/1.txt存在,所以他们重定向到的index.php和工作正常。但是,如果我输入 url example.com/asd.php,它会尝试查找asd.php,当找不到时,它会返回 404 而不是将请求发送到index.php。
有没有得到一个方式asd.php进行也发送到index.php如果asd.php不存在?
Apache2 有一个内置的 fastcgi 替代品,称为 fcgid。这很好,但它缺少 FastCgiExternalServer 指令,我用来连接到 PHP-FPM。我怎样才能对 apache2 中的 fcgid 模块做同样的事情?
我的目标是将 php-fpm 与 apache2 一起使用(在 debian Squeeze 上)。
我正在测试使用nginx/php5-fpm, 与代码
<?php
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
// also tested: header("Status: 404 Not Found");
echo $_SERVER["SERVER_PROTOCOL"];
Run Code Online (Sandbox Code Playgroud)
并强制在命令中使用HTTP 1.0curl。
curl -0 -v 'http://www.example.com/test.php'
> GET /test.php HTTP/1.0
< HTTP/1.1 404 Not Found
< Server: nginx
< Date: Sat, 27 Oct 2012 08:51:27 GMT
< Content-Type: text/html
< Connection: close
<
* Closing connection #0
HTTP/1.0
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我已经在请求使用HTTP 1.0,但是 nginx 回复我HTTP 1.1
赏金
@MaximDounin,@MichaelHampton 已经为规范提供了答案,谢谢。我正在为未来的读者扩展这个问题:
问:当客户端请求 HTTP 1.0 时,响应 HTTP 1.1 的优势是什么?谷歌采取的方法不应该更合理,即当客户端请求 1.0 时,用 1.0 …
我有一个 LEMP 环境,需要选择将所有开发子域与暂存区分开(使用 xdebug 暂存开发而不使用)。
因此我设置了两个池php-dev和php-stage,但似乎只能在php.ini中启用扩展!?
这是我的 pool.conf (dev)
[php-dev]
listen = 127.0.0.1:9101
listen = /var/run/php-fpm/a1-php-dev.socket
listen.backlog = -1
listen.allowed_clients = 127.0.0.1
user = nginx
group = nginx
request_slowlog_timeout = 3s
slowlog = /var/log/php-fpm/slowlog-php-dev.log
pm = dynamic
pm.max_children = 20
pm.start_servers = 10
pm.min_spare_servers = 4
pm.max_spare_servers = 16
pm.max_requests = 500
pm.status_path = /status
request_terminate_timeout = 120s
rlimit_files = 131072
rlimit_core = unlimited
catch_workers_output = yes
env[HOSTNAME] = $HOSTNAME
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = …Run Code Online (Sandbox Code Playgroud) 我在 Ubtuntu 12.04LTS 上使用最新的 php5-fpm(来自 debphp)和 nginx 1.4.3 遇到了非常困难的情况。
简而言之,我根本无法启动php5-fp,我一直在系统日志中收到此错误:
kernel: [1213013.564441] init: php5-fpm main process (7357) terminated with status 78
kernel: [1213013.564496] init: php5-fpm main process ended, respawning
..... (repeated several times)
kernel: [1213014.143911] init: php5-fpm respawning too fast, stopped
Run Code Online (Sandbox Code Playgroud)
我的/var/log/php5-fpm.log根本没有人口。没有php5-fpm.sock和php5-fpm.pid在/run(或/var/run)。
我的/etc/php5/fpm/php-fpm.conf在下面:(这个文件现在似乎没有加载,因为我试图将一些虚假信息放入其中但没有引起任何更改)
;;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;
include=/etc/php5/fpm/*.conf
;;;;;;;;;;;;;;;;;;
; Global Options ;
;;;;;;;;;;;;;;;;;;
[global]
; Pid file
; Note: the default prefix is …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页面。
我怎样才能做到这一点?
一旦池达到 pm.max_children,Nginx 就会在尝试向 PHP-FPM 发送新请求时开始超时。“最大侦听队列”在 php-status 页面中始终为 0。
以下是 php-fpm 池的示例:
[example]
catch_workers_output = no
; Configure listener
listen = /var/run/php-fpm/example.sock
listen.backlog = 65535
listen.owner = nginx
listen.group = nginx
; Unix user/group of processes
user = nginx
group = nginx
; Choose how the process manager will control the number of child processes.
pm = ondemand
pm.max_children = 10
pm.max_requests = 200
pm.process_idle_timeout = 30s
pm.status_path = /status
; Pass environment variables
env[HOSTNAME] = $HOSTNAME …Run Code Online (Sandbox Code Playgroud) 我做了一些调查,发现这个可以计算和调整pm.max_children值
https://myshell.co.uk/blog/2012/07/adjusting-child-processes-for-php-fpm-nginx/
但例如:
如果我应用这个:
pm.max_children = 专用于 Web 服务器的总 RAM / 最大子进程大小
所以在我的情况下:
pm.max_children = 5120 / 80 = 64
但是如果我在每个 php-fpm 网站 conf 文件上添加pm.max_children = 64,这意味着每个网站都可以使用64个子进程X 1 个进程的大小(例如40mb)= 2560Mb
如果我们想象,同时所有 30 个网站都达到了 pm.max_children 值,我们将有:2560Mb(每个网站的最大值)x 30 个网站 = 76 800 Mb
我对么?
Si 是的,这意味着当许多网站托管在同一台服务器上时,我们必须将计算结果pm.max_children = 5120 / 80 = …
第一次设置 VPS——注意不要在这里问,除非我做了尽职调查并提供了上下文。
在我的远程 VPS 上,通过终端,我运行的几乎所有命令都以一条Error: Too many open files消息结束,我需要您的帮助才能继续前进。
我CentOS Linux release 7.6.1810 (Core)在一台有 1 个 CPU 内核和 2048Mb RAM 的机器上运行。它已经设置了一个Nginx 1.16.1, PHP-FPM 7.3.9, MariaDb 10.4.8用于简单 wordpress 站点的 LEMP 堆栈。
我试过了:
中的系统范围设置/etc/security/limits.conf:
nginx soft nofile 1024
nginx hard nofile 65536
root hard nofile 65536
root soft nofile 1024
Run Code Online (Sandbox Code Playgroud)
调整内存限制和上传/etc/php.ini:
memory_limit = 256M
file_uploads = On
upload_max_filesize = 128M
max_execution_time = 600
max_input_time = 600
max_input_vars = 3000 …Run Code Online (Sandbox Code Playgroud) php-fpm ×10
nginx ×8
php ×3
linux ×2
pool ×2
apache-2.2 ×1
centos ×1
fastcgi ×1
http ×1
max-requests ×1
memory ×1
php5 ×1
php7 ×1
redirect ×1
ubuntu-12.04 ×1
web-server ×1
xdebug ×1