macOS Mojave Setup: Homebrew + Apache + PHP + MariaDB

13.08.2019
# macOS Mojave Setup: Homebrew + Apache + PHP + MariaDB
This document provides help on getting your macOS development environment up and running with the latest versions of Homebrew, Apache, PHP, etc.

![Homebrew Logo](https://upload.wikimedia.org/wikipedia/commons/3/34/Homebrew_logo.png)

## Homebrew Installation
[Homebrew](https://brew.sh/) is an excellent package manager for macOS; let's install it.

    $ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    
###
Add the Homebrew taps we need.

    $ brew tap homebrew/core

###

Homebrew can self-diagnose and check your system for potential problems. Let's see if everything is working the way it should.

    $ brew doctor
    
<blockquote>If successful it should display "Your system is ready to brew."</blockquote>
	
## Apache Installation

macOS comes with [Apache](https://httpd.apache.org/) pre-installed. We don't want Apple in control of our web server so let's stop it and prevent it from starting on boot.

    $ sudo apachectl stop
    $ sudo launchctl unload /System/Library/LaunchDaemons/org.apache.httpd.plist 2>/dev/null
    
Type the following command into your terminal:
    
    $ mkdir ~/Sites
	
<blockquote>macOS automatically adds the compass icon to your folder.</blockquote>
	
Now, let's brew and configure our new Apache version and change it to run on standard ports (80/443).
	
    $ brew install httpd

Check the installation path.

    $ which apachectl
    /usr/local/bin/apachectl

Set Apache to start now and restart at login

    $ sudo brew services start httpd

You can watch the Apache error log in a new Terminal tab/window during a restart to see if anything is invalid or causing a problem:

    $ tail -f /usr/local/var/log/httpd/error_log
	
Remember useful commands.

    $ sudo apachectl start
    $ sudo apachectl stop
    $ sudo apachectl -k restart
    $ sudo apachectl configtest
	
## PHP Installation

Install the latest [PHP](http://php.net/) version.

    $ brew install php

The php.ini file can be found in: <code>/usr/local/etc/php/7.x/php.ini</code>.
    
    
## Apache PHP Setup
    
You have successfully installed PHP, but you need to tell Apache to use it. 
Edit the httpd.conf file. 

    vi /usr/local/etc/httpd/httpd.conf 
    
Find **Listen 8080** and change it to port 80:
   
    Listen 80
    
Uncomment the following lines.
	
    LoadModule socache_shmcb_module lib/httpd/modules/mod_socache_shmcb.so
    LoadModule ssl_module lib/httpd/modules/mod_ssl.so
    LoadModule vhost_alias_module lib/httpd/modules/mod_vhost_alias.so
    LoadModule userdir_module lib/httpd/modules/mod_userdir.so
    LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so

Add the following entry at the end of the LoadModules section:
    
    LoadModule php7_module /usr/local/opt/php/lib/httpd/modules/libphp7.so

Update user and group.

    User username
    Group staff
    
Servername is disabled by default, set it to **localhost**:
    
    #ServerName www.example.com:8080
    ServerName localhost

Modify httpd.conf a bit more.

Change DocumentRoot; it makes up the basic document tree, which will be visible from the web.

    DocumentRoot "/Users/username/Sites"
    <Directory "/Users/username/Sites">
        AllowOverride All
    
Check that directive DirectoryIndex includes <code>index.php</code>.

    DirectoryIndex index.php index.html
    
And we need to add the FilesMatch directive so that Apache will now process PHP files.

    <FilesMatch \.php$>
        SetHandler application/x-httpd-php
    </FilesMatch>
    
Uncomment to enable User home directories, Virtual hosts and Secure (SSL/TLS) connections.

    Include /usr/local/etc/httpd/extra/httpd-userdir.conf
    Include /usr/local/etc/httpd/extra/httpd-vhosts.conf
    Include /usr/local/etc/httpd/extra/httpd-ssl.conf
    
Restart apache.
    
    $ sudo apachectl -k restart

Run a configuration file syntax test to verify/validate the configuration. It reports Syntax Ok or detailed information about the particular syntax error. This is equivalent to <code>apachectl -t</code>.

    $ sudo apachectl configtest
    
<blockquote>If it says "Syntax OK" open browser using http://127.0.0.1. You should see a message saying, “It works!”</blockquote>

<code>php -v</code> should report something like...

<pre>PHP 7.3.7 (cli) (built: Jul  5 2019 12:44:05) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.7, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.7, Copyright (c) 1999-2018, by Zend Technologies
</pre>

## SSL/Virtual Hosts

Change default 8443 ports to 443 in the SSL configuration file.

    $ vi /usr/local/etc/httpd/extra/httpd-ssl.conf

Replace all lines that say '8443' with '443'.

    ServerName www.example.com:443

    <VirtualHost _default_:443>

Save the file plus generate a key and certificate.

    $ cd /usr/local/etc/httpd
    $ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt

Open up <code>/usr/local/etc/httpd/extra/httpd-vhosts.conf</code> and add your own SSL based virtual hosts.

    $ vi /usr/local/etc/httpd/extra/httpd-vhosts.conf

Create your virtual host entries.

vi /usr/local/etc/httpd/extra/httpd-vhosts.conf

    <VirtualHost *:80>
        ServerName yourprojectdomain.com
        DocumentRoot "/Users/username/Sites/yourprojectname"
        ErrorLog "/usr/local/var/log/httpd/yourprojectname-error_log"
        CustomLog "/usr/local/var/log/httpd/yourprojectname-access_log" common
    </VirtualHost>

    <VirtualHost *:443>
        DocumentRoot "/Users/username/Sites/yourprojectname"
        ServerName yourprojectdomain.com
        SSLEngine on
        SSLCertificateFile "/usr/local/etc/httpd/server.crt"
        SSLCertificateKeyFile "/usr/local/etc/httpd/server.key"
    </VirtualHost>
    
In Terminal, restart Apache.

    $ sudo apachectl restart
    
## MariaDB Installation

Install [MariaDB](https://mariadb.org/) with Homebrew.

    $ brew install mariadb

Have MariaDB start on boot.

    $ brew services start mariadb
    
Finally, let's improve the security of your installation and add a password.

    $ mysql_secure_installation
    
Restart the MariaDB server.

    $ brew services restart mariadb
    
After MariaDB Server is started, you can log in:

    mysql -u root
    

© 2019 All rights reserved. Codesenior.COM