MacOS Sierra:apachectl使用的是/usr/local/etc/apache2/2.4中的配置,而不是/ etc / apache2 /

Mic*_*żko 2 apache macos apache2 apache2.4 macos-sierra

我在中定义了所有配置文件和虚拟主机/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"
Run Code Online (Sandbox Code Playgroud)

显然,这是使用其他我不知道的apache2配置文件。如何强制apache2使用正确的配置文件?

小智 7

您可能已经在计算机上安装了apache,然后安装了另一个版本。在这种情况下,您可能有多个apachectl二进制文件。不同的apachectl二进制文件将被编译为与不同的配置文件一起使用。

做:

find /usr -name apachectl
Run Code Online (Sandbox Code Playgroud)

这将在/ usr目录中找到名称为apachectl的所有内容。我的输出是:

/usr/local/bin/apachectl
/usr/local/Cellar/httpd/2.4.27/bin/apachectl
/usr/sbin/apachectl
Run Code Online (Sandbox Code Playgroud)

现在,使用-V查看每个可执行文件的信息,直到找到使用所需配置文件编译的版本:

    /usr/sbin/apachectl -V
Run Code Online (Sandbox Code Playgroud)

出:

    ...
    ...
    ...
    -D SERVER_CONFIG_FILE="/private/etc/apache2/httpd.conf"
Run Code Online (Sandbox Code Playgroud)

现在我们知道您要优先哪个。这就是您设置优先级的方式。

即使有多个具有相同名称的二进制文件,当您在终端上键入“ apachectl”时,也没有“奋斗”来确定执行哪个二进制文件,因为优先级由以下各项确定:

  1. / etc / paths文件
  2. 您的bash个人资料

您有几种选择:

A)(不推荐)您可以更改/ etc / paths文件以反映您希望apachectl的一个版本优先于另一个版本

paths文件用于整个文件层次结构的一般优先级。您会说:“通常,当有多个同名二进制文件时,请首先在此目录层次结构中执行一个。”。因此,该文件非常简单,只是目录的排序。我的看起来像这样:

/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
Run Code Online (Sandbox Code Playgroud)

我不会更改路径文件,因为这有点像通过撕掉整个指甲来摆脱指甲。

B)您可以通过在终端中键入以下内容来更改优先级(对于单个终端会话):

export PATH="/usr/sbin/apachectl:$PATH"
Run Code Online (Sandbox Code Playgroud)

这将导出一个带有/ usr / sbin / apachectl的新PATH变量,该变量位于$ PATH中已经存在的所有其他变量之前。这会将可执行文件的路径放在该路径的开头,从而使其优先于所有其他可能的可执行文件。因此,当系统从终端获得对apachectl二进制文件的调用时,它会检查路径,并在遇到指向可执行文件的直接路径时停止检查,这是Path中的第一件事。这不会超出一个会话。因此,如果关闭终端,则PATH将恢复为原来的状态。

C)您可以通过将先前的导出命令添加到您的〜/ .bashrc文件(或在Mac上为〜/ .bash_profile)中,使此设置永久生效:

export PATH="/usr/sbin/apachectl:$PATH"
Run Code Online (Sandbox Code Playgroud)

将其保存在.bashrc文件中将使该语句在每次开始新会话时都执行,因为那是在读取配置文件时。

如果您的配置文件中有另一行故意给出其他版本的apachectl优先级,则可以将其删除,或者只是确保在文件中紧随其后的是export ...行。

D)您可以创建一个别名,以直接引用此可执行文件。

别名是一个单词,您可以用来引用位于特定位置的可执行文件。每次键入别名时,都将在该确切位置引用该确切的可执行文件。我建议首先进行以​​下操作:

alias apachectl_a1='/usr/sbin/apachectl'
Run Code Online (Sandbox Code Playgroud)

这也需要放在您的〜/ .bashrc文件中(在Mac上为〜/ .bash_profile),以保持单个会话结束。