我有一个运行 Apache 2.4.10 和 Php 5.6.26 的 Vagrant Debian Wheezy,我需要安装并运行 libapache2-mod-php5 以使 Apache 能够读取 .htaccess 文件中的 php_value。TL;DR Apache 重新启动后会立即触发错误:
$ apachectl -M
apache2: Syntax error on line 37 of /etc/apache2/apache2.conf: Syntax error on line 1 of /etc/apache2/mods-enabled/php5.load: Cannot load /usr/lib/apache2/modules/libphp5.so into server: /usr/lib/apache2/modules/libphp5.so: undefined symbol: unixd_config
Action '-M' failed.
The Apache error log may have more information.
这是 PHP 版本:
$ php -v
PHP 5.6.26-1~dotdeb+7.1 (cli) (built: Sep 18 2016 19:52:57)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies
with Xdebug v2.5.0-dev, Copyright (c) 2002-2016, by Derick Rethans
这就是 Apache 配置:
$ apache2 -V
[Mon Sep 26 23:27:20.618601 2016] [core:warn] [pid 25105] AH00111: Config variable ${APACHE_PID_FILE} is not defined
[Mon Sep 26 23:27:20.623081 2016] [core:warn] [pid 25105:tid 139878783203136] AH00111: Config variable ${APACHE_RUN_DIR} is not defined
[Mon Sep 26 23:27:20.623438 2016] [core:warn] [pid 25105:tid 139878783203136] AH00111: Config variable ${APACHE_LOCK_DIR} is not defined
Server version: Apache/2.4.10 (Debian)
Server built: Nov 7 2014 12:05:20
Server's Module Magic Number: 20120211:37
Server loaded: APR 1.5.1-dev, APR-UTIL 1.5.3
Compiled using: APR 1.5.1-dev, APR-UTIL 1.5.3
Architecture: 64-bit
Server MPM: worker
threaded: yes (fixed thread count)
forked: yes (variable process count)
Server compiled with....
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=256
-D HTTPD_ROOT="/etc/apache2"
-D SUEXEC_BIN="/usr/lib/apache2/suexec"
-D DEFAULT_PIDLOG="/var/run/apache2.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="mime.types"
-D SERVER_CONFIG_FILE="apache2.conf"
后来我读到libapache2-mod-php5需要使用prefork MPM进行编译,因此再次重新编译并启用 mpm-prefork:
$ sudo a2dismod worker
Module worker disabled.
To activate the new configuration, you need to run:
service apache2 restart
$ sudo a2enmod mpm_prefork
Considering conflict mpm_event for mpm_prefork:
Considering conflict mpm_worker for mpm_prefork:
Module mpm_prefork already enabled
$ sudo service apache2 start
[ ok ] Starting web server: apache2.
$ apache2 -V
[Mon Sep 26 23:05:35.463940 2016] [core:warn] [pid 22298] AH00111: Config variable ${APACHE_PID_FILE} is not defined
[Mon Sep 26 23:05:35.466868 2016] [core:warn] [pid 22298] AH00111: Config variable ${APACHE_RUN_DIR} is not defined
[Mon Sep 26 23:05:35.467139 2016] [core:warn] [pid 22298] AH00111: Config variable ${APACHE_LOCK_DIR} is not defined
Server version: Apache/2.4.10 (Debian)
Server built: Nov 7 2014 12:05:20
Server's Module Magic Number: 20120211:37
Server loaded: APR 1.5.1-dev, APR-UTIL 1.5.3
Compiled using: APR 1.5.1-dev, APR-UTIL 1.5.3
Architecture: 64-bit
Server MPM: prefork
threaded: no
forked: yes (variable process count)
Server compiled with....
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=256
-D HTTPD_ROOT="/etc/apache2"
-D SUEXEC_BIN="/usr/lib/apache2/suexec"
-D DEFAULT_PIDLOG="/var/run/apache2.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="mime.types"
-D SERVER_CONFIG_FILE="apache2.conf"
$ sudo apt-get remove libapache2-mod-php5
...
$ sudo apt-get autoclean
...
$ sudo apt-get install libapache2-mod-php5
...
$ sudo a2enmod php5
Enabling module php5.
To activate the new configuration, you need to run:
service apache2 restart
$ sudo service apache2 restart
[FAIL] Restarting web server: apache2 failed!
[warn] The apache2 configtest failed. ... (warning).
Output of config test was:
apache2: Syntax error on line 37 of /etc/apache2/apache2.conf: Syntax error on line 1 of /etc/apache2/mods-enabled/php5.load: Cannot load /usr/lib/apache2/modules/libphp5.so into server: /usr/lib/apache2/modules/libphp5.so: undefined symbol: unixd_config
Action 'configtest' failed.
The Apache error log may have more information.
但仍然出现相同的错误。我不知道我在这里遗漏了什么。我真的需要在读取 .htaccess 文件中的 php_value 时消除这些错误。
编辑-找到解决方案
感谢@Unbeliever的回答,我发现puPHPet Vagrant机器我正在使用配置php-FPM而不是旧的mod_php(这种情况自2015年3月以来发生)。后来我发现php-FPM(以及其他CGI / FCGI版本的php)可以读取php_value在 user.ini 文件中,如下所述https://secure.php.net/manual/en/configuration.file.per-user.php。因此,最好将 php.ini 文件与 .htaccess 放在一起,以提供全面支持。
答案1
未定义的符号意味着您安装了针对早期版本的 Apache 编译的 mod_php 包。
您应该能够通过将 libapache2-mod-php5 更新为针对 Apache v2.4 编译的版本来纠正此问题。
抱歉,我不是 Linux repo 专家,但您可能需要从获取 Apache httpd 的同一存储库中获取 libapache2-mod-php5。