yumで入れたnginxのWebDAVへは接続できない

普通に「nginx webdav」でググって出てくるような方法ではMacのFinderからさくっと接続……とはいかない。例えば

server {
  listen 443 default ssl;
  ssl on;
  ssl_certificate /etc/nginx/ssl/webdav.endaaman.me.crt;
  ssl_certificate_key /etc/nginx/ssl/webdav.endaaman.me.key;

  server_name webdav.endaaman.me;

  location / {
    root /var/webdav;

    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/.htpasswd;

    client_max_body_size 1000m;

    autoindex on;
    autoindex_exact_size off;
    autoindex_localtime on;

    client_body_temp_path /tmp/webdav;
    create_full_put_path on;

    dav_access group:r all:r;
    dav_methods PUT DELETE MKCOL COPY MOVE;

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

こんな感じの設定にする。そんで、ブラウザからhttps://webdav.endaaman.meに入ってBASIC認証すれば普通にファイルが見られる。ここまではいい。ただMacのFinderの「サーバへ接続」からアクセスすると

怒られる

な感じで怒られる。よくよくnginxのログを見てみると

36.2.153.169 - **** [22/Jul/2015:01:34:04 +0900] "OPTIONS / HTTP/1.1" 405 172 "-" "WebDAVLib/1.3"

という感じでOPTIONSメソッドを弾いている。詳しいことは分からないが、MacのFinderはOPTIONSメソッドを使うが、nginxで普通に使えるWebDAVモジュールではOPTIONSメソッドがサポートされていないので、接続がそこで弾かれているようである。

### OPTIONSメソッドに対応するにはnginx-dav-ext-moduleが必要になる  こいつを導入した上で、confファイルのlocationディレクティブに

dav_ext_methods PROPFIND OPTIONS;

の一行を追加すればいいようである。ただし当然、このモジュールはyum install nginxでインストールしたnginxには入ってない。なのでnginxのソースをコンパイルしてインストールする必要がある。

nginxのソースからインストールする

rpm-buildを使う手もあったが却って面倒くさくなりそうなので、ソースからインストールする。そもそもnginx自体が「各自細かく./configureオプションを設定して使ってくれ」という空気をかなり醸しているので、それに従う方が無難だろう。

これを書いている時の最新は1.9.3だったが、一応最新のSTABLEである1.8.0を使う。

$ wget http://nginx.org/download/nginx-1.8.0.tar.gz
$ tar xf nginx-1.8.0.tar.gz
$ git clone https://github.com/arut/nginx-dav-ext-module.git
$ cd nginx-1.8.0

すでにnginxをyumで入れてるなら、先に

$ nginx -V

をしてどこかにコピっておく。そして肝心の./configure

$ ./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_gunzip_module \
--with-http_gzip_static_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_stub_status_module \
--with-http_auth_request_module \
--with-mail \
--with-mail_ssl_module \
--with-file-aio \
--with-ipv6 \
--with-http_spdy_module \
--add-module=./nginx-dav-ext-module 

yumで入れたnginxのnginx -Vのオプションに、nginx-dav-ext-moduleを有効にする--add-module=../nginx-dav-ext-moduleを追加して、--with-cc-opt--paramを抜いて、path周りはデフォルト(/usr/local/)にするとこんな感じ。

そんで、先にyumでnginxを入れてたならconfやらのバックアップしてsudo yum erase nginxしてから、

$ make
$ sudo make install

でインストール。最初のconfに足りなかった

dav_ext_methods PROPFIND OPTIONS;

を追加してnginxを起動すれば、MacのFinderから接続可能となるはずだ。