Skip to content

Instantly share code, notes, and snippets.

@sdesalas
Last active December 22, 2015 19:49
Show Gist options
  • Save sdesalas/6522004 to your computer and use it in GitHub Desktop.
Save sdesalas/6522004 to your computer and use it in GitHub Desktop.
I've been spending a bit of time trying to enable mod_proxy on heroku via the standard php buildpack (https://github.com/heroku/heroku-buildpack-php).. After much frustration I decided to compile my own binary. This is a script that sets up apache (as well as php and mysql) for compiling a binary that support mod_proxy. Its much the same as on t…
#!/bin/bash
set -uex
cd /tmp
# Heroku revision. Must match in 'compile' program.
#
# Affixed to all vendored binary output to represent changes to the
# compilation environment without a change to the upstream version,
# e.g. PHP 5.3.27 without, and then subsequently with, libmcrypt.
heroku_rev='-2'
# Clear /app directory
find /app -mindepth 1 -print0 | xargs -0 rm -rf
# Take care of vendoring libmcrypt
mcrypt_version=2.5.8
mcrypt_dirname=libmcrypt-$mcrypt_version
mcrypt_archive_name=$mcrypt_dirname.tar.bz2
# Download mcrypt if necessary
if [ ! -f mcrypt_archive_name ]
then
curl -Lo $mcrypt_archive_name http://sourceforge.net/projects/mcrypt/files/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.bz2/download
fi
# Clean and extract mcrypt
rm -rf $mcrypt_dirname
tar jxf $mcrypt_archive_name
# Build and install mcrypt.
pushd $mcrypt_dirname
./configure --prefix=/app/vendor/mcrypt \
--disable-posix-threads --enable-dynamic-loading
make -s
make install -s
popd
# Take care of vendoring Apache.
httpd_version=2.2.25
httpd_dirname=httpd-$httpd_version
httpd_archive_name=$httpd_dirname.tar.bz2
# Download Apache if necessary.
if [ ! -f $httpd_archive_name ]
then
curl -LO ftp://ftp.osuosl.org/pub/apache//httpd/$httpd_archive_name
fi
# Clean and extract Apache.
rm -rf $httpd_dirname
tar jxf $httpd_archive_name
# Build and install Apache.
pushd $httpd_dirname
./configure --prefix=/app/apache --enable-rewrite --with-included-apr --enable-mods-shared="proxy"
make -s
make install -s
popd
# Take care of vendoring PHP.
php_version=5.3.27
php_dirname=php-$php_version
php_archive_name=$php_dirname.tar.bz2
# Download PHP if necessary.
if [ ! -f $php_archive_name ]
then
curl -Lo $php_archive_name http://us1.php.net/get/php-5.3.27.tar.bz2/from/www.php.net/mirror
fi
# Clean and extract PHP.
rm -rf $php_dirname
tar jxf $php_archive_name
# Compile PHP
pushd $php_dirname
./configure --prefix=/app/php --with-apxs2=/app/apache/bin/apxs \
--with-mysql --with-pdo-mysql --with-pgsql --with-pdo-pgsql \
--with-iconv --with-gd --with-curl=/usr/lib \
--with-config-file-path=/app/php --enable-soap=shared \
--with-openssl --with-mcrypt=/app/vendor/mcrypt --enable-sockets
make -s
make install -s
popd
# Copy in MySQL client library.
mkdir -p /app/php/lib/php
cp /usr/lib/libmysqlclient.so.16 /app/php/lib/php
# 'apc' installation
#
# $PATH manipulation Necessary for 'pecl install', which relies on
# PHP binaries relative to $PATH.
export PATH=/app/php/bin:$PATH
/app/php/bin/pecl channel-update pecl.php.net
# Use defaults for apc build prompts.
yes '' | /app/php/bin/pecl install apc
# Sanitize default cgi-bin to rid oneself of Apache sample
# programs.
find /app/apache/cgi-bin/ -mindepth 1 -print0 | xargs -0 rm -r
# Stamp and archive binaries.
pushd /app
echo $mcrypt_version > vendor/mcrypt/VERSION
tar -zcf mcrypt-"$mcrypt_version""$heroku_rev".tar.gz vendor/mcrypt
echo $httpd_version > apache/VERSION
tar -zcf apache-"$httpd_version""$heroku_rev".tar.gz apache
echo $php_version > php/VERSION
tar -zcf php-"$php_version""$heroku_rev".tar.gz php
popd
@sdesalas
Copy link
Author

To use:

  1. heroku apps:create my-buildpack-test
  2. git clone my-buildpack-test
  3. cd my-buildpack-test
  4. heroku run bash
  5. curl -Lo /tmp/install-apache.sh
  6. chmod +x /tmp/install-apache.sh
  7. /tmp/install-apache.sh

.. this will compile all binaries, its the apache binary we are interested in..

curl -T /app/apache-2.2.25.tar.gz ftp://uname:pwd@myserver/mydir/

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