AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 733230
Accepted
David W
David W
Asked: 2015-11-03 02:57:29 +0800 CST2015-11-03 02:57:29 +0800 CST 2015-11-03 02:57:29 +0800 CST

Apache:设置 php-fpm chroot 后“找不到文件”

  • 772

我正在努力完成在 CentOS 7 上运行 Apache 2.4 在 php-fpm 上实现 chroot 的最后一步。

我已经成功设置并测试了没有 chroot 的 php-fpm 连接。但是,一旦我将 chroot 指令添加到我的 /etc/php-fpm.d/file.conf 中的 conf 文件中,我就会像许多其他人所经历的那样得到一个“找不到文件” 。

这是我的 php-fpm 配置文件:

[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
chroot = /home/www/site1.com
chdir = /www
catch_workers_output = yes

如您所见,在设置 chroot 后,我​​更改了chdir指令,使其相对于 PHP 根目录。(系统路径是/home/www/site1.com/www,这就是chdir在启用chroot指令之前设置的)。

这是我的相关 http.d/site1.conf 文件:

<VirtualHost *:80>
        ServerAdmin [email protected]
        ServerName site1.com
        ServerAlias www.site1.com
        DocumentRoot /home/www/site1.com/www
        <Directory "/home/www/site1.com/www">
                Options Includes FollowSymLinks
                DirectoryIndex index.php
                AllowOverride All
                Order allow,deny
                Allow from all
        </Directory>
ErrorLog /home/www/site1.com/logs/errors
CustomLog /home/www/site1.com/logs/access_log common
        <FilesMatch "\.php$">
                SetHandler "proxy:unix:///var/run/php-fpm/site1.com.sock|fcgi://site1.com"
        </FilesMatch>
LogLevel trace3
</VirtualHost>

我在 httpd.d/site.conf 文件中打开了 LogLevel,下面是一些有趣的输出:

  [Mon Nov 02 10:42:52.665284 2015] [proxy:trace2] [pid 14286] proxy_util.c(2007): [client 74.221.189.99:16486] *: found reverse proxy worker for unix:///var/run/php-fpm/site1.com.sock|fcgi://site1.com/home/www/site1.com/www/index.php
    [Mon Nov 02 10:42:52.665292 2015] [proxy:trace2] [pid 14286] proxy_util.c(2041): [client 74.221.189.99:16486] *: rewrite of url due to UDS(/var/run/php-fpm/site1.com.sock): fcgi://site1.com/home/www/site1.com/www/index.php (proxy:fcgi://site1.com/home/www/site1.com/www/index.php)
    [Mon Nov 02 10:42:52.665295 2015] [proxy:debug] [pid 14286] mod_proxy.c(1117): [client 74.221.189.99:16486] AH01143: Running scheme unix handler (attempt 0)
    [Mon Nov 02 10:42:52.665300 2015] [proxy_ajp:debug] [pid 14286] mod_proxy_ajp.c(713): [client 74.221.189.99:16486] AH00894: declining URL fcgi://site1.com/home/www/site1.com/www/index.php
    [Mon Nov 02 10:42:52.665304 2015] [proxy_fcgi:debug] [pid 14286] mod_proxy_fcgi.c(948): [client 74.221.189.99:16486] AH01076: url: fcgi://site1.com/home/www/site1.com/www/index.php proxyname: (null) proxyport: 0
    [Mon Nov 02 10:42:52.665307 2015] [proxy_fcgi:debug] [pid 14286] mod_proxy_fcgi.c(955): [client 74.221.189.99:16486] AH01078: serving URL fcgi://site1.com/home/www/site1.com/www/index.php
    [Mon Nov 02 10:42:52.665311 2015] [proxy:debug] [pid 14286] proxy_util.c(2200): AH00942: FCGI: has acquired connection for (*)
    [Mon Nov 02 10:42:52.665316 2015] [proxy:debug] [pid 14286] proxy_util.c(2253): [client 74.221.189.99:16486] AH00944: connecting fcgi://site1.com/home/www/site1.com/www/index.php to site1.com:8000
    [Mon Nov 02 10:42:52.665320 2015] [proxy:debug] [pid 14286] proxy_util.c(2286): [client 74.221.189.99:16486] AH02545: fcgi: has determined UDS as /var/run/php-fpm/site1.com.sock
    [Mon Nov 02 10:42:52.665420 2015] [proxy:debug] [pid 14286] proxy_util.c(2419): [client 74.221.189.99:16486] AH00947: connected /home/www/site1.com/www/index.php to httpd-UDS:0
    [Mon Nov 02 10:42:52.668135 2015] [proxy_fcgi:error] [pid 14286] [client 74.221.189.99:16486] AH01071: Got error 'Primary script unknown\n'
    [Mon Nov 02 10:42:52.668179 2015] [proxy_fcgi:trace1] [pid 14286] util_script.c(599): [client 74.221.189.99:16486] Status line from script 'index.php': 404 Not Found
    [Mon Nov 02 10:42:52.668237 2015] [http:trace3] [pid 14286] http_filters.c(992): [client 74.221.189.99:16486] Response sent with status 404
    [Mon Nov 02 10:42:52.668284 2015] [proxy:debug] [pid 14286] proxy_util.c(2215): AH00943: FCGI: has released connection for (*)

php 错误日志文件中没有显示任何内容。

所以,在这一切之后,

  • 为什么我仍然收到“找不到文件”错误消息?
  • 更好的是,我该如何解决它,或者至少,我如何更好地解决我的问题?
apache-2.4
  • 4 4 个回答
  • 24509 Views

4 个回答

  • Voted
  1. Best Answer
    David W
    2015-11-11T02:56:05+08:002015-11-11T02:56:05+08:00

    这解决了。我上面的代码有两个问题。

    问题 #1 - 只有 Apache 2.4.10 及更高版本可以支持套接字

    基本 CentOS 存储库 ( Apache 2.4.6 )中的默认 Apache 版本仅支持 TCP 端口。因此,上面的代码是不正确的,listen需要将 php-fpm 配置文件中的指令更改为如下内容:

    listen = 127.0.0.1:9001
    

    我还在我的 http.d conf 文件中进行了适当的更改,但除此之外,我还切换到使用ProxyPassMatch指令而不是使用FilesMatch指令。所以我的代码变成了:

    ProxyPassMatch "^/(.*\.php)$" "fcgi://127.0.0.1:9001/site1.com"
    

    请注意,此代码仍然是错误的...见下文

    继续...

    问题 #2 - 相关路径

    我的 http.d conf 文件中的ProxyPassMatch指令(或者,在我使用该指令的旧代码的情况下)中的路径相对于 chroot。它与 www 文档根目录无关(如果不同)。FilesMatch

    所以我在 http.d conf 文件中的代码变成了:

    ProxyPassMatch "^/(.*\.php)$" "fcgi://127.0.0.1:9001/www/$1"
    

    瞧!我有一个 php-fpm chroot。

    • 6
  2. Benjish
    2015-11-10T12:14:42+08:002015-11-10T12:14:42+08:00

    php-fpm 有一个 chroot 和路径的错误。

    例如 www 中的 index.php

    chroot = /home/www/site1.com
    chdir = /www
    

    使用此配置 php-fpm 写入此路径:

    /home/www/site1.com/home/www/site1.com/www
    

    一种解决方案是在 shell 中创建符号链接:

    cd /home/www/site1.com
    mkdir -p home/www
    cd home/www
    ln -s /home/www/site1.com site1.com
    

    但它不干净。

    https://bugs.php.net/bug.php?id=55322

    https://bugs.php.net/bug.php?id=62279

    • 4
  3. regdude
    2017-06-09T11:53:25+08:002017-06-09T11:53:25+08:00

    有些人可能会因为两件事而收到此错误。

    • php.ini 中的相对路径错误
      如果您在 PHP-FPM.conf 中指定 open_basedir、doc_root、user_dir、session.save_path、upload_tmp_dir(和其他),那么这些路径必须相对于 chroot。
      例如:

    chroot = /var/www
    php_admin_value[doc_root] = /htdocs
    ;所有路径必须相对于 chroot,因为 chroot 后 PHP 不知道绝对路径

    • cgi.fix_pathinfo = 1 in php.ini
      TL;DR 只需将其更改为 0。
      出于某些原因,此值会影响您的 PHP-FPM,即使此参数仅适用于 CGI。
      您应该阅读有关此参数的更多信息,因为它也可能会破坏其他内容,更多信息请点击此处
    • 3
  4. Mugurel
    2015-11-03T03:28:17+08:002015-11-03T03:28:17+08:00

    你有启用 SElinux 吗?getenforce 应该能够告诉你这一点。如果是这种情况, setenforce 0 将禁用它,然后您需要编辑 /etc/sysconfig/selinux 并将 SELINUX 设置为禁用,以便在重新启动后它是持久的。

    • 1

相关问题

  • SELinux 阻止 Apache 写入文件

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve