簡単!さくらのVPSにcoreOSをインストールする方法
さくらのVPSを契約直後の状態から10〜15分程度でインストールが完了します。
SSHで準備する
SSHでログインしてインストールに必要なファイルを収集します。
sshならコピー&ペーストできるので、この後のコンソール操作で手が抜けるようにこの段階で出来るだけ纏めておきます。
cloud-init
まだ勉強中なので最低限の設定だけしています。
static.networkの[Match]で悩んでる方が多いですがeth*は非推奨みたいなのでMACAddressで良いのではと思ってますが機種に依存する設定は省きたいし難しいですね←アドバイスお待ちしております
mkdir -p /tmp/work export VPS_IP=160.16.83.xx # VPSのIPアドレス export VPS_GATEWAY=160.16.82.1 # VPSのGATEWAYアドレス export VPS_DNS1=210.188.224.10 # プライマリDNS export VPS_DNS2=210.188.224.11 # セカンダリDNS export VPS_MAC=9C:A3:BA:01:CD:F1 # MACアドレス export NTP_SERVER=ntp1.sakura.ad.jp # sakura以外ならntp.nict.jpが便利 export ETCD_HOST=`curl -s https://discovery.etcd.io/new` # ディスカバリー用アドレスを発行する cat > /tmp/work/cloud-config << EOT #cloud-config hostname: $HOSTNAME coreos: # etcd: # discovery: $ETCD_HOST # peer-addr: $VPS_IP:7001 units: # - name: etcd.service # command: start # - name: fleet.service # command: start - name: docker.service command: start - name: timezone.service command: start content: | [Unit] Description=set the timezone [Service] Type=oneshot ExecStart=/usr/bin/timedatectl set-timezone Asia/Tokyo RemainAfterExit=yes - name: swap.service command: start content: | [Unit] Description=Turn on swap [Service] Type=oneshot Environment="SWAPFILE=/swapfile" Environment="SWAPSIZE=1GiB" RemainAfterExit=true ExecStartPre=/usr/bin/sh -c '/usr/bin/fallocate -l \${SWAPSIZE} \${SWAPFILE} && chmod 0600 \${SWAPFILE} && /usr/sbin/mkswap \${SWAPFILE}' ExecStartPre=/usr/sbin/losetup -f \${SWAPFILE} ExecStart=/usr/bin/sh -c "/sbin/swapon \$(/usr/sbin/losetup -j \${SWAPFILE} | /usr/bin/cut -d : -f 1)" ExecStop=/usr/bin/sh -c "/sbin/swapoff \$(/usr/sbin/losetup -j \${SWAPFILE} | /usr/bin/cut -d : -f 1)" ExecStopPost=/usr/bin/sh -c "/usr/sbin/losetup -d \$(/usr/sbin/losetup -j \${SWAPFILE} | /usr/bin/cut -d : -f 1)" [Install] WantedBy=multi-user.target - name: static.network content: | [Match] MACAddress=$VPS_MAC [Network] Address=$VPS_IP/23 Gateway=$VPS_GATEWAY DNS=$VPS_DNS1 DNS=$VPS_DNS2 write_files: - path: /etc/ntp.conf content: | server $NTP_SERVER restrict $NTP_SERVER kod nomodify notrap nopeer noquery restrict default ignore restrict 127.0.0.1 ssh_authorized_keys: - ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEA5BqkP+ToroYtzOhnZ2aOJj8WqUpRcQRy/D2ojlPsQutM9Pqfo3qI+75iLpTAAkt+X0RlSBNFLfLsDgfV45IWS/5jv7CKLF/AAIU8Ke5wKVXZrC1LkZ7HfnluALhepUkeB3ilrhFQS+qeS8LHw2s2C2Ig/bGj8lXuEyt93aSREIU= makoto@2ch.to EOT
※公開鍵は自分のに書き変えてください。
ファイルの収集
installerの中で呼ばれるコマンドや設定ファイルを準備します。
(コンソールでviとか面倒臭いので出来るだけこの段階で用意しましょう)
cp /sbin/{blockdev,wipefs,blkid} /tmp/work/ cp /bin/{mktemp,sed,grep,bash,lsblk,env,mkdir,rm,mount,umount,echo,cp} /tmp/work/ cp /usr/bin/{tee,wget,gpg,bzip2,which} /tmp/work/ (cd /tmp/work && ln -f bzip2 bunzip2) echo 'nameserver 8.8.8.8' > /tmp/work/resolv.conf
VNCコンソールを立ち上げる
コントロールパネルからカスタムOSインストールを選択して「CentOS7 x86_64」をインストールするVNCコンソールを立ち上げます。
(/dev/vdaを解放した状態でシェルが使いたいだけなので互換性のあるOSならなんでもかまいません)
「Rescue a CentOS system」を選択
coreOSをinstallする
しばらくするとシェルが立ちあがりますのでまずは先ほど作成したwork.tarを取り出します。
mkdir -p /mnt/root mount /dev/vda3 /mnt/root tar xf /mnt/root/work.tar -C /tmp umount /mnt/root
coreOSのinstall中にネットワークが必要になるのでネットワークを有効にします。
ifconfig eth0 160.16.83.xx(IPアドレス)/23 route add default gw 160.16.xx.1(ゲートウェイ) cp /tmp/resolv.conf /etc/
「coreos-install」を実行します。
export PATH=$PATH:/tmp/ bash /tmp/coreos-install -d /dev/vda -C stable -c /tmp/cloud-config
「Success! CoreOS stable current is installed on /dev/vda」と表示されたらシャットダウンし、コントロールパネルから起動します。
(rebootだとカスタムOSインストールが終わらないのでシャットダウンが必要です)
jQuery.Deferredを使って非同期ループしよう!
突然ですが、Deferred使ってますか?
jQuery.DeferredとはjQueryのバージョン1.5から導入された、非同期処理をうまく扱うための標準モジュールです。
使いこなすことで、以下のような効果が見込めます。
- 非同期処理を連結する際、コールバック地獄から解放される(直列処理、並列処理が可能)
- エラー処理をうまく記述できる
- 一連の非同期処理を関数化して再利用しやすくできる
って説明される事が多いかと思います。
利用方法を説明してるサイトもいっぱいあります。
…が非同期に慣れてない方や、とりあえずjQueryは触れるよ!くらいの人だとすごくわかりにくい動きになっています。
jquery-asyncEach.js
if(jQuery) !function($){ 'use strict'; if( typeof $.asyncEach === 'undefined' ){ // setTimeoutとDeferredを使い非同期にする関数 var async = function($callback){ var $dfd = $.Deferred(); setTimeout(function(){ $callback($dfd); },0); return $dfd.promise(); }; // $.asyncEachメソッド本体 $.asyncEach = function($array,$callback,$thisArg){ if( typeof $thisArg === 'undefined' ) $thisArg = $array; //$arrayが大量だった時に$whenを作るのに時間がかかるのでいきなり非同期化 return async(function($dfd){ //$arrayの要素を1個づつ非同期化 var $when = $.map($array,function($value,$index){ return async(function($dfd){ return $callback.call($thisArg,$dfd,$value,$index); }); }); //$whenが全てresolveするとdone、ひとつでもrejectするとfailする return $.when.apply($,$when) .done(function(){ //argumentsを配列に変換して返す var $_ = []; $_.push.apply($_,arguments); return $dfd.resolve($_); }) .fail(function(){ var $_ = []; $_.push.apply($_,arguments); return $dfd.reject($_); }) ; }); }; } }(jQuery);
テストコード
jQuery.js、jquery-asyncEach.jsの順で読み込んで実行してください。
!function(){ console.log('最初に表示される'); $.asyncEach([1,2,3,4,5,6,7,8,9,10],function($dfd,$value,$index){ //ここに重い処理(…の、かわりにランダムで待たせてから返す) var $r = Math.floor( Math.random() * 1050 ); setTimeout(function(){ //どちらかを使って返り値を返す // $dfd.resolve() = 処理成功 // $dfd.reject() = 処理失敗 return $r <= 1000 ? $dfd.resolve($value * 2) : $dfd.reject($value + 'がキモイ'); },$r); }).then(//.done,.failでもいい function($result){ console.log('重い処理が全部終わったら呼ばれる'); console.log($result); },function($result){ console.log('途中でrejectされたら呼ばれる'); console.log($result); } ); console.log('asyncEachは非同期なので2番目に表示される'); }()
「ほぼiphone」じゃダメなんでしょうか?
今年の夏モデルこそは!と期待してましたがやっぱり出ませんでした。
あきらめてiPod touch + IIJmio高速モバイル/Dサービス + モバイルルーターはいかがでしょうか?
iPod touchでは皆大好きsiriも動くそうです。
最初に必要な物
amazonなので日によって値段は変わりますが送料入れても7万円でお釣りがくる程度で購入できます。
「IIJmio高速モバイル/Dサービス」って?
「IIJmio高速モバイル/Dサービス」はdocomo回線のMVNOです。
通常は200kbpsに制限されていますがクーポンを利用(アプリでon/offできます)するとLTE/3Gの最大値まで利用可能になります。
購入したSIMをそのまま利用すると500MBで使えなくなってしまうので以下のどちらかにアップグレードします。
- ミニマムスタートプラン 月額945円
- ライトスタートプラン 月額1,974円(毎月1GB分のクーポンが付いてくる) ←よく使うのであればこっちがオススメ
IIJmioのFAQを見ると「050 plus」で安定した通話ができます。
アップデートは自宅で行うようにして必要な時だけクーポンを使う癖をつければライトスタートプランで十分運用が可能です。
音声通話はできません
lineでいいんじゃないか?って気もしますが、どうしても電話番号が必要なら「050 plus」を利用する事で月額315円で電話番号を取得できます。
かいちゃった(//▽//
ちゃんと探せばありそうだけど見つからないので…
かいちゃった(//▽//
数字をKB,MB,GB等に変換する関数
(function($size,$fixed,$unit){ return function($size,$fixed,$unit){ var $len = ($size.length > $unit.length ? $unit.length : $size.length) - 1; return { size : Number($len > 1 ? $size[$len] + '.' + $size[$len-1] : $size[$len]).toFixed($fixed), unit : $unit[$len], toString: function(){return this.size+this.unit} }; }( ( function($size){ while($size != ($size = $size.replace(/^(-?\d+)(\d{3})/, "$1,$2"))); return $size; }( new String($size) ) ).split(/,/).reverse(), typeof($fixed) === 'undefined' ? 0 : $fixed, typeof($unit ) === 'undefined' ? 'Byte,KB,MB,GB,TB,PB,EB,ZB,YB'.split(/,/) : $unit ); }(Math.pow(10,9),2) ).toString();
数字をKB,MB,GB等に変換する関数(簡易版,2^10で計算)
(function($size){ return function($size,$){ var $unit = $.shift(),$_; while( ( $_ = $size >> 10 ) >= 1 ) $unit = $.shift(),$size = $_; return $size + $unit; }(Number($size),'Byte,KB,MB,GB,TB,PB,EB,ZB,YB'.split(/,/)); })(0.5*Math.pow(2,30));
無名関数のままじゃかわいそうなので名前付けてかわいがってあげて!
GMOクラウドPublicの簡易見積もりを作ってみた
GMOクラウドPublicって?
GMOグループ運営してる(GMOクラウド株式会社)が運営してるクラウドサービスです。
利用してるプラン内で自由にリソースを割り振れる素晴らしいクラウドサービスで
「GMOクラウドのVPS」や「GMOクラウド専用サーバー」と相性が良いのが特徴です。
料金プランが分かりにくい
パックプラン+超過分は従量課金という料金体系なので、どの料金プランを選んだらいいか分かりにくいかと思います。
構成例がおかしい
間違った料金が掲載されていたり(パック8は29,600円/月)、色々計算が間違っていたり(LBのCPU使用率は10%,Web1,2のディスク容量が10GBだと思われる)と構成例を元に構成しても計算が合わない罠が仕掛けられています。
ってことで
GMOクラウド簡易見積もりを作成しました。
それだけではつまらないので、ほぼ同じ様な構成でGMOクラウドのVPSを利用した場合の料金も計算するようになっています。
dreamobjectsを利用した画像アップローダを作ってみた。
2ちゃんねる画像アップローダという画像アップローダを作成しました。
高負荷にも耐えれる安定したサービスを目指して頑張っていますのでよろしくお願いします。
…というか悲鳴上げるほどアクセス増えて欲しいです。
動機
DreamObjectsというamazon S3と互換性のあるストレージサービスを最近知ったのでを作成してみました。
DreamObjectsがストレージ7¢/GB、Transfer Outも7¢/GB、API呼び出しは無料、先払いによる割引もあります。
S3の米国スタンダードリージョンが$0.095 /GB,$0.120 /GB,$0.01/1,000リクエストなのでずいぶん安くすみそうです。
さて、ここからはサーバの構成のお話です。
フロントエンド
「さくらのVPS 1G」を利用しています。
DreamObjectsが転送料課金なのでnignxがメモリとHDDの大半を使いキャッシュをしています。また、phpを動かすのにapacheも動いています。
負荷が増えた場合、nginxとapacheのサーバを分離後、それぞれ並列化できるように設計しています。
データベース
DBってスケーリングしにくい(というイメージな)ので利用していません。
プログラムでRSSを出力してDreamObjectsにおいています。
Google Developers経由で一覧を作成しています。
件名等各種情報はファイルが持っています。
サムネイル
rethumb - image management serviceというサービスを利用しています。
一覧表示や画像ページ等元画像以外はこちらを経由しています。
リザイズ後の画像はキャッシュしてくれてるので負荷分散にも役立っています。
時々エラーが出たり、海外のサービスなので遅い等もあってオリジナルを作ろうか検討しています。
ストレージ
DreamObjectsを利用しています。
HTMLやCSS等もここに入っています。(phpのみフロントエンドにおいてあります)
現在は使用量が少ないので完全従量制を利用しています。
将来的には1TB PAN($54.95/mon)あたりが必要になると思います。
80円/$だと4,396円ですみますが120円/$だと6,594円と1,000円以上の差が付いてしまいます。
個人のサイフで海外のサービス利用すると為替リスクが怖いですね。
さくらのVPSの賢い使い方
時々wordpress等のCMSを使っていて負荷増えてきたから「さくらのVPS」の4Gや8Gにしたったという話を耳にします。
本当に4GBや8GBで良かったのでしょうか?
構成 | プラン | 料金 | メモリ | コア | HDD | 用途 |
---|---|---|---|---|---|---|
構成1 | さくらのVPS 4G | 3,980円 | 4GB | 4コア | 400GB | すべて |
構成2 | さくらのVPS 2G さくらのVPS 2G 合計 |
1,480円 1,480円 2,960円 |
2GB 2GB 4GB |
3コア 3コア 6コア |
200GB 200GB 400GB |
nginx+apache DB - |
構成3 | さくらのVPS 1G さくらのVPS 2G さくらのVPS 2G 合計 |
980円 1,480円 1,480円 3,940円 |
1GB 2GB 2GB 5GB |
2コア 3コア 3コア 8コア |
100GB 200GB 200GB 500GB |
nginx apache DB - |
構成1
- サーバ1台なので設定は楽
- コア数一番少ないのに料金は一番高い
- 静的コンテンツが200GBでおさまらない場合はしょうがない
- nginx(静的コンテンツを返す)+apache(プログラム処理)+DBを1台で行うのでコンテキストスイッチが多く発生する
構成2
構成3
まとめ
このように用途毎にサーバをわけてより小さいプランを数個契約すると、安くなったり、同じ価格でより高性能な環境を得る事が出来て、お得な事があります。
同様にさくらのVPS 8GBもそれ以下のプランを複数組み合わせる事で安くなったりよりアクセスを捌ける環境を作る事ができる可能性があります。
※管理コストは増えますのでご注意ください
関連リンク
ところで
twitterに[twitter:@sakuravps]という、さくらインターネットVPSサービスの公式アカウントが有るのですが魂が宿っていません。
かわいそうなのでさくらのVPSを利用してる方はフォローしてあげてください。
あと、サーバ構成の検討〜初期設定のお手伝い案件がありましたら是非ご相談ください。