Nginx

Nextcloud Nginx 反向代理 MIME 類型問題

  • June 24, 2020

我在 FPM 模式下的容器設置中執行 Nextcloud。應用程序容器本身執行php-fpm組件,我有一個額外的容器執行 nginx 作為 Web 伺服器。我非常密切地關注這個例子:

https://github.com/nextcloud/docker/tree/master/.examples/docker-compose/with-nginx-proxy-self-signed-ssl/mariadb/fpm

這是我的 docker-compose.yml 文件:

 nextcloud:
   image: nextcloud:17.0.1-fpm-alpine
   container_name: nextcloud
   environment:
     - REDIS_HOST=redis
     - MYSQL_HOST=db
   volumes:
     - nextcloud-data:/var/www/html
   depends_on:
     - mariadb
     - redis
   env_file:
     - ./config/mariadb_nextcloud.env
   
 nextcloud-web:
   build: ./nextcloud-web
   container_name: nextcloud-web
   restart: always
   volumes:
     - nextcloud-data:/var/www/html:ro
   environment:
     - VIRTUAL_HOST={{ nextcloud_external_url }}
     - VIRTUAL_PORT=80
     - LETSENCRYPT_HOST={{ nextcloud_external_url }}
   depends_on:
     - nextcloud

這是nginx.conf被複製到 nextcloud-web 容器中的文件(基於 Nginx,除了添加配置文件之外沒有其他更改):

worker_processes auto;

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


events {
   worker_connections  1024;
}


http {
   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;
   #tcp_nopush     on;

   keepalive_timeout  65;

   set_real_ip_from  10.0.0.0/8;
   set_real_ip_from  172.16.0.0/12;
   set_real_ip_from  192.168.0.0/16;
   real_ip_header    X-Real-IP;

   #gzip  on;

   upstream php-handler {
       server nextcloud:9000;
   }

   server {
       listen 80;

       # Add headers to serve security related headers
       # Before enabling Strict-Transport-Security headers please read into this
       # topic first.
       #add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
       #
       # WARNING: Only add the preload option once you read about
       # the consequences in https://hstspreload.org/. This option
       # will add the domain to a hardcoded list that is shipped
       # in all major browsers and getting removed from this list
       # could take several months.
       add_header Referrer-Policy "no-referrer" always;
       add_header X-Content-Type-Options "nosniff" always;
       add_header X-Download-Options "noopen" always;
       add_header X-Frame-Options "SAMEORIGIN" always;
       add_header X-Permitted-Cross-Domain-Policies "none" always;
       add_header X-Robots-Tag "none" always;
       add_header X-XSS-Protection "1; mode=block" always;

       # Remove X-Powered-By, which is an information leak
       fastcgi_hide_header X-Powered-By;

       # Path to the root of your installation
       root /var/www/html;

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

       # The following 2 rules are only needed for the user_webfinger app.
       # Uncomment it if you're planning to use this app.
       #rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
       #rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;

       # The following rule is only needed for the Social app.
       # Uncomment it if you're planning to use this app.
       #rewrite ^/.well-known/webfinger /public.php?service=webfinger last;

       location = /.well-known/carddav {
           return 301 $scheme://$host:$server_port/remote.php/dav;
       }

       location = /.well-known/caldav {
           return 301 $scheme://$host:$server_port/remote.php/dav;
       }

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

       # Enable gzip but do not remove ETag headers
       gzip on;
       gzip_vary on;
       gzip_comp_level 4;
       gzip_min_length 256;
       gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
       gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;

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

       location / {
           rewrite ^ /index.php;
       }

       location ~ ^\/(?:build|tests|config|lib|3rdparty|templates|data)\/ {
           deny all;
       }
       location ~ ^\/(?:\.|autotest|occ|issue|indie|db_|console) {
           deny all;
       }

       location ~ ^\/(?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+)\.php(?:$|\/) {
           fastcgi_split_path_info ^(.+?\.php)(\/.*|)$;
           set $path_info $fastcgi_path_info;
           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;

           # Avoid sending the security headers twice
           fastcgi_param modHeadersAvailable true;

           # Enable pretty urls
           fastcgi_param front_controller_active true;
           fastcgi_pass php-handler;
           fastcgi_intercept_errors on;
           fastcgi_request_buffering off;
       }

       location ~ ^\/(?:updater|oc[ms]-provider)(?:$|\/) {
           try_files $uri/ =404;
           index index.php;
       }

       # Adding the cache control header for js, css and map files
       # Make sure it is BELOW the PHP block
       location ~ \.(?:css|js|woff2?|svg|gif|map)$ {
           try_files $uri /index.php$request_uri;
           add_header Cache-Control "public, max-age=15778463";
           # Add headers to serve security related headers (It is intended to
           # have those duplicated to the ones above)
           # Before enabling Strict-Transport-Security headers please read into
           # this topic first.
           #add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
           #
           # WARNING: Only add the preload option once you read about
           # the consequences in https://hstspreload.org/. This option
           # will add the domain to a hardcoded list that is shipped
           # in all major browsers and getting removed from this list
           # could take several months.
           add_header Referrer-Policy "no-referrer" always;
           add_header X-Content-Type-Options "nosniff" always;
           add_header X-Download-Options "noopen" always;
           add_header X-Frame-Options "SAMEORIGIN" always;
           add_header X-Permitted-Cross-Domain-Policies "none" always;
           add_header X-Robots-Tag "none" always;
           add_header X-XSS-Protection "1; mode=block" always;

           # Optional: Don't log access to assets
           access_log off;
       }

       location ~ \.(?:png|html|ttf|ico|jpg|jpeg|bcmap|mp4|webm)$ {
           try_files $uri /index.php$request_uri;
           # Optional: Don't log access to other assets
           access_log off;
       }
   }
}

這幾乎是上面連結中的標準配置。Nginx-proxy在這個容器前面,我使用了帶有letsencrypt伴侶的知名容器。大多數 Nextcloud 安裝工作(Web 前端、上傳/下載、應用程序、大部分管理門戶)。然而,我最近安裝了一個自定義應用程序(SAML 配置),但它的管理頁面沒有載入,而是給了我以下錯誤:

Content Security Policy: The page's settings blocked the loading of a resource at inline ("script-src").
The resource from “https://<my-url>.tld/apps/files/” was blocked due to MIME type (“text/html”) mismatch (X-Content-Type-Options: nosniff).
The resource from “https://<my-url>.tld/apps/files/” was blocked due to MIME type (“text/html”) mismatch (X-Content-Type-Options: nosniff).
The resource from “https://<my-url>.tld/apps/files/” was blocked due to MIME type (“text/html”) mismatch (X-Content-Type-Options: nosniff).

知道這裡發生了什麼嗎?任何幫助,將不勝感激。

原來這是一個文件權限問題。Web 容器沒有對該custom_apps文件夾的讀取權限,因此無法提供請求的文件。為什麼它沒有給出更有意義的錯誤資訊,我不能說。

引用自:https://serverfault.com/questions/1022718