もう1年以上前に書いていた下書きをようやく公開。
前回(と言っても1年半前か) までで nginx と PHP の fast-cgi のビルドと設定が終わったので、OS の起動時に自動的に起動するようにサービスとして登録を行います。
OpenSolaris ではサービスの管理に SMF という仕組みを使用しています。SMF はサービスの依存関係を記述できたり、サービスの起動を監視して自動的に再起動してくれたりと、Linux などで使われている /etc/init.d の rc スクリプトに比べるとメリットがありますが、コマンドが独自だったり、自分で SMF にサービスを登録するには manifest と呼ばれる XML ファイルを書く必要があるので、慣れるまではハードルがあります。(この辺は Mac OS X の launchd と似ている。)
以下が、私が nginx を管理するために作成した nginx.xml です。
<?xml version='1.0'?> <!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'> <service_bundle type='manifest' name='export'> <service name='network/nginx' type='service' version='0'> <create_default_instance enabled='true'/> <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 name='start' type='method' exec='/usr/local/sbin/nginx -c /usr/local/conf/nginx.conf' timeout_seconds='60'> <method_context working_directory='/usr/local/logs'> <method_credential user='root' group='root'/> <method_environment> <envvar name='PATH' value='/usr/bin:/bin:/usr/local/bin'/> </method_environment> </method_context> </exec_method> <exec_method name='stop' type='method' exec=':kill' timeout_seconds='60'> <method_context/> </exec_method> </service> </service_bundle>
このファイルを以下のように SMF に登録します。
# svccfg -v import nginx.xml
同様に PHP の FastCGI のプロセスも SMF に登録します。
<?xml version="1.0"?> <!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1"> <service_bundle type="manifest" name="php-fcgi"> <service name="network/php-fcgi" type="service" version="0"> <create_default_instance enabled="true"/> <single_instance/> <dependency name="net" grouping="require_all" restart_on="none" type="service"> <service_fmri value="svc:/network/loopback"/> </dependency> <exec_method name="start" type="method" exec="/usr/local/sbin/php-fcgi.sh" timeout_seconds="60"> <method_context working_directory="/usr/local/www"> <method_credential user="php" group="webservd" privileges="basic,net_privaddr"/> <!--method_credential user="root" group="root" /--> <method_environment> <envvar name="PATH" value="/usr/php/5.2/bin:/usr/local/sbin:/usr/bin:/bin" /> </method_environment> </method_context> </exec_method> <exec_method name='stop' type='method' exec=':kill' timeout_seconds='60'> <method_context/> </exec_method> </service> </service_bundle>
この xml も同じように svccfg コマンドで登録します。
起動用の shell スクリプトはこちらのサイトのものを、ほぼそのまま使っています。
#!/bin/bash LC_ALL=ja_JP.UTF-8 #FastCGI Webserver path FCGI_WEB_SERVER_ADDRS="127.0.0.1" ## ABSOLUTE path to the PHP binary PHPFCGI="/usr/php/bin/php-cgi" ## tcp-port to bind on FCGIPORT="9000" ## IP to bind on FCGIADDR="127.0.0.1" ## number of PHP children to spawn PHP_FCGI_CHILDREN=5 ## number of request before php-process will be restarted PHP_FCGI_MAX_REQUESTS=1000 # allowed environment variables sperated by spaces ALLOWED_ENV="PATH" ## if this script is run as root switch to the following user USERID=webservd ################## no config below this line ALLOWED_ENV="$ALLOWED_ENV PHP_FCGI_CHILDREN" ALLOWED_ENV="$ALLOWED_ENV PHP_FCGI_MAX_REQUESTS" ALLOWED_ENV="$ALLOWED_ENV FCGI_WEB_SERVER_ADDRS" if test x$UID = x0; then EX="/bin/su -m -c \"$PHPFCGI -q -b $FCGIADDR:$FCGIPORT\" $USERID" else EX="$PHPFCGI -b $FCGIADDR:$FCGIPORT" fi echo $EX # copy the allowed environment variables E= for i in $ALLOWED_ENV; do E="$E $i=${!i}" done # clean environment and set up a new one nohup env - $E sh -c "$EX" &
サービスが SMF に登録できれば、svcadm コマンドで起動停止を切り替える事ができます。
起動
# svcadm enable nginx # svcadm enable php-fastcgi
停止
# svcadm disable nginx # svcadm disable php-fastcgi