如何在 MacBook Pro M1 芯片上编译 Tomcat mod_jk?

How do I compile Tomcat mod_jk on a MacBook Pro M1 chip?

我安装了 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(英特尔芯片)迁移了所有东西。我是 运行 库存 Apache 和 Coldfusion Server 2016,但是当我尝试启动 Apache 时在新的 MacBook 上,它不喜欢我的 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'))

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

运行 Mac 上的 ColdFusion 一直是 PITA。不管是 CF 9、10、11,一直到当前。特别是当您处理非基于英特尔的芯片组时。您还试图在可能不受支持的芯片组上获得较旧的自定义构建的 Toncat 运行ning。你也不是唯一的 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

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

查看文档以获取更多信息。

我终于在我的 M1 上安装了带有 Tomcat 的 Apache2,一切正常。 您必须做的一件事是从 Macports 或 HomeBrew 安装新的 Apache。这是因为大多数从旧 mac 复制到新安装的旧安装现在都位于文件系统的 read-only 部分,而 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 macs 的一个问题,已修复。所以目前我们将放弃 1.2.48 源并下载带有修复程序的源。 但是不要删除 1.2.48 源,因为修复源缺少一些文件,您将直接从 1.2.48 源复制这些文件。

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

点击绿色的 'Code' 按钮,然后点击 'Download 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 文件仍然通过 'Include' 命令指向错误位置的其他旧配置文件。

apachectl configtest 将为您测试您的配置并打印出它发现的任何错误。它指出了 4 个它不喜欢的模块,所以我将它们排除在外。虽然很明显,如果您不确定为什么 apachectl 不喜欢某些东西,请仔细阅读消息和 google。如果它回复 'Syntax OK' 你准备好了。

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

httpd: Syntax error on line 76 of /opt/local/etc/apache2/httpd.conf: Cannot load libexec/apache2/mod_authz_owner.so into server: dlopen(/usr/libexec/apache2/mod_authz_owner.so, 0x000A): symbol not found in flat namespace '_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看看是不是运行宁.

日志记录:不要忘记 sudo/var/log/apache2 中创建 jk 文件夹(如果它尚不存在),否则 apache 或 tomcat 会出现神秘问题或 won 't start 之类的(jk.log 需要 /var/log/apache2/jk 文件夹)。

正如我所想的那样,另一个问题突然出现了:apache 无法在启动时写入其 pid 文件。同样,这是因为我在配置中为 pid 文件设置的位置来自我的旧 mac 上的配置,并且选择的位置位于 read-only 位置。 要更改此设置,您需要设置 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

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