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 вещей,
^/caldav(.*)$
никогда не случится, ури всегда начнется с^/owncloud
/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