S3への転送が遅い件について

前回 書いた、 s3cmd を使ったamazon S3 への転送が200〜300Kbしか出ない件です。

http://cdn.cyberduck.ch/img/cyberduck.icon.png


試しに Mac mini に S3にも転送できる Macの定番FTPアプリCyberduck で同じファイルを転送したところ、1Mb 程度の速度がでました。





どうも s3cmd が遅いようですが、チューニング出来そうなパラメター send_chunk を変えてみましたが効果はありませんでした。また、Cyberduck は基本的にGUIツールで shell script から起動する方法が見つからなかったので、利用は諦めました。


そこで、どうしたかた言うと・・・・
実は EY-Office の gitやredmaineを動かしている、さくらVPSのサーバーも S3 にバックアップを取っています。Mac mini からそのサーバーへ scp でファイルを転送すると 2〜3Mb の速度でコピー出来るので、さくらVPSのサーバーのS3コピー用ディレクトリーへ Mac mini のバックアップを scp する事にしました。

さくらVPSのサーバーからS3は非常に早い(転送自体の時間は未測定ですが、バックアップは早いです)ので、それに相乗りする事にしました。

お終い

TimeMachineバックアップの中から重要なファイルのみ自動的にAmazon S3にバックアップする

前回 書いたように TimeMachineのバックアップをサーバーに移行したのは、使い勝手の向上以外に、TimeMachineバックアップの中から重要なファイルのみ自動的にAmazon S3にバックアップしたかったからです。


バックアップスクリプト

以下のようなshell scriptをcronで1日1回実行します

#!/bin/bash 

time_machine=/Volumes/Backup/マシン名.sparsebundle
home_dir='Backups.backupdb/マシン名/Latest/Machintosh SSD/Users/yy'
backup_list=(Documents Project  Storage)
s3bucket=S3バケット名
bakup_dir=/var/tmp/s3bak/bak
mount_dir=/var/tmp/s3bak/mnt
gen=$((`date +%-j` % 3))

hdiutil attach -mountpoint $mount_dir $time_machine
cd "$mount_dir/$home_dir"
for bak in ${backup_list[@]}; do
  tar czf $bakup_dir/$bak.tgz $bak
done
cd $bakup_dir
hdiutil detach $mount_dir
/usr/local/bin/s3cmd -c /etc/s3cfg --recursive put $bakup_dir s3://$s3bucket/backup$gen/

簡単に解説すると

  • time_machineはサーバー上のTimeMachineのバックアップのパス
  • home_dirはTimeMachineのバックアップを展開した際にバックアップするディレクトリーがあるディレクトリー。この例では私のホームディレクトリー
  • backup_listはhome_dirにあるバックアップするディレクトリー
  • s3bucketはS3のバックアップ先のバケット名
  • bakup_dir, mount_dir はバックアップ作業用ディレクトリー
  • gen はバックアップの世代番号、この例では日付から3世代のバックアップを取っています
  • hdiutil は sparsebundle の操作コマンド
  • S3へのコピーは s3cmd で行っています。s3cmd はhomebrewでインストル出来ます

しかし・・・

実際に動かしてみたところ、S3へのコピー速度が 200〜300Kb/s しか出てなく 5Gbyte程度のコピーで 8時間もかかってしまいます。トホホ・・・

我が家の回線(マンションまでは光ですが部屋まではVDSL)のせいなのか、s3cmdのチューニングなのか調べてみます。ちなみに ey-office.netのサーバーまで scp で同じファイルをコピーすると 2Mb/s くらいは出てるので、単純に回線の問題ではないようです。

バラバラのバージョンのRuby on Railsを1つのサーバーで動かす

現在、EY-Officeの社内利用サーバーではではいろいろなバージョンのRuby on Rails を2台で管理しています。ただし全てがほぼ私ししか使っていないので、さくらVPSのキャンペーン につられて1つのサーバーにまとめてみました。


http://www.modrails.com/phusion_template/logo-trans.png
http://github.com/images/error/angry_unicorn.png

移行前

さくら VPS 512Mをつかって以下のアプリを運用していました (1.8.7@rails2.3 という記法は rvmで使う記法で Ruby 1.8.7Rails 2.3.X を使っているという事です)

  • サーバー1
    • redmine : 1.8.7@独自、教育で使ったりするので時々負荷が高くなる
    • radiant : 1.8.7@独自、EY-Officeホームページ作成用、スタティックページを生成して使うので超低負荷
    • Ruby on Rails以外: gitリポジトリー、wliki ( Gaucheで書かれたWiki )
  • サーバー2
    • A社ステージング : 1.8.7@rails2.3 、低負荷
    • B社ステージング : 1.8.7@rails2.3、 お客様側の開発者もたまに使うが、低負荷
    • C社テスト用 : 1.8.7@rails3.0、 低負荷

さらに、A社サービスを 1.9.3@rails3.2 に移行中でステージングサーバーを必要としています。

方針

今までは、Ruby on Railsの実行環境は Apache + Passenger を使っていました。PassengerはApacheのモジュールとして動くのでアプリの設定やデプロイが簡単ですし、1つのサーバーで複数のアプリを動かすのも簡単です。

開発環境(Macbook Pro)はrvm を使って複数のバージョンの Ruby/Railsの開発が出来ます、rvm をサーバー上で使えば同じように複数のバージョンの Ruby/Railsの運用が出来るのでは? と考え調べてみました。

Passenger を rvm の上で動かす事は rvmのページ に書かれているように簡単にできます。 しかし、Passenger で動くアプリで複数Rubyを使う事は出来ません! Passengerのblogに 複数のバージョンのRubyをPassengerで動かす方法というエントリーがありますが、図のように 異なるRubyを使うアプリは Passengerをスタンドアロンで起動して使うと書かれています・・・・・ これでは、手軽に使える Passengerの良さが失われてしまいます ^^);

http://blog.phusion.nl/wp-content/uploads/2010/09/setup.png


Apacheを reverse proxyにしてアプリケーションサーバーを別に起動するなら、Passenger以外に Unicornという選択肢もあります。いろいろと調べた結果

  • 別プロセスを起動する手間はあるが、性能を考えなければ設定は簡単
  • rvm の wrappers 機能を使うと 特定のruby@railsで起動する unicorn_railsコマンドを簡単に作れる
    • 例えば以下のようにコマンドで ruby1.8.7 rails2.3 の環境(環境自身は予め作っておく)で起動する unicorn_railsコマンド ruby2.3_unicorn_rails が作れます
rvm wrapper 1.8.7@2.3 rails2.3 unicorn_rails
  • 起動スクリプト(/etc/init.d/xxxx)はrootで動作しますが、unicorn の実行は su - でrvmのインストールされたユーザーで実行すればよい
  • unicornはPassengerと同等の性能でメモリー使用量が少ない(らしい)

ということで、rvm + unicornRails を運用すれば、好きなバージョンの Ruby 、 好きなバージョンの Rails複数起動できます。

現状

ただし、お客様の環境もPassengerで動いていますのでステージングはPassengerで動かしておいた方が良いと思います。そこで今回の移設では

  • 新サーバー

としました。 新サーバーは 2Gメモリーなので、これだけ動かしても快適です :-)

unicorn の運用になれてきたら、お客様の環境も unicorn にしようかな、と思っています。

cronの中でsudo を使う方法

http://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/NewTux.svg/200px-NewTux.svg.png

訳あって、root で動くcron の中で sudo を含むスクリプトを動かしたのですが

sudo: sorry, you must have a tty to run sudo

というエラーが出て動きませんでした(OSは Centos5)。
しかし検索してみると解決策が見つかりました。

その1 (セキュリティー上、望ましくない)

/etc/sudoers の 以下の行をコメントアウトする

Defaults    requiretty

検索すると、こう書かれた記事がみつかります。
しかし、なぜデフォルトでtty(コンソール)と繋がってないsudoを実行出来ないようにしているのはクラッキング目的で進入したソフト等からsudoされないようにする為です。
なので無闇にこれを無効にしてしまうのは望ましくありません。

その2

Defaults の指定は以下のように特定のユーザーのみttyに繋がってなくともsudoを許可できるので、こちらの方が良いと思います。

Defaults:root !requiretty

さくら VPS の OS を Ubuntu 10.04 に変更してみた

以前 Ruby on Railsのインストール手順を書いたように、CentOS5.5はインストールされているソフトのバージョンがかなり古く、ちょっと実験的に何かを動かそうとするには不便です。そんなおり、「さくらのVPS」の対応OSが5種・10バージョンに拡充 が発表されたので、OSをUbuntu 10.04 に変更することにしました。

既存環境のバックアップ

サーバー環境は既に CentOS5.5 上で作ってありましたので、借りている他のVPSに git リポジトリー や web コンテンツ、Redmine コンテンツをバックアップしました。現在、VPSは「お試し期間」でデータ転送帯域を2Mbps に制限されてるのでバックアップの転送に時間がかなり掛かってしまいました。

Ubuntu 10.04のインストール

SAKURA Internet // サポート - オンラインマニュアル - カスタムOSインストールガイド : Ubuntu 10.04 に書かれている通りに実行するとインストールできます。

すこし、迷ったところを書きます。インストールは10分くらいで終わったと思います。

  • 1. 現在の設定情報

サーバーのIPアドレスGatewayIPアドレスは、インストール前に ifconfig, netstat等を使って調べておきましたが、インストールを開始すると下の画像の様に VPSコンソールに表示されるのでメモしておかなくても大丈夫でした。

  • 2. インストル用のコンソール

インストル用のコンソールは下の画像のように、ブラウザーとは別のウインドウが出来ます。

  • 3. 途中で入力するアカウントに付いて

[STEP 4]で入力するアカウントは通常のユーザーですが、adminグループに属しているのでインストール後直ぐに sudo できますからインストル後、このアカウントでログインし sudo して root のパスワード等を設定できます。

Ruby on Rails を動かす為のインストール

sudo apt-get install build-essential
sudo apt-get install ruby-full
  • 3. gem

apt でインストールしたgem は 1.3.5です、しかも update --system を実行すると以下の様なエラーになるので
World21 (f)さんのブログ にあった手順でアップデートしました。

sudo apt-get install rubygems
sudo gem install rubygems-update
sudo /var/lib/gems/1.8/bin/update_rubygems
sudo apt-get install sqlite3 libsqlite3-dev
sudo apt-get install apache2
sudo apt-get install apache2-prefork-dev
sudo apt-get install git-core git-doc  git-arch gitweb
sudo gem install rake
sudo gem install -v 2.3.8 rails
sudo gem install sqlite3-ruby
  • 6. passenger

さくらVPSでRuby on Railsを動かすメモを参考にして下さい。

sudo gem install passenger
sudo passenger-install-apache2-module 

さくらVPSでRuby on Railsを動かすメモ

Ruby on Rails (+ Passenger) のテスト環境を さくら VPS に作ってみたメモです。

http://vps.sakura.ad.jp/images/mainImg.gif

契約

さくらのVPS|VPS(仮想専用サーバ)はさくらインターネットから申し込むと、カード決済の場合数時間で「[さくらのVPS] 仮登録完了のお知らせ」というメールが来ます。ここにサーバーのIPアドレス、ログイン・パスワード等が書かれています。

  1. 月々980円ですが、最初は利用料金2ヶ月分の1,960円が請求されます。
  2. DNSサーバーのサービスは別オプションです。ドメイン取得業者のDNSサービスが使えない場合は、DNSサーバーの料金が必要になります。

サーバーの起動

*2010/10/4追加*

仮登録完了メールが来た時点ではサーバーは起動されていませんので、メールに書かれた VPSコントロールパネル ログイン情報のURLをアクセスし、IPアドレス、パスワードを入力してログインすると下のような画面が表示されます。

ここで、仮想サーバ操作の「起動」ボタンを押すとサーバーが起動されます。サーバーの起動には少し時間がかかります。左メニューの「リモートコンソール」をクリックするとサーバーのコンソール画面が表示され、Linuxが起動される状況を確認できます。

設定

初期設定では root で外部から sshログインできるので root でログインしたら、自分用のアカウントを作りsudoの設定を行い、sshdの設定を変更しsshの root ログインを禁止した方が良いと思います。

また、iptables(ファイアーウォール)やSELinuxの設定はされてなので、必要があればして下さい。

OSは CentOS 5.5 です。がんばると他のOSもインストールできるようです・・・

インストール

サーバー類は最低限しかありませんので必要なサーバーは自分でインストールする必要があります。

Apache
sudo yum install httpd.x86_64 system-config-httpd.noarch httpd-devel.x86_64
sudo /sbin/chkconfig  --add httpd
sudo /sbin/service httpd start

http://サーバーのIP でapacheが動く事を確認して下さい。

Ruby

まず、Ruby on Railsを動かすのに必要な Rubyの拡張ライブラリー zlib, openssl の開発環境(header/lib)をインストールして下さい。

sudo yum install zlib-devel.x86_64
sudo yum install openssl-devel.x86_64

yumRuby は1.8.5 なので 最新の Rubyコンパイルしていれます。今回は既存のアプリの関係もある 1.8.7 をインストールしました。ruby は /usr/local/binに入りませすので PATH に /usr/local/binが在ることを確認して下さい。

cd InstallWorks
wget wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p302.tar.gz
tar xzf ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p302.tar.gz
cd ruby-1.8.7-p302
./configure
make
make test
sudo make install # テストが成功したら
gem
cd InstallWorks
wget http://production.cf.rubygems.org/rubygems/rubygems-1.3.7.tgz
tar xzf rubygems-1.3.7.tgz
cd rubygems-1.3.7
sudo ruby setup.rb
sudo gem update --system
sqlite3

バージョン 3.6.16 以上の sqlite3が必要なので、これもソースからインストールします。

cd InstallWorks
wget http://www.sqlite.org/sqlite-amalgamation-3.7.2.tar.gz
tar xzf sqlite-amalgamation-3.7.2.tar.gz
cd sqlite-amalgamation-3.7.2
./configure
make
sudo make install
Ruby on Rails

今回は既存のアプリの関係もある 2.3.8 をインストールしました。

sudo gem install rake
sudo gem install -v 2.3.8 rails
sudo gem install sqlite3-ruby

簡単なRailsアプリを作りscript/server で動作することを確認して下さい。

Passenger
sudo gem install passenger
sudo passenger-install-apache2-module   # 画面表示に注意しながら

/etc/httpd/conf/httpd.conf にmod_passengerを追加

LoadModule passenger_module /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.15/ext/apache2/mod_passenger.so
PassengerRoot /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.15
PassengerRuby /usr/local/bin/ruby

/etc/httpd/conf/httpd.conf などにテスト用Railsアプリの VirtualHost を追加

例 -- サーバーにはドメイン名(下の例ではtest.XXXX.com)が付いている必要があります

<VirtualHost *:80>
   ServerName test.XXXX.com
   DocumentRoot /home/rails_app/test/public
   <Directory /home/rails_app/test/public>
      AllowOverride all
      Options -MultiViews
   </Directory>
</VirtualHost>

Apache をリスタート

sudo /sbin/service httpd restart

ブラウザーから http://test.XXXX.com をアクセスし動作確認。詳細は users guidを。

Git

Ruby on Rails 開発といえば git ^^) ということで git も入れました。

yum では git をインストルできないようなので、ソースからインストールしまいた

cd InstallWorks
wget http://kernel.org/pub/software/scm/git/git-1.7.3.tar.bz2
tar xjf git-1.7.3.tar.bz2
cd git-1.7.3/
./configure
make
make test   # かなり時間がかかるので急ぎなら省略しても良いかも?
sudo make install

適当なリポジトリーを clone して動作を確認

以上。

感想

  • さくらVPS 早い(軽い)ですね。この状況が続くといいなぁ〜
  • CentOS5.5 はRuby on Rails を動かすには色々なソフトが古い ^^);

ssh attack された

あるお客様のサーバーを管理しているのですが、今朝 MRTG のCPU利用率が異常に上がっていました。
ログインしてみると、 sshdプロセスが たくさん動いています!

ログをチェックしたところ凄い勢いで 61.158.205.224 から sshログインを試みています。幸いログインは成功していませんでした、一安心 ^^)
とりあえず、お客様のサイトはアクセスできますが、この ssh attack は困るので sshd を一時的に停止し、再開したところ ssh attack は止んでいました。


ネットで検索してみると、sshのポート番号を 22 以外に変更するのが有効と書かれていたので変更しました。サーバー管理は気が抜けませんね・・・