我无法在本地开发机器上执行 PHP 文件。我似乎已经成功安装了nginx并且php-fpm似乎也已正确安装,并且正在运行,但无法弄清楚为什么 PHP 文件被下载而不是被执行。
在经历了很多很多小时的挫折之后,我认为最好问问以前可能做过这件事的人!我已尽力提供所有信息,但如果有任何可能有用或我遗漏的信息,请随时在评论中提问。
请注意:请仔细阅读我遇到的问题。我之所以这么说是因为我已经通读了几乎所有与 Google 可以提供给我的与此问题相关的文章,并尝试了几种不同的方法、修复、建议、重新安装、配置等。但每个人都无法提供帮助修复甚至调试我遇到的问题。换句话说,这绝对不是一个重复的问题。我花了几个小时阅读以确保!
我已经成功安装了nginx和php-fpm使用https://github.com/josegonzalez/homebrew-php. 好的 ol' trustybrew doctor确认一切都是最新的,我已经安装了所有必要的东西(XQuartz、Xcode 命令行工具等)。
以下是一些在尝试理解我的设置时可能有用的文件摘录:
php-fpm 日志
tail -f /usr/local/var/log/php-fpm.log
[24-Dec-2013 00:05:59] NOTICE: [pool www] 'user' directive is ignored when FPM is not running as root
[24-Dec-2013 00:05:59] NOTICE: [pool www] 'group' directive is ignored when FPM is not running as root
[24-Dec-2013 00:05:59] NOTICE: fpm is running, pid 31745 …Run Code Online (Sandbox Code Playgroud) 每次我在 CentOS 机器上升级 php(通过 yum upgrade)时,我的 /var/lib/session 文件夹所有权都会变成具有 600 权限的 root:apache。我使用 nginx 作为我的网络服务器。这会破坏我的网站并阻止存储会话。
修复方法只是将文件夹 chown nginx:nginx 。但是每次 yum 更新 php 时我都必须手动执行此操作。
我想问题源于这样一个事实,即当我最初设置盒子时,我运行了 apache。我在哪里可以将此配置更改为“nginx”以解决此问题?我查看了 php.ini,但在那里看不到任何相关内容。会话目录已指定,但与用户无关。
使用 php-fpm 在 Apache mod_php 与 nginx 上有很多旧的基准测试
但是,在 2.4 版中,Apache 可以使用 php-fpm。是否有任何合理的基准比较 mod_php 和 php-fpm(均在 Apache 2.4.x 上)?
我正在尝试使用 jmeter 测试加载我的团队在 AWS ubuntu 14.04 上开发和部署的 LAMP 应用程序。我们使用 AWS CDN 来提供静态文件,mysql 和 apache 在同一台主机上。
当只有一个用户在做事时,响应时间是正常的,根据页面的不同在 2 到 5 秒之间。
我的目标是让它在同一时间响应 500 个同时做事的连接用户。
我从较少数量的用户开始,在 t2.small(1vCPU,2 Gb RAM)上使用 mod_php 和 prefork 模块,我对只有 40 个连接的用户感到满意。一旦有 100 个,它就会以 +20 秒的响应时间极度减慢。
在进行了一些 SO 资源之后,我尝试使用 php-fpm 和 event 模块。性能更好,但仍然很慢;任何单页 +15 秒。我决定将服务器升级到 M4.2xlarge(8vCPU,32 Gb RAM)。对于 100 个连接的用户,它表现正常,我很满意,但这是一个昂贵的,我想使用最合适的服务器规格找到更好的性能。
不管怎样,我试图用 330 个连接的用户同时做事来测试这个 M4.2xlarge,它变得太慢了,每页 +15~+20s。一直在尝试调整事件配置和 fpm 进程,但没有运气(在大多数情况下,我有 +90?cpu,但没有使用足够的 RAM,这就是为什么我认为我们在某处有限制)。
我觉得我很接近,但我做不到。我将使用您要求的任何文件、日志或输出更新我的问题。
任何人都对 php-fpm 7 和 11.0-RELEASE-p8 有类似的问题,或者知道如何调试它?
几分钟后情况开始,只向客户显示半页。任何页面都显示约 62kb 的内容并带有结尾????????? 4.
php-fpm 的日志文件:
[18-Mar-2017 15:41:49] NOTICE: [pool www] child 80582 exited with code 0 after 0.005648 seconds from start
[18-Mar-2017 15:41:49] NOTICE: [pool www] child 80584 started
[18-Mar-2017 15:41:49] NOTICE: [pool www] child 80583 exited with code 0 after 0.005877 seconds from start
[18-Mar-2017 15:41:49] NOTICE: [pool www] child 80585 started
[18-Mar-2017 15:41:49] NOTICE: [pool www] child 80581 exited with code 0 after 0.007763 seconds from start
[18-Mar-2017 15:41:49] NOTICE: …Run Code Online (Sandbox Code Playgroud) 我正在docker-compose用来设置一个最小的nginx+php-fpm应用程序,但由于某种原因,docker 容器上没有 php.ini 文件(我知道是因为phpinfo()说Loaded Configuration File: (none))。
这是我的docker-compose.yml文件:
web:
image: nginx
ports:
- "8080:80"
volumes:
- ./site.conf:/etc/nginx/conf.d/site.conf
links:
- php
php:
image: php:5-fpm
volumes:
- .root:/var/www/html:ro
command: bash -c "apt-get update && apt-get install -y php5-mysql && php-fpm"
Run Code Online (Sandbox Code Playgroud)
site.conf 也很简单:
server {
index index.php;
server_name local.myspicesage.com;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /var/www/html;
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param …Run Code Online (Sandbox Code Playgroud) 我了解 ssl 握手流程,但我面临逻辑问题。当用户选择证书时,我需要根据应用程序对其进行验证,以了解其是否可靠并与任何系统用户匹配。但如果没有,我必须允许用户再次要求选择另一个。也许用户在他们的机器上安装了多个证书并错误地选择了错误的证书。
在我的实际场景中,要选择另一个证书,用户必须关闭浏览器并再次打开,但它会给用户体验带来负面影响,我想改进它。
该解决方案对每个请求都进行一次握手,因此它允许用户选择另一个请求。
但是怎么做呢?
我发现的最相关的问题是https://security.stackexchange.com/questions/56623/avoiding-ssl-handshake-for-each-call。
- 在完整的握手是一个什么样的客户端和服务器做的时候,他们不知道对方(他们以前从来没有聊过,或者说是很久以前)。在完全握手中,发送证书,并发生非对称加密(RSA、Diffie-Hellman...)。
- 该缩写握手是什么客户端和服务器记住对方; 更准确地说,他们记住了他们在之前的完全握手中建立的算法和密钥,并同意重用它们(从技术上讲,他们重用“主秘密”并从中派生出用于此连接的新加密密钥)。
我可以释放任何 cookie,关闭选项卡并禁用保持活动状态,第二次握手不会打开证书提示。它使用的是先前选择的,例如对于 chrome,没有“记住我的决定”选项,Firefox 有。Edge、Opera、Edge 等也会发生同样的情况。它是标准吗?
我猜,它可以由服务器端控制,请求一个新的 SSL 握手。我做了一些干预尝试自己解决它,但没有成功
在客户端:
在服务器端:
关闭浏览器是唯一对新 SSL Handshake 有效的方法,但它会带来糟糕的用户体验。
好吧,如果我正在清除浏览器中的所有数据,关闭连接,删除任何活动的数据,并且在我关闭浏览器(终止所有进程)之前它仍在使用第二个请求中选择的第一个证书,则有问题,或者使用浏览器(全部)或服务器。
如果我的应用程序使用 SSL 对用户进行身份验证,我不能在不关闭浏览器的情况下使用多次登录,这是不对的,它应该有办法重新协商此身份验证。
我遵循了本指南并更新了值:
/etc/php/7.0/fpm/php.ini 并更改/添加:
max_execution_time = 300
Run Code Online (Sandbox Code Playgroud)
和/etc/php/7.0/fpm/pool.d/www.conf以及和变化/补充一点:
php_admin_value[max_execution_time] = 300
Run Code Online (Sandbox Code Playgroud)
和/etc/nginx/sites-available/example.com, 并在 cgi 部分添加:
fastcgi_read_timeout 300;
Run Code Online (Sandbox Code Playgroud)
...然后重新启动,但仍然:
# php -i | grep max_execution_time
max_execution_time => 0 => 0
Run Code Online (Sandbox Code Playgroud)
这是我网站的位置块:
location ~ .php$ {
fastcgi_split_path_info ^(.+.php)(/.*)$;
try_files $uri =404;
fastcgi_keep_conn on;
fastcgi_read_timeout 600;
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
Run Code Online (Sandbox Code Playgroud)
做错了什么?
我想将任何api/*路由传递给 php-fpm。特别是index.php因为我使用 Symfony。这是唯一应该使用 php 的路径。其他任何内容都将从/usr/share/nginx/html/public(仅 HTML 文件和 CSS)加载。
我已经尝试过,但出现错误:
FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream
Run Code Online (Sandbox Code Playgroud)
我的 nginx 配置如下:
upstream php {
server php:9000;
}
server {
listen 80 default_server;
server_name impressive.local;
index index.html index.php;
root /usr/share/nginx/html/public;
location /api {
root /usr/share/nginx/html/api;
try_files $uri /index.php;
}
location ~ \.php$ {
fastcgi_pass php;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi.conf;
}
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
php_1 | [13-Jan-2019 23:22:54] NOTICE: fpm is running, pid …Run Code Online (Sandbox Code Playgroud) 使用 PHP7.3 FPM 和 Apache 2.4.25 我在启用 PHP FPM 状态页面时遇到问题。
什么工作:
# /etc/php/7.3/fpm/pool.d/www.conf
listen = /run/php/php7.3-fpm.sock
pm.status_path = /status-php
# /etc/apache2/sites-enabled/status.conf
<VirtualHost [::1]:80 127.0.0.1:80>
ServerName localhost
DocumentRoot /var/www
<Location /status-php>
SetHandler "proxy:unix:/run/php/php7.3-fpm.sock|fcgi://localhost"
</Location>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
但是,什么行不通正在取代/status-php以/status/php这两个文件(PHP和Apache的配置)。这会导致 404 和一个 Apache 错误说:
AH01071: Got error 'Primary script unknown'
这是什么原因?为什么子文件夹变体不起作用?
php-fpm ×10
nginx ×4
apache-2.4 ×3
php ×3
php5 ×3
amazon-ec2 ×1
benchmark ×1
docker ×1
freebsd ×1
lighttpd ×1
mac-osx ×1
mod-php ×1
mpm-prefork ×1
permissions ×1
php.ini ×1
php7 ×1
ssl ×1
yum ×1