nginx и owncloud в подпапке

Я хочу иметь экземпляр owncloud в подпапке на моем сервере nginx. Но у меня проблемы с некоторыми файлами, запрошенными opwncloud (кажется, что css и js не загружаются).

Вот файл конфигурации nginx для этого виртуального хоста:

server {
   listen         80;
   server_name    blackblock.22decembre.eu;
   return 301     https://blackblock.22decembre.eu$request_uri;
}

server {
listen 443 default_server ssl;

server_name blackblock.22decembre.eu;
root /srv/www/blackblock/;

access_log  /var/log/nginx/blackblock.access.log;
error_log   /var/log/nginx/blackblock.errors.log;

index index.html index.php;

# This block will catch static file requests, such as images, css, js
# The : prefix is a "non-capturing" mark, meaning we do not require
# the pattern to be captured into $1 which should help improve performance
location ~* \.(:ico|css|js|gif|jpeg|png)$ {
    # Some basic cache-control for static files to be sent to the browser
    expires max;
    add_header Pragma public;
    add_header Cache-Control "public, must-revalidate, proxy-revalidate";
}

# remove the robots line if you want to use wordpress" virtual robots.txt
# location = /robots.txt { access_log off; log_not_found off; }
location = /favicon.ico { access_log off; log_not_found off; }

# this prevents hidden files (beginning with a period) from being served
location ~ /\. { access_log off; log_not_found off; deny all; }

#location ~ ^(?<script_name>.+?\.php)(?<path_info>/.*)?$ {
location ~ \.php {
    fastcgi_param SCRIPT_NAME $fastcgi_script_name;
    #fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $path_info;
    fastcgi_index index.php;
    fastcgi_pass unix:/run/php5-fpm.sock;
    include fastcgi_params;
}

location /roundcube/program/js/tiny_mce/ { alias /usr/share/tinymce/www/; }
location /roundcube/(config|temp|logs) { deny all;}

 ##### owncloud
 location ~ /owncloud/ {
root /srv/www/blackblock/owncloud/;
try_files $uri $uri/ index.php;

#client_max_body_size 10G; # set max upload size
    #fastcgi_buffers 64 4K;

    rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;
    rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;
    rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;

    location ~ ^/remote.php(/.*)$ {
            fastcgi_split_path_info ^(.+\.php)(/.*)$;
            fastcgi_pass unix:/run/php5-fpm.sock;
    include fastcgi_params;
    }

    error_page 403 /core/templates/403.php;
    error_page 404 /core/templates/404.php;

    location ~ ^/(data|config|\.ht|db_structure\.xml|README) {
            deny all;
    }

# The following 2 rules are only needed with webfinger
rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;
rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;
rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;
rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;

    # Optional: set long EXPIRES header on static assets
    #location ~* ^.+\.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
     #       expires 30d;
            # Optional: Don't log access to assets
      #      access_log off;
#   }
}

    ##### torrent (not related to owncloud, flask application)
location = /flask-torrent { rewrite ^ /flask-torrent/ last; }

 }

Я не могу найти, почему owncloud не загружается правильно! Вы можете взглянуть на веб-сайт, я чувствую себя хорошо и защищен для этого: https://blackblock.22decembre.eu/owncloud/ (сертификаты cacert). Если я запускаю конкретный виртуальный хост для owncloud, он работает отлично, но я не хочу, я предпочитаю его в подпапке этого хоста (черный блок)!

4 ответа

Ни один из других ответов не сработал для меня, я наконец-то получил рабочее решение из этого блога: http://www.aelog.org/install-owncloud-in-a-subdirectory-using-nginx/

Вот версия:

server {
    listen 80;
    server_name example.com;
    # enforce https
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/ssl/nginx/cloud.example.com.crt;
    ssl_certificate_key /etc/ssl/nginx/cloud.example.com.key;

    # Add headers to serve security related headers
    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;

    # Path to the root of your website (one level above owncloud folder)
    root /var/www;
    # set max upload size
    client_max_body_size 10G;
    fastcgi_buffers 64 4K;

    # Disable gzip to avoid the removal of the ETag header
    gzip off;

    # Uncomment if your server is build with the ngx_pagespeed module
    # This module is currently not supported.
    #pagespeed off;

    # ownCloud blacklist
    location ~ ^/owncloud/(?:\.htaccess|data|config|db_structure\.xml|README) {
        deny all;
        error_page 403 = /owncloud/core/templates/403.php;
    }

    index index.php;

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location ~ ^/(?:\.htaccess|data|config|db_structure\.xml|README){
        deny all;
    }

    location /owncloud {
        error_page 403 = /owncloud/core/templates/403.php;
        error_page 404 = /owncloud/core/templates/404.php;

        rewrite ^/owncloud/caldav(.*)$ /remote.php/caldav$1 redirect;
        rewrite ^/owncloud/carddav(.*)$ /remote.php/carddav$1 redirect;
        rewrite ^/owncloud/webdav(.*)$ /remote.php/webdav$1 redirect;

        rewrite ^(/owncloud/core/doc[^\/]+/)$ $1/index.html;

        # The following rules are only needed with webfinger
        rewrite ^/owncloud/.well-known/host-meta /public.php?service=host-meta last;
        rewrite ^/owncloud/.well-known/host-meta.json /public.php?service=host-meta-json last;
        rewrite ^/owncloud/.well-known/carddav /remote.php/carddav/ redirect;
        rewrite ^/owncloud/.well-known/caldav /remote.php/caldav/ redirect;

        try_files $uri $uri/ index.php;
    }

    location ~ \.php(?:$|/) {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param HTTPS on;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
    }

    location / {
         root /var/www/html/;
         index index.html;
    }

    # Optional: set long EXPIRES header on static assets
    location ~* \.(?:jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
        expires 30d;
        # Optional: Don't log access to assets
        access_log off;
    }
}

Я создал запрос на получение документации здесь: https://github.com/owncloud/documentation/pull/1704

Причина, по которой ownCloud не работает в подпапке с nginx, заключается в том, что nginx по умолчанию не включает подпапку в параметре SCRIPT_NAME, Если ownCloud находится на domain.tld/owncloud/index.php, это ожидает $_SERVER['SCRIPT_NAME'] быть /owncloud/index.php, но nginx по умолчанию (если вы include fastcgi_params;) устанавливает его index.php, Решение состоит в том, чтобы переопределить поведение: добавить fastcgi_param SCRIPT_NAME /owncloud/$fastcgi_script_name; в php-location-block в файле конфигурации nginx.

Соответствующие части моего файла конфигурации nginx приведены ниже. Обратите внимание, что я не проверил это полностью; на первый взгляд, кажется, работает. Моя система: nginx 1.2.1 и php 5.4.4 на 64-битной Debian Wheezy.

    location /owncloud/ {
            alias /var/www/owncloud/;
            location ~ ^/owncloud/(data|config|\.ht|db_structure\.xml|README) {
                    deny all;
            }
            rewrite ^/owncloud/caldav(.*)$ /owncloud/remote.php/caldav$1 redirect;
            rewrite ^/owncloud/carddav(.*)$ /owncloud/remote.php/carddav$1 redirect;
            rewrite ^/owncloud/webdav(.*)$ /owncloud/remote.php/webdav$1 redirect;
            rewrite ^/owncloud/.well-known/host-meta /owncloud/public.php?service=host-meta last;
            rewrite ^/owncloud/.well-known/host-meta.json /owncloud/public.php?service=host-meta-json last;

            rewrite ^/owncloud/.well-known/carddav /owncloud/remote.php/carddav/ redirect;
            rewrite ^/owncloud/.well-known/caldav /owncloud/remote.php/caldav/ redirect;

            rewrite ^/owncloud/apps/([^/]*)/(.*\.(css|php))$ /owncloud/index.php?app=$1&getfile=$2 last;
            rewrite ^(/owncloud/core/doc/[^\/]+/)$ $1/index.html;

            try_files $uri $uri/ index.php;

            location ~ ^/owncloud/(.+?\.php)/? {  # note the question mark here and in the next line!
                    fastcgi_split_path_info ^/owncloud/(.+?\.php)(/?.*)$;
                    set $path_info $fastcgi_path_info;  # workaround for bug: try_files resets fastcgi_path_info for some reason.
                    try_files $fastcgi_script_name = 404;
                    include fastcgi_params;
                    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                    fastcgi_param PATH_INFO $path_info;
                    fastcgi_param HTTPS on;
                    fastcgi_param SCRIPT_NAME /owncloud/$fastcgi_script_name;  # !!!
                    fastcgi_pass unix:/var/run/php5-fpm.sock;
            }
    }

Сначала позвольте мне указать, что / еще не работает /index.php работает, а это значит, что index оператор по какой-то причине не работает, или что ваш URI соответствует другому блоку.

На всякий случай переписать location ~ /owncloud/ в location ^~ /owncloud

Ваша конфигурация требует много переписывания, помните, что конфигурация по умолчанию была сделана для owncloud, установленного в корневом каталоге, а ваша в подкатегории вам нужно исправить несколько вещей, например, имейте в виду, что $uri будет включать в себя /owncloud а также /file.ext будет прыгать за пределы папки owncloud, поэтому все переписывает, как

rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;

нужно исправить из-за 2 вещей,

  1. ^/caldav(.*)$ никогда не случится, ури всегда начнется с ^/owncloud
  2. /remote.php/... будет смотреть за пределы собственного облака

Исправление будет что-то вроде этого:

rewrite ^/owncloud/caldav(.*)$ /owncloud/remote.php/caldav$1 redirect;

Попробуйте их для начала и скажите, как это происходит.

Извините, если вы уже рассмотрели это, но есть несколько пунктов, включая несколько директив о расположении Nginx, которые отсутствуют в конфигурации, которую вы опубликовали. Я бы порекомендовал взглянуть на примечания по конфигурации (ссылка внизу этого поста) и убедиться, что у вас есть директивы Nginx для данных ownCloud и ownCloud.

Проверьте обработчик Nginx PHP:

Ваша конфигурация Nginx должна включать в себя обработчик для PHP5-FPM, поместите его перед директивой server в верхней части конфигурации Nginx:

upstream php5-fpm-handler {
        server unix:/var/run/php5-fpm.sock;
}

Проверьте директивы Nginx:

Примеры:

location /owncloud {
   rewrite ^ https://$http_host$request_uri? permanent;
   }

   location ~ ^/owncloud/(data|config|\.ht|db_structure\.xml|README) {
         deny all;
   }

Проверьте конфигурацию PHP5-FPM:

Кроме того, убедитесь, что конфигурация пула PHP5-FPM (обычно где-то, например, /etc/php5/fpm/pool.d/www.conf в Ubuntu) настроена на прослушивание сокета, а не порта TCP, который должен соответствовать вашему обработчику. Ниже приведены директивы конфигурации сокета PHP5-FPM и порта.

Пример сокета:

listen = /var/run/php5-fpm.sock

Пример порта (закомментированный для соответствия с вышестоящим обработчиком):

;listen = 127.0.0.1:9000

Кроме того, если вы еще этого не сделали, ознакомьтесь с примечаниями по настройке ownCloud для Nginx.

http://doc.owncloud.org/server/5.0/admin_manual/installation/installation_others.html

Другие вопросы по тегам