S3への転送が遅い件について
前回 書いた、 s3cmd を使ったamazon S3 への転送が200〜300Kbしか出ない件です。
試しに 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つのサーバーにまとめてみました。
移行前
さくら VPS 512Mをつかって以下のアプリを運用していました (1.8.7@rails2.3 という記法は rvmで使う記法で Ruby 1.8.7 で Rails 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の良さが失われてしまいます ^^);
Apacheを reverse proxyにしてアプリケーションサーバーを別に起動するなら、Passenger以外に Unicornという選択肢もあります。いろいろと調べた結果
rvm wrapper 1.8.7@2.3 rails2.3 unicorn_rails
- 起動スクリプト(/etc/init.d/xxxx)はrootで動作しますが、unicorn の実行は su - でrvmのインストールされたユーザーで実行すればよい
- unicornはPassengerと同等の性能でメモリー使用量が少ない(らしい)
ということで、rvm + unicorn でRails を運用すれば、好きなバージョンの Ruby 、 好きなバージョンの Rails を 複数起動できます。
現状
ただし、お客様の環境もPassengerで動いていますのでステージングはPassengerで動かしておいた方が良いと思います。そこで今回の移設では
- 新サーバー
としました。 新サーバーは 2Gメモリーなので、これだけ動かしても快適です :-)
cronの中でsudo を使う方法
訳あって、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アドレスやGatewayのIPアドレスは、インストール前に ifconfig, netstat等を使って調べておきましたが、インストールを開始すると下の画像の様に VPSコンソールに表示されるのでメモしておかなくても大丈夫でした。
- 2. インストル用のコンソール
インストル用のコンソールは下の画像のように、ブラウザーとは別のウインドウが出来ます。
- 3. 途中で入力するアカウントに付いて
[STEP 4]で入力するアカウントは通常のユーザーですが、adminグループに属しているのでインストール後直ぐに sudo できますからインストル後、このアカウントでログインし sudo して root のパスワード等を設定できます。
Ruby on Rails を動かす為のインストール
- 1. コンパイラー等
sudo apt-get install build-essential
- 2. ruby
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
- 4. sqlite3, apache, git
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 に作ってみたメモです。
契約
さくらのVPS|VPS(仮想専用サーバ)はさくらインターネットから申し込むと、カード決済の場合数時間で「[さくらのVPS] 仮登録完了のお知らせ」というメールが来ます。ここにサーバーのIPアドレス、ログイン・パスワード等が書かれています。
サーバーの起動
*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
yum のRuby は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 以外に変更するのが有効と書かれていたので変更しました。サーバー管理は気が抜けませんね・・・