joppot

コピペで絶対動く。説明を妥協しない

サーバ

AWS環境でELB(ロードバランサー)とEC2サーバでapacheを使っている場合にhttpからhttpsにリダイレクトする方法

投稿日:2014年5月1日 更新日:

Pocket

89f

概要

みなさんこんにちはcandleです。今回はマニアックな記事ですが、恐らくスタートアップ企業などではわりと使う内容だと思うのでまとめておきます。

この方法が全てのサービス上でベストなやり方なのかどうかは正直分かりません。紹介する内容はリダイレクトさせる1つのやり方です。

下のようなAWS環境でリダイレクトを行いたいと思います。

aws

この環境ではELBとユーザー間でhttps通信をする事で、それぞれのEC2サーバにSSLの設定をしなくてすみます。サーバとELB間ではhttp通信をしています。

今回はELBにSSLの設定をする方法は説明しません。すでに、ELBにSSLの登録がされている事が前提になります。

その上で、httpからhttpsへリダイレクトさせる仕組みを説明していきます。また、今回はhttpとhttps混在サービスではなく、facebookやtwitterみたいに、全てhttpsでサービスを行うという体で説明します。もちろん、httpからhttpsへリダイレクトできれば、混在はその応用なのたぶん簡単にできると思います。

 

前提

ELBにSSL登録している。
https通信をELB <ー> ユーザー間で行っている
Apacheのバーチャルホストmodが入っている

SPONSORED LINK

ELBのポート設定

このポート設定はAWSコンソール上でやる設定の事です。ポート設定はセキュリティも含め、わりと厳重にしたほうが無難です。

ではELBのポート設定から書いていきます。

設定すべきELBが受け入れるポートはhttpsの443とhttpの80です。このポートを開かないとELBはアクセスを遮断してしまうのでリダイレクトができません。

EC2の画面に移動して、メニューから「Load Balancers」をクリックします。
EC2 Management Console

右画面から「Liteners」のタブをクリックしましょう。下の図を見ても分かるように、現在はHTTPS(443)を受け付けていて、Instance(サーバ) へは80で投げています。

EC2 Management Console-1

httpの外部からのアクセスを許可します。「Edit」ボタンを押しましょう。
外部からELBにhttpでアクセスするのを許可します。

httpでELBに来た場合、instanceへ渡すポート番号は80ではなくて、port10100に投げます。なぜなら、ポート番号80はELBに443でアクセスした場合に使っているので、それ以外にしましょう。

ちなみに、ポート番号10000番台は自由に使えるポート番号です。別に10100でなくても構いません。

EC2 Management Console-2

設定したら、「Save」を押しましょう。

この設定で下の様な通信網が作られます。まだインスタンス側の「security group」の設定ができていないので、EC2サーバ側で10100アクセスは弾かれます。

iujiwe

 

EC2でhttp(10100)のアクセスを許可する

次に、インスタンスの設定をしましょう。EC2側は今のところ、ロードバランサーからのhttp(80)番しか「Security Group」でアクセスを許可していません。

http(10100)を許可しましょう。
http(80)を許可しているsecurity groupを見ます。現在は下のように、http(80)のアクセスをload balancerからのみを許可しています。
EC2 Management Console-3

「Edit」を押します。新しく、http(10100)のアクセスをロードバランサーからのみ許可するよに設定しましょう。

(*追記、指定するものはLaod Balancerについているセキュリティグループの「Security Group ID」になります。

Laod Balancerに紐付いているSecurity Groupを確認する方法は
EC2の左のメニューから「Laod Balancers」を選択して自分が使っている、Laod Balancerをクリックします。
次に、下のウィンドウの「Security」タブを押します。
そこにあるSecurity GroupのIDを使います。)

EC2 Management Console-4

これで下の様に、load balancerから10100のアクセスが来たらそれを受信できます。

wea

 

apacheのバーチャルホストでリダイレクトを設定する

リダイレクトの設定はそれぞれのサーバのapacheに書かなくてはなりません。もしも、2台あったらそれぞれに同じ設定をします。

まずは、sshでサーバにアクセスしましょう。そしたら、httpd.confがある場所に移動します。そのサーバのOSによって場所は違うと思います。Amazon Linuxならば下のパスです。

/etc/httpd/conf/httpd.conf

そこに移動して、エディタで開きましょう。

cd /etc/local/httpd/conf/

vim httpd.conf

ポートを受け入れている記述を探します。「Listen 80」という記述があると思います。

f30i

その下に、「Listen 10100」と書き加えましょう。

Listen 10100

jjg

これで保存します。

次に、バーチャルホストの設定ファイルに移動しましょう。バーチャルホストのファイル名はhttpd-vhost.confとかvirtualhost.confとかありますが、AmazonLinuxだと、下のパスに
virtualhost.confという名前であります。

/etc/httpd/conf.d/virtualhost.conf

これを編集しましょう。

ファイルを開くと、下のようなポート80に関する記述があるかと思います。

NameVirtualHost *:80
<VirtualHost *:80>
  ServerName your.domain.name.com
  DocumentRoot /var/www/
  <Directory /var/www>
   #####省略######
  </Directory>
</VirtualHost>

ポート80に関する閉じタグの外に下の内容をコピペします。必ず「your.domain.name.com」のところは各々のドメイン名に変えてください。

<VirtualHost *:10100>
  <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteLogLevel 0
    RewriteCond %{SERVER_PORT} ^10100$
    RewriteRule ^(.*)?$ https://your.domain.name.com$1 [L,R]
  </IfModule>
</VirtualHost>

こんな感じですね。
u

保存したら、apacheの構文をチェクして

sudo apachectl -t

apacheを再起動します。

sudo apachectl graceful

これでリダイレクトの設定は完了です。

最終的に下のようなリダイレクトの流れになります。

8989

まとめ

これで、リダイレクトができました。
記述が足りていないかもしれません。分からないことなどがありましたら、
下のコメント欄に書いてください。

スポンサードリンク

「為になったなぁ」と思ったら、シェアお願いします。

-サーバ
-, , , ,

執筆者:


  1. 門屋 より:

    joppot様

    門屋と申します。

    非常に分かりやすい記事なんですが、一点、
    セキュリティグループでIPを記述する部分に

    「Load Balancer」を指定

    とありますがこれはLoad Balancerの何を指定すればよろしいでしょうか?
    Subnet CIDRのIPでしょうか?

    ご教授願います。

    • candle より:

      門屋様へ

      candleです。返信遅れて申し訳ございません。
      もうすでに、解決しているかもしれませんが、返信させて頂きます。

      指摘されるまで気づかなかったのですが、早急に記事を変更させてもらいます。
      指定するものはLaod Balancerについているセキュリティグループの「Security Group ID」になります。

      Laod Balancerに紐付いているSecurity Groupを確認する方法は
      EC2の左のメニューから「Laod Balancers」を選択して自分が使っている、Laod Balancerをクリックします。
      次に、下のウィンドウの「Security」タブを押します。
      そこにあるSecurity GroupのIDを使います。

      もしも、Security GroupがLoad Balancerに付いていない場合は「Edit」から付与してください。
      もしも、Load Balancer用のセキュリティグループが無い場合は
      一般に、「Inbound」を(HTTP 80 Anywhere) と (HTTPS 443 Anywhere)を付与します。
      「Outbond」は厄介なのですが、Load BalancerからEC2にアクセスしたいEC2が付属している
      Security Group IDを指定します。

      よろしくお願いします。

comment

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

関連記事

ruby on railsで出力されるlog(ログ)のフォーマットを変更する

概要 みなさんこんにちはcandleです。今回はrailsのログに関する記事です。railsは決まった記述でログを出力します。 webアプリケーションを実行中におかしな挙動が合った場合はこのログをもと …

Mysqlの管理ユーザーを追加する

概要 みなさんこんにちはcandleです。今回はmysqlの管理者を加える方法です。 この記事は別段書かなくても、いくらでもweb上にあるのですが、私がよく使うのでまとめました。 前提 mysqlの実 …

ruby on railsのckeditor gemをapacheのproductionの本番環境で動かす

概要 みなさんこんにちはcandleです。今回はckeditorを本番環境で動かしてみたいと思います。 とは言っても基本的な記述はdevelopment環境と同じなので、そこまでは前回の記事を参照お願 …

ElastiCacheのmemcachedとEC2上のrailsとdalli-elasticacheを使ってキャッシュ管理する

概要 皆さんこんにちはcandleです。今回はaws上にあるElastiCacheというサービスを使って railsのキャッシュを管理したいと思います。 キャッシュというのはwebサービス上でよく使う …

CentOS6.5にcomposerをインストールする

概要 みなさんこんにちはcandleです。cakephpではphpのライブラリ管理ツールcomposerと連帯して、便利に必要なライブラリを導入できます。 例えば、cakephpの標準テストツールph …

  • English
  • 日本語

プロフィール


ベンチャー企業のCTOをやってます。大学時代にプログラミングを始め、javaから入門し、C++へて、PHPへと進み、会社ではRailsを使用。自動化が大好きなプログラマー

スポンサードリンク

アーカイブ