
Setup
Before starting you need xcode installed with the cli tools. Also, you will need VS Code installed with the code
command in your system path.
xcode-select --install
And, homebrew.
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
OpenSSL
Install OpenSSL.
brew install openssl
MySQL
Install MySQL.
brew install mysql
brew services start mysql
brew services list
Next, update your my.cnf
code /usr/local/etc/my.cnf
# Default Homebrew MySQL server config
[mysqld]
Only allow connections from localhost
bind-address = 127.0.0.1
mysqlx-bind-address = 127.0.0.1
# Add mode only if needed
sql_mode = "ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
Now, secure using the password password
and then restart.
mysql_secure_installation
brew services restart mysql
Next, MySQL 8 authentication needs to be updated per user to mysql_native_password
.
mysql -u root -ppassword
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
Postgres
Install postgresql (not the postgres app).
brew install postgresql
brew services start postgresql
brew services list
psql postgres
Now, you can check your user list.
postgres-# \du
PHP
Don’t use the default homebrew core tap for PHP. Use shivammathur/php.
brew tap shivammathur/php
brew install shivammathur/php/php@7.2
brew install shivammathur/php/php@7.3
brew install shivammathur/php/php@7.4
brew install shivammathur/php/php@8.0
Next, set PHP 7.4 as your default php
CLI version.
brew unlink php
brew link --overwrite --force php@7.4
Now, for each version update the php-fpm you will need a unique port. Change the ports of each php-fpm to match its php version number. For example, php@7.4
I use port 9074
.
Also, you will want php-fpm to run with your user account and not _www
.
code /usr/local/etc/php/7.4/php-fpm.d/www.conf
# default
user = _www
group = _www
listen = 127.0.0.1:9000
# change to
user = <your_username>
group = staff
listen = 127.0.0.1:9074
Optionally, before starting php-fpm, if you want to make edits to a php.ini
file now is the time. For example, you might want to increase the upload_max_filesize
and post_max_size
to 10M
.
/usr/local/etc/php/7.2/php.ini
/usr/local/etc/php/7.3/php.ini
/usr/local/etc/php/7.4/php.ini
/usr/local/etc/php/8.0/php.ini
Once you are ready, start up php-fpm for each version.
sudo brew services start php@7.2
sudo brew services start php@7.3
sudo brew services start php@7.4
sudo brew services start php@8.0
Check that you have processes running and validate your ports are correct.
sudo lsof -i -n -P|grep php-fpm

Next, and optionally, add some aliases for your CLI to use by adding the following and replacing <your_version>
with the version homebrew installs. This will give you quick access to a specific version when needed.
# Alias old versions
alias php72="/usr/local/Cellar/php@7.2/<your_version>/bin/php"
alias php73="/usr/local/Cellar/php@7.3/<your_version>/bin/php"
alias php74="/usr/local/Cellar/php@7.4/<your_version>/bin/php"
# The latest version of php in be located under
# the "php" folder not an "@" folder.
alias php80="/usr/local/Cellar/php/<your_version>/bin/php"
# Make switching versions easy
function phpv() {
brew unlink php
brew link --overwrite --force "php@$1"
}
If you want to change the default php
CLI you can set it using brew or, if added, the bash function phpv 7.4
.
# brew
brew unlink php
brew link --overwrite --force php@7.4
# bash function
phpv 7.4
Xdebug
Now, I like xdebug for development. But, this step is optional. To install xdebug for each version of php (cli and fpm) run the following.
brew link --overwrite --force php@7.2
pecl uninstall -r xdebug
pecl install xdebug
brew link --overwrite --force php@7.3
pecl uninstall -r xdebug
pecl install xdebug
brew link --overwrite --force php@7.4
pecl uninstall -r xdebug
pecl install xdebug
brew link --overwrite --force php@8.0
pecl uninstall -r xdebug
pecl install xdebug
For each version you installed update the php.ini
. In our example, php@7.4.
code /usr/local/etc/php/7.4/php.ini
You will need to remove the zend_extension="xdebug.so"
that is added to the top of the file by the pecl install process. The new default xdebug port is 9003
, it was port 9000
.
Add the following to the bottom of your php.ini
file.
[xdebug]
zend_extension="xdebug.so"
xdebug.mode=debug
xdebug.client_port=9003
xdebug.idekey=PHPSTORM
When finished adding your xdebug configuration to each version you have installed kill all the currently running php-fpm processes. This is not wise to do on a production server. On a new Mac dev setup, this is perfectly fine.
sudo killall php-fpm
Nginx
Install nginx.
brew install nginx
sudo nginx
Now, test the install is working.
http://localhost:8080
Now, change the default settings.
code /usr/local/etc/nginx/nginx.conf
# From
listen 8080;
server_name localhost;
index index.html;
# To
listen 80;
server_name localhost test.x;
index index.html index.htm index.php;
Next, add a FastCGI gateway to php-fpm on the default server. The latest version of php installed is best. For other servers, you can set the version of PHP to the project requirement.
location ~ \.php$ {
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_pass 127.0.0.1:9074;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
}
Next, add some basic security to your default server.
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
Then add the charset.
charset utf-8;
Now, you might want to allow for large file uploads.
http {
...
client_max_body_size 100M;
}
Next, we edit the real index.html file used by nginx. So, replace the index.html
with an index.php
file. Then, and some php code to make sure everything is working.
mv /usr/local/var/www/index.html /usr/local/var/www/index.php
code /usr/local/var/www/index.php
<?php echo phpinfo(); ?>
Reload nginx.
sudo nginx -s reload
http://localhost
To add more servers you can go to the nginx servers directory, /usr/local/etc/nginx/servers
, and add them there as individual files. Here is a basic template.
To add SSL for your nginx server check out this post. I use these bash functions to make the process faster. To add a server I use the command nginxcreate my.test.x
but you might want to modify the files to match your setup.
alias nginxreload="sudo nginx -s reload"
alias nginxrestart="sudo nginx -s stop && sudo nginx"
alias nginxservers="cd /usr/local/etc/nginx/servers"
function nginxcreate() {
wget https://gist.githubusercontent.com/kevindees/4e3508357ef46676f7635c545e4fd017/raw/f2c2f2716605e4b22a437058e2a7ebf5f8b775b9/nginx-server-template.conf -O /usr/local/etc/nginx/servers/$1.conf
sed -i '' "s:{{host}}:$1:" /usr/local/etc/nginx/servers/$1.conf
if [ "$2" ]; then
sed -i '' "s:{{root}}:$2:" /usr/local/etc/nginx/servers/$1.conf
else
sed -i '' "s:{{root}}:$HOME/Sites/$1:" /usr/local/etc/nginx/servers/$1.conf
fi
nginxaddssl $1
nginxrestart
code /usr/local/etc/nginx/servers/$1.conf
}
function nginxaddssl() {
openssl req \
-x509 -sha256 -nodes -newkey rsa:2048 -days 3650 \
-subj "/CN=$1" \
-reqexts SAN \
-extensions SAN \
-config <(cat /System/Library/OpenSSL/openssl.cnf; printf "[SAN]\nsubjectAltName=DNS:$1") \
-keyout /usr/local/etc/nginx/ssl/$1.key \
-out /usr/local/etc/nginx/ssl/$1.crt
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain /usr/local/etc/nginx/ssl/$1.crt
}
function nginxedit() {
code /usr/local/etc/nginx/servers/$1
}
function nginxlist() {
ll /usr/local/etc/nginx/servers/
}
Dnsmasq
To save yourself the fuss of editing your hosts file constantly you can use dnsmasq
.
brew install dnsmasq
Then we set up a custom hosts TLD *.x (or other hosts TLD like .test
) that point to 127.0.0.1
.
(customize the commands as needed)
echo 'address=/.x/127.0.0.1' > /usr/local/etc/dnsmasq.conf
sudo brew services start dnsmasq
sudo mkdir -v /etc/resolver sudo bash -c 'echo "nameserver 127.0.0.1" > /etc/resolver/x'
Test that it is working.
ping test.x
MailHog
I like to have mailhog running as a development mail server. But, if you don’t want to take this step that is perfectly fine.
brew install mailhog
brew services start mailhog
# start with
mailhog
Now, you can access MailHog at http://localhost:8025/. However, you still need to connect MailHog to PHP and the mail
mac command used by Postfix (Postfix comes with macOS Big Sur).
code /etc/postfix/main.cf
Add the following to the end of the file to connect MailHog to Postfix.
# MailHog
myhostname = localhost
relayhost = [127.0.0.1]:1025
Send a test email and check MailHog.
echo "Test email from Postfix" | mail -s "Test Email" hi@example.com
Next, update each php.ini file
with the following and then restart php-fpm. Note, test@localhost
should be used but will be overridden by any PHP scripts that run.
# Update your version number as needed
# 1.0.1 as of this writing
sendmail_path = /usr/local/Cellar/mailhog/1.0.1/bin/MailHog sendmail test@localhost
sudo killall php-fpm
Redis
Install Radis. This will install Redis Server v6.
brew install redis
brew services start redis
redis-server
Optionally, you can update your default dump.rdb
file name in the redis.conf
if you want.
code /usr/local/etc/redis.conf
# The filename where to dump the DB
dbfilename dump.rdb
Resources
https://github.com/shivammathur/homebrew-php
https://getgrav.org/blog/macos-bigsur-apache-multiple-php-versions
https://litebreeze.com/software-development/install-nginx-mariadb-in-macos/
https://medium.com/@ThomasTan/installing-nginx-in-mac-os-x-maverick-with-homebrew-d8867b7e8a5a
https://github.com/openssl/openssl/issues/3363
https://www.moncefbelyamani.com/how-to-install-postgresql-on-a-mac-with-homebrew-and-lunchy/
https://dev.to/ravishan16/brew-redis-on-mac-1ni8
https://blog.menincode.com/en/how-to-configure-your-mailhog-and-postfix-on-mac-os-mojave/
Hi There,
I would like to build my website by website builder and softaculus and I couldn’t get that because need php 5.5.0 version. (they have upgraded from the old very usable version and no any chance available)
I try to follow your instructions to instal PHP 5.5.0 for my apple macbook rpo with big sure, but i couldn’t.
Can I get any help from you?
I am a beginner programmer and don’t have any experience about that.
thanks
Mickey
If you are a beginner I recommend using https://www.mamp.info/en/mac/. However, I’m not sure what PHP versions they support. PHP 5.5 is very old so you might run into issues finding local development tooling that supports it.
Thanks for this article, it’s extremely useful and helped me a lot with installation