work.log

エンジニアの備忘録的ブログ

Nginx and PHP-FPM and FcgiWrap on FreeBSD 9.1

投稿:2014-01-14 18:27  更新:

久しぶりにじっくりとサーバ弄りをしたので忘れないうちにメモ。

FreeBSD 9.1 で Nginx + PHP-FPM + FcgiWrap を使って、所謂 LAMP 環境を整えてみたので残しておきたいと思います。(Linux + Nginx の場合は LEMP とか言うらしいが、FreeBSD の場合はよくわからない)

今回利用した各バージョンは下記の通りです。

  • FreeBSD 9.1-RELEASE amd64
  • MySQL 5.6.15
  • Nginx 1.4.4
  • PHP (PHP-FPM) 5.5.7
  • FcgiWrap 1.1.0

構築方法は下記の順で書いていきます。

  1. MySQL のインストール
  2. PHP (PHP-FPM) のインストールと設定
  3. FcgiWrap のインストールと設定
  4. Nginx のインストールと設定
  5. ログローテートの設定

スポンサーリンク

MySQL のインストールと設定

各種ミドルウェアは ports よりインストールしていきます。まずは MySQL からです。

# cd /usr/ports/databases/mysql56-server
# make install clean

続いて各種調整です。rc.conf へ自動起動の追加と root パスワードを設定します。

# echo 'mysql_enable="YES"' >> /etc/rc.conf
# /usr/local/etc/rc.d/mysql-server start
# mysqladmin -u root password 'mypass'

mysql_secure_installation で初期セットアップを済ませます。

# mysql_secure_installation

  * 下記抜粋
  Enter current password for root (enter for none): <- password 応答
  Change the root password? [Y/n] n
  Remove anonymous users? [Y/n] Y
  Disallow root login remotely? [Y/n] Y
  Remove test database and access to it? [Y/n] Y
  Reload privilege tables now? [Y/n] Y

続いて MySQL のディレクトリを /var/db から /home へ移します。ここはお好みで。

# /usr/local/etc/rc.d/mysql-server stop

# mv /var/db/mysql /home/
# ln -s /home/mysql /var/db/mysql
# mkdir /home/mysql/log
# chown mysql:mysql /home/mysql/log

# vi /home/mysql/my.cnf
  * パラメータ割愛

# ln -s /home/mysql/my.cnf /etc/my.cnf
# /usr/local/etc/rc.d/mysql-server start

PHP (PHP-FPM) のインストールと設定

次は PHP をインストールしていきます。

# cd /usr/ports/lang/php55
# make config-recursive
  * 下記オプションを追加
  + Build FPM version

# make install clean

Core をインストールした後はエクステンションをインストールします。

# cd /usr/ports/lang/php55-extensions
# make config-recursive
  * 下記オプションを追加
  + GD library support
  + gettext library support
  + multibyte string support
  + Encryption support
  + MySQL database support
  + MySQLi database support
  + pcntl support (CLI only) * PHP で daemon を書きたい場合
  + PDO MySQL driver
  + SNMP support * Cacti で必要
  + sockets support
  + ZLIB support

# make install clean

次は設定です。php.ini でセッションの保存先を /tmp/php にしておきます。

# vi /usr/local/etc/php.ini
  -----
  session.save_path = "/tmp/php"

# mkdir /tmp/php
# chown www:www /tmp/php

* 掃除
# mkdir /usr/local/etc/sample/
# mv /usr/local/etc/php.ini-* /usr/local/etc/sample/

次は、PHP-FPM の設定です。ここも必要な箇所のみ。

# vi /usr/local/etc/php-fpm.conf
  -----
  ;listen = 127.0.0.1:9000
  listen = /var/run/php-fpm.sock

# echo 'php_fpm_enable="YES"' >> /etc/rc.conf
# /usr/local/etc/rc.d/php-fpm start

FcgiWrap のインストールと設定

FcgiWrap は特にインストールオプションがないので、そのまま make install して rc.conf に簡単な設定を書いておしまいです。

# cd /usr/ports/www/fcgiwrap
# make install clean

# echo 'fcgiwrap_enable="YES"' >> /etc/rc.conf
# echo 'fcgiwrap_user="www"' >> /etc/rc.conf
# /usr/local/etc/rc.d/fcgiwrap start

Nginx のインストールと設定

最後は要の Nginx です。cache_purge を追加で入れておきます。

# cd /usr/ports/www/nginx
# make config-recursive
  * 下記オプションを追加
  + cache_purge module

# make install clean

インストール後は各種調整をしていきます。

* 掃除
# mkdir /usr/local/etc/nginx/sample
# mv /usr/local/etc/nginx/*-dist /usr/local/etc/nginx/sample/

* 各種コンフィグ置き場を作っておく
# mkdir /usr/local/etc/nginx/conf.d

* デフォルトの DocumentRoot および Cache ディレクトリは /home に作成
# mkdir /home/www /home/www/htdocs /home/www/cache /home/www/temp
# chown -R www:www /home/www
# chown root:wheel /home/www/htdocs

* プラグインのテンポラリ
# mkdir /var/tmp/nginx
# chown www:www /var/tmp/nginx

# echo 'nginx_enable="YES"' >> /etc/rc.conf

続いて nginx.conf を作成します。動作テストに PHP および CGI を実行できるようにしてみます。

nginx.conf

user  www www;
pid  /var/run/nginx.pid;
worker_processes  1;
worker_rlimit_nofile  4096;
events {
    worker_connections  1024;
}

http {
    include  /usr/local/etc/nginx/mime.types;
    default_type  text/plain;
    sendfile  on;
    tcp_nopush  on;
    server_tokens  off;
    keepalive_timeout 0;

server {
    listen  *:80 default_server;
    root /home/www/htdocs;
    access_log  /var/log/nginx-access.log combined;
    error_log   /var/log/nginx-error.log warn;

    location / {
        index  index.html index.cgi index.pl index.php;
    }

    include /usr/local/etc/nginx/conf.d/phpfpm.conf;
    include /usr/local/etc/nginx/conf.d/fcgiwrap.conf;
}

}

PHP-FPM と FcgiWrap は別ファイルに切り出して必要な時に include するようにしてみました。

phpfpm.conf

location ~ \.php$ {
    fastcgi_pass   unix:/var/run/php-fpm.sock;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

fcgiwrap.conf

location ~ \.(pl|cgi)$ {
    fastcgi_pass   unix:/var/run/fcgiwrap/fcgiwrap.sock;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

これで完成です。Nginx を起動して適当な PHP や CGI を動かして動作確認をします。

/usr/local/etc/rc.d/nginx start

ログローテートの設定

最後はログローテートの設定です。FreeBSD の newsyslog を使ってこんな感じに設定してあげます。

# mysql
/home/mysql/log/mysql.log        640  7  *  @T04  Z
/home/mysql/log/mysql-slow.log   640  7  *  @T04  Z
/home/mysql/log/mysql-error.log  640  7  *  @T04  Z

# nginx
/var/log/nginx-access.log        640  7  *  @T04  Z
/var/log/nginx-error.log         640  7  *  @T04  Z  /var/run/nginx.pid
/var/log/php-fpm.log             640  7  *  @T04  Z  /var/run/php-fpm.pid 31
※ 2014/01/30 追記
php-fpm はシグナル USR2 にする必要があったため、コード 31 を追加。

MySQL はさらに自作スクリプトも併用します。

# vi /root/.my.cnf
  -----
  [mysqladmin]
  user     = root
  password = mypass

# chmod 600 /root/.my.cnf
# vi /root/mysql_lotate.sh

スクリプトの中身はこんな感じ。

#!/bin/sh

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
MYSQL_LOG_DIR=/var/db/mysql/log
MYSQL_LOG="mysql.log mysql-slow.log mysql-error.log"

    if [ ! -e '/root/.my.cnf' ]; then
        exit;
    fi

    for LOG in $MYSQL_LOG
    do
        if [ -e "$MYSQL_LOG_DIR/$LOG" ]; then
            chown mysql:mysql "$MYSQL_LOG_DIR/$LOG"
        fi
    done

    mysqladmin flush-logs

exit

このスクリプトは cron に登録して定期実行させます。

# chmod 755 /root/mysql-lotate.sh
# crontab -u root -e
  -----
  1 4 * * * /root/mysql-lotate.sh >/dev/null 2>&1

長くなりましたが環境構築は以上です。

後は、Nginx, PHP-FPM の設定チューニングだったり OS のチューニングが残ってたりするんですがこれは試したらまた書きます。

果たして Apache (mod_php) と PHP-FPM だとどっちがいいんだろ。Nginx + Apache の方が設定は楽な気もする。

スポンサーリンク

コメント

コメントを残す

よく読まれている記事

  • 今日
  • 週間
  • 月間