WindowsファイルサーバをLinuxからcifsマウントしてApacheのWebDAVで公開する方法 WebDAVでWindowsファイルサーバをマウント公開する自宅のファイルサーバ(Windows2000)を,インターネットから参照,更新できるようにしたい. この場合,簡単にやるなら以下のような選択肢があると思われる.
今回,エクスプローラから開けるという利便性から,WebDAVを使って実現することにした.
前提
ファイルサーバは内部LAN上にあるが,インターネットからアクセス可能なサーバでApache(WebDAV)が稼働しており, そのサーバからファイルサーバをマウントして参照することで, 間接的にインターネットからファイルサーバにアクセスできるという状態を作る.
1.WebDAVの設定まず,Apache2.0から2.2への移行に書いてある内容で,mod_davとmod_encodingが使える状態にしておく.日本語ファイル名を含むディレクトリをWebDAVで公開する場合,例えば以下のようにmod_encodingを設定するのが定番だと思う. <IfModule mod_encoding.c> SetServerEncoding UTF-8 DefaultClientEncoding JA-AUTO-SJIS-MS SJIS AddClientEncoding "cadaver/" EUC-JP NormalizeUsername on </IfModule> ファイルサーバをマウントするローカルのディレクトリは,普通にAliasやDocumentRoot等で設定しておく. ただし,EnableSendfile Offの指定が必要なので注意. これを設定しないと,Apacheがレスポンスのヘッダだけ返してボディ部分を返さず,エラーは出ないがブラウザに何も表示されないという奇怪な現象が発生した. EnableSendfileについては,以下を参考にしました. 結局うちの場合は,こんな感じの設定だ. Alias /fsmnt /mnt/fs/ <Location /fsmnt> EnableSendfile Off EncodingEngine on DAV On Order Allow,Deny AuthName "file server WebDAV Folder" AuthType Basic AuthUserFile /usr/local/apache2/conf/.basic Require user aaaaa RemoveHandler .cgi Options Indexes DirectoryIndex .not.exist.file IndexOptions FancyIndexing IgnoreCase NameWidth=* SuppressDescription </Location> Options Indexes以降の設定は,WebDAVが使えない環境からはFancyIndex(mod_autoindex)で閲覧だけでもできるようにしようという意図です. 今回の内容とは直接関係ありません.
※追記 IndexOptions FancyIndexing IgnoreCase NameWidth=* SuppressDescription Charset=UTF-8 なお,このあたりのmod_autoindexの話は,mod_autoindexで遊ぶ(日付書式の改造など)に詳細を記述してあります.WebDAVとは別の話なので.
2.smbclientの設定 (cifsでのmount)ファイル名の文字コードWebDAVの設定でSetServerEncodingがUTF-8だということは必然的に, 日本語ファイル名がUTF-8になるようにファイルサーバをmountしなければならない.そのため, mount -t smbfs //fsever/home /mnt/fs/home -o username=test,password=xxxxx,codepage=cp932,iocharset=utf8 どうも, iocharset=utf8が効いてくれないようだ. それで色々調べたところ,smbfsではなくcifsとしてマウントすれば良いようだ. mount -t cifs //fsever/home /mnt/fs/home -o username=test,password=xxxxx,iocharset=utf8 mount.cifsのmanページによると,cifsとはsmbの後継らしい.後継なら,多分こっちを使う方が良いのだろう. また,smbfsにあったcodepageのオプションは無くなっていた. しかしiocharsetは残っていて,これは今までと同じようにローカルでのファイル名として使用するキャラクタセットの指定だ. 今回は上述したように,WebDAVと共用するためUTF-8にする必要があるので,utf8を指定している. ここが無指定だと,カーネルをビルドしたときのnls_defaultというのが使われるらしい. うちのCentOS 4.4では無指定時はUTF-8になったのでそれでも悪くはないのだが, こういうものは省略せずに明示的に指定しておいた方が良かろう.
マウント時のパーミッションmountはたいていrootで行うので,そのままだとApacheの実行ユーザ(nobodyやdaemon)に書き込み権限が無く, WebDAVでのファイル更新ができない.
色々やり方はあると思うが,今回はファイルサーバアクセス用のグループ(fsmount)を作成し,
groupadd fsmount mount -t cifs //fsever/home /mnt/fs/home -o username=test,password=xxxxx,iocharset=utf8,uid=nobody,gid=fsmount httpd.confを変更する Group fsmount
※2008.01.20 追記
※2008.02.05 追記 WebDAV経由で作成したファイルのパーミッション (2009.04.02 追加)なお,WebDAV経由でファイルを新規作成した場合,次のようなパーミッションになった.-rw-r--r-- 1 nobody fsmount 399 4月 2 15:16 GNUGlobal.txt
ここはnobodyユーザのumaskの関係なので,Apache起動用のスクリプト(apachectl)を編集して,
Apache起動時にumaskを変更するようにした. umask 002 -rw-rw-r-- 1 nobody fsmount 3.その他セキュリティを考慮して,このWebDAVへのアクセスには,Basic認証をかけてかつhttps(SSL)としている.httpsを使うのには他にも理由があって... 会社からアクセスするときに,会社のproxyサーバがWebDAVのメソッドを通してくれないという現象があるのだが, httpsを使えばproxyサーバは関与しなくなるので通るようになると. |