よく見かける[任意の文字列].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-contrib
はsinatra
でcookie扱う時に必要みたいだったので入れました
※ AmazonEC2のAmazon Linuxを使っています
この検証のゴール
- サブドメインの部分を任意に変えてアクセスできる
- アクセスしたサブドメイン部分の文字列を取得して画面に表示してみる
- サブドメイン間でcookieを共有できる事を確認する
実現方法
ドメインの設定
対象のドメインに対してワイルドカードを有効にします。
今回はAレコードとして* を設定して対応しました。
設定値:*.proletariat.jp
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/
public
とtmp
ディレクトリは空です。
- 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
にしています。
サブドメイン部分の文字列が表示され、アクセスカウントもサブドメイン間で共有されているのを確認しました。
ワイルドカードのサブドメインを運用する上での注意事項
- localhostでcookieが共有されないようです(主に開発時に困る)
- プロキシなどを使えば対応できるようです
- SSL証明書
- SSL証明書はワイルドカードのドメインに対応したものが必要になります
- Ajaxクロスドメインリクエスト制約の問題
- ドメインが違うため、サブドメイン間でのAjaxリクエストができません。
- Access-Control-Allow-OriginをWebサーバ側で設定するなどの対応が必要です。