PCの80番ポートでvagrantの80番ポートにアクセスする方法

今日はphpMyAdminと戦ったり、結構疲れています…。

ようやく開発できるようになったわーと思って、mod_rewriteを使えるように設定した後、バックアップデータをMySQLに入れて、ようやく元のサイトが動いた!と思ったのですが、サブディレクトリに置いているブログ(いま見ているブログの元になるやつ)にアクセスしたら、なぜかポート番号が失われてしまいました…。

どういうことかというと、

  1. http://localhost:8080/ にアクセスすると見れる。
  2. http://localhost:8080/foo (フレームワーク上の仮想ディレクトリ)にアクセスすると見れる。
  3. 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:


カテゴリー Mac, PHP, WordPress | タグ | パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です