从 Linux 迁移 Apache2 服务到 macOS

最近在把 Darock 在线服务从一台破旧的服务器迁移到 Mac mini,迁移的过程还是遇到了许多问题的,因此在这里记下来帮助大家(和以后如果要再迁移的我)避坑。

配置文件

两端 Apache2 的配置文件语法是一样的,但是位置和名称都有些不同。

主配置文件:

  • macOS:/etc/apache2/httpd.conf
  • Linux:/etc/apache2/apache2.conf

配置文件的默认模版差别也比较大。在 Linux 下,apache2 目录下有 sites-available, sites-enabled 等文件夹,通过在 *-available 里创建单独的配置文件,然后软链接到 *-enabled 以让 Apache2 载入。macOS 下则默认没有这样的设置,取而代之的是总会载入 other 目录下的所有配置文件,因此各个独立服务的配置文件可以放在这里面。

迁移

  • 将 Linux 端 sites-available 目录下链接到的文件拷贝到 macOS 端的 other 目录。

配置文件内容

当然,迁移过程免不了更改配置文件的内容。对于每个与 VirtualHost 相关的配置文件:

  • 更改 ErrorLogCustomLog 配置项的目录,因为 macOS 下没有 ${APACHE_LOG_DIR} 这个环境变量。直接删掉也可以。
  • 需要时更改 DocumentRoot,你可能会在 macOS 上选择不同的网站根目录路径。

修改主配置文件

这一步是需要做最多更改的,因为 macOS 下的默认主配置文件模版与 Linux 下的有很大不同。

迁移

  • 检查 Modules:macOS 下在主文件定义载入的 Module,仔细检查被注释掉的 LoadModule 设置,并为需要的 Module 取消注释。
  • 监听端口:Linux 下是在 ports.conf 文件中设置要监听的端口的,macOS 直接写在了主文件里。
  • 网站根目录位置:macOS 下网站根目录默认在 /Library/WebServer/Documents 下,直接写在主配置文件中的。如果要更改位置建议直接在主文件中把默认的删掉,在 other 目录下创建单独的配置文件来配置每个服务,方便快速查找和管理。

SSL

macOS 下的 Apache2 默认没有载入 SSL Module,要使用 SSL 的话需要在主文件内取消注释,同时还要更改一堆配置。

在主文件末尾有一行被注释掉的对 extra/httpd-ssl.conf 文件的引用,需要取消注释。

转到 extra/httpd-ssl.conf 文件,这个文件默认还包含了一个通过 443 端口服务的 VirtualHost。我的建议是直接删掉,把 Linux 的原配置拷贝到 other 目录下。

同时这个文件中已经包含了对 443 端口的监听,所以不用在主配置文件的开头加一个 Listen 443,否则会报错。

迁移

  • 检查主配置文件中是否已载入 ssl_module
  • 取消主文件末尾对 extra/httpd-ssl.conf 引用的注释。
  • 删除 extra/httpd-ssl.conf 文件中的 VirtualHost 部分。
  • 将来自 Linux 的原配置拷贝到 other 目录下,注意检查证书的路径是否需要更改。

命令行工具

管理配置

在 Linux 有 a2enmod 等命令来快速启用 Module 和网站等,macOS 下似乎没有这样的工具,需要自己手动更改配置文件。

进程

Linux 下一般使用 systemd 等工具来对 Apache2 进程进行停止和重启等操作。macOS 下对应的系统工具是 launchd,但我们不需要和 launchctl 打交道,Apache2 有自己的命令行工具。

使用 apachectl 来更改 Apache2 的运行状态:

1
sudo apachectl -k restart

到现在,基本的迁移就已经差不多了。如果还有其他配置项的问题就只能自己对着错误信息找了((