サブドメインをワイルドカードに対応させる

サブドメインをワイルドカードに対応させる

みなさんこんにちは。

意識高い系エンジニアの僕です。

よく見かける[任意の文字列].example.comのような設定をしてみたいと考えたのですが、やったことが無かったので検証してみました。

動かすサンプルのWebアプリとしては、簡単に動かせるsinatraにしようと思います。
Webサーバは使い慣れたApacheを使います。
アプリケーションサーバとしてはPassengerを使います。

試した環境

  • Apache 2.2.29
  • Passenger 5.0.13
  • ruby 2.2.2
  • sinatra 1.4.6
  • sinatra-contrib 1.4.6

sinatra-contribsinatraでcookie扱う時に必要みたいだったので入れました
※ AmazonEC2のAmazon Linuxを使っています

この検証のゴール

  • サブドメインの部分を任意に変えてアクセスできる
  • アクセスしたサブドメイン部分の文字列を取得して画面に表示してみる
  • サブドメイン間でcookieを共有できる事を確認する

実現方法

ドメインの設定

対象のドメインに対してワイルドカードを有効にします。
今回はAレコードとして* を設定して対応しました。

設定値:*.proletariat.jp

domainsetting

CNAMEでも設定できるので、ELBなどを使っている場合はCNAMEで同様の設定をすれば良いと思います。

Apacheのインストール

yumでApacheをインストールしました。

Ruby環境のインストール

rubyはrbenvでインストール。
sinatra,sinatra-contrib,passengerははgemでインストールしました。

Apacheの設定

主にバーチャルホストの設定とPassengerの設定ですが、/etc/httpd/conf.dの下にそれぞれ分けて設定しました。

Apache実行ユーザとPassengerの実行ユーザはec2-userに変えてあります。
(本来はApacheの実行ユーザにec2-userを設定するのは不適切だと思います。)

passengerの設定

  • /etc/httpd/conf.d/passnger.conf
LoadModule passenger_module /home/ec2-user/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/passenger-5.0.13/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
  PassengerRoot /home/ec2-user/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/passenger-5.0.13
  PassengerDefaultRuby /home/ec2-user/.rbenv/versions/2.2.2/bin/ruby
  PassengerUserSwitching off
  PassengerDefaultUser ec2-user
</IfModule>

バーチャルホストの設定

  • /etc/httpd/conf.d/vhost.conf
NameVirtualHost *:80
<VirtualHost *:80>
  ServerName *.proletariat.jp
  DocumentRoot /var/www/html/app/public
  RackEnv production
</VirtualHost>

sinatraの配置

以下の4つのファイルを配置します。

/var/www/html/app
– config.ru
– hello.rb
– public/
– tmp/

publictmpディレクトリは空です。

  • config.ru
require File.expand_path(File.dirname(__FILE__)) + '/hello'
run Sinatra::Application
  • hello.rb
require 'sinatra'
require 'sinatra/cookies'

set :cookie_options, { domain: '.proletariat.jp', path: '/' }

get '/' do
  cookies[:access_count] = cookies[:access_count].to_i + 1
  "Hello #{request.host.split('.').first}! 只今のアクセス回数#{cookies[:access_count].to_i}"
end

アクセス時にサブドメインの部分とアクセス回数を表示しています。

アクセス回数はサブドメイン間で共有されたcookieから表示しています。

cookieをサブドメイン間で共有させるために、cookieのドメイン設定を.proletariat.jpにしています。

cookieshare1

cookieshare2

サブドメイン部分の文字列が表示され、アクセスカウントもサブドメイン間で共有されているのを確認しました。

ワイルドカードのサブドメインを運用する上での注意事項

  • localhostでcookieが共有されないようです(主に開発時に困る)
    • プロキシなどを使えば対応できるようです
  • SSL証明書
    • SSL証明書はワイルドカードのドメインに対応したものが必要になります
  • Ajaxクロスドメインリクエスト制約の問題
    • ドメインが違うため、サブドメイン間でのAjaxリクエストができません。
    • Access-Control-Allow-OriginをWebサーバ側で設定するなどの対応が必要です。

TAG

  • このエントリーをはてなブックマークに追加
金子 将範
エンジニア 金子 将範 rubyist

新しいことや難しい課題に挑戦することにやりがいを感じ、安定やぬるい事は退屈だと感じます。 考えるより先に手が動く、肉体派エンジニアで座右の銘は諸行無常。 大事なのは感性、プログラミングにおいても感覚で理解し、感覚で書きます。