LinuxForum.Fans
Тема

Nginx + owncloud webdav и траблы при работе с davfs2

Автор: denis32 4 сообщений 4058 просмотров
#245797

Первое в чём была проблема, nginx из коробки не поддерживал методы PROPFIND OPTIONS.
Пересобрал его добавив модуль https://github.com/arut/nginx-dav-ext-module

Попробовал промонтировать, на что получил:

text
$ sudo mount -t davfs https://cloud-storage.mydomain.com/files/webdav.php /mnt/cloud-storage.mydomain.com
Please enter the username to authenticate with server
https://cloud-storage.mydomain.com/files/webdav.php or hit enter for none.
  Username: denis
Please enter the password to authenticate user denis with server
https://cloud-storage.mydomain.com/files/webdav.php or hit enter for none.
  Password:  
/sbin/mount.davfs: warning: the server does not support locks
$ ls /mnt/cloud-storage.mydomain.com
404  lost+found

В логах nginx'a:
[14/Apr/2012:01:50:44 +0400] "PROPFIND /files/webdav.php/ HTTP/1.1" 207 249 "-" "davfs2/1.4.6 neon/0.29.3"
Поправил файл /etc/davfs2/davfs2.conf

text
use_locks       0

Перемонтировал,

text
sudo umount /mnt/cloud-storage.mydomain.com
sudo mount -t davfs https://cloud-storage.mydomain.com/files/webdav.php /mnt/cloud-storage.mydomain.com

На этот раз всё смонтировалось без всяких передупреждений, но файлов которые в облаке лежали я так не увидел.

text
$ ls -la /mnt/cloud-storage.mydomain.com
итого 1
drwxr-xr-x 3 root root 104 Апр 14 02:05 .
-rw-r--r-- 1 root root   0 Апр 14 02:05 404
drwx------ 2 root root   0 Апр 14 01:47 lost+found
$ file /mnt/cloud-storage.mydomain.com/404
/mnt/cloud-storage.mydomain.com/404: empty

Конфиг nginx'a:

text
server {
   listen 443 ssl;
   ssl_certificate /etc/nginx/cert/cloud-storage.mydomain.com.crt;
   ssl_certificate_key /etc/nginx/cert/cloud-storage.mydomain.com.key;
   server_name cloud-storage.mydomain.com;   
   ssl_protocols              TLSv1 TLSv1.1 TLSv1.2;
   ssl_ciphers                 AES256-SHA:AES128-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
   ssl_prefer_server_ciphers   on;
   ssl_session_cache shared:SSL:10m;
   ssl_session_timeout 10m;
   access_log    /var/log/nginx/cloud-storage.mydomain.com/access.log;
   error_log       /var/log/nginx/cloud-storage.mydomain.com/error.log;
   root /var/www/cloud-storage.mydomain.com;
   index index.php;
  # dav_methods PUT DELETE MKCOL COPY MOVE;
  # dav_ext_methods PROPFIND OPTIONS;
   #create_full_put_path on;
 #  dav_access user:rw group:rw all:r;
   client_max_body_size 1000M; # set maximum upload size
   add_header Strict-Transport-Security max-age=31536000;
   add_header X-Frame-Options SAMEORIGIN;
   add_header X-Content-Security-Policy "allow 'self';";
   add_header X-XSS-Protection "1; mode=block";
   keepalive_timeout   70;
   
   location ~ ^/(data|config|\.ht|db_structure\.xml|README) {
      deny all;
   }
   
   location / {
      try_files $uri $uri/ @webdav;
   }

location @webdav { try_files $uri $uri/ 404; fastcgi_split_path_info ^(.+\.php)(/.*)$; fastcgi_pass unix:/var/run/fpm/cloud-storage.mydomain.com.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param HTTPS on; include fastcgi_params; }

location ~ \.php$ { try_files $uri $uri/ 404; fastcgi_pass unix:/var/run/fpm/cloud-storage.mydomain.com.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param HTTPS on; include fastcgi_params; } location ~ /.svn/ { deny all; } location ~ /.git/ { deny all; } location ~ /.cvs/ { deny all; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { log_not_found off; access_log off; } }

В чём может быть дело?

ps nginx/1.0.15, debian 6.0.4, PHP 5.3.10-1~dotdeb.1

#246143

Добрый день, я автор модуля nginx-dav-ext-module.

Вы монтируете урл https://cloud-storage.mydomain.com/files/webdav.php.
Судя по конфигу, обработчик этого урла проксирует запросы к fastcgi, если try_files не нашел файлов и просто не дает обработчику PROPFIND выполниться. Такая конфигурация будет отдавать отдельные файлы, но она не может возвратить список файлов в директории, что и является основным функционалом модуля nginx-dav-ext-module. Не очень понятно, зачем вы хотите подружить WebDAV и FastCGI/PHP, но если проксирование уберете, все будет работать.

#246144
arut написал:
Добрый день, я автор модуля nginx-dav-ext-module.

Вы монтируете урл https://cloud-storage.mydomain.com/files/webdav.php.
Судя по конфигу, обработчик этого урла проксирует запросы к fastcgi, если try_files не нашел файлов и просто не дает обработчику PROPFIND выполниться. Такая конфигурация будет отдавать отдельные файлы, но она не может возвратить список файлов в директории, что и является основным функционалом модуля nginx-dav-ext-module. Не очень понятно, зачем вы хотите подружить WebDAV и FastCGI/PHP, но если проксирование уберете, все будет работать.

Доброго времени!
Возможно, я чего-то не понимаю, но в owncloud работа с webdav предоставляется по средствам какого-то расшерения к php. Зы. http://code.google.com/p/sabredav/
Я просто не понимаю, каким образом убрать "проксивирование" в этом случае.
И ещё, практически такая-же конфигурация nginx'a дана в официальной документации owncloud http://owncloud.org/support/setup-and-installation/linux-server/
И так-же, если не использовать try_files - ведь стоит ждать ответа от бекэнда fpm вроде "No input file specified"?

#246246

Проблема пропала, как убрал try_files. Но как я и пологал. Если запросить https://cloud-storage.mydomain.com/files/webdavv.php - получаем ответ от FastCGI демона php-fpm - No input file specified
Хм, хотя, если в именованном локейшне @webdav не использовать try_files, а дописать только для location ~ \.php$ - вроде норм.
Хехе. А если создать test.php через webdav, он не появится в облаке. Если создать через веб-интерфейс, всё нормально. Если пробовать удалить его через webdav - тоже не удалится. :)

Войдите или зарегистрируйтесь, чтобы ответить.