SSHでポートフォワード


ポートフォワードについての説明は省きます。
想定しているのはOpenSSHを用いて「ローカルのLinuxマシン」から「経由するリモートサーバ」を経由して、「目的のサーバ」に辿り着くことです。
まずリモートサーバで接続用のユーザを作成して、そのユーザの公開鍵と秘密鍵を作成します。
秘密鍵の方をローカルマシンのLinuxユーザの~/.ssh以下に設置します。
この時、~/.sshが無ければ作成して、パーミッションを700、秘密鍵パーミッションを600にします。
またリモートサーバの~/.sshパーミッションが700、公開鍵のパーミッションも600にしなければなりません。
(※すでにWindows上でPuTTY形式の秘密鍵を持っている場合は、PuTTYgenを使ってOpenSSH形式の秘密鍵に変換して下さい。)

次にローカルサーバ上で


$ ssh (リモートサーバの接続用ユーザ)@(リモートサーバのホスト名) -N -L \
(ポートフォワードに使用するローカルサーバの任意のポート番号):(目的のサーバのホスト名):(目的のサーバのポート番号) \
-i ~/.ssh/(秘密鍵の名前)
あとは別のターミナルを立ち上げ、

// 例として、SVNリポジトリをポートフォワードで参照。
$ svn co []http://localhost:(ポートフォワードに使用するローカルサーバの任意のポート番号)/svn/testrepos[]
のように、ポートフォワードを行います。


Debianの時刻フォーマットを変更する。

Debian lennyを最小構成でインストールすると、dateコマンドにおける時刻表示がUTCになっている。
JSTとかあんまりないと思うがGMTとかに変更する場合は、


$ dpkg-reconfigure tzdata
とコマンド打ち、タイムゾーンを設定してやれば良い。
MySQLなどのデーモンの時刻は、デーモンを再起動しないと反映されないので注意。

Imagickのインストール


Imagickは画像処理エンジンImageMagickPHP拡張です。

これをVPSベースのCentOS5.3にインストールします。


// ImageMagickと開発環境のインストール
$ yum install -y imagemagick imagemagick-devel

// Imagickのインストール
$ cd /usr/lib/php5/bin

// 最後に出る、エクステンションの名前(+パス)をコピー
$ ./pecl install imagick

$ vim /etc/php.ini
// extension_dirにパスが設定されているはずなので、以下の一行を追加(extension_dirのパスと違う場合絶対パスで表記)
extension='エクステンションの名前'

これで、Imagickを使えるようになりました。

SVNの$Id$置換


SVNでバージョン管理を行っているファイル中の$Id$キーワードをコミット時に自動で

ファイル名 リビジョン コミット日時 コミットユーザ
のフォーマットで展開する方法。


PHPファイルで行う場合・・

$ vim ~/.subversion/config
※上部省略

### Set enable-auto-props to 'yes' to enable automatic properties
### for 'svn add' and 'svn import', it defaults to 'no'.
### Automatic properties are defined in the section 'auto-props'.
enable-auto-props = yes

[auto-props]
*.php = svn:keywords=Id
### The format of the entries is:
### file-name-pattern = propname[=value][;propname[=value]...]
### The file-name-pattern can contain wildcards (such as '*' and
### '?'). All entries which match will be applied to the file.
### Note that auto-props functionality must be enabled, which
### is typically done by setting the 'enable-auto-props' option.
# *.c = svn:eol-style=native
# *.cpp = svn:eol-style=native
# *.h = svn:eol-style=native
# *.dsp = svn:eol-style=CRLF
# *.dsw = svn:eol-style=CRLF
# *.sh = svn:eol-style=native;svn:executable
# *.txt = svn:eol-style=native
# *.png = svn:mime-type=image/png
# *.jpg = svn:mime-type=image/jpeg
# Makefile = svn:eol-style=native

バージョン管理


みなさんは社内でWEBアプリケーションの開発を行うときのバージョン管理フローをどのように行っているでしょうか。

私の勤務する会社ではSubversionを使用して、以下のような方法でバージョン管理を行っています。

※制作部とはマークアップやデザインを行う部署の事です。サーバにログインして作業する必要は無いのでTortoiseSVNなどSVNクライアントで成果物をコミットします。
※システム部には1人1台ずつ開発用のサーバが提供されています。実際には1台のサーバをXENで仮想化しています。


このフローを実現する段階は以下のように分けられます。

  1. 共用開発サーバにSVNサーバ(HTTP)を導入。
  2. 実際にSVNリポジトリを作成し、共用サーバ及び個人サーバにチェックアウト(=作業コピーの作成)。
  3. 個人サーバはローカルで、共用サーバはグローバルにWEBを公開。
  4. SVNのhook機能を利用して、個人サーバからのコミット時に自動で共用サーバの作業コピーが更新されるようにする。
  5. 本番反映を行うため、rsyncまたはlftpでサーバ間のファイルの同期を実現。
  6. 本番反映ページの開発。
  7. 制作部用にSVNクライアントでの流れを確認。
  8. 外部からの作業を行うために社内にSSHサーバを設置して、ポートフォワード(トンネリング)を行う。



以降は新たな案件が入り次第、2〜5を行うだけです。


以上の1〜8の具体的な導入方法は次回以降、1エントリずつ紹介します。
なお3についてですが、
個人サーバ・共用サーバともにApacheのバーチャルホストで実現できます。
ただし以下の条件では注意が必要です。

  • 社内のLAN内に共用サーバを設置。
  • IPアドレスが一つしか割り当てられていない。
  • ルータがポートベースのルーティングしかできない。(ネームベースでルーティングできない。⇒できるルータってあるんですかね??第4層では無理な気がするのですが。。)
  • そのIPを使用して既に別のサーバでWEBを公開していて、そのサーバを共用サーバにはしたくない。

この場合は既にあるサーバから共用サーバにリバースプロキシをかけることで解決します。
どちらにしてもApacheの設定リバースプロキシでサーバ移行を見て頂ければ良いと思いますので、以降のエントリでの説明を省きます。
また7についてはただの作業ですのでこれも割愛します。


この方法でバージョン管理及び、アップユーザの管理が行えます。
尚、当たり前の事ですが各サーバのIPアドレスによるポート制限は必ず行いましょう。
特に共用開発サーバ⇒本番サーバのFTPに注意しましょう。


シェルで一斉置換

シェルを使って、あるカレントディレクトリ以下の、
特定の拡張子のファイルに含まれる文字列を置換する方法。


// EXT:置換対象とするファイルの拡張子
// TO:置換後の文字列
// FROM:置換前の文字列
$ EXT="php";FROM="example2";TO="example";AFILES=`find ./ -name "*.$EXT"`;FILES=`grep -l $FROM $AFILES`;
for FILE in $FILES; do cp $FILE $FILE.back; sed -e "s;$FROM;$TO;g" $FILE.back > $FILE;done;
※ページ幅の都合上コマンドに改行が入っていますが、実際には改行しません。