by ryou

Vagrant起動時に、httpdの自動起動に失敗する原因と解決法

原因

httpd.confでルートディレクトリをsynced_folderに設定しており、synced_folderはVagrantでは外部ストレージのような扱いで、それをマウントする前にhttpdの自動起動をしようとしていたためルートディレクトリを認識できずにこけてしまっていた。

解決法

以下のコードをVagrantfileに追記

config.vm.provision :shell, run: "always", :inline => <<-EOT
  sudo systemctl start httpd
EOT

これにより、「vagrant up(reload)」時に自動的に「sudo systemctl start httpd」が走るようになり、マウント後にhttpdの起動コマンドが走るようになる。

詳細

以下、Vagrant起動後sshログインしhttpdの状況を確認した際のログ。

[vagrant@localhost ~]$ sudo systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Sat 2017-04-15 02:47:46 UTC; 24s ago
     Docs: man:httpd(8)
           man:apachectl(8)
  Process: 1283 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=1/FAILURE)
  Process: 1217 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE)
 Main PID: 1217 (code=exited, status=1/FAILURE)

Apr 15 02:47:39 localhost.localdomain systemd[1]: Starting The Apache HTTP Server...
Apr 15 02:47:46 localhost.localdomain httpd[1217]: AH00526: Syntax error on line 119 of /etc/httpd/conf/httpd.conf:
Apr 15 02:47:46 localhost.localdomain httpd[1217]: DocumentRoot '/var/www/html/public' is not a directory, or is ...able
Apr 15 02:47:46 localhost.localdomain systemd[1]: httpd.service: main process exited, code=exited, status=1/FAILURE
Apr 15 02:47:46 localhost.localdomain kill[1283]: kill: cannot find process ""
Apr 15 02:47:46 localhost.localdomain systemd[1]: httpd.service: control process exited, code=exited status=1
Apr 15 02:47:46 localhost.localdomain systemd[1]: Failed to start The Apache HTTP Server.
Apr 15 02:47:46 localhost.localdomain systemd[1]: Unit httpd.service entered failed state.
Apr 15 02:47:46 localhost.localdomain systemd[1]: httpd.service failed.
Hint: Some lines were ellipsized, use -l to show in full.

次の行

Apr 15 02:47:46 localhost.localdomain httpd[1217]: DocumentRoot '/var/www/html/public' is not a directory, or is ...able

にある通り、DocumentRootとして設定したディレクトリが検出されていない。

開発効率のため、「/var/www/html」からsynced_folderとして設定した「/vagrant」内の「/vagrant/html」にシンボリックリンクを貼っていた。前述の通りsynced_folderは外部ストレージのような扱いで、httpd自動起動時にはまだマウントされておらずこけてしまっていた。

OS側の起動スクリプトを弄る方法もあるみたいだが、そこらへんには正直手を着けたくなかったので参考記事にあるとおり、前述の解決法のようにVagrantfile側でなんとかした。

参考記事

Vagrantのup時、httpdが自動起動しないとき

Basic Usage – Provisioning – Vagrant by HashiCorp