我终于在我的 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 命令中使用它作为路径。
命令如下(其实先别跑,因为会失败):
./configure --with-apxs=/opt/local/bin/apxs
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'
运行命令:
./configure --with-apxs=/opt/local/bin/apxs
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。我必须创建 run 和 apache2 文件夹。
就是这样。如果您被卡住,有各种日志可能会指示错误:
/var/log/apache2/error_log
还有 apache/tomcat 连接器的 jk.log:
/var/log/apache2/jk/jk.log
而且总是有系统日志可能会告诉你一些事情:
/var/log/system.log
我非常希望这对某人有所帮助。然而它非常漫长和复杂,我肯定错过了我在此过程中所做的一些事情,所以如果你遇到一些新问题,我会看看我是否可以提供帮助。