PHPのビルトインウェブサーバをsystemdのサービスとして登録する

提供: サイバーネットワーク研究所
移動先:案内検索

PHPにはビルトインウェブサーバが付属していますので、WEB用のPHPスクリプトをちょっとテストするのに便利です。ただ、ある程度継続して使い続けるためには、サービスとして登録する必要があります。そんな時にどうするかという話です。


想定環境[編集]

  1. PHPのWebアプリのテスト、ローカルポータルサイトの構築などの目的
  2. LAN内のLinuxサーバ、またはLinuxPC上に設置(グローバルに公開しない)


ローカルにかつ一時的に利用することを想定しています。恒常的なサービスにする場合は記事末を見てください。


手順[編集]

  1. .serviceファイルを用意する
  2. /lib/system/systemdに.serviceファイルをコピーする
  3. サービスを有効化する
  4. サービスを起動する


.serviceファイルは、ウェブサーバで起動するPHPスクリプトとペアにして、同じディレクトリ内に置いておくと管理のために便利です。


.serviceファイル[編集]

.serviceファイルはリスト2のように記述します。「{ }」内には具体的な値が入ります。なお、筆者はDebianを使っていますので、サービスの実行ユーザをwww-dataにしています(お使いのOSの習慣に従って、適宜変更してください)。

リスト1
[Unit]
Description = {Description}

[Service]
ExecStart = /usr/bin/php -S {HOSTNAME}:{PORT} {SCRIPTPATH}
User = www-data
Group = www-data

[Install]
WantedBy = default.target


{HOSTNAME}[編集]

ウェブサーバをPC上で起動する場合は

   localhost あるいは 127.0.0.1

にしてください。これにより、LAN内であっても他のホストからのアクセスができません。LAN内の別ホスト上で起動する場合は

   プライベートアドレス あるいは そのアドレスを指すローカルホスト名

にします。


{PORT}[編集]

Webサービスであることを明示的に示すためには、ポートは

   8080 〜 8089

を使うのが良いでしょう。他のサービスと重複しなければ何でも良いのですが、特権ポート(1023以下)は避けた方が無難です。


{SCRIPTPATH}[編集]

ビルトインウェブサーバにより起動されるPHPスクリプト名です。必ずフルパスで指定してください。


{DESCRIPTION}[編集]

「systemctl status」コマンド等の結果として表示されるサービスの名前です。.serviceファイルのベース名(拡張子を取り除いた部分)を使うのが無難でしょう。


サービスの登録と起動[編集]

筆者はリスト2のようなスクリプトを使っています。「register-service」と名付けてパスの通っている場所に保存しています。このスクリプトは、.serviceファイルが置かれたディレクトリをカレントにしないと実行できないようになっています。これは、あくまでも一時的なサービスであることを強調するためです。

リスト2(register-service)
 1 #!/usr/bin/env bash
 2 NAME=$1
 3 
 4 # 第1引数でサービスの名前を定義する
 5 if [ "${NAME}" == "" ]; then
 6 	echo "Service name required."
 7 	exit 1
 8 fi
 9 NAME=${NAME%.service}
10 SNAME=${NAME}.service
11 
12 # カレントディレクトリに定義ファイルが存在するか
13 if [ ! -f "${SNAME}" ]; then
14 	echo "${SNAME} not found."
15 	exit 1
16 fi
17 
18 LDIR=/lib/systemd/system
19 
20 # 同じ名前のserviceが存在するか
21 if [ -e ${LDIR}/${SNAME} ]; then
22 	echo "Service ${NAME} already exists."
23 	exit 1
24 fi
25 
26 # .serviceをコピーする
27 sudo cp ${PWD}/${SNAME} ${LDIR}/${SNAME}
28 
29 # serviceを有効化する
30 sudo systemctl enable ${NAME}
31 
32 # serviceを起動する
33 sudo systemctl start ${NAME}


例えば、「php8081.service」を登録する場合には、そのファイルの存在するディレクトリをカレントにして

1 $ register-service php8081

などと実行します。一般のサービスへできるだけ影響を与えないように、.serviceファイルの存在するディレクトリで実行します。

サービスの削除[編集]

一時的なサービスですので、いつかは削除します。その際、サービスをdisableする前に、stopしなければならないことに注意してください。サービスが起動中にdisableしてしまうと、ゾンビのようなサービスが残ってしまいます(リスト3)。

リスト3
1 $ sudo systemctl status php8081
2 ● php8081.service
3      Loaded: not-found (Reason: Unit php8081.service not found.)
4      Active: active (running) since Mon 2020-07-27 00:35:21 JST; 2min 49s ago
5 ...
6  7月 27 00:36:36 chiimama systemd[1]: php8081.service: Current command 
7     vanished from the unit file, execution of the command list won't be resumed.


筆者は、サービスを間違いなく削除するために、リスト4のスクリプトを利用しています。

リスト4
25 (ここまでリスト2と同じ)
26 # serviceを停止する
27 sudo systemctl stop ${NAME}
28 
29 # serviceを無効化する
30 sudo systemctl disable ${NAME}
31 
32 # .serviceを削除する
33 sudo rm ${LDIR}/${SNAME}