MacOS Sierra:apachectl 正在使用来自 /usr/local/etc/apache2/2.4 而不是 /etc/apache2/ 的配置
Posted
技术标签:
【中文标题】MacOS Sierra:apachectl 正在使用来自 /usr/local/etc/apache2/2.4 而不是 /etc/apache2/ 的配置【英文标题】:MacOS Sierra: apachectl is using configuration from /usr/local/etc/apache2/2.4 instead of /etc/apache2/ 【发布时间】:2018-02-16 05:00:51 【问题描述】:我在/etc/apache2/
中定义了我的所有配置文件和虚拟主机。
但是,当我运行 apachectl -V
时,我得到以下输出:
Server version: Apache/2.4.26 (Unix)
Server built: Jul 8 2017 19:15:17
Server's Module Magic Number: 20120211:68
Server loaded: APR 1.6.2, APR-UTIL 1.6.0
Compiled using: APR 1.6.2, APR-UTIL 1.6.0
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_SYSVSEM_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/local/Cellar/httpd24/2.4.26"
-D SUEXEC_BIN="/usr/local/Cellar/httpd24/2.4.26/bin/suexec"
-D DEFAULT_PIDLOG="/usr/local/var/run/apache2/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="/usr/local/etc/apache2/2.4/mime.types"
-D SERVER_CONFIG_FILE="/usr/local/etc/apache2/2.4/httpd.conf"
这显然是在使用其他一些我什至不知道存在的 apache2 配置文件。如何强制 apache2 使用正确的配置文件?
【问题讨论】:
【参考方案1】:您的计算机上可能已经安装了 apache,然后安装了另一个版本。在这种情况下,您可能有多个 apachectl 二进制文件。将编译不同的 apachectl 二进制文件以用于不同的配置文件。
做:
find /usr -name apachectl
这将找到 /usr 目录中具有名称 apachectl 的所有内容。我的输出是:
/usr/local/bin/apachectl
/usr/local/Cellar/httpd/2.4.27/bin/apachectl
/usr/sbin/apachectl
现在查看每个可执行文件的信息,使用 -V,直到找到使用所需配置文件编译的版本:
/usr/sbin/apachectl -V
出来:
...
...
...
-D SERVER_CONFIG_FILE="/private/etc/apache2/httpd.conf"
现在我们知道您希望哪个优先。所以这就是你设置优先级的方式。
即使有多个同名的二进制文件,当你在终端输入“apachectl”时,也不会“打架”来确定执行哪个,因为优先级由以下因素决定:
-
/etc/paths 文件
您的 bash 个人资料
你有几个选择:
A)(不推荐)您可以更改您的 /etc/paths 文件以反映您希望一个版本的 apachectl 优先于另一个版本
路径文件用于整个文件层次结构的一般优先级。你会告诉它,“一般来说,当有多个同名的二进制文件时,首先执行这个目录层次结构中的那个”。因此,该文件非常简单,只是目录的排序。我的看起来像这样:
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
我不会更改路径文件,因为这有点像通过撕掉整个钉子来摆脱吊钉。
B) 您可以通过在终端中输入以下内容来更改优先级(针对单个终端会话):
export PATH="/usr/sbin/apachectl:$PATH"
这将导出一个新的 PATH 变量,其中 /usr/sbin/apachectl 位于 $PATH 中的所有其他内容之前。这会将可执行文件的路径添加到路径的开头,使其优先于所有其他可能的可执行文件。因此,当您的系统从终端收到对 apachectl 二进制文件的调用时,它会检查路径并在遇到指向可执行文件的直接路径作为路径中的第一件事时停止检查。这不会超过一个会话。因此,如果您关闭终端,PATH 将恢复到原来的样子。
C) 您可以通过将之前的导出命令添加到您的 ~/.bashrc 文件(或 Mac 上的 ~/.bash_profile)中来使其永久化:
export PATH="/usr/sbin/apachectl:$PATH"
在您的 .bashrc 文件中包含此语句将导致在您每次开始新会话时执行此语句,因为那是读取您的配置文件的时间。
如果您的配置文件中的另一行故意赋予其他版本的 apachectl 优先级,您可以删除它,或者只是确保您的 export... 行在文件中位于它之后。
D) 你可以创建一个别名,直接引用这个可执行文件。
别名是您可以用来指代位于特定位置的可执行文件的词。每次输入别名时,您指的是在该确切位置的确切可执行文件。我建议这样做高于所有其他人:
alias apachectl_a1='/usr/sbin/apachectl'
这也需要放在您的 ~/.bashrc 文件中(Mac 上为 ~/.bash_profile)以持续超过一个会话。
【讨论】:
以上是关于MacOS Sierra:apachectl 正在使用来自 /usr/local/etc/apache2/2.4 而不是 /etc/apache2/ 的配置的主要内容,如果未能解决你的问题,请参考以下文章