如何在 OS X Yosemite 上的 Apache 2.4 中安装 mod_perl 2.0.9?
Posted
技术标签:
【中文标题】如何在 OS X Yosemite 上的 Apache 2.4 中安装 mod_perl 2.0.9?【英文标题】:How to install mod_perl 2.0.9 in Apache 2.4 on OS X Yosemite? 【发布时间】:2014-12-16 12:03:20 【问题描述】:随着 OS X 10.10 Yosemite 的发布,Apple 将其 Apache 服务器升级到了 2.4 版。
在发布时,mod_perl 2.0.8 与 Apache 2.4 不兼容,mod_perl 2.0.9 尚未正式发布 (more info)。
因此,Apache 没有包含 mod_perl。
我在本地使用 perl 的网站工作,需要安装 mod_perl。
我是一位经验丰富的程序员,但我以前从未做过这样的事情,并且只有我的主机可以工作。我不介意花一些时间来解决这个问题,但我负担不起我的本地服务器。
如何在 OS X Yosemite 上安装 mod_perl?
子问题:
我应该安装哪个版本? 我是下载到安装位置还是其他地方? 我在哪里安装它? 还有其他需要提前安装的依赖吗? 我必须重新创建 apache 安装还是 mod_perl 安装是独立的?我在 bash 方面经验丰富,使用终端非常舒适。
【问题讨论】:
我自己也在想这个。我昨天尝试从源代码 (github.com/apache/mod_perl/tree/trunk) 编译它 git repo 没有一些依赖项,所以我从 2.0 源代码 (apache.org/dist/perl/mod_perl-2.0-current.tar.gz) 中获取了那些。我能够运行perl Makefile.PL
和make
但make test
失败并且我无法运行make install
。没有创建 mod_perl.so 文件(这是 make test
步骤所必需的。我现在放弃了,也许你会有更好的运气。
【参考方案1】:
mod_perl 2.0.8(最新稳定版)不会削减它——它不知道 MPM_NAME 在 apache 2.4.x 中被弃用 通过svn下载最新的开发:
svn checkout https://svn.apache.org/repos/asf/perl/modperl/trunk/ mod_perl-2.0
更改文件将此版本列为 2.0.9-dev
Xcode 6.01 不会删减它——它的 apache 头文件会让 mod_perl 认为你正在运行 apache 2.2.26;获取 Xcode 6.1(10 月 20 日发布)。
Makefile.PL 仍然无法找到 ap_release.h(以获取您的 apache 版本)。在这里:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/apache2/ap_release.h
Makefile.PL 默认在/usr/include/apache2
中查找。它还将在 /usr/include/apr-1
中查找 apr 标头,因为包含 Yosemite 的 /usr/bin/apr-1-config
会告诉它它们在哪里(它们实际上在 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/apr-1
中)
/usr/bin/apr-1-config --includedir
/usr/include/apr-1
我尝试适当地设置环境变量MP_AP_PREFIX
和MP_APR_CONFIG
,但这些值似乎被忽略了。所以我让事情变得更轻松了:
$ sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/apache2 /usr/include/apache2
$ sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/apr-1 /usr/include/apr-1
(感谢 Sean Coyne)Per Jason A. Crome's blog post “OS X 上的 llvm/clang 默认为 C99,但 mod_perl 需要 89 “标准”
$ perl Makefile.PL MP_CCOPTS=-std=gnu89; make ; sudo make install
mod_perl
的 LoadModule
行已从 Yosemite 的 /etc/apache2/httpd.conf
文件中删除。
添加
LoadModule perl_module libexec/apache2/mod_perl.so
到/etc/apache2/httpd.conf
的模块部分
【讨论】:
我按照这些步骤操作,它似乎编译正确,它确实构建了 mod_perl.so 文件,但是在运行apachectl configtest
时我看到以下内容:httpd: Syntax error on line 111 of /private/etc/apache2/httpd.conf: Cannot load libexec/apache2/mod_perl.so into server: dlopen(/usr/libexec/apache2/mod_perl.so, 10): Symbol not found: _modperl_handler_anon_add\n Referenced from: /usr/libexec/apache2/mod_perl.so\n Expected in: flat namespace\n in /usr/libexec/apache2/mod_perl.so
好的,想通了。显然,clang 默认使用了错误的 mod_perl 标准,因此您需要改为运行 perl Makefile.PL MP_CCOPTS=-std=gnu89 ; make ; sudo make install
。信用:blogs.perl.org/users/jason_a_crome/2012/04/…
我自己从 Jason Crome 那里发现的 [link]blogs.perl.org/users/jason_a_crome/2012/04/…
@AndrewSwift Dan 的回答有效。他已对其进行了编辑以进行我提到的更改。
成功了!非常感谢。我会写一个简单的答案,列出步骤和一些注释,但选择这个答案是正确的。【参考方案2】:
这是 Dan Deal 答案的简化版本,为经验不足的开发人员提供了一些注释。
您需要从 Mac App Store 安装 Xcode 6.1。 Xcode 是 Apple 开发的用于开发 ios 和 OS X 软件的工具套件。它占用了将近 6GB,但可以在安装后删除。
启动 Xcode 一次以同意 Apple 的条款。
在终端中,切换到任何临时目录,然后下载 mod_perl 2.0.9-dev: (注意 - '任何临时目录'必须在您的根卷上,并且不能有 目录名称中的任何空格字符;否则 make 脚本稍后会失败)
svn checkout https://svn.apache.org/repos/asf/perl/modperl/trunk/ mod_perl-2.0
切换到新创建的 mod_perl 目录:
cd mod_perl-2.0
告诉安装人员在哪里寻找零件:
/usr/bin/apr-1-config --includedir /usr/include/apr-1
sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/apache2 /usr/include/apache2
sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/apr-1 /usr/include/apr-1
(ln -s 建立一个符号链接,apr-1-config 程序用于检索有关 apr 库的信息,通常用于编译和链接该库。)
(注意 - 在某些 Yosemite 安装中,/usr/include 目录不存在;您 可能必须通过 cd /usr;mkdir include 来创建它)
制作 mod_perl:
perl Makefile.PL MP_CCOPTS=-std=gnu89; make ; sudo make install
删除临时文件夹 mod_perl-2.0。
告诉 apache 在 apache httpd.conf 中包含 mod_perl:
sudo vi /etc/apache2/httpd.conf (or)
sudo nano /etc/apache2/httpd.conf
在包含列表的末尾添加以下行,靠近第 170 行:
LoadModule perl_module libexec/apache2/mod_perl.so
保存、退出并重启 apache:
sudo apachectl restart
【讨论】:
我尝试按照您建议的方式安装,但是在运行“sudo apachectl configtest”时,我得到“httpd:/private/etc/apache2/httpd.conf 第 171 行的语法错误:无法加载libexec/apache2/mod_perl.so 进入服务器:dlopen(/usr/libexec/apache2/mod_perl.so, 10): image not found"。我将 mod_perl 下载到 /Users/my.name/tmp 并且必须运行“sudo perl Makefile.PL MP_CCOPTS=-std=gnu89; make ; sudo make install”才能进行安装。有什么建议吗? “my.name”是否包含空格?如果您最后成功了,我无法从您评论的最后部分判断。 没有空格,结果可以看这里***.com/questions/27827724/… 如果您将其转发到ServerFault,请在此处放置链接。 Makefile.PL 位于何处?或者当我运行“sudo perl Makefile.PL ...”时我必须位于哪个目录中?【参考方案3】:El Capitan 需要额外的操作!
在 El Capitan 中,Apple 禁止用户写入 /usr/ 下的任何位置,除了 /usr/local/
参考上面 Dan Deal 和 Andrew Swift 的回答,并假设您安装了 Xcode 7 和 El Capitan (10.11) SDK:
sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/apache2 /usr/local/include/apache2
sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/apr-1 /usr/local/include/apr-1
将 Xcode 标头软链接到 /usr/local/include。
接下来,我们需要告诉 Makefile.PL 在哪里可以找到头文件(因为它默认使用 /usr/include)。
sudo cp /usr/sbin/apxs /usr/local/bin
制作 Makefile.PL 用来定位 apache 头文件的 APXS 工具的副本。现在编辑它:
sudo vi /usr/local/bin/apxs (or)
sudo nano /usr/local/bin/apxs
找到写着:
的行my $prefix = get_vars("prefix");
并将其替换为:
my $prefix = "/usr/local";
确保 /usr/local/bin 在 /usr/sbin 之前的路径中,以便它选择您刚刚修改的路径:
export PATH=/usr/local/bin:$PATH
现在您可以继续构建 mod_perl:
perl Makefile.PL MP_CCOPTS=-std=gnu89; make ; sudo make install
最后,当你编辑你的 httpd.conf 时,你需要明确地将完整路径传递给 mod_perl.so,因为它不在 apache 期望找到它的目录中:
LoadModule perl_module /usr/local/libexec/apache2/mod_perl.so
【讨论】:
太棒了!我在升级到 El Capitan 之前已经安装了它,并且我之前的安装在升级后继续工作。这对刚开始的人非常有帮助。 有趣——我也有,但它坏了。 我从第一个测试版开始并不断升级。您安装的是最终版还是测试版? 我直接从 Yosemite 去了 El Cap GM,所以这可能是差异的来源。我假设你离开了 SIP(“无根”)? 是的,El Cap 在 SIP 激活的情况下运行。我实际上试图停用它,但我无法让我的 Mac 在恢复模式下重新启动。【参考方案4】:感谢以上所有指点。这是一个解决方案/收据,从源代码构建,没有符号链接到 Xcode 中的奇数文件,并避免“预期在:平面命名空间”错误。
(编辑:)令我惊讶的是,Apple 提供的 httpd (2.4.16) 现在能够与 my mod_perl 一起运行!
0 Xcode 7.3(测试版)和命令行实用程序,OS X 10.11.3 El Capitan
1 安装 perl,使用线程:
perlbrew install -f -Dusethreads perl-stable;
我把 perl 放到 /usr/local/perl5/
2 得到 apr-1.5.2
3 获取 apr-util-1.5.4
4 获取 pcre-8.38 (./configure --prefix=/usr/local/pcre; make; make install)
5 获取 httpd-2.4.9
6 COPY (cp -r -p) dirs apr-1.5.2 和 apr-util-1.5.4 到 httpd-2.4.9/srclib/ 分别作为 'apr' 和 'apr-util'在构建 httpd 时可以使用 --with-included-apr。
7 cd httpd-2.4.9
export CC=/usr/bin/gcc
export CPP=/usr/bin/cpp
./configure --prefix=/usr/local/apache2/ --enable-mods=most --enable-auth-basic --enable-rewrite --with-included-apr --with-pcre=/usr/local/pcre
make clean
make
make install
8 mod_perl-2.0.9
perl Makefile.PL MP_CCOPTS=-std=gnu89 MP_APXS=/usr/local/apache2/bin/apxs
(MP_CCOPTS=-std=gnu89 在这里很重要)
make
make install
关于构建和加载模块的信息:
# httpd -V
Server version: Apache/2.4.16 (Unix)
Server built: Jul 31 2015 15:53:26
Server's Module Magic Number: 20120211:47
Server loaded: APR 1.4.8, APR-UTIL 1.5.2
Compiled using: APR 1.4.8, APR-UTIL 1.5.2
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_FLOCK_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="/usr"
-D SUEXEC_BIN="/usr/bin/suexec"
-D DEFAULT_PIDLOG="/private/var/run/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="/private/etc/apache2/mime.types"
-D SERVER_CONFIG_FILE="/private/etc/apache2/httpd.conf"
# httpd -D DUMP_MODULES
Loaded Modules:
core_module (static)
so_module (static)
http_module (static)
mpm_prefork_module (static)
authn_file_module (shared)
authn_core_module (shared)
authz_host_module (shared)
authz_groupfile_module (shared)
authz_user_module (shared)
authz_core_module (shared)
access_compat_module (shared)
auth_basic_module (shared)
reqtimeout_module (shared)
filter_module (shared)
mime_module (shared)
log_config_module (shared)
env_module (shared)
headers_module (shared)
setenvif_module (shared)
version_module (shared)
proxy_module (shared)
proxy_connect_module (shared)
proxy_ftp_module (shared)
proxy_http_module (shared)
proxy_fcgi_module (shared)
proxy_scgi_module (shared)
proxy_wstunnel_module (shared)
proxy_ajp_module (shared)
proxy_balancer_module (shared)
proxy_express_module (shared)
slotmem_shm_module (shared)
lbmethod_byrequests_module (shared)
lbmethod_bytraffic_module (shared)
lbmethod_bybusyness_module (shared)
unixd_module (shared)
status_module (shared)
autoindex_module (shared)
negotiation_module (shared)
dir_module (shared)
alias_module (shared)
rewrite_module (shared)
perl_module (shared)
【讨论】:
以上是关于如何在 OS X Yosemite 上的 Apache 2.4 中安装 mod_perl 2.0.9?的主要内容,如果未能解决你的问题,请参考以下文章
基于名称的虚拟主机在 OS X 10.10 Yosemite 上的 Apache 2.4.9 中不起作用/不允许
Mac OS X Yosemite 上的 ElasticSearch + Node:JRE 崩溃?
如何在Mac OS X Yosemite上安装 jdk 1.6 开发环境