俺の開発大作戦

Linux, Mac, Windows10 で 迷走する1開発を進めていく備忘録5

macOS Mojave で apache2.4 + php7.2 環境構築

macOS の Mojave が出て暫く経過したが、巷で大きな混乱もなかったので、ダークモードを体験したくて、ワクワクテカテカ(死語)しながらアップグレードを行った。(一応、バックアップは取ったし、ドンと来い。)

アップグレード後は apache2 の設定が言わずもがなながらデフォルトに戻ってしまったので、前々回記事および前回記事の手順で php7.2 を Homebrew で再インストールし、周辺の環境を再セットアップした。だが、同じ様に設定しても、ブラウザからページを開くと、'ERR_CONNECTION_REFUSED' が出てローカルのページが立ち上がらない。

apache の起動に失敗しているようなので、'sudo apachectl -k start' コマンドで状態を探ることに。

% sudo apachectl -k start
httpd: Syntax error on line 177 of /private/etc/apache2/httpd.conf: Cannot load /usr/local/Cellar/php/7.2.10/lib/httpd/modules/libphp7.so into server: dlopen(/usr/local/Cellar/php/7.2.10/lib/httpd/modules/libphp7.so, 10): no suitable image found.  Did find:\n\t/usr/local/Cellar/php/7.2.10/lib/httpd/modules/libphp7.so: code signature in (/usr/local/Cellar/php/7.2.10/lib/httpd/modules/libphp7.so) not valid for use in process using Library Validation: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed.\n\t/usr/local/Cellar/php/7.2.10/lib/httpd/modules/libphp7.so: stat() failed with errno=22

どうやら、Homebrew でインストールしたphp7.2 のモジュールが Mojave 標準のapache に適していないためエラーになっているようだ。

色々ネットで情報を探っていたら、Github の Homebrew ページ内に本問題がトピックス 'PHP7.2 module fails to load in macOS Mojave (14.2) #32436' としてあがっていた。

上記リンク先のページにて、pratiksahu氏より本問題の解決方法として、Mojave 標準のApache を止めて、代わりに Homebrew のapache をインストールして起動する手順が紹介されていたので、早速実践してみることに。

まずは、Mojave 標準の apache を止めた後、Homebrew のapache インストールから。

% sudo apachectl stop
% brew install httpd

無事、インストール後は、Mojave 標準 apache の自動起動を止めるコマンド実行。

% sudo launchctl unload /System/Library/LaunchDaemons/org.apache.httpd.plist

Homebrew の apache 設定ファイル (/usr/local/etc/httpd/httpd.conf) を設定

...
LoadModule php7_module /usr/local/lib/httpd/modules/libphp7.so // php7.2 を有効化。(Homebrew の案内に従い、モジュールの実体がある場所ではなく、シンボリックリンクが張られている場所のパスを追記。)
...
Listen 80 // Homebrew 版 apache のデフォルト値は'8080'。一般的なポートで良い場合は変更。
...
DirectoryIndex index.html index.php // index.php を追記。
...

ひととおり設定して、'sudo apachectl start' でapache を起動するも、何故か拡張子.php のファイル上で PHP が実行されず、phpのソースコードがそのまま WEB 上に表示されるだけ。色々と試行錯誤した結果、PHP公式ページこのページなどを参考にしながら、拡張子.php のファイル上で確実にPHPが実行されるように、次の内容を /usr/local/etc/httpd/httpd.conf の最後に追記。すると、突然正常に実行されるようになった。

<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

最後に、次回起動から Homebrew 版 apache を自動起動するためのコマンド実行。

% brew services restart httpd
Stopping `httpd`... (might take a while)
==> Successfully stopped `httpd` (label: homebrew.mxcl.httpd)
==> Successfully started `httpd` (label: homebrew.mxcl.httpd)

apache を再起動後、phpinfo(); 実行ファイルを開き、無事 Mojave 上で php7.2 が動作していることを確認。

なお、Mojave 標準の apache から Homebrew 版の環境を移した結果、環境設定のためのファイル群が別の場所に移動したため、今後細かい設定を実行していく前に状態を整理。

maxOSX標準版 apache Homebrew 版 apache
ドキュメントルート /Library/WebServer/Documents /usr/local/var/www
httpd.conf /etc/apache2/httpd.conf /usr/local/etc/httpd/httpd.conf
apachectl /usr/sbin/apachectl /usr/local/bin/apachectl(シンボリックリンク)
httpd-vhosts.conf /etc/apache2/extra/httpd-vhosts.conf /usr/local/etc/httpd/extra/httpd-vhosts.conf

前回 HighSierra で実施したバーチャルホストの設定等、基本的に編集する内容は同じだが、編集対象のファイルが場所とともに変わるので、混乱しないようにしたい。

macOS HighSierra で バーチャルホストの設定

前回に続き、MacBook Pro のWeb開発周りの設定を更に進めていく。現在、当ブログを動かす手製の CMS や従業員が参加する CGM サイトなど、公私にわたって複数のサイト管理を行っているため、バーチャルホストの設定は欠かせない。

というわけで、/etc/apache2/httpd.conf の設定から。まずは、下記のコメントアウトを外してバーチャルホストを有効にする。

...
# Virtual hosts                           
Include /private/etc/apache2/extra/httpd-vhosts.conf // 行頭の「#」を外す。
...

続けて、.htaccess から mod_rewrite が使えるように、該当する行のコメントアウトも外しておく。

...
LoadModule rewrite_module libexec/apache2/mod_rewrite.so // 行頭の「#」を外す。
....

次に、さきほど有効にした /etc/apache2/extra/httpd-vhosts.conf を編集して、バーチャルホストの詳細設定を行う。

一つのホストにつき、以下の内容を1セットとして設定を書き進める。

<VirtualHost *:80>
    ServerAdmin contact@kobachan.biz
    DocumentRoot "コンテンツ配置場所を絶対パスで指定"
    ServerName kobachan-biz
    ErrorLog "/private/var/log/apache2/kobachan-biz-error_log"
    CustomLog "/private/var/log/apache2/kobachan-biz-access_log" common

  <Directory "コンテンツ配置場所を絶対パスで指定">
     Options FollowSymLinks
     AllowOverride all
     Require all granted
  </Directory>

</VirtualHost>

'AllowOverride' を 'all' で設定しないと.htaccess の設定が有効にならないので注意。

'/etc/hosts' に上で設定した ServerName を追記し、apache を再起動してアクセス確認。

...
127.0.0.1 kobachan-biz
...
% sudo apachectl restart

バーチャルホスト URL 'http://kobachan-biz/' で無事ページが開くことを確認。

これで、無事 macOS のlocalhost環境 でマルチに開発や試験を進める環境が構築できた。あとは、ソースを github で管理し、ローカルからpush 後に本番環境に自動デプロイする仕組みを整えて終了。

macOS HighSierra で PHP7.2 をセットアップ

新しくアサインされた業務の用途で、会社より新しい MacBookPro を購入して貸与してもらえることになった。というわけで、到着後さっそくマニアックに、ターミナルのシェルを zsh に変えたり、.zshrc やら .vimrc をホームに置いたり、テキストエディタに Visual Studio Code を入れたりと、色々自分好みの環境設定を済ませたが、ついでにWebやアプリの開発環境も整えようと思い立ち、早速セットアップしていくことに。(ちなみに、本作業時の macOS は HighSierra。)

まずは、ベースの Web 開発環境で、Apache と PHP から。デフォルトでインストール済みのものをヴァージョンチェック。

% php -v
PHP 7.1.16 (cli) (built: Mar 31 2018 02:59:59) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
% httpd -v
Server version: Apache/2.4.33 (Unix)
Server built:   Apr  3 2018 23:45:11

Apache は特に触らずにそのままにすることに。一方、PHP は、さくらインターネットをはじめ、利用中のクラウドサービスが今後 7.2 に切り替えるとアナウンスしているので、Homebrew で 7.2 をインストールすることにした。

インストールする際の名称をチェック。

% brew search php7.2
==> Formulae
php@7.2

上で調べた名前で、インストール開始。

% brew install php@7.2

ターミナルを再起動して、再びヴァージョンチェック。無事に 7.2 がインストールされたことを確認。

% php -v 
PHP 7.2.10 (cli) (built: Sep 14 2018 07:07:08) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.10, Copyright (c) 1999-2018, by Zend Technologies

続いて、/etc/apache2/httpd.conf を編集して、Apache2 のPHP環境まわりのセットアップ。

% sudo cp /etc/apache2/httpd.conf /etc/apache2/httpd.default.conf
% sudo vi /etc/apache2/httpd.conf

追加したPHP7.2 のモジュールを読込むための文を追記して、

..
LoadModule php7_module /usr/local/Cellar/php/7.2.10/lib/httpd/modules/libphp7.so
..

すかさず構文チェック。'Syntax OK' と出たら、Apatch を再起動。

% apachectl -t
Syntax OK
% sudo apachectl restart

localhost に phpinfo()関数実行ファイルを置いて、apache2 で動作している PHP の動作確認。PHP7.2 が動いていればOK。

<?php
phpinfo(); 
?>

最後に 'http://example.com/index.php' というURL を ''http://example.com/' というようにディレクトリパス指定だけで開けるように、再び /etc/apache2/httpd.conf を編集。

...
DirectoryIndex index.html index.php // index.php を追記。
...

ひとまずここまでにして、次は ヴァーチャルホストまわりの設定を行う。

Ubuntu16.04LTS に apache2 をインストール

慣れ親しんだLAMP環境(*)でCMSとか色々作りたいので、早速apacheから入れていく。Xamppとかインストールすれば一発で開発環境が全て整って楽なんだけど、各サーバーの最新の導入仕様をきちんと手を動かし確認しながら進めたいので、急がば回れで一つ一つ導入していく。

(*)Linux, Apache, MySQL, PHP を組み合わせたWebアプリケーションの開発・実行環境のこと。それぞれの頭文字をとって、LAMP環境。

1. apache2のインストール

apt-get からインストール

% sudo apt-get update
% sudo apt-get install apache2

2. セキュリティ設定

security.conf を編集

% cd /etc/apache2/conf-available
% sudo vim security.conf

デフォルトでは、ServerTokensは「OS」になっている。

  ServerTokens OS

この状態だと、http://サーバーのアドレス/にアクセスすると、レスポンスヘッダーのServerのところに、OS名やApacheのバージョンが表示されてしまう。

セキュリティ上好ましくないので、ServerTokensを「Prod」に変更する。

  ServerTokens Prod

*ServerTokensを「Prod」に変更すると、サーバのプロダクト名(すなわち、「Apache」)だけの表示となる。ちなみに、「Full」にすると、デフォルト以上に詳細な情報が表示されるようになる。

なお、この設定はサーバ全体に適用され、バーチャルホスト上で有効にしたり 無効にしたりはできない。

次にSignatureの設定を確認。

  ServerSignature On

Signatureもデフォルトの「On」のままだとサーバが生成するドキュメント (エラーメッセージ、mod_proxy における FTP のディレクトリリスト、 mod_info の出力、等々) のフッターに、ポート番号など様々な情報が表示されてしまうので変更が必要。

  ServerSignature Off

「Off」に変えるとフッターそのものを非表示にできる。

3. バーチャルホストの設定

デフォルト以外の設定を行う場合は次の手順で行う。

(1)/etc/apache2/site-available/ のディレクトリ内にあるデフォルトの設定ファイル"000-default.conf"を元に、設定ファイル"[任意のファイル名].conf"を複製して追加し、ServerName や DocumentRoot などの項目を必要に応じて編集し保存する。

% cd /etc/apache2/sites-available/
% sudo cp -i 000-default.conf [任意のファイル名].conf
% sudo vim [任意のファイル名].conf

なお、使用しているドメイン間でそれぞれ設定を変えたい場合は、ドメイン毎にconfファイルを作成する。(ファイル内の ServerName の欄でドメイン名を指定し、その他の設定を書いていく。)

  ServerName ドメイン名
  DocumentRoot ドキュメントルートまでのパス

以下、その他の追記例。

  # 制御するディレクトリ
  <Directory ドキュメントルートまでのパス>
    # オプション
    Options FollowSymLinks
    # .htaccessの許可
    AllowOverride all
    # アクセス許可
    Require all granted
  </Directory>

  # エラーログ
  ErrorLog ${APACHE_LOG_DIR}/error.ドメイン名.log
  # エラーログを記録するレベル
  LogLevel warn
  # アクセスログ
  CustomLog ${APACHE_LOG_DIR}/access.ドメイン名.log combined

(2)上で作成したファイルのシンボリックリンクを /etc/apache2/sites-enabled のディレクトリ内に保存してapacheを再起動すれば設定が有効になる。(サーバ起動時に、httpd.conf が sites-enabled のディレクトリ内にシンボリックリンクがある全てのconfファイルを読み込む仕組み。)

シンボリックリンク作成の際は、「a2ensite」というコマンドを利用する。(作成した場所から sites-enabled へ簡単にシンボリックリンクが作成できる。)

% sudo a2ensite [任意のファイル名].conf

新しくバーチャルホストを設定した場合、デフォルトの設定ファイルへのシンボリックリンクは、特に必要なければ原則削除する。削除の場合は、「a2dissite」というコマンドを使用。

% sudo a2dissite 000-default.conf

最後にサーバを再起動して終了。

% sudo service apache2 reload

なお、サーバを段階的に停止→スタートする場合は以下のとおり。

  sudo service apache2 stop
  sudo service apache2 start

・・・

<後日追記>
アクセスのあったURLを、正規表現で書き換えてから処理する機能 'mod_rewrite' が初期状態では無効になっているために、少々苦戦したので追記。なんでも Ubuntuのリポジトリから取得出来るApache2はオリジナルのApache2とはディレクトリの構成や設定の方法が違うらしい・・・。当方は、この仕様のために仮想パスで指定した URL がアクセス先でことごとく '404 not found' になって表示不可になってしまい、数時間嵌った・・・。

まずはmod_rewriteが利用可能となっているかを確認

% cat /etc/apache2/mods-available/rewrite.load
LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so

上のとおり、利用可能なことを確認したら、以下のコマンドで有効化しよう。

% sudo a2enmod rewrite
Enabling module rewrite.
To activate the new configuration, you need to run:
  service apache2 restart

上記メッセージのとおり、apache サーバを再起動すると設定が有効になる。

なお、Ubuntu で Apache2 のモジュールを有効にするには a2enmod を使用する。逆に無効化する場合は、同じ書式で a2dismod を使用する。

% sudo a2enmod [module]
% sudo a2dismod [module]

有効・無効化できるモジュールは /etc/apache2/mods-available/ にあるため、各々のファイル名を拡張子なしで指定する。

俺: 小林康典(KOBACHAN)

▼プロフィール畳む

▶プロフィール見る

時はネットが産声をあげた前世紀末、東京大手町に本社がある元国営の通信事業会社に新卒入社し、以降およそ10年間勤務して、インターネット系の新規事業立ち上げに複数携わる。

その後、退職して、ITベンチャーのスタートアップ参画を皮切りに、複数のIT/Web企業でプロダクトマネージャーを務めた後、縁あって現在の会員制ホテル&医療系事業会社へjoin。

元来、エンジニアばかりの環境で過ごしてきたが、ここは一般の非IT系事業会社でIT関連は全て外注。内製中心のアジャイル開発を企てるも、実際に技術がわかり手も動かせるIT担当者の存在はほぼ皆無で、参加直後から周囲の理解が得られず孤立無援の大ピンチ。

幾たびの紆余曲折を経て、技術やデザインに素養がある仲間を一人一人見つけアジャイル開発の世界に勧誘しては、知識・ノウハウを提供して地道に自律的な成長を促し、小規模ながらなんとか内製開発できるチームの形を整える。

現在、業務改善系ITプロダクトの企画およびシステム開発、ビッグデータ分析やAIビジネス転化への試行錯誤など、マルチに行い奮闘中。
(最近は、サイボウズ社のSaasサービス「キントーン」関連の開発多め。)

E-mail: contact@kobachan.biz

カテゴリー
月別アーカイブ
  • 2020 (1)
  • 2019 (2)
  • 2018 (5)
  • 2017 (6)