Solaris 10 に PHP5 と MySQL5 をインストール

Solaris 10 に、 MySQL をインストールする方法や PHP や Apache をインストールする方法 をまとめてあります。

Solaris 10 のパッケージに含まれている gcc (GNU Compiler Collection) は /usr/sfw/bin にコマンドがあるので、環境変数PATH に登録しておくとよいでしょう。また、/usr/sfw/lib にインストールされている多くのライブラリを gcc はそのまま利用できます(LD_RUN_PATHを指定する必要がありません)。

Solaris 10 にて gcc を利用して MySQL などをコンパイルする場合、libstdc++.laの内容が空であるために出力される "libstdc++.la is not a valid libtool archive" エラーに対処しておかなければなりません。(Solaris Expressでは、修正されています。)

/usr/sfw/lib/libstdc++.la は以下のように修正
# libstdc++.la - a libtool library file
# Generated by ltmain.sh - GNU libtool 1.4a-GCC3.0 (1.641.2.256 2001/05/28 20:09:07 with GCC-local changes)
#
# Please DO NOT delete this file!
# It is necessary for linking the library.
 
# The name that we can dlopen(3).
dlname='libstdc++.so.6'
 
# Names of this library.
library_names='libstdc++.so.6.0.3 libstdc++.so.6 libstdc++.so'
 
# The name of the static archive.
old_library='libstdc++.a'
 
# Libraries that this one depends upon.
dependency_libs='-lc -lm -L/usr/sfw/lib -lgcc_s'
 
# Version information for libstdc++.
current=6
age=0
revision=3
 
# Is this an already installed library?
installed=yes
 
# Files to dlopen/dlpreopen
dlopen=''
dlpreopen=''
 
# Directory that this library needs to be installed in:
libdir='/usr/sfw/lib'
/usr/sfw/lib/64/libstdc++.la は以下のように修正
# libstdc++.la - a libtool library file
# Generated by ltmain.sh - GNU libtool 1.4a-GCC3.0 (1.641.2.256 2001/05/28 20:09:07 with GCC-local changes)
#
# Please DO NOT delete this file!
# It is necessary for linking the library.
 
# The name that we can dlopen(3).
dlname='libstdc++.so.6'
 
# Names of this library.
library_names='libstdc++.so.6.0.3 libstdc++.so.6 libstdc++.so'
 
# The name of the static archive.
old_library='libstdc++.a'
 
# Libraries that this one depends upon.
dependency_libs='-L/lib/64 -lc -lm -L/usr/sfw/lib/64 -lgcc_s'
 
# Version information for libstdc++.
current=6
age=0
revision=3
 
# Is this an already installed library?
installed=yes
 
# Files to dlopen/dlpreopen
dlopen=''
dlpreopen=''
 
# Directory that this library needs to be installed in:
libdir='/usr/sfw/lib/64'

MySQL5 のセットアップ

ソースを入手します。
http://dev.mysql.com/downloads/

業は スーパーユーザー(root) で行ってください。以降で利用している、MySQLを起動するユーザー(mysql)やグループ(staff)は各自の運用のポリシーにより決定してください。

    # useradd -g staff -s /bin/false -m mysql (必要なら -b /export/home を指定)
    # passwd mysql
    New UNIX password: <mysql のパスワード>
    Retype new UNIX password: <mysql のパスワード>
    # gzip -dc mysql-5.0.24a.tar.gz | tar xf -
    # cd mysql-5.0.24a
    # ./configure --prefix=/usr/local/mysql --with-mysqld-user=mysql \
    > --with-charset=binary --with-extra-charsets=all
    # make
    # make install

--with-extra-charsets について
complex - 日本語文字をはじめとする、2バイト(以上)のキャラクタセットを組み込む
all - MySQL がサポートする全てのキャラクタセットを組み込む

● データベースの初期化と起動

    # cp support-files/my-medium.cnf /etc/my.cnf
    # cd /usr/local/mysql
    # ./bin/mysql_install_db --user=mysql
    # chown -R root .
    # chown -R mysql:staff var
    # ./bin/mysqld_safe --user=mysql &

※ コンフィグレーションファイル (support-files/my-xxxx.cnf) で環境にあったものを /etc/my.cnf としてコピーしておくことで、/etc/my.cnf ファイルの編集でデータベースを最適化できます。huge > large > medium > small の順で規模を選択できます。大規模データベースに合わせたコンフィグレーションファイルの場合、大容量のメモリが必要です。
※ 起動時に、キャラクタセットを指定するには ./mysqld --default-character-set=sjis ... と実行します。

● 動作確認

    # /usr/local/mysql/bin/mysqladmin version
    /usr/local/mysql/bin/mysqladmin  Ver 8.41 Distrib 5.0.24a, ....
    ...
 
    Server version          5.0.24a-log
    Protocol version        10
    Connection              Localhost via UNIX socket
    UNIX socket             /tmp/mysql.sock
    Uptime:                 2 min 46 sec
 
    Threads: 1  Questions: 1  Slow queries: 0  Opens: 12  Flush tables: 6 ...
    # /usr/local/mysql/bin/mysqlshow
    +--------------------+
    |     Databases      |
    +--------------------+
    | information_schema |
    | mysql              |
    | test               |
    +--------------------+
    # /usr/local/mysql/bin/mysqlshow mysql
    Database: mysql
    +---------------------------+
    |          Tables           |
    +---------------------------+
    | columns_priv              |
    | db                        |
    | func                      |
    ...
    | time_zone_transition      |
    | time_zone_transition_type |
    | user                      |
    +---------------------------+
    # /usr/local/mysql/bin/mysql -e "select host,db,user from db" mysql
    +------+---------+------+
    | host | db      | user |
    +------+---------+------+
    | %    | test    |      |
    | %    | test\_% |      |
    +------+---------+------+

● 終了方法

    # /usr/local/mysql/bin/mysqladmin shutdown

● サービスの追加

mysqld_safe は、OS 起動時に起動されるように設定します。SMFを利用して登録します(従来の init.d を利用する記述でも可能)。

/var/svc/manifest/network/mysql.xml
<?xml version='1.0'?>
<!DOCTYPE service_bundle  SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
<!--
    Copyright 2006 Shinta, All rights reserved.
 
    Service manifest for MySQL
-->
 
<service_bundle  type='manifest' name='mysql:mysql'>
 
<service
    name='network/mysql'
    type='service'
    version='1'>
 
    <create_default_instance  enabled='false' />
 
    <single_instance />
 
    <dependency
        name='fs'
        grouping='require_all'
        restart_on='none'
        type='service'>
        <service_fmri value='svc:/system/filesystem/local' />
    </dependency>
 
    <dependency
        name='net'
        grouping='require_all'
        restart_on='none'
        type='service'>
        <service_fmri value='svc:/network/loopback' />
    </dependency>
 
    <exec_method
        type='method'
        name='start'
        exec='/lib/svc/method/svc-mysql  start'
        timeout_seconds='-1'>
        <method_context>
            <method_credential user='mysql' group='staff' />
        </method_context>
    </exec_method>
 
    <exec_method
        type='method'
        name='stop'
        exec=':kill'
        timeout_seconds='-1'>
    </exec_method>
 
</service>
 
</service_bundle>
/lib/svc/method/svc-mysql(以下の内容または /usr/local/mysql/share/mysql/mysql.serversvc-mysql としても良い)
#!/usr/bin/sh
#
# Copyright 2006 Shinta, All rights reserved.
# SMF Method file for MySQL

#
. /lib/svc/share/smf_include.sh
 
DB_DIR=/usr/local/mysql/var
PIDFILE=${DB_DIR}/`/usr/bin/uname -n`.pid
 
case "$1" in
    start)
        /usr/local/mysql/bin/mysqld_safe --user=mysql --pid-file=${PIDFILE} > /dev/null &
        ;;
 
    stop)
        if [ -f ${PIDFILE} ]; then
            /usr/bin/pkill mysqld_safe  >/dev/null 2>&1
            /usr/bin/kill `cat ${PIDFILE}` >  /dev/null 2>&1
        fi
        ;;
 
    *)
        echo "Usage: `basename $0` { start | stop }"
        exit 1
        ;;
esac
    # chown root:bin /lib/svc/method/svc-mysql
    # chmod 555 /lib/svc/method/svc-mysql
    # chown root:sys /var/svc/manifest/network/mysql.xml
    # chmod 444 /var/svc/manifest/network/mysql.xml
    # svccfg import /var/svc/manifest/network/mysql.xml
    # svcadm -v enable mysql

各ユーザーは、mysqlコマンドなどを利用できるように PATH環境変数に /usr/local/mysql/bin を設定しておくとよいでしょう。

● チューニング

MySQL のバージョン 4.1から認証プロトコルが変わりました。そのため 4.0ベースのクライアントライブラリ(libmysqlclient)を利用して作られた Perl DBI や PHP などで利用するためには、OLD_PASSWORD()関数によってパスワードを作成するか、設定ファイルである my.cnf[mysqld] 以下に old-passwords を追加してパスワードを作成する必要があります。バージョン 4.1 以降のクライアントライブラリを利用した Perl DBI や PHP などからのみアクセスされる場合は old-passwords にする必要ありません。

mysqldump コマンドを利用する場合、必ず --default-character-set= によって出力する文字コードを指定すると安全です。また、バージョン 4.1以上の MySQLを利用するアプリケーションの場合、"SET NAMES キャラクターセット名" という SQL 文(コマンド)を発行しておくことで漢字コードの変換ミスを防ぐことができます。

キャラクターセットmy.cnf で行う方法:

MySQL 4.1 MySQL 4.1.15 以降
[mysqld]
default-character-set=キャラクターセット名
 
[client]
default-character-set=キャラクターセット名
 
[mysql]
default-character-set=キャラクターセット名
 
[mysqldump] 
default-character-set=キャラクターセット名
[mysqld]
default-character-set=キャラクターセット名
skip-character-set-client-handshake
          

調整するとよいパラメータ:

パラメータ 意味 増やすことで得る効果
key_buffer_size 検索に使われるインデックスをバッファに保存する際のメモリサイズ パフォーマンスが向上(マシンに搭載しているメモリーの1/4を推奨)
max_allowed_packet 入力データ保持のための最大バッファサイズ 大きな入力データを扱える
max_connections 認められる同時接続可能なクライアントの数 接続できるクライアント数
table_cache データのキャッシュサイズ ディスクのI/Oが減りパフォーマンスが向上
sort_buffer_size ソートをおこなう際に使用するバッファサイズ ORDER BYやGROUP BYをクエリーに用いた場合のパフォーマンスが向上
record_buffer_size スキャンする各テーブルにこのサイズのバッファを割り当てる インデックスを含まないクエリーの実行速度が上がる
join_buffer_size 完全結合(インデックスを使用しない結合)に使用されるバッファのサイズ 大量のjoin の発行に対応(結合を速くする最良の方法はインデックスの追加です)

MySQL が必要とするメモリサイズの計算(実メモリ+スワップ)
key_buffer_size + ( sort_buffer_size + record_buffer_size ) * max_connections = 必要とするメモリサイズ

アカウントの調整:

不要なユーザーの削除やデータベースの参照権限、パスワードを設定します。問い合わせ元のIPアドレスも限定することでセキュリティがより堅牢になります。

    # mysql -uroot mysql
    mysql> delete from user where user='';
    mysql> update user set password = PASSWORD('PASSWORD') where user='root';
    mysql> grant select,insert,delete,update on DB_NAME.* to USER_NAME@HOST_ADDRESS
        -> identified by 'PASSWORD';
    mysql> flush privileges;

Apache2 のセットアップ

ソースを入手します。
http://httpd.apache.org/download.cgi

作業は スーパーユーザー(root) で行ってください。

Apache 2 のソースを展開して configure を実行(今後何かと利用するかもしれないので SSL対応にしておく)

    # gzip -dc httpd-2.0.59.tar.gz  | tar xf -
    # cd httpd-2.0.59
    # ./configure --enable-so --enable-ssl (必要なら --enable-ssl-dir=/usr/sfw を指定)
    # make
    # make install

Apache の設定ファイルである /usr/local/apache2/conf/httpd.conf をチェックします。既に HTTP サーバーが起動している場合、それを停止するか、新しくインストールした Apache の ポートを変更する。特に Listen, User, Group, ServerName といったディレクティブはチェックしてください。

    # edit /usr/local/apache2/conf/httpd.conf
Listen httpd (HTTPサーバー) が、監視するポートを指定します。
User httpd (HTTPサーバー)を起動するときのオーナーを指定します。
Group httpd (HTTPサーバー)を起動するときの group を指定します。#-1 に設定されていてうまく動作しないときがあるので、nobody など実際に許可を与えたいグループに設定する。
ServerName httpd (HTTPサーバー)を起動するホストとポートを指定します。DNS に登録されていない場合、IP Address を指定します。

自分の作った各 Web ページに METAタグで charset をきちんと書いていないと文字化することがあります。

● 起動と終了方法

    # /usr/local/apache2/bin/apachectl start
    # /usr/local/apache2/bin/apachectl stop

● サービスの追加

httpd サーバーは、OS 起動時に起動されるように設定します。SMFを利用して登録します(従来の init.d を利用する記述でも可能)。 また、Solaris 10 には、apache2がすでに登録されていることがあります。ここでは、登録されている apache2の設定を編集して新規にインストールした apache 2.0 を利用するように変更します。

/var/svc/manifest/network/http-apache2.xml
<?xml version='1.0'?>
<!DOCTYPE service_bundle  SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
<!--
    Copyright 2006 Shinta, All rights reserved.
 
    Service manifest for Apache
-->
 
<service_bundle type='manifest' name='apache2:apache'>
 
<service
    name='network/http'
    type='service'
    version='1'>
 
    <instance name='apache2' enabled='false'>
        <dependency name='network'
            grouping='require_all'
            restart_on='error'
            type='service'>
            <service_fmri value='svc:/milestone/network:default'/>
        </dependency>
 
        <dependency name='filesystem-local'
            grouping='require_all'
            restart_on='none'
            type='service'>
            <service_fmri value='svc:/system/filesystem/local:default'/>
        </dependency>
 
        <dependency name='autofs'
            grouping='optional_all'
            restart_on='error'
            type='service'>
            <service_fmri value='svc:/system/filesystem/autofs:default'/>
        </dependency>
 
        <exec_method
            type='method'
            name='start'
            exec='/lib/svc/method/http-apache2 start'
            timeout_seconds='60' />
 
        <exec_method
            type='method'
            name='stop'
            exec='/lib/svc/method/http-apache2 stop'
            timeout_seconds='60' />
 
        <exec_method
            type='method'
            name='refresh'
            exec='/lib/svc/method/http-apache2 refresh'
            timeout_seconds='60' />
 
        <property_group name='httpd' type='application'>
            <stability value='Evolving' />
            <propval name='ssl' type='boolean' value='false' />
        </property_group>
 
        <property_group name='startd' type='framework'>
            <propval name='ignore_error' type='astring'
                value='core,signal' />
        </property_group>
  
    </instance>
 
    <stability value='Evolving' />
 
    <template>
        <common_name>
            <loctext xml:lang='C'>
                Apache 2 HTTP server
            </loctext>
        </common_name>
        <documentation>
            <manpage title='httpd' section='8'
                manpath='/usr/local/apache2/man' />
            <doc_link name='apache.org'
                uri='http://httpd.apache.org' />
        </documentation>
    </template>
</service>
  
</service_bundle>
/lib/svc/method/http-apache2
#!/usr/bin/sh
#
# Copyright 2006 Shinta, All rights reserved.
# SMF Method file for apache

#
. /lib/svc/share/smf_include.sh
 
APACHE_HOME=/usr/local/apache2
CONF_FILE=/usr/local/apache2/conf/httpd.conf
PIDFILE=/usr/local/apache2/logs/httpd.pid
 
case "$1" in
    start)
        /bin/rm -f ${PIDFILE}
        ssl=`svcprop -p httpd/ssl svc:/network/http:apache2`
        if [ "$ssl" = false ]; then
            cmd="start"
        else
            cmd="startssl"
        fi
        ;;
 
    refresh)
        cmd="graceful"
        ;;
 
    stop)
        cmd="stop"
        ;;
 
    *)
        echo "Usage: `basename $0` { start | stop | refresh }"
        exit 1
        ;;
esac
 
exec ${APACHE_HOME}/bin/apachectl $cmd 2>&1
    # svccfg delete -f apache2
    # svccfg import /var/svc/manifest/network/http-apache2.xml
    # svcadm -v enable apache2

SSL対応にしたい場合、キーの作成や設定は「Apache2 を SSL に対応」ページを参照し設定する。 Solaris で有効にするには、svccfg コマンドで apache2 の設定を調整する。http/sslを "true" に変更し終了、その後 apache2 を再起動する。

    # svcprop -p httpd/ssl svc:/network/http:apache2
    false
    # svccfg
    svc:> select apache2
    svc:/network/http:apache2> setprop httpd/ssl = boolean: true
    svc:/network/http:apache2> end
    # svcadm refresh apache2
    # svcprop -p httpd/ssl svc:/network/http:apache2
    true
    #

※ apache 2.2 では、startsslがなくなり conf/extra/httpd-ssl.conf を設定し有効にすることで start で SSLも有効になるようになりました。


PHP5 のセットアップ

ソースを入手します。XMLやグラフなども利用できるように Libxml2 や GD パッケージも入手します。
http://www.php.net/downloads.php
http://www.boutell.com/gd/
http://xmlsoft.org/downloads.html

作業は スーパーユーザー(root) で行ってください。

Solaris 10 は、/usr/sfw/lib に FreeType, PNG, JPEGライブラリがインストールされているので新たにインストールせずにそのまま利用します。 Solaris 10 に含まれる Libxml2 はバージョンが古いため、新しいバージョンをインストールします。

    # gzip -dc libxml2-2.6.26.tar.gz | tar xf -
    # cd libxml2-2.6.26
    # ./configure
    # make
    # make MAKEFLAGS+=--silent tests
    # make install
    # cd ..
 
    # gzip -dc gd-2.0.33.tar.gz | tar xf -
    # cd gd-2.0.33
    # ./configure
      ...
    ** Configuration summary for gd 2.0.33:
 
       Support for PNG library:          yes
       Support for JPEG library:         yes
       Support for Freetype 2.x library: yes
       Support for Fontconfig library:   yes
       Support for Xpm library:          yes
       Support for pthreads:             yes
      ...
    # make
    # make install
    # cd ..
    # gzip -dc php-5.1.6.tar.gz | tar xf -
    # cd php-5.1.6
    # ./configure --with-mysql=/usr/local/mysql --with-pdo-mysql=/usr/local/mysql \
    > --with-apxs2=/usr/local/apache2/bin/apxs --enable-track-vars \
    > --enable-mbstring --enable-mbregex --enable-zend-multibyte \
    > --enable-gd-native-ttf --enable-gd-jis-conv \
    > --with-gd=/usr/local --with-libxml-dir=/usr/local --with-freetype-dir=/usr/sfw
    # make
    # make install

● PHP の初期化ファイルの設定

    # cp php.ini-dist /usr/local/lib/php.ini
    # edit /usr/local/lib/php.ini
include_path = ".:/usr/local/lib/php"
 ...
output_handler = mb_output_handler
 ...
mbstring.language = Japanese
mbstring.internal_encoding = EUC-JP
mbstring.http_input = auto
mbstring.http_output = EUC-JP
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character = none;
mbstring.func_overload = 0
mbstring.strict_encoding = Off

● Apacheの設定(PHPのインストーラーが自動で追加する LoadModule の設定を別ファイルに移動する)

    # edit /usr/local/apache2/conf/httpd.conf
#LoadModule php5_module        modules/libphp5.so
...
# PHP settings
Include conf/extra/httpd-php.conf
    # edit /usr/local/apache2/conf/extra/httpd-php.conf
# LoadModule
LoadModule php5_module modules/libphp5.so # AddType AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps

Apache 2 を起動したら使用可能になります。

    # svcadm disable apache2
    # svcadm enable apache2

● PEAR パッケージのアップデートとインストール(必要なものを...)

    # pear upgrade-all
    # pear install XML_RPC
    # pear install MDB2
    # pear install Net_URL
    # pear install Net_Socket
    # pear install HTTP_Request

JpGraph のセットアップ

ソースを入手します。
http://www.aditus.nu/jpgraph/
http://ossipedia.ipa.go.jp/ipafont/

JpGraph のライブラリは、どこに置いても構いませんが PHP がサーチできるパス (include_path)に置くか、インストールしたディレクトリを php.iniinclude_path に追加すると良いでしょう。 ここでは、include_path = ".:/usr/local/lib/php" となっているとして、/usr/local/lib/php/JpGraph にライブラリをインストール(コピー)します。

JpGraph の設定は、キャッシュのディレクトリと TrueType フォントが含まれるディレクトリを指定します。デフォルトではIPAフォントが指定されているためダウンロードしてインストールします。JpGraph で日本語を扱うには、文字コードをUTF-8 にする必要があります。

    # unzip IPAfont00203.zip
    # mkdir -p /usr/local/share/fonts/truetype
    # cp IPAfont00203/*.ttf /usr/local/share/fonts/truetype/

● JpGraph の設定設定(jpg-config.inc.php で、キャッシュのディレクトリと TrueType フォントが含まれるディレクトリと日本語のフォントを指定)

    # gzip -dc jpgraph-2.1.2.tar.gz | tar xf -
    # cp -rp jpgraph-2.1.2/src /usr/local/lib/php/JpGraph
    # edit  /usr/local/lib/php/JpGraph/jpg-config.inc.php
      40行目
        DEFINE("CACHE_DIR",   "/tmp/jpgraph_cache/");
        DEFINE("TTF_DIR",     "/usr/X11R6/lib/X11/fonts/TrueType/");
        DEFINE("MBTTF_DIR",   "/usr/local/share/fonts/truetype/");
    # mkdir /tmp/jpgraph_cache
    # chmod 777 /tmp/jpgraph_cache

※ IPAフォント(Ver.3 - OpenTypeフォント形式)を利用する場合、jpgraph_ttf.inc.php を変更する必要があります。

    # edit  /usr/local/lib/php/JpGraph/jpgraph_ttf.inc.php
      136行目
        define('MINCHO_TTF_FONT','ipam.otf');
        define('PMINCHO_TTF_FONT','ipamp.otf');
        define('GOTHIC_TTF_FONT','ipag.otf');
        define('PGOTHIC_TTF_FONT','ipagp.otf');
    # 

● サンプルのレーダーチャート

以下のサンプルが EUCで書かれているとして mb_convert_encoding を利用して UTF-8 にしています。サンプルが Shift-JIS で書かれていれば sjis-winUTF-8 にするようにし、UTF-8 で書かれていれば変換の必要はありません。

<?php
require_once("JpGraph/jpgraph.php");
require_once("JpGraph/jpgraph_radar.php");
 
// データ
$aryData = array(7, 10, 6, 8, 5); // 軸タイトル $aryTitle = array( mb_convert_encoding("走り", "UTF-8", "eucJP-win"), mb_convert_encoding("乗り心地", "UTF-8", "eucJP-win"), mb_convert_encoding("燃費", "UTF-8", "eucJP-win"), mb_convert_encoding("操作性", "UTF-8", "eucJP-win"), mb_convert_encoding("デザイン", "UTF-8", "eucJP-win") ); // レーダーグラフの初期化 $graph = new RadarGraph(350, 250, "auto"); // 背景の設定 $graph->SetColor("white"); $graph->SetFrame(false);
// グラフの描画位置
$graph->SetCenter(0.5, 0.55); // 軸の設定 $graph->axis->SetFont(FF_GOTHIC, FS_NORMAL); $graph->axis->title->SetFont(FF_GOTHIC, FS_NORMAL); $graph->axis->SetColor("#207870"); // グリッドの設定 $graph->grid->SetLineStyle("dotted"); $graph->grid->SetColor("gray"); $graph->grid->Show(); $graph->HideTickMarks(); // タイトルの設定 $graph->title->Set(mb_convert_encoding("ニコニコカーⅡ", "UTF-8", "eucJP-win")); $graph->title->SetFont(FF_GOTHIC, FS_NORMAL, 13); $graph->title->SetColor("#406898"); $graph->SetTitles($aryTitle); // プロットデータの作成 $plot = new RadarPlot($aryData); $plot->SetColor("#ff5588", "#ffeeee"); //$plot->SetFill(false); $plot->SetLineWeight(2); // プロットデータの追加
$graph->Add($plot); // グラフの描画 $graph->Stroke(); ?>

RadarGraph