【问题标题】:How do I compile Tomcat mod_jk on a MacBook Pro M1 chip?如何在 MacBook Pro M1 芯片上编译 Tomcat mod_jk?
【发布时间】:2021-12-09 01:22:32
【问题描述】:

我安装了 Homebrew Apache 并尝试将 Coldfusion Server 2016 与 Tomcat mod_jk 连接。

我从https://tomcat.apache.org/download-connectors.cgi下载了源代码

我按照说明编译它,尝试了几种不同的方法,但是当我进入“make”命令时,我一直收到同样的错误:

In file included from jk_ajp12_worker.c:26:
In file included from ./jk_ajp12_worker.h:26:
In file included from ./jk_logger.h:26:
In file included from ./jk_global.h:340:
./jk_types.h:56:2: error: Can not determine the proper size for pid_t
#error Can not determine the proper size for pid_t
 ^
./jk_types.h:62:2: error: Can not determine the proper size for pthread_t
#error Can not determine the proper size for pthread_t
 ^
2 errors generated.
make[1]: *** [jk_ajp12_worker.lo] Error 1
make: *** [all-recursive] Error 1

这些是我尝试编译的不同命令:

./configure --with-apxs=/opt/homebrew/bin/apxs
./configure CFLAGS='-arch arm64e' APXSLDFLAGS='-arch arm64e' --with-apxs=/opt/homebrew/bin/apxs
./configure CFLAGS='-arch arm64e' APXSLDFLAGS='-arch arm64e' --with-apxs=/opt/homebrew/bin/apxs --host=arm

我最近买了这台新的 MacBook Pro 16" 并从我的 2017 MacBook Pro(英特尔芯片)迁移了所有东西。我正在使用 Coldfusion Server 2016 运行库存 Apache,但是当我尝试在新 MacBook 上启动 Apache 时,它不喜欢我的 mod_jk.so 文件并抛出错误:

httpd: Syntax error on line 542 of /opt/homebrew/etc/httpd/httpd.conf: Syntax error on line 2 of /opt/homebrew/etc/httpd/mod_jk.conf: 
Cannot load /Applications/ColdFusion2016/config/wsconfig/2/mod_jk.so into server: dlopen(/Applications/ColdFusion2016/config/wsconfig/2/mod_jk.so, 0x000A): 
tried: '/Applications/ColdFusion2016/config/wsconfig/2/mod_jk.so' 
(mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64e'))

感谢任何帮助或意见。谢谢。

【问题讨论】:

    标签: apache coldfusion homebrew apple-m1 mod-jk


    【解决方案1】:

    我终于在我的 M1 上安装了带有 Tomcat 的 Apache2,并且一切正常。 您必须做的一件事是从 Macports 或 HomeBrew 安装新的 Apache。这是因为大多数从旧 Mac 复制到新 Mac 的旧安装现在将位于文件系统的只读部分,并且 SIP 不会让您靠近它们。你会发现奇怪而美妙的解决方法(例如,apachectl 告诉我我必须对 mod_jk.so 进行代码设计,我浪费了很多时间,最终它毫无意义),你将尝试让旧的安装工作,但是相信我,这不值得。

    您需要编译一个新的 jk_module (mod_jk.so)。这就是我所做的:

    下载最新的连接器https://dlcdn.apache.org/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.48-src.tar.gz,保存.gz并解压。

    将目录更改为native 文件夹。 运行which apxs 告诉您./configure 命令的apxs 路径 我给出的路径是:/opt/local/bin/apxs。在下面的 ./configure 命令中使用它作为路径。

    命令如下(其实先别跑,因为会失败):

    1. ./configure --with-apxs=/opt/local/bin/apxs
    2. make

    但是make 会失败:

    ./jk_types.h:56:2: error: Can not determine the proper size for pid_t
    #error Can not determine the proper size for pid_t
     ^
    ./jk_types.h:62:2: error: Can not determine the proper size for pthread_t
    #error Can not determine the proper size for pthread_t
     ^
    2 errors generated.
    make[1]: *** [jk_ajp12_worker.lo] Error 1
    make: *** [all-recursive] Error 1
    

    这是已修复的 M1 mac 问题。因此,目前我们将放弃 1.2.48 源并下载带有修复程序的源。 但不要删除 1.2.48 源,因为修复源缺少一些文件,您将直接从 1.2.48 源复制这些文件。

    下载 Mac OS 修复程序的页面在这里:https://github.com/apache/tomcat-connectors,即在 2021 年 6 月 30 日提交 e719874

    点击绿色的“代码”按钮,然后点击“下载 ZIP”。 解压新源并 cd 到 'native'

    运行命令:

    1. ./configure --with-apxs=/opt/local/bin/apxs
    2. make

    每当它停止并抱怨缺少某些东西时,请在 1.2.48 源中找到它并将其复制到新源中的相同位置并重试。它会发生两三次。

    我曾一度遇到此错误:

    /home/myuser/source/mod_auth_cas/mod_auth_cas/missing: line 81: aclocal-1.15: command not found
    WARNING: 'aclocal-1.15' is missing on your system.
             You should only need it if you modified 'acinclude.m4' or
             'configure.ac' or m4 files included by 'configure.ac'.
             The 'aclocal' program is part of the GNU Automake package:
             <http://www.gnu.org/software/automake>
             It also requires GNU Autoconf, GNU m4 and Perl in order to run:
             <http://www.gnu.org/software/autoconf>
             <http://www.gnu.org/software/m4/>
             <http://www.perl.org/>
    make: *** [aclocal.m4] Error 127
    

    然后我在某处读到运行autoreconf -f -i(修复了它)。

    当 make 完成时,在 native/apache-2.0 文件夹中找到你的新 mod_jk.so 文件并将其复制到所有其他模块所在的位置。我安装了 Macports,所以 Homebrew 可能有所不同,但我的模块位于 /opt/local/lib/apache2/modules

    如果 httpd.conf 中没有 LoadModule 行,请不要忘记添加:

    LoadModule jk_module /opt/local/lib/apache2/modules/mod_jk.so
    

    您可能很难确定哪些 apache2 文件夹包含新安装,而不是旧安装 - 我发现另外两个安装试图混淆我。 我的配置在这里:/opt/local/etc/apache2/httpd.conf

    apachectl 对配置非常有用。

    apachectl -t -D DUMP_INCLUDES 将找到它正在使用的所有配置文件。这完全救了我,因为它显示我从其他地方复制的 httpd.conf 文件仍然通过“包含”命令指向错误位置的其他旧配置文件。

    apachectl configtest 将为您测试您的配置并打印出它发现的任何错误。它指出了它不喜欢的 4 个模块,所以我只是将它们排除在外。虽然很明显,如果您不确定 apachectl 为什么不喜欢某些东西,请仔细阅读这些消息并使用谷歌搜索。如果它回复“语法 OK”,您就可以开始了。

    这是一条神秘的消息,直到我发现这是因为 httpd.conf 指向每个模块的错误模块文件夹(apache2 的旧安装),所以它正在加载可能不是的东西编译为 64 位

    httpd:/opt/local/etc/apache2/httpd.conf 第 76 行的语法错误: 无法将 libexec/apache2/mod_authz_owner.so 加载到服务器中: dlopen(/usr/libexec/apache2/mod_authz_owner.so,0x000A):符号不是 在平面命名空间“_apr_stat$INODE64”中找到

    这是我使用 Macports 自动创建的 plist 的启动命令: sudo launchctl load -w /opt/local/etc/LaunchDaemons/org.macports.apache2/org.macports.apache2.plist

    然后卸载: sudo launchctl unload /opt/local/etc/LaunchDaemons/org.macports.apache2/org.macports.apache2.plist

    运行 ps ax|grep httpd 以查看它是否正在运行。

    Logging:如果jk文件夹不存在,别忘了sudo/var/log/apache2创建jk文件夹,否则apache或tomcat会出现神秘问题或无法启动之类的(/var/log/apache2/jk jk.log 需要文件夹)。

    正如我认为的那样,另一个问题突然出现了:apache 无法在启动时写入其 pid 文件。这又是因为在我的配置中为 pid 文件设置的位置来自我旧 Mac 上的配置,并且选择的位置位于只读位置。 要更改此设置,您需要设置 PidFile 参数,我在以下文件中找到了该参数: /opt/local/etc/apache2/extra/httpd-mpm.conf

    它看起来像这样:

    # PidFile: The file in which the server should record its process
    # identification number when it starts.
    #
    # Note that this is the default PidFile for most MPMs.
    #
    <IfModule !mpm_netware_module>
        PidFile "local/run/apache2/httpd.pid"
    </IfModule>
    

    不用担心 IfModule 在做什么,只需将 PidFile 设置为可写位置,如您所见,这是一个相对路径。您可能想知道local 文件夹前面的内容。

    前面是httpd.conf中设置的ServerRoot参数:

    ServerRoot "/usr"
    

    所以我的 pid 将写在/usr/local/run/apache2/httpd.pid。我必须创建 runapache2 文件夹。

    就是这样。如果您被卡住,有各种日志可能会指示错误:

    /var/log/apache2/error_log
    

    还有 apache/tomcat 连接器的 jk.log:

    /var/log/apache2/jk/jk.log
    

    而且总是有系统日志可能会告诉你一些事情:

    /var/log/system.log
    

    我非常希望这对某人有所帮助。然而它非常漫长和复杂,我肯定错过了我在此过程中所做的一些事情,所以如果你遇到一些新问题,我会看看我是否可以提供帮助。

    【讨论】:

    • 感谢您的详细撰写!我使用 Homebrew Apache,但可能不得不尝试 Macports,因为我仍然无法让 Apache 连接到 Coldfusion。再次感谢!
    【解决方案2】:

    在 Mac 上运行 ColdFusion 始终是 PITA。不管是 CF 9、10、11,一直到当前。特别是当您处理非英特尔芯片组时。您还尝试在可能不受支持的芯片组上运行较旧的自定义版本的 Toncat。你也不是唯一一个having this issue with CF 2016 on the M1 chip(他们也没有找到解决方案)。

    尝试使用CommandBox 运行 CF。它将服务器下载为 JAR 文件并在 Glassfish servlet 容器 (IIRC) 上运行它。您也不需要 Apache。启动和运行真的很简单。

    https://commandbox.ortusbooks.com/embedded-server/multi-engine-support

    安装后,在 CLI 中转到应用程序的根文件夹:

    start cfengine=adobe@2016
    

    它将下载并安装服务器,然后启动应用程序。

    查看文档了解更多信息。

    【讨论】:

    • 感谢您推荐CommandBox;我没听说过。今天试一下。
    • 我终于让 mod_jk 能够正确编译和制作,但现在 Coldfusion/Tomcat 与 Apache 通信出现了问题。我不断收到“服务不可用”页面。
    • @felix822 你能否详细说明一下,也许有一个正确的答案,你是如何安装 mod_jk 的。我想从我的旧 mac 复制到我的 M1,但是所有 apache 模块现在都在一个只读文件夹中,你不能再覆盖 SIP,所以我不能添加它。我可以将它安装在一个 r/w 文件夹中并告诉 LoadModule 它在​​哪里,但是你必须用一个血淋淋的证书签署它,经过两天的尝试证明是不可能的。你能帮忙吗?
    • @mwarren 我从源代码编译了 mod_jk。不幸的是,我没有记下确切的方法,但是使用不同的配置设置进行了很多尝试。我还必须对 mod_jk.so 文件进行自签名,我可以按照此处提供的步骤来做到这一点 - blog.phusion.nl/2020/12/22/future_of_macos_apache_modules
    • @felix822 我的签名问题已经解决。但是 Apache 仍然没有启动。这是我的问题和答案:developer.apple.com/forums/thread/699126?page=1#702453022
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 2022-08-02
    • 2022-01-23
    • 2022-10-18
    • 2021-03-24
    • 2021-09-22
    • 1970-01-01
    相关资源
    最近更新 更多