I've been wanting to try out Nginx with PHP-FPM. I installed Nginx via Macports. I read that PHP 5.3.3 includes PHP-FPM, however, the PHP 5.3.3 configuration on Macports does not enable it.

Can anyone explain or refer me to a tutorial on how to install PHP 5.3.3 with PHP-FPM for Nginx on OS X? I'd want to place it in /opt where Nginx is to keep it away from the PHP I'm using with Apache in /usr/local.

I'm new to command-line stuff. Pardon my ignorance.


I was able to take @Struder's answer above and mostly make it work, but like @Seth I was getting the "cannot stat sapi/cgi/php-cgi" error.

I ended up making some additional tweaks to the Portfile: Adding enable-fpm only when the fastcgi variant is used, getting rid of the "cannot stat" error, and copying the default php-fpm config file into place. The config file still needs to be user-customized, but this portfile will get you up and running with php5.3.3.

# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4
# $Id: Portfile 71588 2010-09-17 05:21:24Z ryandesign@macports.org $

PortSystem              1.0

name                    php5
conflicts               php5-devel php52
# Update revision of php5-eaccelerator when updating version of php5
epoch                   1
version                 5.3.3
revision                2
set major               [lindex [split ${version} .] 0]
set my_name             php${major}
dist_subdir             ${my_name}
categories              lang php www
maintainers             ryandesign jwa
homepage                http://www.php.net/
master_sites            php
distname                php-${version}
use_bzip2               yes
platforms               darwin freebsd
use_parallel_build      yes

description \
    PHP: Hypertext Preprocessor

long_description \
    PHP is a widely-used general-purpose scripting language \
    that is especially suited for developing web sites, but can also \
    be used for command-line scripting.

checksums \
    [suffix ${distname}] \
    md5     21ceeeb232813c10283a5ca1b4c87b48 \
    sha1    9f66716b341119e4e4f8fe3d81b7d0a5daf3cbc8 \
    rmd160  9edb51663feac9b787f8382012893f1ac98fec6a

depends_build \
    port:pkgconfig \

depends_lib \
    path:bin/gsed:gsed \
    port:libtool \
    port:libxml2 \
    port:bzip2 \
    port:mhash \
    port:pcre \
    port:readline \

# Use -p1 to accommodate the Suhosin patch
patch.pre_args          -p1
patchfiles              patch-scripts-php-config.in.diff \

use_autoconf            yes
autoconf.cmd            ${prefix}/bin/autoconf213

set phpinidir           ${prefix}/etc/${my_name}
set extraphpinidir      ${prefix}/var/db/${my_name}

destroot.keepdirs       ${destroot}${extraphpinidir}

configure.args \
    --mandir=${prefix}/share/man \
    --infodir=${prefix}/share/info \
    --with-config-file-path=${phpinidir} \
    --with-config-file-scan-dir=${extraphpinidir} \
    --disable-all \
    --enable-bcmath \
    --enable-ctype \
    --enable-dom \
    --enable-fileinfo \
    --enable-filter \
    --enable-hash \
    --enable-json \
    --enable-libxml \
    --enable-pdo \
    --enable-phar \
    --enable-session \
    --enable-simplexml \
    --enable-tokenizer \
    --enable-xml \
    --enable-xmlreader \
    --enable-xmlwriter \
    --with-bz2=${prefix} \
    --with-mhash=${prefix} \
    --with-pcre-regex=${prefix} \
    --with-readline=${prefix} \
    --with-libxml-dir=${prefix} \
    --with-zlib=${prefix} \
    --without-pear \

# php5-mysql +mysqlnd needs mysqlnd support compiled into php
configure.env-append    PHP_MYSQLND_ENABLED=yes

configure.universal_args-delete --disable-dependency-tracking

platform darwin 10 {
    configure.env-append \

variant no_web conflicts apache apache2 fastcgi description {Don't include any web server support} {}

# Build an Apache 1 module. On Mac OS X, it uses Apple's provided Apache 1 server.
# On other platforms, the MacPorts apache port is used. Keep the options here
# in sync with those in the relevant part of the post-destroot phase.
variant apache conflicts apache2 no_web description {Add Apache 1 web server module} {
    if { ! [variant_isset macosx] && (![info exists os.subplatform] || ${os.subplatform} != "macosx") } {
        depends_lib-append \
        configure.args-append \
    } else {
        destroot.violate_mtree yes
        configure.args-append \

# Build an Apache 2.2 module. Keep the options here in sync with those in the
# relevant part of the post-destroot phase.
variant apache2 conflicts apache no_web description {Add Apache 2.2 web server module} {
    pre-configure {
        # Checking for mod_cgi.so is a convenient way to verify apache2 is using its
        # +preforkmpm variant. (+eventmpm and +workermpm instead provide mod_cgid.so.)
        if {![file exists ${prefix}/apache2/modules/mod_cgi.so]} {
            ui_error "To use ${name} with the +apache2 variant, apache2 must be installed with the +preforkmpm variant."
            return -code error "incompatible apache2 installation"
    destroot.violate_mtree yes
    depends_lib-append \
    configure.args-append \

# Build a FastCGI binary. Keep the options here in sync with those in the
# relevant part of the post-destroot phase.
variant fastcgi conflicts no_web description {Add FastCGI web server binary} {
    if { ![variant_isset apache] && ![variant_isset apache2] } {
        configure.args-delete \
        configure.args-append \
            --enable-fpm \

foreach {old_variant new_port} {
    gmp             gmp
    imap            imap
    macports_snmp   snmp
    mssql           mssql
    mysql4          mysql
    mysql5          mysql
    mysqlnd         mysql
    oracle          oracle
    pcntl           pcntl
    postgresql82    postgresql
    postgresql83    postgresql
    pspell          pspell
    snmp            snmp
    sockets         sockets
    sqlite          sqlite
    tidy            tidy
} {
    eval [subst {
        variant ${old_variant} description "Obsolete; install ${my_name}-${new_port} port instead" {
            pre-configure {
                ui_msg "The +${old_variant} variant is obsolete. Please install the ${my_name}-${new_port} port instead."

variant ipc description {Add semaphore, shared memory and IPC functions} {
    configure.args-append \
        --enable-shmop \
        --enable-sysvsem \
        --enable-sysvshm \

if {![variant_isset apache] && ![variant_isset apache2] && ![variant_isset fastcgi] && ![variant_isset no_web]} {
    default_variants +apache2

variant pear description {Add PEAR} {
    configure.args-delete \
    configure.args-append \
    destroot.target-append \
    destroot.args-append \
    post-destroot {
        #nuke pear-stuff in ${destroot}
        system "cd ${destroot} && rm -rf .channels .depdb .depdblock .filemap .lock"

        system "if \[ -f ${prefix}/lib/php/.depdblock \]; then rm -f ${destroot}${prefix}/lib/php/.depdblock; fi"
        system "if \[ -f ${prefix}/lib/php/.depdb \]; then rm -f ${destroot}${prefix}/lib/php/.depdb; fi"
        system "if \[ -f ${prefix}/lib/php/.filemap \]; then rm -f ${destroot}${prefix}/lib/php/.filemap; fi"
        system "if \[ -f ${prefix}/lib/php/.lock \]; then rm -f ${destroot}${prefix}/lib/php/.lock; fi"
        system "if \[ -d ${prefix}/lib/php/.channels \]; then rm -rf ${destroot}${prefix}/lib/php/.channels; fi"

variant suhosin description {Add Suhosin patch} {
    pre-fetch {
        if {"darwin" == ${os.platform} && ${os.major} < 9} {
            ui_error "The suhosin variant requires Mac OS X 10.5 or greater."
            return -code error "incompatible Mac OS X version"
    set suhosin_patch_version   ${version}-0.9.10
    set suhosin_patch           suhosin-patch-${suhosin_patch_version}.patch.gz
    patch_sites-append          http://download.suhosin.org/
    patchfiles-append           ${suhosin_patch}
    checksums-append \
        ${suhosin_patch} \
            md5     b66b27c43b1332400ef8982944c3b95b \
            sha1    76675242cfdeff763767900213346af622002490 \
            rmd160  8dcd8b51ea0357b6cc51e70e495e18f341c62f7c

destroot.args \

destroot.target \
    install-cli install-build install-headers install-programs

post-destroot {
    # Copy the Apache 1 module.
    if { [variant_isset apache] } {
        xinstall -m 755 -d ${destroot}${prefix}/libexec/apache \
        xinstall -m 755 ${worksrcpath}/libs/libphp5.so ${destroot}${prefix}/libexec/apache/
        xinstall -m 755 -c ${filespath}/mod_php.conf ${destroot}$prefix/etc/apache/extra

    # Copy the Apache 2.2 module.
    if { [variant_isset apache2] } {
        xinstall -m 755 -d ${destroot}${prefix}/apache2/modules \
        xinstall -m 755 ${worksrcpath}/libs/libphp5.so ${destroot}${prefix}/apache2/modules/
        xinstall -m 755 -c ${filespath}/mod_php.conf ${destroot}${prefix}/apache2/conf/extra

    if { [variant_isset fastcgi] } {
        # If we've built an Apache module (any version) then the FastCGI binary
        # will not have been built, so we need to run through the whole process
        # again and build just the FastCGI binary. Keep the options here in sync
        # with the options specified in the apache and apache2 variants.
        if { [variant_isset apache] } {
            if { ![variant_isset macosx] && (![info exists os.subplatform] || ${os.subplatform} != "macosx") } {
                configure.args-delete \
            } else {
                configure.args-delete \
        if { [variant_isset apache2] } {
            configure.args-delete \

        # Run the build again to get the FastCGI binary. Keep the options here
        # in sync with those in the fastcgi variant.
        if { [variant_isset apache] || [variant_isset apache2] } {
            configure.args-delete \
            configure.args-append \
                --enable-fpm \
            ui_msg "$UI_PREFIX Configuring ${name} again for fastcgi"
            command_exec configure
            ui_msg "$UI_PREFIX Building ${name} again for fastcgi"
            command_exec build
            ui_msg "$UI_PREFIX Staging ${name} fastcgi into destroot"

        # Copy the FastCGI binary to the bin dir under a new name so it doesn't
        # conflict with the cli version.
        if {[file exists ${worksrcpath}/sapi/cgi/php-cgi]} {
            xinstall -m 755 ${worksrcpath}/sapi/cgi/php-cgi ${destroot}${prefix}/bin

        # Copy the default FastCGI config
        xinstall -m 644 ${worksrcpath}/sapi/fpm/php-fpm.conf ${destroot}${prefix}/etc/

    #file rename ${destroot}${prefix}/etc/pear.conf ${destroot}${prefix}/etc/pear.conf.sample

    # Copy the default php.ini files.
    xinstall -m 755 -d ${destroot}${phpinidir}
    xinstall -m 644 -W ${worksrcpath} \
        php.ini-development \
        php.ini-production \

    # Copy mysqlnd headers.
    xinstall -d ${destroot}${prefix}/include/php/ext/mysqlnd
    eval xinstall -m 644 [glob ${worksrcpath}/ext/mysqlnd/*.h] ${destroot}${prefix}/include/php/ext/mysqlnd

pre-activate {
    set filepath ${extraphpinidir}/.turd_${name}
    if {[file exists ${filepath}]} {
        delete ${filepath}

post-activate {
    if {[file exists ${prefix}/etc/php.ini] && ![file exists ${phpinidir}/php.ini]} {
        move ${prefix}/etc/php.ini ${phpinidir}
        ui_msg "Your ${prefix}/etc/php.ini has been moved to ${phpinidir}/php.ini"
        ui_msg ""
    if {![file exists ${phpinidir}/php.ini]} {
        ui_msg "To customize php, copy"
        ui_msg "${phpinidir}/php.ini-development (if this is a development server) or"
        ui_msg "${phpinidir}/php.ini-production (if this is a production server) to"
        ui_msg "${phpinidir}/php.ini and then make changes."
    } else {
        ui_msg "You may need to update your php.ini for any changes that have been made"
        ui_msg "in this version of php. Compare ${phpinidir}/php.ini with"
        ui_msg "${phpinidir}/php.ini-development (if this is a development server) or"
        ui_msg "${phpinidir}/php.ini-production (if this is a production server)."

    if {![variant_isset no_web]} {
        ui_msg ""
        ui_msg "If this is your first install, you need to activate PHP in your web server."
        if {![variant_isset fastcgi]} {
            if {[variant_isset apache]} {
                set moduledir ${prefix}/libexec/modules
                set apxs ${prefix}/apache/bin/apxs
            if {[variant_isset apache2]} {
                set moduledir ${prefix}/apache2/modules
                set apxs ${prefix}/apache2/bin/apxs
            ui_msg ""
            ui_msg "To enable PHP in Apache, run"
            ui_msg "  cd ${moduledir}"
            ui_msg "  ${apxs} -a -e -n \"${my_name}\" lib${my_name}.so"

    #ui_msg "* copy  ${prefix}/etc/pear.conf.sample to  ${prefix}/etc/pear.conf"

variant debug description {Enable debug support (useful to analyze a PHP-related core dump)} {
    configure.args-append   --enable-debug

test.run                yes

livecheck.type          regex
livecheck.url           ${homepage}downloads.php
livecheck.regex         get/php-(5\\.\[0-9.\]+)\\.tar
| improve this answer | |

Just did that setup on my MBP with OSX 10.6.5 nginx 0.8.53 + php-fpm (php 5.3.3)

For doing this i used the excellent homebrew package installer instead of macports:

brew install nginx

Homebrew doesnt include php but there is a non official "formula" for it

brew install php --with-mysql --with-fpm

Then you got both installed, the rest is configuration... that you can find easily on the web.

| improve this answer | |

php-fpm is now officially part of macports.

sudo port install php53-fpm
sudo port install php54-fpm
| improve this answer | |

Did you try the fastcgi variant of PHP installed by MacPorts ?

sudo port install php +fastcgi

EDIT : Before doing this, edit the Portfile (in /opt/local/var/macports/sources/rsync.macports.org/release/ports/lang/php5) and add the following to the configure.args (line 64, for example) :

configure.args \
    --enable-fpm \                  # <- add this line
    --mandir=${prefix}/share/man \
| improve this answer | |
  • I'm trying this right now. – Seth Aug 13 '10 at 23:43
  • adding the line '--enable-fpm \' causes an error. ... ---> Configuring php5 Error: Target org.macports.configure returned: configure failure: shell command failed Log for php5 is at: /opt/local/var/macports/logs/_opt_local_var_macports_sources_rsync.macports.org_release_ports_lang_php5/main.log Error: Status 1 encountered during processing. To report a bug, see <guide.macports.org/#project.tickets> – Seth Aug 14 '10 at 1:16
  • I'm thinking this is due to me not having libevent installed. – Seth Aug 14 '10 at 1:20
  • After installing libevent the next error in the log was "cannot stat `sapi/cgi/php': No such file or directory". – Seth Aug 14 '10 at 1:59
  • @Studer - if one has fastcgi then there's no need of php-fpm... right? – Abhishek A Aug 14 '10 at 6:05

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.