MacにNginx、PHP-FPM、PHP5.6をインストールする

2015年2月15日

Nginx PHP-FPM PHP5.6 インストール

Mac に Homebrew で Nginx、PHP-FPM、PHP5.6 をインストールしました。実行したコマンドと php.ini などの設定を残しておきます。OPcache、APCu、Xdebug のインストール方法、SSL 環境の構築方法にも触れます。

Homebrew のインストールには触れませんので、あらかじめセットアップしておいてください。

Mac での PHP 環境構築は phpbrew もオススメです。

phpbrew
MacでのPHP開発はphpbrewが非常に良い

Mac で PHP のバージョンを複数管理する必要が出てきたので phpbrew をインストールしました。この手のツール ...

続きを見る

動作確認環境

  • Mac OSX 10.9

目次

  1. tap コマンドでリポジトリを追加
  2. Nginx をインストール・設定
  3. PHP5.6 をインストール
  4. PHP-FPM を設定する
  5. php.ini を設定する
  6. OPcache を設定する
  7. 動作確認
  8. Nginx を起動・停止するコマンド
  9. PHP-FPM を起動・停止するコマンド
  10. APCu をインストール・設定
  11. Xdebug をインストール・設定
  12. 自己署名証明書を作成
  13. SSL 接続できるようにする
  14. 複数バージョンの PHP を共存させる

tap コマンドでリポジトリを追加

brew tap コマンドで PHP 用のリポジトリを追加します。

brew tap homebrew/dupes
brew tap homebrew/versions
brew tap homebrew/homebrew-php

Nginx をインストール・設定

brew install コマンドで Nginx をインストール。

$ brew install nginx

インストールできたら nginx.conf を編集します。開発環境なので設定は最低限。

  • http のポートは 8080
  • ドキュメントルートを ホームディレクトリ直下の www に
  • PHP-FPM への接続は unix ソケット経由

/usr/local/etc/nginx/nginx.conf

worker_processes  1;
error_log /usr/local/var/log/nginx/error.log crit;
pid /usr/local/var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  text/html;
    sendfile        on;
    tcp_nopush      on;
    keepalive_timeout  65;
    root   /Users/karasawa/www;
    index  index.html index.php;
    access_log off;
    server {
        listen       8080;
        server_name  localhost;
        location ~ \.php(/|$) {
            fastcgi_index  index.php;
            fastcgi_pass   unix:/usr/local/var/run/php-fpm.sock;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
    }
}

nginx のポートを 80 番にするには、nginx を root で実行する必要があります。私は nginx をログインユーザで手軽に実行したいので、ポートを 8080 にしています。

PHP5.6 をインストール

次は PHP5.6 をインストール。オプションで PHP-FPM と MySQL を有効に、PEAR は使わないので無効にします。利用可能なオプションは
brew options php56 コマンドで表示できます。

$ brew install php56 --with-fpm --with-mysql --without-pear

.bashrc や .zshrc に PATH を追加します。

export PATH="$(brew --prefix homebrew/php/php56)/bin:$PATH"
export PATH="/usr/local/sbin:$PATH"

PHP-FPM を設定する

PHP-FPM の設定を行います。

  • nginx との接続は unix ソケット経由
  • 子プロセスは 1 個
  • catch_workers_output = yes を設定し、php.ini で指定した error_log にエラーが出力されるように

/usr/local/etc/php/5.6/php-fpm.conf

listen = /usr/local/var/run/php-fpm.sock
listen.mode = 0664
listen.allowed_clients = 127.0.0.1
pm = static
pm.max_children = 1
catch_workers_output = yes

php.ini を設定する

php.ini はほとんどデフォルトのままです。

/usr/local/etc/php/5.6/php.ini

error_log = /usr/local/var/log/php_errors.log
...
default_charset = "UTF-8"
...
date.timezone = "Asia/Tokyo"

PHP5.5 までは mbstring の設定を細かく行うのが恒例でしたが、PHP5.6 からは、mbstring の設定がいくつか非推奨になりました。mbstring の設定をデフォルトのままにしておき、代わりに default_charset を設定することが推奨されています。

mbstring 実行時設定 - PHP Manual

OPcache を設定する

OPcache は、php.ini で enable にするだけで有効になります。

/usr/local/etc/php/5.6/php.ini

[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=4
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1

動作確認

このへんでいったん動作確認。ドキュメントルートに phpinfo() を表示する php ファイルを作成します。

$ mkdir ~/www
$ echo '<?php phpinfo();' > ~/www/phpinfo.php

Nginx 起動。

$ nginx

PHP-FPM の起動ファイルにシンボリックリンクを張る

$ ln -sfv /usr/local/opt/php56/*.plist ~/Library/LaunchAgents

PHP-FPM 起動

$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.php56.plist

ブラウザでアクセスして動作確認。

http://localhost:8080/phpinfo.php

phpinfo が 表示され、OPcache が有効になっていることを確認してください。Bad Gateway と出てしまう場合は nginx と PHP-FPM の連携がうまくいっていないケースが多いです。Nginx と PHP-FPM の設定を確認してみてください。

念のためターミナルからも動作確認。

$ php -v

PHP 5.6.5 (cli) (built: Feb 14 2015 11:50:37)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend Technologies

こんな感じに表示されれば OK です。

Nginx を起動・停止するコマンド

以下のコマンドで Nginx の起動・停止できます。

#起動
$ nginx
#停止
$ nginx -s stop

PHP-FPM を起動・停止するコマンド

PHP-FPM の起動・停止には Mac の LaunchAgents を使います。

まず、LaunchAgents に起動設定のシンボリックリンクを作成します。

$ ln -sfv /usr/local/opt/php56/homebrew.mxcl.php56.plist ~/Library/LaunchAgents/homebrew.mxcl.php56.plist

以下のコマンドで起動・停止を行います。

# 起動
$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.php56.plist
# 停止
$ launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.php56.plist

APCu をインストール・設定

続いて Extension をインストールしましょう。Extension は必要に応じて brew search php56 コマンドで探してください。

APCu は brew install コマンドでインストールします。

$ brew install php56-apcu

apcu.ini を編集します。

/usr/local/etc/php/5.6/conf.d/ext-apcu.ini

[apcu]
extension="/usr/local/Cellar/php56-apcu/4.0.7/apcu.so"
apc.enabled=1
apc.shm_size=64M
apc.ttl=7200
apc.mmap_file_mask=/tmp/apc.XXXXXX
apc.enable_cli=1

Xdebug をインストール・設定

Xdebug も brew コマンドで。

$ brew install php56-xdebug

xdebug.ini を編集します。Xdebug は重いのでデフォルトでは無効にしてます。

/usr/local/etc/php/5.6/conf.d/ext-xdebug.ini

[xdebug]
zend_extension="/usr/local/Cellar/php56-xdebug/2.2.7/xdebug.so"
xdebug.remote_enable=0
xdebug.remote_port="9000"
xdebug.profiler_enable=0
xdebug.profiler_output_dir="/tmp"
xdebug.max_nesting_level=1000
xdebug.idekey = "PHPSTORM"

自己署名証明書を作成

localhost に https で接続するため、OpenSSL で証明書を作ります。

Homebrew で OpenSSL を入れておきます。たしか Mac にも少し古いバージョンがデフォルトで入ってた気がしますので、それを使ってもいいです。

$ brew install openssl

秘密鍵を作成します。

$ openssl genrsa 2048 > server.key

証明書署名要求(CSR)を作成します。

$ openssl req -new -key server.key > server.csr

入力を求められるので、Country Name と Common Name のところだけ入力します。他はデフォルトで大丈夫です。

Country Name (2 letter code) [AU]:JP
Common Name (e.g. server FQDN or YOUR name) []:localhost

自己署名証明書(CRT)を作成します。有効期限は 365 日。

$ openssl x509 -days 365 -req -signkey server.key < server.csr > server.crt

作成した秘密鍵と証明書を Homebrew で入れた openssl の etc 以下にコピーします。

$ cp server.crt /usr/local/etc/openssl/certs/cert.pem
$ cp server.key /usr/local/etc/openssl/private/cert.key

SSL 接続できるようにする

localhost に https で接続できるようにします。

nginx.conf に以下の設定を追記します。先ほど作成した秘密鍵と証明書のパスを指定します。

/usr/local/etc/nginx/nginx.conf

http {
    #...
    server {
        #...
        listen       8080;
        #...
    }
    #...
    server {
        listen       8081 ssl;
        server_name  localhost;
        ssl_certificate      /usr/local/etc/openssl/certs/cert.pem;
        ssl_certificate_key  /usr/local/etc/openssl/private/cert.key;
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        location ~ \.php(/|$) {
            fastcgi_index  index.php;
            fastcgi_pass   unix:/usr/local/var/run/php-fpm.sock;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
    }
}

Nginx を再起動してブラウザからアクセスしてみましょう。

https://localhost:8081/phpinfo.php

複数バージョンの PHP を共存させる

phpenv + php-build ほど柔軟にはいきませんが、一応、複数バージョンの PHP を共存できます。今回は PHP5.5 と PHP5.6 を共存させる例を紹介します。

まず、php5.6 を unlink。

$ brew unlink php56

PHP5.5 をインストール。

$ brew install php55 --with-fpm --with-mysql --without-pear

CLI 用の PHP のバージョンを 5.5 に切り替えます。.bashrc や .zshrc の PATH を編集することで切り替えます。PHP5.6 のものはコメントアウトして残しておくと良いです。

~/.bashrc

#export PATH="$(brew --prefix homebrew/php/php56)/bin:$PATH"
export PATH="$(brew --prefix homebrew/php/php55)/bin:$PATH"

設定が終わったら .bashrc, .zshrc を再読み込みします。

$ source ~/.bashrc
$ source ~/.zshrc

PHP-FPM の起動ファイルにシンボリックリンクを張ります

$ ln -sfv /usr/local/opt/php55/homebrew.mxcl.php55.plist ~/Library/LaunchAgents/homebrew.mxcl.php55.plist

PHP5.6 を停止して PHP5.5 を起動

# PHP5.6 停止
launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.php56.plist
# PHP5.5 起動
launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.php55.plist

ブラウザから phpinfo にアクセスして動作確認してみてください。

一応この方法で複数バージョンの共存はできますが、特定の PHP バージョンにさかのぼってインストールできなかったり、brew doctor するとエラーが出たり、イマイチです。本格的に複数バージョンの共存をしたい場合は、phpenv や phpbrew を使ったほうが良いと思います。

phpbrew
MacでのPHP開発はphpbrewが非常に良い

Mac で PHP のバージョンを複数管理する必要が出てきたので phpbrew をインストールしました。この手のツール ...

続きを見る

まとめ

Homebrew で PHP5.6 をインストールする方法を紹介しました。複数バージョンの PHP を共存させる必要がなく、新しめの PHP を入れたいだけの場合は homebrew-php がおすすめです。

参考サイト
Homebrew/homebrew-php | GitHub

-技術ブログ
-