久しぶりにじっくりとサーバ弄りをしたので忘れないうちにメモ。
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
構築方法は下記の順で書いていきます。
- MySQL のインストール
- PHP (PHP-FPM) のインストールと設定
- FcgiWrap のインストールと設定
- Nginx のインストールと設定
- ログローテートの設定
スポンサーリンク
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
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 の方が設定は楽な気もする。