systemdでApacheをオプション付きで起動する


# はじめに

この記事ではCentOS7系で採用されているsystemdでオプションを指定してApacheを起動する方法を紹介します。

## systemdとは

CentOS 7系からサービスの管理方法がinit.dからsystemdに変更されました。
具体的な変更内容は次の記事が参考になりました。

-  [CentOS7でサービスの管理方法が変わった！](https://qiita.com/haisaihiroki/items/c38cb3c0a331db9b6f69)

## systemdのserviceファイルについて

ApacheのデフォルトのserviceファイルはCentOS7.3では次の場所に格納されています。

- /usr/lib/systemd/system/httpd.service

デフォルトの設定を変更したくない場合には、次の記事を参考に別のserviceファイルを定義するのもよいです。

-  [Systemdを使ってさくっと自作コマンドをサービス化してみる](https://qiita.com/DQNEO/items/0b5d0bc5d3cf407cb7ff)

# 実行環境

- OS : CentOS 7.3
- Apache : v2.4.23(Fedra Core25のRPMがベース)

# Apache v2.4.23の起動オプション

```consol
[root@localhost ~]# httpd -h
Usage: httpd [-D name] [-d directory] [-f file]
             [-C "directive"] [-c "directive"]
             [-k start|restart|graceful|graceful-stop|stop]
             [-v] [-V] [-h] [-l] [-L] [-t] [-T] [-S] [-X]
Options:
  -D name            : define a name for use in <IfDefine name> directives
  -d directory       : specify an alternate initial ServerRoot
  -f file            : specify an alternate ServerConfigFile
  -C "directive"     : process directive before reading config files
  -c "directive"     : process directive after reading config files
  -e level           : show startup errors of level (see LogLevel)
  -E file            : log startup errors to file
  -v                 : show version number
  -V                 : show compile settings
  -h                 : list available command line options (this page)
  -l                 : list compiled in modules
  -L                 : list available configuration directives
  -t -D DUMP_VHOSTS  : show parsed vhost settings
  -t -D DUMP_RUN_CFG : show parsed run settings
  -S                 : a synonym for -t -D DUMP_VHOSTS -D DUMP_RUN_CFG
  -t -D DUMP_MODULES : show all loaded modules 
  -M                 : a synonym for -t -D DUMP_MODULES
  -t -D DUMP_INCLUDES: show all included configuration files
  -t                 : run syntax check for config files
  -T                 : start without DocumentRoot(s) check
  -X                 : debug mode (only one worker, do not detach)

```

# systemdでApacheをオプション付きで起動する方法

私が実験した範囲で3つ方法があるので、お好みの方法を選択ください。

今回の記事ではConfigFile指定のオプション(-f)を例にしていますが、他のオプションでも適用できると思います。

ここではConfigFileをmyhttpd.confとしているので、自分の環境に合わせて適宜読み替えてください。
なお、ConfigFileの指定はフルパスなのでお気を付け下さい。

## 方法1.ExecStart/ExecReloadに直接書く

```diff:httpd.service
- ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
- ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
+ ExecStart=/usr/sbin/httpd -f myhttpd.conf $OPTIONS -DFOREGROUND
+ ExecReload=/usr/sbin/httpd -f myhttpd.conf $OPTIONS -k graceful
```

単純にExecStart/ExecReloadに追記するだけです。

この方法の欠点はオプションが増えてきたときに、ExecStartに書く内容が長くなりコードの見通しが悪くなることです。

## 方法2.serviceファイルのEnvironment変数に書く

```diff:httpd.service
+ Environment=HTTPD_CONF=myhttpd.conf

- ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
- ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
+ ExecStart=/usr/sbin/httpd -f ${HTTPD_CONF} $OPTIONS -DFOREGROUND
+ ExecReload=/usr/sbin/httpd -f ${HTTPD_CONF} $OPTIONS -k graceful
```

オプションに指定する値をEnvironment変数に定義し、それを使用します。

この方法の注意点は、変数を中括弧({})で囲む必要があることです。
中括弧で囲まないと、変数が展開されず、文字列そのままで解釈されます。

この方法の欠点は変数が増えるとserviceファイルの行数が増えて、コードの見通しが悪くなることです。

## 方法3.serviceファイルのEnvironmentFile変数で指定されるファイルに書く

```diff:httpd.service
+ EnvironmentFile=/etc/sysconfig/myhttpd

- ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
- ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
+ ExecStart=/usr/sbin/httpd -f ${HTTPD_CONF} $OPTIONS -DFOREGROUND
+ ExecReload=/usr/sbin/httpd -f ${HTTPD_CONF} $OPTIONS -k graceful
```

環境変数用のファイルを別ファイルとして用意して、それを読み込む方法です。
環境変数用のファイルは次のように書きます。

```consol:myhttpd
HTTPD_CONF=myhttpd.conf
```

この方法では起動オプションだけでなく、Apacheのconfファイル内で使う他の環境変数も渡せるという利点があります。

欠点としてはserviceファイルだけでは設定内容が把握できないことでしょうか。

# おわりに

個人的には方法3の環境変数用のファイルに書くのがスマートだと感じています。

本記事がサービス管理がinit.dからsystemdに変更されて困っていた人の助けになれば幸いです。