ようやく開発できるようになったわーと思って、mod_rewriteを使えるように設定した後、バックアップデータをMySQLに入れて、ようやく元のサイトが動いた!と思ったのですが、サブディレクトリに置いているブログ(いま見ているブログの元になるやつ)にアクセスしたら、なぜかポート番号が失われてしまいました…。
どういうことかというと、
- http://localhost:8080/ にアクセスすると見れる。
- http://localhost:8080/foo (フレームワーク上の仮想ディレクトリ)にアクセスすると見れる。
- http://localhost:8080/blog/ にアクセスすると、http://localhost/blog/にリダイレクトされる
という感じです。ポート番号が失われてしまい、vagrant上のウェブサーバではなく、Mac自身のディレクトリにアクセスしようとしてしまってるので、当然見れません(Mac上にWebサーバ立ててないし)。
解決策を考える
解決策を考えると、思い浮かぶのは、
- /blog/に移動してもポート番号を引き継ぐ方法を探し出す
- http://localhost/にアクセスしたらvagrant上のウェブサーバにアクセスできるよう、フォワーディング設定を書き換える
の2つです。
1つ目は、まず最初に挑んだのですが、どうも糸口が見えなかったので、諦めました。
そして、2つ目にしたらすぐに解決するだろうとは思っていたのですが、Macの80番ポートを使うのはなー…と気が引けていたのですが、vagrantを起動している間だしいいかと思って割り切りました。
fowarded_portしても動かない…
そこで、Vagrantfileを修正してみたのですが、動きません。
元になっているVagrantfileは、vagrant-php-boxのものです。
Vagrant.configure("2") do |config| # ... forward_port = ->(guest, host = guest) do config.vm.network :forwarded_port, guest: guest, host: host, auto_correct: true end forward_port[80] # nginx/apache # ...
Vagrant的には1024番ポート以下のウェルノウンポートは、フォワーディングの対象にはならないようです。これは困りました。しかし、解決策がありました。
SSH経由で80番ポートを転送する
SSH経由で80番ポートのアクセスを転送します。
sudo ssh -p 2222 -gNfL 80:localhost:80 vagrant@localhost -i ~/.vagrant.d/insecure_private_key
初回は、鍵の受け入れがあります。あと、毎回vagrantユーザーのパスワードを求められます。デフォルトパスワードはvagrantです。
vagrant up後に、これを行うことで、http://localhostにアクセスするとvagrant上のサーバの80番ポートにアクセスできます。素晴らしい。
SSHするところまで自動化する
しかし、これ毎回vagrant up後にSSHをしないといけないので、忘れてしまいそうです。しかもコマンド長いし。そこで、vagrant upの中にこれらを組み込んでしまいましょう。
組み込むためには、vagrant triggers pluginが要ります。これは、up, reload, halt, destroyなどのイベント発生時に呼ばれるコールバックを設定することができるプラグインです。インストールは簡単です。
vagrant plugin install vagrant-triggers
インストールが終わったら、Vagurantfileに以下のコードを追記します。
# 使わないのでコメントアウト # forward_port[80, 8080] # nginx/apache config.trigger.after [:provision, :up, :reload] do system('sudo ssh -p 2222 -gNfL 80:localhost:80 vagrant@localhost -i ~/.vagrant.d/insecure_private_key') end
これでvagrant upまたはvagrant reloadしてみましょう。
そうすると、最後にパスワードを求められるので入力するのみになります。SSHのパスワード自動化はできるようですが、そのツールを入れること自体がリスクになるので、今回はここまでにしました。
参考URL:
- stackoverflow: Vagrant won’t forward ONLY port 80
- http://salvatore.garbesi.com/vagrant-port-forwarding-on-mac/(動かなかった)
- https://github.com/emyl/vagrant-triggers