如何在 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.PLmakemake 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_PREFIXMP_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_perlLoadModule 行已从 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 开发环境

mac os x yosemite下如何编译milton?

Mac os x yosemite 和 iOS 8以上的系统如何用AirDrop共享文件?

如何 在Mac OS X 上的 Appium 上 Run *.app 文件