Linux
lftp

LFTPでサーバ間でファイル転送をする

More than 1 year has passed since last update.

ごあいさつ

ひょんなきっかけで6日目を担当することになりましたAkkykgといいます
安請け合いしたものの開発や技術バリバリな世界でやってきていないので
あまり目を見張るような内容では無いかもしれませんが書いていきたいとおもいます


今回のお題

ずばり、「サーバー間でデータコピーをやってみる 」です

最近の仕事でしばしばあるのが、『あるサーバーにあるコンテンツを別のサーバーに移行(=コピー)してほしい』というものです。

どんなときにデータコピーなんてするの?

  • ミラーサイトとして同期した状態を保つとき
  • サーバーを引っ越すとき
  • 同じコンテンツのサーバを複数作成したいとき(ホットスタンバイサーバーなど)
    etc・・・データコピーの場面はたまにあるものです、あるということにさせてください

手法やソフトなど様々考えられるテーマですがこれを今回、サーバー間でやってみます

一般的なパターン

  1. パソコンにダウンロード用スペースを確保
  2. 移行前サーバーからパソコンへデータをダウンロード
  3. パソコンから新サーバーへデータをアップロード

ここでいくつか問題があります。

  • 右から左へ渡すだけなのにパソコンにスペース確保しないといけないとか
  • 下りと上りで通信が2回発生して時間とかいろいろ
  • パーミッションが継承されないとかされるように気をつけないといけないとか

無駄が多いように感じますよね

ということで、今回はサーバー間でデータの転送をしたいと思います
(とはいえパソコン不要、というわけではありませんけど)

今回の方法

今回はデータ転送時にパソコンを通さずサーバー間で転送したいと思います
また、環境によってはrsyncで転送しちゃうぜ、というのもありますが今回は、sshもroot権限も使わずあくまでもFTPによる転送をしたいと思います

前提

現行サーバでのプログラム利用可否

プログラム 利用可否
ssh 利用不可
rsync 当然不可
sftp 当然不可
lftp 利用可

つまりZenlogicのご利用者が実行可能な範囲を想定しています


LFTPを採用する

今回はFTPの中でも、もっと利用が増えてほしいLFTPを採用してみます

LFTPとは

LFTPは、UNIXおよびUnix系システム向けのコマンド行ファイル転送プログラム(FTPクライアント)の1つ。Alexander V. Lukyanov が開発し、・・・続きはWikipediaで

なんでLFTP?

  • ミラー転送ができるので途中で何らかの問題で中断しても再実施時に無駄が少ない
  • ミラーサイトのようにコンテンツを定期的に同じ状態に保つ用途にも利用可

データの移行をやってみよう

注意)今回は説明の簡略化の為、同じレンサバ、同じリージョンであると想定し、
サーバ間のデータ転送は外部からはクローズドな状態で行えるものとさせてください
そのため、セキュアな通信についてを排除して説明します

サーバー 対象となるディレクトリ
サーバーA(移行元) /virtual/htdocs/source_dir
サーバーB(移行先) /virtual/htdocs/target_dir

実施の流れ

サーバーAにFTPユーザー作成

この後の手順で作成するいくつかのファイルをサーバーAに設置するのに利用します
こちらは特に手順に影響ありませんのででも構いません

サーバーBにFTPユーザー作成

こんな感じで作成します(以降の説明時のサンプルで使用するので表で記載しておきます)

設定値
FTPユーザー FTP_USER
FTPユーザーのホームディレクトリ /virtual/
FTPパスワード FTP_PASSWORD

FTP接続用datファイルの作成

今回はsshを使用した対話式での実行ではありませんので、FTP接続に利用する情報を
datファイルとして作成し、外部から参照できない場所へ設置し読み込ませて転送を行います
ファイル名は「lftp.dat」としました

このファイルをパソコンからサーバーAにFTPでアップロードしてください
今回は、/virtual/cgi-data/というパスに設置したことを想定しています

lftp.dat
open -u FTP_USER,FTP_PASSWORD {サーバーBのIPかホスト名}
mirror -R --delete --verbose=3 --log=/virtual/cgi-data/lftp.log /virtual/htdocs/source_dir htdocs/target_dir
echo end
close
quit

簡単な説明

  • サーバーBにFTP接続をかけてます
  • LFTPではmirrorというコマンドが利用できますのでこれを使います
  • 今回は--deleteオプションを付けて同期転送するように記載しています
  • ログファイルの出力先を移行元サーバの所定のパスで指定しています

そして注意すべきは転送元、転送先のディレクトリ指定です
サーバーBへはあくまでもFTPユーザで接続しているので、FTPユーザーのホームディレクトリの設定が影響します
ホームディレクトリが「/virtual」なので、ターゲットとなるdirの指定としては「/htdocs/targt_dir」となるわけです

今回は使ってませんが、「--only-newer」を指定することで、移行元のファイルが移行先より新しいもの(=更新あったもの)のみコピーなんてことができます

LFTP実行用phpスクリプト

サーバーAのドキュメントルートにFTPでアップロードします

kick_transfer.php
<?
    $str = shell_exec('/usr/bin/lftp -f /virtual/cgi-data/lftp.dat');
    echo "<pre>$str</pre>";
?>

簡単な説明
- 先ほど作成したlftp.datの情報を-fオプションで食わせて実行しています
- 実行した結果をブラウザに出すようにしていますがあまりに膨大な場合は必須の内容ではありません

LFTP実行用phpスクリプトの実行

パソコンから、ブラウザで先ほどのスクリプトを実行します
実行が終わればFTPでサーバーAから削除することをおすすめします

cronから実行させたい場合

パソコンからやっぱり人間が実行させるのか、つきっきりかよ」という方は
cronに登録するという方法もあります
特に定期的に実行したい場合等はcron一択でしょう

lftp.sh
/usr/bin/lftp -f /virtual/cgi-data/lftp.dat

注意点(Zenlogicの場合)

  • 改行コードはLFに設定すること
  • パーミッションを0755にすること
  • ドキュメントルート以下に設置する必要はありません
  • ログファイルを日単位に残したいなどの場合はdatファイルに少し細工が必要です

あとは設定画面(Zenlogicではコントロールパネル)のcron設定にて、上記のファイルを
実行する設定をしてください(例:1回限り、定時実行、などなど)

実行結果の確認

実行結果は/virtual/cgi-data/lftp.logに出力されますので確認します
※ 定時実行の場合はログファイルを日単位で取得するような記述が必要です

サーバーAのファイル構造

上で記載したサンプルファイルは、以下のように設置を想定しています

/virtual
│
├ cgi-data/
│ │
│ ├ lftp.dat(LFTPスクリプト)
│ ├ lftp.log(実行後のログ)
│ └ (lftp.sh(cron実行する場合のみ))
│
└ htdocs/
   │
   └ default/(ドキュメントルート想定)
       │
       └ kick_transfer.php

さいごに

ということで今回は移行元、移行先ともにZenlogicであることを想定して、LFTPによるサーバー間のデータ転送を取り上げました

異なるレンサバのサーバへ転送する場合等ではセキュアな通信方式を考慮すべきで、
LFTPでもSFTPやFTPS等が可能ですが今回は説明簡略化の為にばっさり省きました

最近ではセキュアが叫ばれている状況につき、要不要に関係なくセキュアを意識した記事にしようかとも思いましたが、今回は「LFTPによるサーバー間のファイル転送」にポイントを絞って書かせていただきました