Installing & Configuring Apache on macOS using Homebrew and use Sites folder

Eventhough Apache ships with macOS, a better maintained version would be coming from Homebrew, also Apple is making noises about not supporting legacy software like PHP so in the future this may be more of a compulsory option.

macOS use to ship with both MySQL & PHP, but now since macOS Monterey, PHP has also been deprecated.

In this guide we look to add both MySQL and PHP and structure the workflow to use the User Sites folder as the document root. For MySQL/MariaDB you can either also install from Homebrew or as a standalone package.

First thing to do would be to remove the builtin Apache version of which in macOS Monterey Big Sur is Apache/2.4.46. or 2.4.48

Remove built-in Apache in macOS

You can test if Apache is running by issuing this command, which is checking Port 80:

sudo lsof -i:80

Output you may get back would be:

COMMAND PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME

httpd   107 root    4u  IPv6 0xe356c4f54c26d40f      0t0  TCP *:http (LISTEN)

httpd   395 _www    4u  IPv6 0xe356c4f54c26d40f      0t0  TCP *:http (LISTEN)

This tells us that indeed httpd/Apache is running, no output would mean it’s not running.

Stop Apache running on computer restart by issuing:

sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist

That will unload the start up daemon and make the builtin macOS Apache incapacitated, test by issuing the previous command:

sudo lsof -i:80

Installing Apache with Homebrew

First make sure you have Homebrew set up and ready to go.

Install Apache which is known as the package name ‘httpd’:

brew install httpd

Final command line output should be:

DocumentRoot is /usr/local/var/www.

The default ports have been set in /usr/local/etc/httpd/httpd.conf to 8080 and in

/usr/local/etc/httpd/extra/httpd-ssl.conf to 8443 so that httpd can run without sudo.

To have launchd start httpd now and restart at login:

  brew services start httpd

Or, if you don't want/need a background service you can just run:

  apachectl start

==> Summary

????  /usr/local/Cellar/httpd/2.4.46_2: 1,657 files, 31.4MB

Set Apache to auto-start now and on computer restart:

brew services start httpd

The other 2 commands to stop or Restart Apache are:

brew services stop httpd

brew services restart httpd

By default the Apache Homebrew package is listening on Port 8080 and 8443, test by issuing:

sudo lsof -i:8080

Test the location of Apache/httpd

which httpd

Homebrew location is:

/usr/local/bin/httpd

If you are getting the default macOS location of /usr/sbin/httpd:

/usr/sbin/httpd

Restart the computer and try the location test again.

Changing the Port Number

Next is to change the port numbers from 8080 to 80

nano /usr/local/etc/httpd/httpd.conf

And change Listen 8080 to:

Listen 80

Restart Apache and web files will now be served over the default port 80.

brew services restart httpd

Changing the document root to be the old sites folder

Previously in macOS the web root directory which is missing by default is the ‘~/Sites’ folder in the User account. This makes sense to set up as a document root as it is logical and easily accessible.

You need to make a “Sites” folder at the root level of your account and then it will work. Once you make the Sites folder you will notice that it has a unique icon which is a throwback from a few versions older. Make that folder before you set up the configuration changes below

In the /usr/local/etc/httpd/httpd.conf file, find:

DocumentRoot "/usr/local/var/www"

Change to:

DocumentRoot /Users/shortusername/Sites

Change the shortusername to the one on your macOS account

Find:

<Directory "/usr/local/var/www"">

Change to:

<Directory "/Users/shortusername/Sites">

Find:

    #
    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   AllowOverride FileInfo AuthConfig Limit
    #
    AllowOverride None

Change to:

    #
    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   AllowOverride FileInfo AuthConfig Limit
    #
    AllowOverride All

Find:

User _www
Group _www

Change:

User shortusername
Group staff

Find:

#ServerName www.example.com:8080

Change:

ServerName localhost

Find and uncomment:

LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so

Now the webroot is /Users/shortusername/Sites/ just add a index.html file there and view file via localhost/index.html in your browser

Apache Log File

To check any Apache errors or access you can find its log files:

/usr/local/var/log/httpd/error_log

/usr/local/var/log/httpd/access_log

Getting PHP Working

Follow this Homebrew PHP guide to download your required PHP versions.

In the /usr/local/etc/httpd/httpd.conf file add in required module – example uses PHP 8.

LoadModule php_module /usr/local/opt/[email protected]/lib/httpd/modules/libphp.so

Find:

<IfModule dir_module>
  DirectoryIndex index.html
</IfModule>

Change:

<IfModule dir_module>
  DirectoryIndex index.php index.html
</IfModule>

Also at the end of the file add in:

<FilesMatch .php>
SetHandler application/x-httpd-php
</FilesMatch>

Restart Apache:

brew services restart httpd

You can check PHP is running by adding <?php phpinfo(); ?> to a .php web hosted file and view the output.

That’s it, Apache is now set up and running with PHP enabled.

To remove Apache httpd

brew remove httpd