Every time Apple releases a new version of macOS, I have to go in and re-configure Apache with PHP the way I want it. So this time, I thought I’d automate the configuration changes with a single command.
Background
Prior versions of this article have more in-depth explanations, e.g.
- Enabling Apache and PHP7 on macOS Mojave 10.14
- Re-enable Apache and PHP after macOS Sierra 10.12 update
- Enabling Apache and PHP on OS X El Capitan 10.11
No major change this time - macOS Catalina 10.15.1 ships with:
- Apache 2.4.41 (Mojave 10.14 came with Apache 2.4.34)
- PHP 7.3.9 (Mojave 10.14 came with PHP 7.1.19)
You can check the PHP version with php -v
:
PHP 7.3.9 (cli) (built: Sep 10 2019 17:45:01) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.9, Copyright (c) 1998-2018 Zend Technologies
And the Apache version with apachectl -version
:
Server version: Apache/2.4.41 (Unix)
Server built: Oct 17 2019 18:04:28
Seems Apache now has the Multi-Processing Module
mpm_prefork_module
enabled by default.
Setup Script
My previous instructions still hold - edit the Apache configuration in /private/etc/apache2/httpd.conf
:
- Uncomment the the PHP and rewrite modules.
- Change the
DocumentRoot
to one in your user folder (the default/Library/WebServer/Documents
is read-only) and - Add make the corresponding change to the
Directory
section, e.g. in the example below,[mylogin]
is your login profile’s home directory[www]
is a folder serving the HTML and PHP files
LoadModule rewrite_module libexec/apache2/mod_rewrite.so
LoadModule php7_module libexec/apache2/libphp7.so
DocumentRoot "/Users/[mylogin]/[www]"
<Directory "/Users/[mylogin]/[www]">
Require all granted
</Directory>
Danger: Running as superuser, with irreversible changes made! Be warned.
So, all you need is to run this:
- The first regular expression replacement
s/a/b
looks for pattern a and replaces it with b. In this case, it matches a commented out line that starts with#
and uncomments it (replaces with the first match, i.e. without the#
). - The second
s/
does the same for the Rewrite module. - The third replaces the default DocumentRoot and directory - remember to replace
[mylogin]
and[www]
as appropriate. -i
creates a backup since sed will edit the file in-place.
sudo sed -e 's/^#\(LoadModule php7.*\)/\1/' \
-e 's/^#\(LoadModule rewrite.*\)/\1/' \
-e 's/\/Library\/WebServer\/Documents/\/Users\/[mylogin]\/[www]/' \
-i .bak /private/etc/apache2/httpd.conf
This is basically all I need. Check and then re-start Apache with sudo apachectl -k restart
.
You may use this tiny script echo "<?php phpinfo();" > /Users/[mylogin]/[www]/phpinfo.php
to make sure PHP is enabled.
You may refer to my last post on this topic if you need to edit php.ini
also.
Setup Script Part Deux
There are many other settings you may need to change depending on your requirements!
- If you have overriding
.htaccess
files, then you needAllowOverride All
on the directory in question - The default
ServerRoot
/usr
is really not a good location. - You may also wish to change the Apache service user / group
_www
- if you encounter permission issues accessing files. - Also, the default access control is
Require all granted
- if you want to limit Apache to serve your mac only, useRequire local
instead. - Finally, note I didn’t set a sensible
ServerName
.
sudo sed -e 's/^#\(LoadModule php7.*\)/\1/' \
-e 's/^#\(LoadModule rewrite.*\)/\1/' \
-e 's/\/Library\/WebServer\/Documents/\/Users\/[mylogin]\/[www]/' \
-e 's/AllowOverride None/AllowOverride All/' \
-e 's/User _www/User [mylogin]/' \
-e 's/Group _www/Group staff/' \
-e 's/ServerRoot ".*"/ServerRoot "\/Users\/[mylogin]\/[www]"/' \
-e 's/Require all granted/Require local/' \
-i .bak /private/etc/apache2/httpd.conf
Happy PHP-ing.