OS X El Capitanでサーバをたてたときのメモ

#準備

*目的：小さな職場でlocalに使うためのサーバ各種を準備したい。Web（とくにCGIとPHP、wiki）とDHCPサーバ。*

Macは購入時のdefault settingで開始。El Capitan。
適当にApple ID作成（そのままではXcodeいれられないので）

ADCからXcode7.3.1とCommand Line Tools 10.11 (7.3.1)を入手してinstall
X11.appからXQuartzのサイトに飛んでXQuartz2.7.9を入手してinstall
一度Xcode起動して必要なmoduleをinstallさせてもいいししなくてもいいけど、おまじないとして一度マシンをreboot

このあとは基本的にTerminal.appからdefaultのshell（bash）で作業
一応`sudo xcodebuild -license`してagreeしておく

必要ならCotEditorとかiTerm2とかfreeのツールいれて作業すると楽。

#Webサーバ

##Apache起動
まず`sudo apachectl start`でwebサーバを有効にする
止めるときは`sudo apachectl start`、再起動には`sudo apachectl restart`が便利
  
Safariなどで`http://localhost`を表示させてapacheが起動しているか確認
そのあと余裕があるならマシン自体再起動後してまたSafariで`http://localhost`みて、自動でapacheが上がっていることを確認

サービスとしてみるなら`sudo launchctl list | grep http`みたいにしてloadされているかどうかを確認

このあとApacheのconfをいじる
（OS Xのhttpd.conf類は実際には`/private/etc/apache2/`の下にある）
（ちなみに`/etc`は`/private/etc`からのリンクなので、`/etc/apache2`でもよい）
（空白はタブつかわないほうがいい？）

いじったらこまめに再起動してsyntax checkすること

```
 $ sudo apachectl restart
 $ sudo apachectl configtest

```

##.htaccessを有効にしてUserディレクトリも使えるようにする

まず`/etc/apache2/httpd.conf`の以下をアンコメントにする
上二つはdefaultではアンコメントされてるはず
mod_userdir.soはUserディレクトリつかうなら必須、mod_rewrite.soは.htaccessつかうなら必須

```/etc/apache2/httpd.conf
 LoadModule authz_core_module libexec/apache2/mod_authz_core.so
 LoadModule authz_host_module libexec/apache2/mod_authz_host.so
 LoadModule userdir_module libexec/apache2/mod_userdir.so
 LoadModule rewrite_module libexec/apache2/mod_rewrite.so
 
 Include /private/etc/apache2/extra/httpd-userdir.conf
```

次に `/etc/apache2/extra/httpd-userdir.conf` の以下をアンコメントにする

```/etc/apache2/extra/httpd-userdir.conf
 Include /private/etc/apache2/users/*.conf
```

ここまで書き換えたらapache再起動 `sudo apachectl restart` して文法確認 `sudo apachectl configtest`

defaultではHomeにSiteディレクトリが存在しないので、Home `/Users/{ユーザ名}` にSitesディレクトリを作成 `mkdir ~/Sites`

`/etc/apache2/users/{ユーザ名}.conf` に以下のように書き加えて、.htaccessが使用出来るようにする
（実際は.htaccessなくても動きはする）
（Userディレクトリつかうだけなら.htaccessつかうための `AllowOverride All` はしなくてもいい）
（indexダダ見えだったりするので書き換えたほうがいい）

```/etc/apache2/users/{ユーザ名}.conf
 <Directory "/Users/{ユーザ名}/Sites/">
  AllowOverride All
  Options Indexes MultiViews FollowSymLinks
  Require all granted
 </Directory>
```

`/etc/apache2/users/{ユーザ名}.conf` のパーミッションが` -rw-r--r-- root:wheel` なのをなのを確認
（特にあたらしく作ったとき）

書き換えたらapache再起動 `sudo apachectl restart` して文法確認 `sudo apachectl configtest`

Safariなどで `http://localhost/~{ユーザ名}` みてみて確認

##PHPを有効にする

ひとまず/etc/php.iniはそのままでOK
（PukiWikiでupload上限を変えるときとかには変更するけど）

一応indexまわりのファイル名を確認しておく
`/etc/apache2/other/php5.conf` をみると `DirectoryIndex index.html index.php`になってるはず
 
`/etc/apache2/httpd.conf` の以下の部分をアンコメント

```/etc/apache2/httpd.conf
 LoadModule php5_module libexec/apache2/libphp5.so
```

書き換えたら書き換えたら `sudo apachectl restart` して `sudo apachectl configtest` して確認

たとえば/Users/{ユーザ名}/Sites/phpinfo.phpを用意して以下を書き込み、`http://localhost/~{ユーザ名}/phpinfo.php` が表示されるかを確認

```phpinfo.php
 <?php phpinfo(); ?>
```

##CGIとSSIを有効にする

`/etc/apache2/httpd.conf` の以下の部分をアンコメント

```/etc/apache2/httpd.conf
 LoadModule cgi_module modules/mod_cgi.so
```

CGIスクリプトを `/Library/WebServer/CGI-Executable` に置くなら、`/etc/apache2/httpd.conf` の以下に`Options +ExecCGI` を追加する（defaultでは `Options None` になっているはず）

```/etc/apache2/httpd.conf
 <Directory "/Library/WebServer/CGI-Executables">
  AllowOverride None
  Options +ExecCGI +Includes
  Require all granted
 </Directory>
```
 
（この時点で `AddHandler cgi-script .cgi` がアンコメントされてないけどなぜか動くけどなぜなんだろう…どこかに記述されてるんだな…）

自前のディレクトリの特定の場所（たとえば `/Users/{ユーザ名}/Sites/cgi-bin` ）に置くなら
`/etc/apache2/users/{ユーザ名}.conf` に以下を記述

```/etc/apache2/users/{ユーザ名}.conf
 <Directory /Users/{ユーザ名}/Sites/cgi-bin>
  AddType text/html .shtml
  AddHandler cgi-script .cgi
 </Directory>
```
 
`/Users/{ユーザ名}/Sites/.htaccess` を準備して以下を追加しておく

```/Users/{ユーザ名}/Sites/.htaccess
 Options +ExecCGI +Includes
```

ちなみにSSIいらないなら、`AddType text/html .shtml`と`+Includes`は無くていい

書き換えたら `sudo apachectl restart` して `sudo apachectl configtest` して確認
テストしたいなら、以下のtest.cgiみないなのつくって置いて試す

```test.cgi
#!/usr/bin/perl
use strict;
use CGI;
my($q) = new CGI;
print $q->header;
print $q->start_html;
print "test\n";
print $q->end_html;
```


##Basic認証をつける
apacheが読込めそうなところにパスワードファイルを用意する
（例：/etc/apache2/htpasswdみたいなかんじで）
（/Users/{ユーザ名}/htpasswdとかでもいいかも、だめなら/Users/{ユーザ名}/Sites/.htpasswd）
（sudo emacs /etc/apache2/htpasswdとか新規につくる。owerはroot:wheelのままでOK）
（権限が-rw-r--r--、644になっていること）

まずhtpasswdコマンド `htpasswd -n {閲覧するユーザ名}` で{閲覧するユーザ名}というユーザでパスワードを作成
ここででてくる文字列（たとえばGKL0oNAaj0A9gみたいなの）を`user:password`のようにパスワードファイルに記述（ユーザがいくつかあれば、1行毎に書き込む）
 ```htpasswdファイル
 {閲覧するユーザ名}:GKL0oNAaj0A9g
 hoge:Ue0m9xCyeaiw
 fuga:H03hg8dj4hkw
```

`/etc/apache2/http.conf` などで `AllowOverrride AuthConfig` とか `AllowOverride All` が設定されていれば、認証をつけたいDirectoryに.htaccessを用意すればいい
（`sudo emacs .htaccess` とかでつくれば `-rw-r--r--` 権限で `root:wheel` になってるはず）
たとえばいちばんトップに置くかたちで、`/Library/WebServer/Document/.htaccess` に以下を書き込んでおく

```/Library/WebServer/Document/.htaccess
 AuthType Basic
 AuthName "hogefuga server"
 AuthUserFile /etc/apache2/htpasswd
 Require user {閲覧するユーザ名}
```
 
書き換えたら `sudo apachectl restart` して `sudo apachectl configtest` して確認

もしUserディレクトリでやるのなら

```/Library/WebServer/Document/.htaccess
 AuthType Basic
 AuthName "Personal Sites"
 AuthUserFile /Users/{ユーザ名}/htpasswd
 Require user {閲覧するユーザ名}
```

とかして同様に`sudo apachectl restart` して `sudo apachectl configtest`

もしくは `/etc/apache2/other`などにconfファイルとしてまとめて置いておけば集中管理できる。
たとえば `/etc/apache2/other/htaccess.conf` みたいな名前のconfファイルつくっておいて、

```htaccess.confファイル
 <Directory "/Library/WebServer/Documents">
  AuthType Basic
  AuthName "Public Sites"
  AuthUserFile /etc/apache2/htpasswd
  Require user {閲覧するユーザ名}
 </Directory>
 <Directory "/Library/WebServer/Documents/wiki">
  AuthType Basic
  AuthName "PukiWiki"
  AuthUserFile /etc/apache2/htpasswd
  Require user {wiki利用者ユーザ名}
 </Directory>
```

としておいくとか、`/etc/apache2/{ユーザ名}/htaccess.conf` に

```htaccess.confファイル
  <Directory "/Users/{ユーザ名}/Sites/">
  AuthType Basic
  AuthName "Personal Sites"
  AuthUserFile /Users/{ユーザ名}/htpasswd
  Require user {閲覧ユーザ名}
 </Directory>
 <Directory "/Users/{ユーザ名}/Sites/wiki">
  AuthType Basic
  AuthName "PukiWiki"
  AuthUserFile /etc/apache2/htpasswd
  Require user {wiki利用者ユーザ名}
 </Directory>
```
 
を追加しておくみたいにすればOK


##PukiWikiをたてる
pukiwikiのインストールの手順ですぐできる。基本的に解凍して置くだけ
管理者パスワードの設置とかアップロード容量の上限変更とかapacheのrestartもわすれずに


#DHCPサーバ

MacPorts 2.3.4 El Capitanを入手してinstall
`sudo xcodebuild -license`して`sudo port -v selfupdate`もしくは`sudo port -d selfupdate`して`sudo port install dhcp`する
（べつにmacportでなくてもhomebrewでもなんでもいい）
（Linuxとかから移行してくるならISC-DHCPなのでそのままconfファイル動く）

依存関係上、まっさらだとopensslとzlibがMacPortsでinstallされる
とくになにもなく、cautionやnoteなども表示されずinstall終了

ひとまず`/Library/LaunchDaemons/org.macports.dhcpd.plist`の中身を`less`などでみる
必要な3つのファイル（`dhcpd.conf`と`dhcpd.leases`と本体のdhcpd）がどこにあるべきかを確認（よくある場所とは別の場所だったりするので注意）

```
/Library/LaunchDaemons/org.macports.dhcpd.plist
/opt/local/etc/dhcp/dhcpd.conf.sample
/opt/local/etc/dhcp/dhclient.conf.sample
/opt/local/var/db/dhcpd/.turd_dhcp
/opt/local/sbin/dhcpd
```

ができている

`/opt/local/var/db/dhcpd/dhcpd.leases` は始め存在しないので、自分で `sudo touch /opt/local/var/db/dhcpd/dhcpd.leases` みたいな感じで空ファイルつくる（これをしないとリースしないので正常に動いているようでどはまりする）

`/opt/local/etc/dhcp/dhcpd.conf` を準備する
ここに、とりあえずlinuxから移設するのでも、なら`dhcpd.conf`そのまま置けばうごく
いちおうconfの文法確認 `/opt/local/sbin/dhcpd -t /etc/dhcp/dhcpd.conf`

簡単には `sudo port load dhcp`で起動、`sudo port unload dhcp`で停止

`sudo launchctl list`でちゃんとサービスとしてloadされているか確認
一応再起動してちゃんとサービス立ち上がっているかも確認

じっさいは再起動してちゃんとうごかすためには以下でon/offしたほうが無難そう
起動は`sudo launchctl load -w /Library/LaunchDaemons/org.macports.dhcpd.plist`、停止は`sudo launchctl unload -w /Library/LaunchDaemons/org.macports.dhcpd.plist`

あとは
`sudo ln -s /opt/local/etc/dhcp /etc/dhcp` とかしてリンク作っておけばlinux的な感じにして使いやすくなるのかな

#MySQLサーバ
宿題。。。

#他の
redmineとか…？