Nginx で WebDAV 環境構築、PROPFIND 405 が使えなかったのでソースからコンパイルしてみた

# WebDAV
最近では結構お馴染みの規格「WebDAV」ですがMicroSoftが先導して作った規格だけど、なぜかWindows8では使えない（正確にはちょっと手間かかる）とか、なんか放置気味のプロトコルですが、FTPとかscpとかより敷居が低いのと、最近のメディアプレーヤーだとDLNAとならんで対応してたりするので家で動画みるときに便利なこいつ。

でもってそんな便利な環境はすでにApache で環境構築済みなわけなんですが、GW中で暇なのでNginx で WebDAV 環境構築をさくっと作ってみようと思ってみました。そしてまたハマッタｗ。つー自分備忘録です。

# PROPFINDが405
こちの記事「[nginxでWebDAV (nginx-dav-ext-moduleはなし)](http://qiita.com/megmogmog1965/items/c23fb1b28f32c09e5501)」を見てさっくりyumで環境を作ってみたのですが、WebDAVクライアントからアクセスするとPROPFINDが405がでるんですよ。

```
192.168.11.1 - - [05/May/2015:08:40:23 +0900] "OPTIONS / HTTP/1.1" 405 166 "-" "Rei.Fs.WebDAV/1.11.12
```

なんでだ？って思ったら。「PROPFIND, OPTIONS」メソッドを解釈できないためらしい。dav_methods では「PROPFIND, OPTIONS」が定義できない。

> [WebDAVでPROPFINDが405](http://lunatear.net/archives/000520.html)

# 仕方ないのでソースからコンパイル
いつものvagrant環境を作成しそこで動作テストしてみます。ソースをコンパイルするのでコンパイル環境を作成するぜい！！

コンパイル環境のインストールとnginx, nginx-dav-ext-moduleソースをダウンロードします。

```
$ sudo yum install expat-devel
$ sudo yum install wget gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel gd gd-devel
$ wget http://nginx.org/download/nginx-1.9.0.tar.gz
$ tar zxvf nginx-1.9.0.tar.gz 
$ cd nginx-1.9.0
$ git clone https://github.com/arut/nginx-dav-ext-module.git
```

コンパイルオプションは、yum でインストールされるオプションと同等とします。ここで注意する点は、```--add-module=./nginx-dav-ext-module``` を含めること。

```
$ cd nginx-1.9.0
# ./configure --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 --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' --add-module=./nginx-dav-ext-module
$ make
$ sudo make install
```

nginx ユーザーを作成します。

```
$ sudo useradd -s/sbin/nologin -d/usr/local/nginx -M nginx
```

/etc/init.d/ に nginx の起動／終了スクリプトファイルをダウンロードします。
余分な文字列が含まれているので ```service nginx start``` してエラーが出たら適宜削除する。

```
# cd /etc/init.d
# wget -O nginx "http://wiki.nginx.org/index.php?title=RedHatNginxInitScript&action=raw&anchor=nginx"
# chmod +x nginx
```

# 設定ファイルを記述するぜい
なんだか /etc/nginx/nginx.conf あまりいけてないので修正します。

```text:/etc/nginx/nginx.conf
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    server_tokens off;
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    keepalive_timeout  65;
    include /etc/nginx/conf.d/*.conf;
}
```

# WebDavの定義を記述します
その前に ```/etc/nginx/conf.d```を作成しときます。

```text:/etc/nginx/conf.d/webdav.conf
server {
  listen       8888;
  server_name  localhost;

  location / {
  root /tmp;
    # デフォルトのキャラクターコード
    charset utf-8;

    # ブラウザから確認するとき
    autoindex on;
    autoindex_exact_size off;
    autoindex_localtime on;

    # アップロードサイズの上限
    client_max_body_size   100m;

    # WebDAV設定
    dav_methods  PUT DELETE MKCOL COPY MOVE;

    # nginx-dav-ext-module の拡張メソッド
    dav_ext_methods PROPFIND OPTIONS;

    # WebDAVでのアクセス権を設定
    dav_access group:r all:r;
    client_body_temp_path  /tmp;
    create_full_put_path on;

    access_log /var/log/nginx/webdav.access.log;
    error_log /var/log/nginx/webdav.error.log;
  }
}
```

# CarotDAV
WindowsのWebDAVクライアントソフト「[CarotDAV](http://rei.to/carotdav.html)」からアクセスしてみます。

# 次回は
ローカル環境だったら色々と制限薄くていいだろうけど、とりあえずDigest 認証とSSL位は設定しておく。ってことで環境を作ってみる。
さて、お昼ご飯いこうっと～～。