如何在OS X Yosemite上的Apache 2.4中安装mod_perl 2.0.9?

时间:2014-10-21 09:48:59

标签: apache perl osx-yosemite mod-perl

随着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方面经验丰富,使用终端非常舒服。

4 个答案:

答案 0 :(得分:12)

mod_perl 2.0.8(最新稳定版)不会削减它 - 它不知道apache 2.4.x中MPM_NAME的弃用 通过svn下载最新的开发:

svn checkout https://svn.apache.org/repos/asf/perl/modperl/trunk/ mod_perl-2.0

Changes文件将此版本列为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

我尝试正确设置env vars 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

LoadModule的{​​{1}}行已从Yosemite的mod_perl文件中删除。
添加

/etc/apache2/httpd.conf

LoadModule perl_module libexec/apache2/mod_perl.so

的模块部分

答案 1 :(得分:6)

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 / 本地 / include。

接下来,我们需要告诉Makefile.PL在哪里找到标题(因为它默认采用/ usr / include)。

sudo cp /usr/sbin/apxs /usr/local/bin

制作APXS工具的副本,Makefile.PL用于定位apache标头。现在编辑它:

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

答案 2 :(得分:5)

这是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将mod_perl包含在apache httpd.conf中:

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

答案 3 :(得分:0)

感谢上面的所有指示。这是一个解决方案/ recipe,从源代码构建,没有符号链接到Xcode中的奇数文件,并避免'预期在:平面命名空间'错误。

(编辑:)令我惊讶的是,Apple提供的httpd(2.4.16)现在能够运行我的 mod_perl!

0 Xcode 7.3(beta)和命令行工具,OS X 10.11.3 El Capitan

1个perl, with threads

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在这里是VITAL)

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)