tanaka's Programming Memo

プログラミングについてのメモ。

macの OS をバージョンアップした時にやること(自分用メモ)

mac の OS をバージョンアップすると、Apache などの設定が初期化されてローカルの環境が気づかないうちに動かなくなったりするので、自分向けのメモ。

目次

Xcode の確認とバージョンアップ

  • Launchpad から Xcode を起動
  • 更新したり、許可する必要があれば行う
  • 問題がなければ、Xcode を終了
  • 端末を起動して、以下を実行
xcode-select --install

Homebrewのアップデート

  • 端末で、以下を実行
brew update
brew update
brew upgrade
  • 以下を実行して、「Your system is ready to brew.」を表示されれば完了。
brew doctor

上記で、警告が表示される場合、何らかの対応方法が書かれていることが多いので、それを実施して、再度 brew doctor を実行して、なるべく警告を減らします。

MySQLのセキュリティ設定

  • 以下を実行
mysql_secure_installation
  • rootのパスワードを入力
  • 以下は、テスト用で簡単なパスワードも許可しておきたいので no
VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?

Press y|Y for Yes, any other key for No: 
  • パスワードの変更は不要なので no
Using existing password for root.
Change the password for root ? ((Press y|Y for Yes, any other key for No) : n
  • 何か使っていると面倒なので no
Remove anonymous users? (Press y|Y for Yes, any other key for No) : n
  • リモートアクセスは不要なので y
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
  • テスト用のデータベースは不要なので y
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
  • 特権テーブルをすぐにリロードしておくので y
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y

以上で、 mysql -u root -p として、パスワードを入力すると、MySQLへの接続ができるようになります。起動すると、自動的にサービスは起動します(自分の設定が最初からそうなっていたからかも)

古いバージョンの削除

いらないバージョンが出たら削除できます。mysql は最新版以外不要になったら、以下で古いものを削除できます。

brew cleanup mysql

文字コードの設定(2017/2/27追加)

目的としている MySQL のデータベースと、文字コードの設定が異なる場合は修正しないと文字化けを起こします。まずは、正しい設定を確認しておきます。 MySQL に接続して、以下の SQL を実行します。

use 確認したいデータベース;
show variables like '%character%';

以下のような結果が表示されたとします。

f:id:am1tanaka:20170227200929p:plain

データベースごとの文字コードの設定方法がよくわからなかったので、 PHP のプログラム側で設定することにします。データベースに接続するコードで、以下のように exec コマンドで、各設定をします。

    $db = new PDO('mysql:host=<データベースのホストアドレス>;dbname=<データベース名> , <ユーザー>, <パスワード>');
    $db->exec("SET character_set_client=utf8");
    $db->exec("SET character_set_connection=utf8");
    $db->exec("SET character_set_database=ujis");
    $db->exec("SET character_set_results=utf8");
    $db->exec("SET character_set_server=ujis");
    $db->exec("SET character_set_system=utf8");      

以上で文字コードが設定されるので、文字化けを防げます。

MySQLの起動と停止

MySQLのサービスの開始と停止は、 brew から呼び出すと動きます(mysql.server start はやり方が悪かったからか、エラーになったので、以下で良いかと)。

brew services start mysql
brew services stop mysql

Apache の設定

以下のブログの設定を参考に、現状に合わせて作業します。

$ sudo apachectl stop
$ sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist 2>/dev/null
$ brew install httpd24 --with-privileged-ports --with-http2
  • インストールが完了したら、インストール先のパスが表示されるので、記録しておく。以下の場合、[/usr/local/Cellar/httpd24/2.4.25]フォルダー f:id:am1tanaka:20170223190012p:plain
  • 以下を実行する。[2.4.25]の部分は、実際のバージョンに読み換える
$ sudo cp -v /usr/local/Cellar/httpd24/2.4.25/homebrew.mxcl.httpd24.plist /Library/LaunchDaemons
$ sudo chown -v root:wheel /Library/LaunchDaemons/homebrew.mxcl.httpd24.plist
$ sudo chmod -v 644 /Library/LaunchDaemons/homebrew.mxcl.httpd24.plist
$ sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.httpd24.plist

以上で、Apache自動起動が設定されます。すでに起動しているので、 http://localhost にアクセスすれば、[It Works!]の表示を確認できます。

以下を実行しておくと、エラーを監視できます。

$ tail -f /usr/local/var/log/apache2/error_log

apache自動起動を解除する(2017/3/23追記)

valet などを利用するためにポート80を開けたいなど、 apache自動起動を無効にしたい場合は、以下を実行します。

$ sudo launchctl unload -w /Library/LaunchDaemons/homebrew.mxcl.httpd24.plist

設定の変更

  • 設定ファイルの場所は、以下で確認できる
$ /usr/local/Cellar/httpd24/2.4.25/bin/httpd -V

f:id:am1tanaka:20170223183237p:plain

  • ビルド時の設定が表示されて、[-D SERVER_CONFIG_FILE=]の後ろに、設定ファイルへのパスが表示されます。画像の例では[/private/etc/apache2/httpd.conf]が該当するパス。今回のインストールでは[/usr/local/etc/apache2/2.4/httpd.conf]になる
  • テキストエディターで httpd.conf を開く
$ open -e /usr/local/etc/apache2/2.4/httpd.conf
  • DocumentRoot の設定を探して、設定したいフォルダーに書き換える(ダブルクォーテーションは消した方が良いらしいので、消しておく)
DocumentRoot /Library/WebServer/Documents
<Directory /Library/WebServer/Documents>
  • Directory タグ内の [AllowOverride]設定を以下のように[All]に書き換える
    AllowOverride All
  • [mod_rewrite.so]を利用できるようにするために、同モジュールを読み込む行を探して、行頭の # を以下のように削除
LoadModule rewrite_module libexec/mod_rewrite.so
  • ユーザーとグループを daemon から自分のものに変更する。[User daemon]という行を探して、以下のように修正(<自分のユーザーアカウント名>は実際のアカウント名に書き換える。staff はそのままで良い。現在の設定を確認したいときは、 id -p で確認する)
User 自分のユーザーアカウント名
Group staff
  • 以下の行を探して、行頭の # を削除
LoadModule socache_shmcb_module libexec/mod_socache_shmcb.so
...
LoadModule ssl_module libexec/mod_ssl.so
...
Include /usr/local/etc/apache2/2.4/extra/httpd-ssl.conf
...
Include /usr/local/etc/apache2/2.4/extra/httpd-vhosts.conf
  • 上書き保存したら、次は以下を開く
$ open -e /usr/local/etc/apache2/2.4/extra/httpd-vhosts.conf
  • 以下を追加
<VirtualHost *:443>
    DocumentRoot "/Library/WebServer/Documents"
    ServerName localhost
    SSLEngine on
    SSLCertificateFile "/usr/local/etc/apache2/2.4/server.crt"
    SSLCertificateKeyFile "/usr/local/etc/apache2/2.4/server.key"
</VirtualHost>
  • SSLの設定を開く
$ open -e /usr/local/etc/apache2/2.4/extra/httpd-ssl.conf
  • 以下の設定を探して、修正
#   General setup for the virtual host
DocumentRoot "/Library/WebServer/Documents"
ServerName localhost:443
ServerAdmin admin@example.com
  • 上書き保存する。認証用のファイルを作成する
$ cd /usr/local/etc/apache2/2.4
$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt
$ sudo apachectl configtest
  • Syntax OK と表示されなかった場合、ここまで手順を再確認する。表示されたら、以下で apache を再起動する
$ sudo apachectl -k restart

以上で、設定完了です。 http://localhost などは普通に開けるはずです。

https://localhost を開こうとすると、警告が表示されます。詳細をクリックしたり、エラー内容をクリックして、動作を許可してください。

mac にプライベート認証局を設置する場合は、以下の記事を参照してください。

PHP のインストール

PHPを複数バージョンインストールします。以下、 PHP5.6 と PHP7.1 をインストールする例です。

$ brew install php71 --with-httpd24
$ brew install --build-from-source php71-imagick
$ brew unlink php71
$ brew install php56 --with-httpd24
$ brew install --build-from-source php56-imagick

エラーが発生したら、 unlink をする必要があるかもしれません。エラーメッセージを読んで、指示の通りにコマンドを実行してから、再度インストールしてください。また、インストール済みの時は、念のため、 reinstall しておきます。

PHPの設定ファイルの場所は以下の場所です。

/usr/local/etc/php/5.6/php.ini
/usr/local/etc/php/7.1/php.ini

以下で、設定ファイルを開いて、 date.timezone を東京に設定します。

$ open -e /usr/local/etc/php/5.6/php.ini
  • date.timezone を検索して、設定がなければ以下のように追記
date.timezone = "Asia/Tokyo"
  • 上書き保存
  • 以上を、インストールした全てのPHPの設定ファイルに行う

ApachからPHPを利用する設定

httpd.conf に PHP の設定をします。httpd.conf を開いていたら、設定が変更されているので、一度閉じてから、以下で再起動します。

$ open -e /usr/local/etc/apache2/2.4/httpd.conf
  • LoadModule で php を読み込んでいる以下の行を削除します。
LoadModule php7_module        /usr/local/Cellar/php71/7.1.2_13/libexec/apache2/libphp7.so
LoadModule php5_module        /usr/local/Cellar/php56/5.6.29_5/libexec/apache2/libphp5.so
  • 削除した行の代わりに、以下の設定を追加
# Brew PHP LoadModule for `sphp` switcher
LoadModule php5_module /usr/local/lib/libphp5.so
#LoadModule php7_module /usr/local/lib/libphp7.so
  • ディレクトリ設定を書き換える。まずは以下のブロックを探す
<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>
  • 以下に書き換える
<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>

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

PHPバージョンスイッチスクリプトを設定

PHPのバージョンを切り替えるためのスクリプト sphp をインストールします。

$ curl -L https://gist.github.com/w00fz/142b6b19750ea6979137b963df959d11/raw > /usr/local/bin/sphp
$ chmod +x /usr/local/bin/sphp

切り替えを試して見ます。PHP7.1を設定してみます。

$ sphp 71

以上で、切り替え割ります。切り替わったら、自動的に apache が再起動するので、アクセスすればバージョンが切り替わっていることが確認できます。

次に、以下で PHP5.6 に切り替えます。

$ sphp 56

以上で、環境の復活作業は完了です。


PHPの切り替え後、 Apache が停止した場合

sphp でバージョンを切り替えた時に、phpの設定がコメントアウトされないことがありました。以下で対処します。

  • 設定ファイルを開く
open -e /usr/local/etc/apache2/2.4/httpd.conf
  • php を検索して、以下のブロックを探し、片方の設定の前に # を追加して無効にする。以下は、 php5.x の方を有効にする例
# Brew PHP LoadModule for `sphp` switcher
LoadModule php5_module /usr/local/lib/libphp5.so
#LoadModule php7_module /usr/local/lib/libphp7.so
  • 設定を変更して保存したら、以下で apache を起動する
sudo apachectl start

brew upgrade時の警告

最初に brew upgrade をした時の、主要なアプリの警告です。

MySQL

==> /usr/local/Cellar/mysql/5.7.17/bin/mysqld --initialize-insecure --user=<ユーザー名>
Last 15 lines from /Users/yutanaka/Library/Logs/Homebrew/mysql/post_install.01.mysqld:
2017-02-25 01:08:47 +0900

/usr/local/Cellar/mysql/5.7.17/bin/mysqld
--initialize-insecure
--user=<ユーザー名>
--basedir=/usr/local/Cellar/mysql/5.7.17
--datadir=/usr/local/var/mysql
--tmpdir=/tmp

2017-02-24T16:08:47.181867Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2017-02-24T16:08:47.188144Z 0 [ERROR] --initialize specified but the data directory has files in it. Aborting.
2017-02-24T16:08:47.188199Z 0 [ERROR] Aborting

Warning: The post-install step did not complete successfully
You can try again using `brew postinstall mysql`
==> Caveats
We've installed your MySQL database without a root password. To secure it run:
    mysql_secure_installation

To connect run:
    mysql -uroot

To have launchd start mysql now and restart at login:
  brew services start mysql
Or, if you don't want/need a background service you can just run:
  mysql.server start
==> Summary
🍺  /usr/local/Cellar/mysql/5.7.17: 321 files, 234.4M

nginx

brew services start nginxでサービスをスタートできるという表示。

php56-imagick

==> Pouring php56-imagick-3.4.3_1.sierra.bottle.tar.gz
==> Caveats
To finish installing imagick for PHP 5.6:
  * /usr/local/etc/php/5.6/conf.d/ext-imagick.ini was created,
    do not forget to remove it upon extension removal.
  * Validate installation via one of the following methods:
  *
  * Using PHP from a webserver:
  * - Restart your webserver.
  * - Write a PHP page that calls "phpinfo();"
  * - Load it in a browser and look for the info on the imagick module.
  * - If you see it, you have been successful!
  *
  * Using PHP from the command line:
  * - Run `php -i "(command-line 'phpinfo()')"`
  * - Look for the info on the imagick module.
  * - If you see it, you have been successful!
==> Summary
🍺  /usr/local/Cellar/php56-imagick/3.4.3_1: 3 files, 321.7K

php-xdebug

==> Caveats
To finish installing xdebug for PHP 5.6:
  * /usr/local/etc/php/5.6/conf.d/ext-xdebug.ini was created,
    do not forget to remove it upon extension removal.
  * Validate installation via one of the following methods:
  *
  * Using PHP from a webserver:
  * - Restart your webserver.
  * - Write a PHP page that calls "phpinfo();"
  * - Load it in a browser and look for the info on the xdebug module.
  * - If you see it, you have been successful!
  *
  * Using PHP from the command line:
  * - Run `php -i "(command-line 'phpinfo()')"`
  * - Look for the info on the xdebug module.
  * - If you see it, you have been successful!
==> Summary
🍺  /usr/local/Cellar/php56-xdebug/2.5.0: 3 files, 194K

参考URL