2017/05/31
Chrome 58 からこの方法のSSL環境は証明書エラーになってしまいます(´д`)
こちらの記事を参考に証明書を作ることで回避できます。
いつもは最初から入っているApacheとbrewのphpとmysqlって組み合わせにしていたけど、MacBookを初期化したタイミングでnginxとphp-fpmとmariadbにしてみたので、備忘録として残す。(2017年1月16日)
Dockerとかお勉強中だけど、やっぱ手元でぶん回せる環境は欲しいよなぁ。
Homebrew
これが無いとはじまらない。
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
以降、ざっと必要な物をインストール
dnsmasq
いちいち、hostsファイルをいじりたくないからね。
$ brew install dnsmasq
$ cp /usr/local/opt/dnsmasq/dnsmasq.conf.example /usr/local/etc/dnsmasq.conf
$ echo 'address=/dev/127.0.0.1' >> /usr/local/etc/dnsmasq.conf
$ sudo brew services start dnsmasq
$ sudo mkdir /etc/resolver
$ echo 'nameserver 127.0.0.1' | sudo tee /etc/resolver/dev
参考: osxでプロダクションに限りなく近い開発環境を準備する
nginx
SSLの設定もするので、http2付けてみた。
$ brew install nginx --with-http2
$ sudo brew services start nginx
起動時は80番ポートを使うので、sudoで。
この状態で http://localhost:8080 で nginx の Hello! みたいなのが見られるはず。
細かい設定は後ほど。
php
バージョンはとりあえず最新で。php56
でもphp70
でも同じかな。
$ brew tap homebrew/php
$ brew install php71
$ brew services start php71
いつもは、Apache用に--with-httpd24
ってつけていたけど、もう要らないね。
手元の環境でパーミッションとか面倒なので、phpの実行ユーザーを自分にしておく。
user = nemooon
group = staff
設定変えたら、再起動。
$ brew services restart php71
mariadb
特に変わったことはなし。
$ brew install mariadb
$ brew services start mariadb
初期状態はroot
でパスワード無し。
この辺もMySQLと変わらないのね。
$ mysql_secure_installation
Sequel Pro で適当にユーザー作る。
yarn
最近は「にゃーん」ですね。
$ brew install yarn
これでnode
も勝手に入る。
諸々の設定
インストールは終わったところで、Laravelが動くくらいまでの設定をば。
なお、~/Workspace/
に色々と溜め込む方向。
nginxの設定
まずはディレクトリを作っておく。
$ mkdir -p ~/Workspace/nginx
$ cd ~/Workspace/nginx
$ mkdir logs servers ssl
nginx.conf
をいじって、Workspace
の設定を読ませる。
serverディレクティブを全部コメントアウトして、
最後にあるinclude servers/*;
の後に以下を追記。
include /Users/nemooon/Workspace/nginx/servers/*
http://localhost 用のVirtualHost設定を作る。
server {
listen 80 default_server;
server_name localhost;
root /Users/nemooon/Workspace/localhost;
index index.html index.htm index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
access_log off;
error_log /Users/nemooon/Workspace/nginx/logs/localhost-error.log error;
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
fastcgi_params
の最後に以下を追記。
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
設定を確認して、nginxをリロードする。
$ sudo nginx -t
$ sudo nginx -s reload
ドキュメントルートに適当にindex.html
とかphpinfo();
書いたPHPファイルを置いて確認する。
SSLの設定
ついでに https://localhost を表示出来るようにする。
まずは、ssl_dhparam
用のDH交換鍵とやらを作る。
$ cd ~/Workspace/nginx/ssl
$ openssl dhparam 2048 -out dhparams.pem
お次は、localhost用の鍵を作る。
$ cd ~/Workspace/nginx/ssl
$ openssl genrsa -out localhost.key 2048
$ openssl req -new -x509 -key localhost.key -out localhost.crt -days 3650 -subj /CN=localhost
$ sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain localhost.crt
別のホスト用の鍵を作るときはlocalhost
の部分をhoge.dev
とかに置換でOK。
localhost.conf
にlisten 443 ssl http2;
と、出来上がった鍵の記述を追加。
server {
listen 80 default_server;
listen 443 ssl http2;
server_name localhost;
root /Users/nemooon/Workspace/localhost;
ssl_certificate /Users/nemooon/Workspace/nginx/ssl/localhost.crt;
ssl_certificate_key /Users/nemooon/Workspace/nginx/ssl/localhost.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_prefer_server_ciphers on;
ssl_dhparam /Users/nemooon/Workspace/nginx/ssl/dhparams.pem;
index index.html index.htm index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
access_log off;
error_log /Users/nemooon/Workspace/nginx/logs/localhost-error.log error;
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
保存した、nginxを再起動。
$ sudo nginx -t
$ sudo nginx -s reload
これで、 https://localhost が動く。
キーチェーンに登録したから、アドレスバーのところが緑色になって気分がイイネ。
でも、Apache環境も欲しい
でもさー、やっぱり Apache 案件が絶対あるよねー
ということで、8080番ポートで動かして nginx からプロキシしてみる。
httpd24 + mod_rpaf
mod_rpaf
でリバースプロキシ時に上手く SSL やってくれるモノがある。
ので、ここでも最初から入っている Apache には手を出さず、homebrew から入れる。
$ brew install httpd24
$ brew install mod_rpaf --with-homebrew-httpd24
$ brew services start httpd24
今回は8080番ポートなんで、起動時にsudo要らないです。
php56
どうせなら、phpも別バージョンを入れましょう。
$ brew install php56 --with-httpd24
今回は、Apache 用なので、--with-httpd24
を付けましょう。
別に同じバージョンでもいいけど、この記事どおりなら、php71 --with-httpd24
でインストールし直しです。
Apacheの設定
まずは、Apache を8080番ポートで動かす。
Apache も nginx 同様、Workspace にディレクトリを作る。
$ mkdir -p ~/Workspace/apache
$ cd ~/Workspace/apache
$ mkdir logs vhosts
rewrite_module
のLoadModuleのコメントアウトを外して、
php5_module
とrpaf_module
の記述を追加。
LoadModule rewrite_module libexec/mod_rewrite.so
LoadModule php5_module /usr/local/opt/php56/libexec/apache2/libphp5.so
LoadModule rpaf_module /usr/local/opt/mod_rpaf/libexec/mod_rpaf.so
あと、例のごとくパーミッションとか面倒なのでユーザー変える。
User nemooon
Group staff
末尾まで来たら、php5_module
とrpaf_module
の設定を追加。
ついでに、Workspace ディレクトリ以下の設定をまとめて。
<IfModule php5_module>
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
<IfModule dir_module>
DirectoryIndex index.php index.html
</IfModule>
</IfModule>
<IfModule mod_rpaf.c>
RPAF_Enable On
RPAF_Header X-Real-Ip
RPAF_ProxyIPs 127.0.0.1
RPAF_SetHostName On
RPAF_SetHTTPS On
RPAF_SetPort On
</IfModule>
<Directory /Users/nemooon/Workspace>
Options All
AllowOverride All
Order allow,deny
Allow from all
Require all granted
</Directory>
まずは http://localhost:8080 の VirtualHost の設定を追加。
<VirtualHost _default_:8080>
ServerName localhost
DocumentRoot /Users/nemooon/Workspace/localhost
CustomLog /dev/null common env=0
ErrorLog /Users/nemooon/Workspace/apache/logs/localhost-error_log
</VirtualHost>
と、Apache 環境用 http://legacy.dev:8080 の VirtualHost も追加。
<VirtualHost _default_:8080>
ServerName legacy.dev
DocumentRoot /Users/nemooon/Workspace/legacy.dev
CustomLog /dev/null common env=0
ErrorLog /Users/nemooon/Workspace/apache/logs/legacy.dev-error_log
</VirtualHost>
必要な設定ができたら、保存して、Apache を再起動。
$ apachectl -t
$ apachectl restart
phpinfo();
あたりを設置して、 http://localhost:8080 と http://legacy.dev:8080 をチェック。
nginxの設定
Apache 側はもう受ける準備が整っているので、次は nginx 側の設定を追加します。
いや、8080番ポートで問題ないなら、別にこの先不要なんですよね。
せっかく nginx がいるのなら、80番とか443番みたく、見せたいじゃあないですか。
まずは、80番ポート用のプロキシ設定。
server_name
はスペース区切りで複数 Apache 用環境のホスト名を記述すれば設定はこれだけでOK。
server {
listen 80;
server_name legacy.dev;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
保存して、nginx をリロードする。
$ sudo nginx -t
$ sudo nginx -s reload
これで、 http://legacy.dev が http://legacy.dev:8080 にプロキシされます。
次は443番ポート用の設定です。
今回はホスト名毎に鍵の設定を追記しないといけませんので、ホスト名毎に用意しましょう。
#鍵の生成は、前述のやり方と同じです。
server {
listen 443 ssl http2;
server_name legacy.dev;
ssl_certificate /Users/nemooon/Workspace/nginx/ssl/legacy.dev.crt;
ssl_certificate_key /Users/nemooon/Workspace/nginx/ssl/legacy.dev.key;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
保存して、nginx をリロードする。
$ sudo nginx -t
$ sudo nginx -s reload
これで、 https://legacy.dev が、SSL接続で http://legacy.dev:8080 にプロキシされます。
以上で、Apache 環境も設定できたことですし、メデタシメデタシ。
※ 検証しながらやりましたが、記事は継ぎ接ぎなのでどっかしら間違っているかもネー。