Usable MAMP on OS X 10.8 Mountain Lion

Alan Ivey's picture

Senior Systems Administrator

Blog

Usable MAMP on OS X 10.8 Mountain Lion

Dec 19, 2012

Alan Ivey

share

MAMP on OS X is a great way to quickly get started on Apache/MySQL/PHP development locally on a Mac. Unfortunately, I've found that many of the defaults can get in the way of developing some content management systems, like Drupal. The following are a list of steps aimed to help you get MAMP installed and configured to be much more friendly to development projects in Drupal or WordPress. It'll also set you up for VirtualDocumentRoot, which is a faster way to create new projects. Read on to get started.

Install MAMP

Download the latest MAMP from http://mamp.info/en/downloads/index.html and run the installer.

Choose APC Cache

Open the MAMP app, open Preferences..., click the PHP tab, and change Cache to APC. Click OK to close Preferences and Quit MAMP.

MAMP Screenshot

PATH variable

From here on out, you'll be copying and pasting commands into Terminal. If you're new to getting this deep into the system, just copy and paste carefully and hit return after each command you paste. Some commands begin with the # character; they are comments and will have no effect.

Put MAMP binaries, including PHP, in the front of your $PATH (this is a single command):

echo 'export PATH="/Applications/MAMP/bin:/Applications/MAMP/Library/bin:$(find /Applications/MAMP/bin/php -type d -name "php5.4*" | sort | tail -1)/bin:$PATH"' >> ~/.bash_profile && source ~/.bash_profile

MySQL

Set up MySQL and stop it (default MySQL password is root, you do not have to change it when running mysql_secure_installation, though I recommend all of the other defaults):

cp -va /Applications/MAMP/Library/support-files/my-small.cnf /Applications/MAMP/conf/my.cnf
 
sed -i '' "s/^(max_allowed_packet =) [0-9]<em>M/\1 1G/g" /Applications/MAMP/conf/my.cnf
 
egrep "^# Uncomment the following if you are using InnoDB tables$" /Applications/MAMP/conf/my.cnf &>/dev/null && sed -i '' "s/^(# Uncomment the following if you are using InnoDB tables)$/\1@innodb_file_per_table/; y/@/\n/; s/^#(innodb_.</em>)/\1/g" /Applications/MAMP/conf/my.cnf
 
/Applications/MAMP/bin/startMysql.sh &
 
# Secure MySQL setup:
/Applications/MAMP/Library/bin/mysql_secure_installation
# -- OR --
# Less secure MySQL setup:
#/Applications/MAMP/Library/bin/mysql -uroot -proot -e"DELETE FROM mysql.user WHERE User=''; DELETE FROM mysql.user WHERE User='root' AND Host!='localhost'; FLUSH PRIVILEGES;"
 
/Applications/MAMP/bin/stopMysql.sh

PHP

Set timezone, and increase timeouts and memory values:

sed -i '-default' "s|^;<em>(date.timezone[[:space:]]</em>=).<em>|\1 \"<code>systemsetup -gettimezone|awk -F&quot;\: &quot; &#039;{print $2}&#039;</code>\"|; s|^(memory_limit[[:space:]]</em>=).<em>(\;.</em>)|\1 256M \2|; s|^(post_max_size[[:space:]]<em>=).</em>|\1 200M|; s|^(upload_max_filesize[[:space:]]<em>=).</em>|\1 100M|; s|^(default_socket_timeout[[:space:]]<em>=).</em>|\1 600|; s|^(max_execution_time[[:space:]]<em>=).</em>(\;.<em>)|\1 300 \2|; s|^(max_input_time[[:space:]]</em>=).<em>(\;.</em>)|\1 600 \2|;" $(find /Applications/MAMP/bin/php -type d -name "php5.4<em>" | sort | tail -1)/conf/php.ini
 
echo -e "\n[apc]\napc.shm_size = 192M\napc.rfc1867 = 1" >> $(find /Applications/MAMP/bin/php -type d -name "php5.4</em>" | sort | tail -1)/conf/php.ini

PECL Uploadprogress

Feel free to skip: This is quite involved when the setting apc.rfc1867=1 set above does the job in most cases. This is mostly an exercise in building PHP modules for MAMP.

You'll need to install Xcode Command Line Tools from http://develop.apple.com/downloads in order to complete all of the steps below.

mkdir -p $(find /Applications/MAMP/bin/php -type d -name "php5.4<em>" | sort | tail -1)/include
cd $(find /Applications/MAMP/bin/php -type d -name "php5.4</em>" | sort | tail -1)/include
export PHPVER=$(cd /Applications/MAMP/bin/php && find * -type d -name "php5.4<em>" | sort | tail -1 | sed 's/php//') && curl -L -o php-${PHPVER}.tar.bz2 http://us3.php.net/get/php-${PHPVER}.tar.bz2/from/us3.php.net/mirror && unset PHPVER
ls php-5.4</em>bz2 | xargs -L1 tar jxpf && rm php-5.4<em>bz2
mv -v $(find * -type d -name "php-5.4</em>") php
cd php
./configure
cd ..
 
# Build automake and related tools
export build="$PWD/build"
mkdir -p $build
cd $build
curl -OL http://ftpmirror.gnu.org/autoconf/autoconf-2.68.tar.gz
tar xzf autoconf-2.68.tar.gz
cd autoconf-2.68
./configure --prefix=$build/autotools-bin
make
make install
export PATH=$PATH:$build/autotools-bin/bin
cd $build
curl -OL http://ftpmirror.gnu.org/automake/automake-1.11.tar.gz
tar xzf automake-1.11.tar.gz
cd automake-1.11
./configure --prefix=$build/autotools-bin
make
make install
cd $build
curl -OL http://ftpmirror.gnu.org/libtool/libtool-2.4.tar.gz
tar xzf libtool-2.4.tar.gz
cd libtool-2.4
./configure --prefix=$build/autotools-bin
make
make install
cd $build
unset build
rm autoconf-2.68.tar.gz automake-1.11.tar.gz libtool-2.4.tar.gz
rm -rf autoconf-2.68 automake-1.11 libtool-2.4
cd ..
 
pecl download uploadprogress
ls uploadprogress<em>z | xargs -L1 tar zxpf && rm -v uploadprogress</em>z package<em>xml
mv -v $(find * -type d -name "uploadprogress</em>") uploadprogress
cd uploadprogress
phpize
./configure --with-php-config=$(find /Applications/MAMP/bin/php -type d -name "php5.4<em>" | sort | tail -1)/bin/php-config
make
make install
 
echo -e "\n[uploadprogress]\nextension=uploadprogress.so" >> $(find /Applications/MAMP/bin/php -type d -name "php5.4</em>" | sort | tail -1)/conf/php.ini

Reference 1: http://www.lullabot.com/articles/installing-php-pear-and-pecl-extensions-on-mamp-mac-os-x-107-lion
Reference 2: http://jsdelfino.blogspot.com/2012/08/autoconf-and-automake-on-mac-os-x.html

Apache

Set up VirtualHosts in ~/Sites/mamp-vhosts.conf so it's easy to edit later:

cp -av /Applications/MAMP/conf/apache/httpd.conf{,-default}
 
export USERHOME=$(dscl . -read /Users/<code>whoami</code> NFSHomeDirectory | awk -F": " '{print $2}') && echo -e "\n# User VirtualHosts file (added after MAMP installer)\nInclude ${USERHOME}/Sites/mamp-vhosts.conf" >> /Applications/MAMP/conf/apache/httpd.conf && unset USERHOME
 
[ ! -d ~/Sites/logs ] && mkdir -pv ~/Sites/logs

IMPORTANT! Be sure to copy and paste the lines containing PORTNUM through the last EOF as a single command (this entire block is a single copy+paste):

PORTNUM=$(egrep '^Listen [0-9]*' /Applications/MAMP/conf/apache/httpd.conf | awk '{print $2}') USERHOME=$(dscl . -read /Users/<code>whoami</code> NFSHomeDirectory | awk -F": " '{print $2}') cat > ~/Sites/mamp-vhosts.conf <<EOF
#
# Use name-based virtual hosting.
#
NameVirtualHost *:${PORTNUM}
 
#
# Set up permissions for VirtualHosts in ~/Sites
#
<Directory "${USERHOME}/Sites">
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>
 
# For http://localhost in the MAMP default location
<VirtualHost _default_:${PORTNUM}>
    ServerName localhost
    DocumentRoot "/Applications/MAMP/htdocs"
</VirtualHost>
 
#
# VirtualHosts
#
 
## VirtualHost template
#<VirtualHost *:${PORTNUM}>
#  ServerName domain.local
#  CustomLog "${USERHOME}/Sites/logs/domain.local-access_log" combined
#  ErrorLog "${USERHOME}/Sites/logs/domain.local-error_log"
#  DocumentRoot "${USERHOME}/Sites/domain.local"
#</VirtualHost>
 
#
# Automatic VirtualHosts
# A directory at ${USERHOME}/Sites/webroot can be accessed at http://webroot.dev
# In Drupal, uncomment the line in .htaccess with: RewriteBase /
#
# This log format will display the per-virtual-host as the first field followed by a typical log line
LogFormat "%V %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combinedmassvhost
<VirtualHost *:${PORTNUM}>
  ServerName dev
  ServerAlias *.dev
 
  CustomLog "${USERHOME}/Sites/logs/dev-access_log" combinedmassvhost
  ErrorLog "${USERHOME}/Sites/logs/dev-error_log"
 
  VirtualDocumentRoot ${USERHOME}/Sites/%-2+
</VirtualHost>
EOF

If you read that closely, you'll see that it's set up to do MassVirtualHosts using the *.dev tld. For example, set up a web root at $HOME/Sites/project and you will be able to view it at http://project.dev:8888 without needing to create a separate VirtualHost. A custom log format is used, putting the domain name at the beginning of the line, so you can easily see the output as it's related to a project.

Finishing Up

Open the MAMP application to Start Servers. Note that if you ever change the Apache port number, you'll need to edit ~/Sites/mamp-vhosts.conf appropriately.

As always with MAMP, you can work out of http://localhost:8888/ by putting files in /Applications/MAMP/htdocs. For example, the folder /Applications/MAMP/drupal will be accessible at http://localhost:8888/drupal. You can find other MAMP tools at http://localhost:8888/MAMP.

If you're having trouble connecting to MySQL with Sequel Pro or another utility, use /Applications/MAMP/tmp/mysql/mysql.sock as the socket path. If MAMP's MySQL is the only service running mysqld, this should not be necessary but YMMV.

Changing the defaults of MAMP is not trivial; perhaps it's easier to do if you pay for MAMP Pro. Hopefully, copying and pasting these commands will take care of the legwork for you and in the end you'll have a MAMP environment better suited for developing quickly on your Mac. If you have any questions or run into any problems, leave us a comment.