Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 45 You must be signed in to star a gist
  • Fork 14 You must be signed in to fork a gist
  • Save andrewstobbe/7c56de552df41e444f0a1d5bdfa02ffe to your computer and use it in GitHub Desktop.
Save andrewstobbe/7c56de552df41e444f0a1d5bdfa02ffe to your computer and use it in GitHub Desktop.
Mac OSX Sierra : Brew Apache + Mysql + PHP Switcher + DNSMasq + SSL

Mac OSX Sierra : Brew Apache + Mysql + PHP Switcher + DNSMasq + SSL 👍

Things I had to do using Homebrew to get my local web dev environment back up and running after migration to OSX Sierra + Xcode 8.1.

Note: I used brew reinstall because I had already installed most of this previously under Yosemite. Probably better ways to do this, but this is what worked for me.

brew doctor

brew tap homebrew/dupes
brew tap homebrew/versions
brew tap homebrew/php
brew tap homebrew/apache

brew update

sudo apachectl stop
sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist 2>/dev/null

brew reinstall httpd24 --with-privileged-ports --with-http2

sudo cp -v /usr/local/Cellar/httpd24/2.4.23_2/homebrew.mxcl.httpd24.plist /Library/LaunchDaemons

sudo chown -v root:wheel /Library/LaunchDaemons/homebrew.mxcl.httpd24.plist
sudo chmod -v 644 /Library/LaunchDaemons/homebrew.mxcl.httpd24.plist
sudo launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.httpd24.plist

Make sure all http instances have been stopped before going on.

ps -aef | grep httpd

sudo apachectl -k start

Check for errors.

tail -f /usr/local/var/log/apache2/error_log

Useful commands.

sudo apachectl start
sudo apachectl stop
sudo apachectl -k restart

Modify httpd.conf and test Apache.

DocumentRoot ~/Sites/active-projects

AllowOverride All

Uncomment rewrite_module

User YourLocalUser
Group staff

ServerAdmin admin@yourdomain.com

Create an index page in webroot.

echo "<h1>Active Projects Web Root</h1>" > ~/Sites/active-projects/index.html

##Install PHP55

brew reinstall php55 --with-apache
brew reinstall php55-opcache 
brew reinstall php55-apcu
brew reinstall php55-mcrypt  
brew reinstall php55-imagick
brew reinstall php55-pdo-dblib
brew reinstall php55-yaml
brew reinstall php55-xdebug

Add to httpd.conf so we can test the first php install.

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

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

sudo apachectl -k restart

If all went well, install other php versions.

brew unlink php55

brew reinstall php56 --with-apache
brew reinstall php56-opcache 
brew reinstall php56-apcu
brew reinstall php56-mcrypt  
brew reinstall php56-imagick
brew reinstall php56-pdo-dblib
brew reinstall php56-yaml
brew reinstall php56-xdebug
brew unlink php56

brew reinstall php70 --with-apache
brew reinstall php70-opcache 
brew reinstall php70-apcu
brew reinstall php70-mcrypt  
brew reinstall php70-imagick
brew reinstall php70-pdo-dblib
brew reinstall php70-yaml
brew reinstall php70-xdebug
brew unlink php70

In my case php71 ended up needing special attention before re-install.

brew uninstall --force php71
brew cleanup --force -s php71
brew prune
sudo rm -fr  /usr/local/opt/php71

brew reinstall php71 --with-apache
brew reinstall php71-opcache 
brew reinstall php71-apcu
brew reinstall php71-mcrypt  
brew reinstall php71-imagick
brew reinstall php71-pdo-dblib
brew reinstall php71-yaml
brew reinstall php71-xdebug
brew unlink php71

Back to PHP5

brew link php56

###PHP ini paths

/usr/local/etc/php/5.5/php.ini
/usr/local/etc/php/5.6/php.ini
/usr/local/etc/php/7.0/php.ini
/usr/local/etc/php/7.1/php.ini

Modify the paths as follows:

LoadModule php5_module    /usr/local/opt/php55/libexec/apache2/libphp5.so
LoadModule php5_module    /usr/local/opt/php56/libexec/apache2/libphp5.so
LoadModule php7_module    /usr/local/opt/php70/libexec/apache2/libphp7.so
LoadModule php7_module    /usr/local/opt/php71/libexec/apache2/libphp7.so

We can only have one module processing PHP at a time, so for now, comment out all but the php56 entry:

#LoadModule php5_module    /usr/local/opt/php55/libexec/apache2/libphp5.so
LoadModule php5_module    /usr/local/opt/php56/libexec/apache2/libphp5.so
#LoadModule php7_module    /usr/local/opt/php70/libexec/apache2/libphp7.so
#LoadModule php7_module    /usr/local/opt/php71/libexec/apache2/libphp7.so

Verify php install one more time.

##Install php switcher.

curl -L https://gist.github.com/w00fz/142b6b19750ea6979137b963df959d11/raw > /usr/local/bin/sphp
chmod +x /usr/local/bin/sphp

Add LoadModule for sphp switcher to httpd.conf (final PHP change)

LoadModule php5_module /usr/local/lib/libphp5.so
#LoadModule php7_module /usr/local/lib/libphp7.so

It's IMPORTANT at this stage to fully stop your Apache sever, and start it again. Do not just restart it!

sudo apachectl -k stop
sudo apachectl start

I had some error messages regarding php*-intl, this fixed it. Had to be run for each version of php as do any other updates.

sphp71
brew reinstall --build-from-source php71-intl
brew update
brew upgrade

sphp55
brew reinstall --build-from-source php55-intl
brew update
brew upgrade

sphp56
brew reinstall --build-from-source php56-intl
brew update
brew upgrade

sphp70
brew reinstall --build-from-source php70-intl
brew update
brew upgrade

Virtual hosts

Apache already comes preconfigured to support this behavior but it is not enabled.

First you will need to uncomment the following lines in your /usr/local/etc/apache2/2.4/httpd.conf file:

LoadModule vhost_alias_module libexec/mod_vhost_alias.so

and:

Include /usr/local/etc/apache2/2.4/extra/httpd-vhosts.conf

and:

<VirtualHost *:80>
DocumentRoot "~/Sites/active-projects"
ServerName localhost
</VirtualHost>

<VirtualHost *:80>
DocumentRoot "~/Sites/active-projects/myproject.dev"
ServerName myproject.dev
</VirtualHost>

##Install DnsMasq

brew reinstall dnsmasq
echo 'address=/.dev/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/dev'

Test it!

ping fakedomain.dev

Generate Self-Signed SSL Cert

openssl genrsa -des3 -passout pass:x -out local.dev.pass.key 2048
openssl rsa -passin pass:x -in local.dev.pass.key -out local.dev.key

rm local.dev.pass.key

openssl req -new -key local.dev.key -out local.dev.csr
openssl x509 -req -days 365 -in local.dev.csr -signkey local.dev.key -out local.dev.crt

Remove MySQL completely

  1. Open the Terminal

  2. Use mysqldump to backup your databases

  3. Check for MySQL processes with: ps -ax | grep mysql

  4. Stop and kill any MySQL processes

  5. Analyze MySQL on HomeBrew:

    brew remove mysql
    brew cleanup
    
  6. Remove files:

    sudo rm /usr/local/mysql
    sudo rm -rf /usr/local/var/mysql
    sudo rm -rf /usr/local/mysql*
    sudo rm ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
    sudo rm -rf /Library/StartupItems/MySQLCOM
    sudo rm -rf /Library/PreferencePanes/My*
    
  7. Unload previous MySQL Auto-Login:

    launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
    
  8. Remove previous MySQL Configuration:

    subl /etc/hostconfig` 
    # Remove the line MYSQLCOM=-YES-
    
  9. Remove previous MySQL Preferences:

    rm -rf ~/Library/PreferencePanes/My*
    sudo rm -rf /Library/Receipts/mysql*
    sudo rm -rf /Library/Receipts/MySQL*
    sudo rm -rf /private/var/db/receipts/*mysql*
    
  10. Restart your computer just to ensure any MySQL processes are killed

  11. Try to run mysql, it shouldn't work

##Install MySQL

brew install mysql
brew services start mysql
Copy link

ghost commented Sep 13, 2017

Hey,

Thank you for this, it helps me to properly launch APCU, but now i have another problem. Maybe you can help:

After changing this line in httpd.conf file:
LoadModule php5_module libexec/apache2/libphp5.so
to this:
LoadModule php5_module /usr/local/opt/php56/libexec/apache2/libphp5.so
All the extensions that you mentioned load properly, but in my project i use old mysql extension and now it fails to load:
Fatal error: Call to undefined function mysql_connect()

I have php version 5.6.30. When I change again that line in httpd.conf to original, mysql load properly but other extensions like ACPU failed to load.

I will be grateful for any tips :)

@kshitijdeota
Copy link

I believe that is the common 2002 mysql socket location issue on MacOS
try this and let know:
sudo mkdir /var/mysql
sudo ln -s /tmp/mysql.sock /var/mysql/mysql.sock

@marlenesco
Copy link

Thank you for this gist, is it good for High Sierra also?

@jvdjay
Copy link

jvdjay commented Jan 18, 2018

@marlenesco I just installed it on my Mac running High Sierra with some changes:
brew reinstall php56 --with-apache
--output error saying that 'with-apache' is depreciated and uses --with-http instead -> thats normal

all of the plist paths containing the 'httpd24' had to be changed to 'httpd' (no 24) and you would have to look into the '/usr/local/Cellar/httpd/' directory for the proper path to the updated plist location. as of the time of this writing the apache has been upgraded from 2.4.23_2 to 2.4.29_1

@marlenesco
Copy link

Thank you @jvdjay, I'll take your advice

@omar-faruk-sust
Copy link

omar-faruk-sust commented Feb 14, 2018

hello @jvdjay, i tried to follow this tutorial i am facing some issue as like as you. Can you please give me instruction how did you install? however i tried by replacing all the httpd24 with httpd and change the listen port 8080 to 80 but not able to access localhost. and it's not pointing my local sites folder too.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment