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.
First thing to do would be to remove the builtin Apache version of which in macOS Big Sur is Apache/2.4.46.
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
Homebrew location is:
If you are getting the default macOS location of /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
And change Listen 8080 to:
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:
Change the shortusername to the one on your macOS account
# # 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
# # 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
User _www Group _www
User shortusername Group staff
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:
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
<IfModule dir_module> DirectoryIndex index.html </IfModule>
<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>
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