2013年6月30日日曜日

メモ(チーズ)

TVでチーズのことやってました。おいしそー。

 ウォッシュチーズ エポワス。赤ワインに合うらしい。

 白カビチーズ ブリー。白ワインに合うらいし。癖がなく食べやすい。

 フレッシュチーズ キャステロ パイン味。アルコール飲めない人にもおすすめ。

いずれも美味しそう・・見つけたら食べてみよー(で忘れないように備忘録)。

2013年6月23日日曜日

nginxでwebdavを構築してみる

nginxでWebDAVを使うために、
 ・nginxをソースを入手する
 ・WebDAV用のモジュール(ソース?)を入手する
  ※Windows標準のWebClientを使うため、methodを拡張(PROPFIND,OPTIONS)を扱える
   ようにする
 ・rpmを作成する

構築する環境は、
 ・CentOS 6.4(64bit)
  ・nginx1.4.1
で試してみる。

1.nginx+WebDAV拡張モジュールインストールのためのライブラリのインストール

必要となる以下のパッケージを入れる
・nginxのため
  zlib
  zlib-devel
  pcre
  pcre-devel
  perl
・nginx-dav-ext-moduleのため
  expat
  expat-devel

2.nginxのソースパッケージを入手

# cd /tmp
# wget http://nginx.org/packages/centos/6/SRPMS/nginx-1.4.1-1.el6.ngx.src.rpm
# rpm -ivh  nginx-1.4.1-1.el6.ngx.src.rpm

インストール先は~/rpmbuildになるみたい。

3.拡張モジュールを入手るする

WebDAVの拡張モジュールのソースはgitで管理されているので、gitから入手。

# cd ~/rpmbuild/SOURCES/
# git clone https://github.com/arut/nginx-dav-ext-module.git

上記で以下のフォルダにソースファイルが展開される

~/rpmbuild/SOURCES/nginx-dav-ext-module

4.rpmパッケージの作成

今回必要なモジュールのみインストールをすることを目的に、SPECファイルを
修正する。
ポイントは以下の通り
 1.ソースは1.4.1をベースとする(デフォルトはWebから最新を入手)
 2.不要なライブリの依存を外す(openssl-devel)
 3.不要なnginxのオプションを、ocnfigureから外す
これをspecファイルに反映する。

# vi ~/rpmbuild/SPECS/nginx.spec

>>


Source0: nginx-1.4.1.tar.gz

#BuildRequires: openssl-devel




%build
./configure \
        --prefix=%{_sysconfdir}/nginx \
        --sbin-path=%{_sbindir}/nginx \
        --conf-path=%{_sysconfdir}/nginx/nginx.conf \
        --error-log-path=%{_localstatedir}/log/nginx/error.log \
        --http-log-path=%{_localstatedir}/log/nginx/access.log \
        --pid-path=%{_localstatedir}/run/nginx.pid \
        --lock-path=%{_localstatedir}/run/nginx.lock \
        --user=%{nginx_user} \
        --group=%{nginx_group} \
        --with-http_dav_module \
        --with-cc-opt="%{optflags} $(pcre-config --cflags)" \
        --add-module=/home/chika/rpmbuild/SOURCES/nginx-dav-ext-module \
        $*
make %{?_smp_mflags}
%{__mv} %{_builddir}/%{name}-%{version}/objs/nginx \
        %{_builddir}/%{name}-%{version}/objs/nginx.debug
./configure \
        --prefix=%{_sysconfdir}/nginx \
        --sbin-path=%{_sbindir}/nginx \
        --conf-path=%{_sysconfdir}/nginx/nginx.conf \
        --error-log-path=%{_localstatedir}/log/nginx/error.log \
        --http-log-path=%{_localstatedir}/log/nginx/access.log \
        --pid-path=%{_localstatedir}/run/nginx.pid \
        --lock-path=%{_localstatedir}/run/nginx.lock \
        --user=%{nginx_user} \
        --group=%{nginx_group} \
        --with-http_dav_module \
        --with-cc-opt="%{optflags} $(pcre-config --cflags)" \
        --add-module=/home/chika/rpmbuild/SOURCES/nginx-dav-ext-module \
        $*
make %{?_smp_mflags}


<<

上記のインストールパスの変更などを行いたい場合は、
 ・~/.rpmmacrosに変数を記載
 ・上記のspecファイルに修正を加える。
で対応する。

# rpmbuild -bb ~/rpmbuild/SPECS/nginx.spec

これで、以下にファイルが出来上がり。
 ~/rpmbuild/RPMS/x86_64/nginx-1.4.1-1.el6.ngx.x86_64.rpm

5.nginxをインストール

# rpm -ihv ~/rpmbuild/RPMS/x86_64/nginx-1.4.1-1.el6.ngx.x86_64.rpm

準備中...                ########################################### [100%]
   1:nginx                  ########################################### [100%]
----------------------------------------------------------------------

Thanks for using NGINX!

Check out our community web site:
* http://nginx.org/en/support.html

If you have questions about commercial support for NGINX please visit:
* http://www.nginx.com/support.html

----------------------------------------------------------------------

# /usr/sbin/nginx -V
nginx version: nginx/1.4.1
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC)
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --user=nginx --group=nginx --with-http_dav_module --with-cc-opt='-O2 -g -I/usr/local/include' --add-module=/home/nginx/rpmbuild/SOURCES/nginx-dav-ext-module

指定のモジュールが組み込まれているようです!次回はWebDAVの設定です。

2013年6月21日金曜日

apacheでWebDAV(その3)

いよいよapache + WebDAVの設定に入ります。

まずはデフォルトで用意されているWebDAの設定を使ってみる。

1.httpd.confの修正

 httpd.confにてWebDAV用モジュールと設定ファイル、あとそのWebDAV設定ファイルに記載
 されている、必要モジュールの有効化をする(コメントを外す)。

>>
LoadModule dav_module modules/mod_dav.so

LoadModule dav_fs_module modules/mod_dav_fs.so



LoadModule auth_digest_module modules/mod_auth_digest.so

Include conf/extra/httpd-dav.conf
<<

2.WebDAVのデフォルト設定ファイル(httpd-dav.conf)の確認

httpd-dav.confを見ると、
 ・対象フォルダをDocumentRoot外のフォルダ(/usr/local/apache2/uploads)をAliasで
  /uploadsと見せかけている
 ・Digest認証が設定されている。プロバイダはファイル。
 ・以下の条件をいずれかを満たせばアクセスOK。
  -メソッドがGET POST OPTIONSであること
  -userはadminであること
となっていますね。この設定のまま使ってみよう。

3.ディレクトリの作成

httpd-dav.confにあったディレクトリを作成する。まずはDavLockDB用のディレクトリ。

# mkdir /usr/local/apache2/var

# chown apache:apache /usr/local/apache2/var

次はWebDAV用のディレクトリ。

# mkdir /usr/local/apache2/uploads

# chown apache:apache /usr/local/apache2/uploads

4.Digest認証のアカウントの作成

# /usr/local/apache2/bin/htdigest -c "/usr/local/apache2/user.passwd" DAV-upload admin

でパスワードを求められるので設定。

これで完了いうことで、ブラウザからつついてみる。あれ??403が返ってくる。
認証の問題なのか?と思い、digest認証部分をすべて外してみるが、やはり変わらない。
ということで調査開始。

5.apacheのログをデバックモードに変更

httpd.confに記載されている個所を変更

>>
#LogLevel warn
LogLevel debug
<<

apacheを再起動。

# service httpd graceful

これで再度ブラウザから試してみると、ログ(/usr/local/apache2/logs/error_log)に以下の
エラーメッセージが出ていました。

Cannot serve directory /usr/local/apache2/uploads/: No matching DirectoryIndex (index.html) found, and server-generated directory index forbidden by Options directive

ディレクトリ参照が禁止されてとのことらしい。DocumentRootには

Options Indexes FollowSymLinks

がついているし、なぜディレクトリ参照が禁止されているのだろう。。。あっ!今回使ったapacheの
サンプルは、aliasを使ってDocumentRoot配下以外のディレクトリを参照させる設定になってまし
たね。ということは、そこにもOptionsを記載をしないと、そもそも参照ができないってことですね。

サンプルのhttpd-dav.confを使っているので、そこに追記し、再起動してみる。

>>
<Directory "/usr/local/apache2_2/uploads">
    Dav On

    AuthType Digest
    AuthName DAV-upload
    # You can use the htdigest program to create the password database:
    #   htdigest -c "/usr/local/apache2/user.passwd" DAV-upload admin
    AuthUserFile "/usr/local/apache2/user.passwd"
    AuthDigestProvider file

    # Allow universal read-access, but writes are restricted
    # to the admin user.
    <RequireAny>
        Require method GET POST OPTIONS
        Require user admin
    </RequireAny>
    Options Indexes FollowSymLinks ★
</Directory>
<<

再起動後にブラウザでアクセスすると、、無事アクセスができました。
そこで改めて、Windows8からWebDAVとしてアクセスをしてみると、認証後(admin)無事アクセスが
できました。

ちなみに、、上記の★が本当に必要なのか?今一度はずしてみると、ブラウザはアクセスはできませんが、WebDAVは参照できました!
ということで、デフォルトの設定でWebDAVをアクセスすることができました。

めでたしめでたし。

2013年6月14日金曜日

apacheでWebDAV(その2)

前回までは、コンパイルもできて、さぁ実行!というところで、httpd -lでモジュールが組み込まれているか?を確認してみた。

# /usr/local/apache2/bin/httpd -l

Compiled in modules:

  core.c
  mod_so.c
  http_core.c
  event.c

頭を浸してみた。そりゃそうか。sharedなんだから、組み込まれているはずがない。
ということで、念のため確認してみる。

# ./configure --enable-ssl=true --enable-dav=true --with-ssl=/opt/openssl-1.0.1e


# /usr/local/apache2/bin/httpd -l

Compiled in modules:
  core.c
  mod_so.c
  http_core.c
  event.c

変わらん・・。ここでも10分ほど悩む・・・そうだ。2.4ではデフォルトがshared(dso)なのだから、
trueではいかんのでは?

# ./configure --enable-ssl=static --enable-dav=static --with-ssl=/opt/openssl-1.0.1e

でどうだろうか。

# /usr/local/apache2/bin/httpd -l

Compiled in modules:
  core.c
  mod_so.c
  http_core.c
  mod_ssl.c
  event.c
  mod_dav.c
  mod_dav_fs.c

おおーっ成功。振り返ってみれば、あたりまえだけど、、ちょっとうれしい(バージョンが変わる
って大変ですね)。
ということで、sharedにして以降進める。



2013年6月12日水曜日

apacheでWebDAV

apacheでWebDAVを実装してみよ~。今回の目的は以下の通り。

 ・SSLで安全に!
 ・htdocs配下にない、ディレクトリを参照させる(alias、シンボリック)
 ・日本語対応してみる

1.ソースからコンパイル

今回の目的に向けて、以下のようにapache2をコンパイルから始める。
もともとのインストールはここを参照。

# cd /usr/local/src/httpd-2.4.4
# ./configure --enable-ssl=shared --enable-dav=shared

オプションの意味としては、以下の通り

--enable-ssl=shared
 ApacheでSSLを処理するためのモジュール(mod-ssl)をDSOで利用可能(=shared)にする。

--enable-dav=shared
 WebDAVのためのフロントエンドモジュールmod-davと、バックエンドモジュールmod-dav-fsがインストールされ、DSOで
 利用可能にする。mod-dav-fsはファイルシステムをWebDAVで使うためのモジュール。

 ※mod-davとmod-dav-fsを分離する目的がよくわからなかったけど、バックエンドモジュールにはmod-dav-svnという
  バージョン管理モジュールを選択することもできるらしい。これは当然ファイルシステムではなく、BerkleyDBを使って
  バージョン管理ができるらしいです。今度やってみよう!
  
ということでコンパイルしてみたら、、

checking for OpenSSL version >= 0.9.7... FAILED
configure: WARNING: OpenSSL version is too old
no
checking whether to enable mod_ssl... configure: error: mod_ssl has been requested but can not be built due to prerequisite failures

ということで、OpenSSLのバージョンが古いらしい。

# yum info openssl

Name        : openssl
Arch        : x86_64
Version     : 1.0.0
Release     : 27.el6
・・・

Available Packages
Name        : openssl
Arch        : i686
Version     : 1.0.0
Release     : 27.el6_4.2
・・・

Name        : openssl
Arch        : x86_64
Version     : 1.0.0
Release     : 27.el6_4.2
・・・

となって、1.0.0が使えるようなので、これにUPGRADEしてみる。

# yum upgrade  openssl -y

・・・

Updated:
  openssl.x86_64 0:1.0.0-27.el6_4.2

Complete!

で、再度apacheのコンパイル。

checking for OpenSSL version >= 0.9.7... FAILED
configure: WARNING: OpenSSL version is too old
no
checking whether to enable mod_ssl... configure: error: mod_ssl has been requested but can not be built due to prerequisite failures

あれ??変わってない。ということでopensslの参照先を指定しないといけないらしい。
でも、--with-sslで指定するにしても、どのディレクトリを指定すればよいのだろうか。。
ということで、opensslをソースからインストールしてみることにした(ここ)。

( ※デフォルトのopensslインストールではだめなのだろうか??どこかで検証したいところ)

で再度チャレンジ。

# ./configure --enable-ssl=shared --enable-dav=shared --with-ssl=/opt/openssl-1.0.1e

おおっ、、無事完了。ということで、make & make install。さぁ最後に確認してみよう。

# /usr/local/apache2/bin/httpd -l

Compiled in modules:

  core.c
  mod_so.c
  http_core.c
  event.c

あれっ??mod_dav.cとかmod_ssl.cとか出てこないし、、まだかかりそうです。。(次回に続く)




openssl 1.0.1eのインストール

apache + SSLの構築の流れで、openssl0.97が古くインストールができなかったので(ここ)、
opensslをインストールしてみることにした。

1.ソースの入手
 
 http://www.openssl.org/source/からソールをゲットする

# cd /tmp
# wget http://www.openssl.org/source/openssl-1.0.1e.tar.gz

2.コンパイル

# tar xvfz openssl-1.0.1e.tar.gz
# cd openssl-1.0.1e
# ./config --prefix=/opt/openssl-1.0.1e shared zlib

 ※シェアードライブラリとしてコンパイルすること(shared)と、zlibを使うこと(zlib)を
  指定しています。

 コンパイルはうまくいった感じ・・引き続いてmake

3.make

# make

 ・・・

make[2]: *** [c_zlib.o] エラー 1
make[2]: ディレクトリ `/tmp/openssl-1.0.1e/crypto/comp' から出ます
make[1]: *** [subdirs] エラー 1
make[1]: ディレクトリ `/tmp/openssl-1.0.1e/crypto' から出ます
make: *** [build_crypto] エラー 1

となり失敗。ログをさかのぼってみると

c_zlib.c:25:18: error: zlib.h: そのようなファイルやディレクトリはありません

という箇所からエラーが始まっているので、どうもライブラリが足りないらしい。
恐らくzlib-develだろうと思い(あてずっぽうだなぁ。。)、yumでインストールしてから、
再度チャレンジ!

今度はうまくいったようで、make installで完了。

4.確認

インストールが正常にインストールされているか?を確認

# cd /opt/openssl-1.0.1e/bin
# openssl version

OpenSSL 1.0.0-fips 29 Mar 2010

# ldd openssl

        linux-vdso.so.1 =>  (0x00007fff001ff000)
        libssl.so.1.0.0 => /opt/openssl-1.0.1e/lib/libssl.so.1.0.0 (0x00007f8aa1743000)
        libcrypto.so.1.0.0 => /opt/openssl-1.0.1e/lib/libcrypto.so.1.0.0 (0x00007f8aa1366000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f8aa115e000)
        libz.so.1 => /lib64/libz.so.1 (0x00007f8aa0f48000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f8aa0bb4000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f8aa19ad000)

ということで、バージョンもライブラリも指定ディレクトリのものを使用しているみたいで、
OKでしょう。。


2013年6月11日火曜日

tips:Redhat6のiscsiでディスクを再認識させる方法

お仕事でやったのでtipsに記録。

状況は、iSCSI環境で、ディスクの削除・追加を実施した際に、同じデバイスファイルが使われる
ことがあるかと思いますが、その際に古いディスクの情報が残ってしまいます。
ということで、古いディスクの情報を削除し、再度あたらしくなった情報を読み込みます。

以下の例では、/dev/sdcデバイスファイルを1GBから10GBに変更したい際の例。

1.該当LUNのディスク情報の確認

# ls -l /dev/disk/by-path/ip-*lun-0

lrwxrwxrwx 1 root root 10  6月 10 06:33 2013 /dev/disk/by-path/ip-192.168.x.x:3260-iscsi-iqn.xxxxxxxxxx-lun-0 -> ../../sdc

# fdisk -l /dev/sdc

ディスク /dev/sdc: 1073 MB, 1073741824 バイト
ヘッド 34, セクタ 61, シリンダ 1011
Units = シリンダ数 of 2074 * 512 = 1061888 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00000000

2.該当ディスクの削除

# echo 1 > /sys/block/sdc/device/delete

# ls -l /dev/disk/by-path/ip-*lun-0

ls: cannot access /dev/disk/by-path/ip-*lun-0: そのようなファイルやディレクトリはありません

何も表示されない。成功。

3.ディスクの再認識

まずはiSCSIのセッションを確認する(本当はすでに知っているはずですが・・)

# iscsiadm -m session

tcp: [1] 192.168.x.x:3260,7 iqn.1992-04.com.xxx:xx.xxxxxx.xx

これでセッション5であることがわかる。

# ls -ld /sys/class/iscsi_host/host*/device/session1

drwxr-xr-x 6 root root 0  3月 26 19:47 2013 /sys/class/iscsi_host/host5/device/session1

ここのhost5を記録。これを使ってスキャンするパスを確認する。

# find /sys/class/iscsi_host/host5/device/scsi_host/host*/scan

/sys/class/iscsi_host/host5/device/scsi_host/host5/scan

このパス情報を使って、デバイスをスキャンする。

# echo "- - -" > /sys/class/iscsi_host/host5/device/scsi_host/host5/scan

そしてデバイスを確認してみると、、

# ls -l /dev/disk/by-path/ip-*lun-0

lrwxrwxrwx 1 root root 10  6月 11 06:33 2013 /dev/disk/by-path/ip-192.168.x.x:3260-iscsi-iqn.xxxxxxxxxx-lun-0 -> ../../sdc

できてました!日付も新しい。念のため

# fdisk -l /dev/sdc

ディスク /dev/sdc: 10.7 GB, 10737418240 バイト
ヘッド 64, セクタ 32, シリンダ 10240
Units = シリンダ数 of 2048 * 512 = 1048576 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00000000

ディスク /dev/sdc は正常なパーティションテーブルを含んでいません

おおおおっ。10GBになってた。終了。

-----おまけ-----
上記のようなディスクがいっぱいあった場合を想定してちょっと工夫してみた。
対象LUNがわかっている前提になるが、

1.対象LUNの現状を確認する(以下の例はLUNが13,14,15の場合)

# for i in 13 14 15;do ls -l /dev/disk/by-path/ip-*lun-$i; done|awk -F "/" '{print "fdisk -l /dev/"$NF""}'|sh

これで現在のデバイスが古い情報なのかどうか?が判断できる(容量から)。

2.対象LUNを削除する

# for i in 13 14 15;do ls -l /dev/disk/by-path/ip-*lun-$i; done|awk -F "/" '{print "echo 1 > /sys/block/"$NF"/device/delete"}'|sh

3.対象デバイスを再スキャンする

# find /sys/class/iscsi_host/host*/device/scsi_host/host*/scan|awk -F: '{print "echo \"- - -\" > "$0}'|sh

4.対象LUNを確認する

# for i in 13 14 15;do ls -l /dev/disk/by-path/ip-*lun-$i; done|awk -F "/" '{print "fdisk -l /dev/"$NF""}'|sh

これでちょっと楽になったかな(やり方が野暮ったい感じはするけども。。)。

2013年6月7日金曜日

tips:CentOSのディストリビューション名とバージョンの確認

uname ではカーネルのバージョンしか出力されない。そしていつも忘れてしまうので、備忘録。

方法その1.

#cat /etc/redhat-release

CentOS release 6.2 (Final)


方法その2.

#cat /etc/issue

何も表示されないこともある。。以上!