Проблема — при попытке доступа к приложению (включая первый раз) я получаю ошибку 404 — Файл не найден.
При попытке доступа к приложению в браузере через nextcloud.example.com я получаю следующую ошибку из журнала консоли контейнера NextCloud FMP Docker:
172.19.0.5 - 04/Mar/2023:22:36:01 +0000 "GET /index.php" 404
А эта ошибка из журнала консоли контейнера NGinX Docker:
172.69.67.108 - - [04/Mar/2023:22:36:01 +0000] "GET / HTTP/2.0" 404 36 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36" "xxx.my.ip.xxx"
Настройка хоста сервера Docker и контейнеров
Операционная система хост-сервера Docker — Ubuntu 22.04 LTS
Контейнер Docker NGinX. Я знаю, что docker-compose.yml — лучший вариант, но пока я не добьюсь, чтобы он работал как следует, я запускаю контейнер с помощью:
docker run -p 80:80 -p 443:443 --name nginx \ --restart=unless-stopped \ -v certbot:/etc/letsencrypt \ -v nginx:/etc/nginx/conf.d \ -v www:/usr/share/nginx/html \ --network tools \ -d nginx
Это единственный контейнер на хосте Docker Server с открытыми портами, который использует монтирование томов для общего доступа:
- Сертификаты с контейнером CertBot
- NGinX Conf Directory для настройки конфигурации для каждого приложения
- HTML www root home для совместного использования с NextCloud FPM Docker Container
- Сетевые инструменты
Контейнер NextCloud FPM Docker, я запускаю контейнер с помощью:
docker run --name nextcloud-fpm \ --restart=unless-stopped \ -v www:/var/www/html \ -e 'TRUSTED_PROXIES=nginx' \ -e 'POSTGRES_HOST=database.server.com' \ -e 'POSTGRES_USER=database_user' \ -e 'POSTGRES_PASSWORD=database_user_password' \ -e 'POSTGRES_DB=databse_name' \ --network tools \ -d nextcloud:fpm
Этот контейнер запускается на тех же сетевых инструментах, чтобы не раскрывать порты приложения на сервере Docker Host, а также чтобы упростить создание стеков контейнеров и файла конфигурации NGinX, используя имена контейнеров вместо IP-адресов для обратных прокси-серверов.
- HTML www root home для совместного использования с контейнером NGinX Docker
- Переменные среды для доверенного прокси (контейнер NGinX)
- Переменные среды для базы данных PostgreSQL
- Этот контейнер запускает FPM на порту 9000.
- Сетевые инструменты
Файлы конфигурации NGinX, их два, один default.conf, в основном, предназначен для того, чтобы не допускать прямого доступа к хост-серверу по IP и порту (пример xxx.xxx.xxx.xxx:80 или xxx.xxx.xxx.xxx:443):
server { # Removes Web Server Info server_tokens off; # HTTP listen 80 default_server; listen [::]:80 default_server; listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server; ssl_reject_handshake on; # Identify Server without the name, hence just IP server_name _; # Return Empty Response return 444; }
Наконец, nextcloud.conf, он был взят изОфициальный репозиторий GitHub NextCloud FPM:
upstream php-handler { server nextcloud-fpm:9000; # In here I set up the Stream with the NextCloud FPM Container name } server { listen 80; listen [::]:80; server_name nextcloud.example.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl; listen [::]:443 ssl; server_name nextcloud.example.com; ssl_certificate /etc/letsencrypt/live/nextcloud.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/nextcloud.example.com/privkey.pem; # HSTS settings # 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 Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always; # set max upload size client_max_body_size 512M; 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/> # Pagespeed is not supported by Nextcloud, so if your server is built # with the `ngx_pagespeed` module, uncomment this line to disable it. #pagespeed off; # HTTP response headers borrowed from Nextcloud `.htaccess` 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 /usr/share/nginx/html/; # Since NGinX is the Web Server, I am pointing root to where the NextCloud Files are mounted inside the NGinX Container from the NextCloud FPM Container # Specify how to handle directories -- specifying `/index.php$request_uri` # here as the fallback means that Nginx always exhibits the desired behaviour # when a client requests a path that corresponds to a directory that exists # on the server. In particular, if that directory contains an index.php file, # that file is correctly served; if it doesn't, then the request is passed to # the front-end controller. This consistent behaviour means that we don't need # to specify custom rules for certain paths (e.g. images and other assets, # `/updater`, `/ocm-provider`, `/ocs-provider`), and thus # `try_files $uri $uri/ /index.php$request_uri` # always provides the desired behaviour. index index.php index.html /index.php$request_uri; # Rule borrowed from `.htaccess` to handle Microsoft DAV clients location = / { if ( $http_user_agent ~ ^DavClnt ) { return 302 /remote.php/webdav/$is_args$args; } } location = /robots.txt { allow all; log_not_found off; access_log off; } # Make a regex exception for `/.well-known` so that clients can still # access it despite the existence of the regex rule # `location ~ /(\.|autotest|...)` which would otherwise handle requests # for `/.well-known`. location ^~ /.well-known { # The rules in this block are an adaptation of the rules # in `.htaccess` that concern `/.well-known`. location = /.well-known/carddav { return 301 /remote.php/dav/; } location = /.well-known/caldav { return 301 /remote.php/dav/; } location /.well-known/acme-challenge { try_files $uri $uri/ =404; } location /.well-known/pki-validation { try_files $uri $uri/ =404; } # Let Nextcloud's API for `/.well-known` URIs handle all other # requests by passing them to the front-end controller. return 301 /index.php$request_uri; } # Rules borrowed from `.htaccess` to hide certain paths from clients location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/) { return 404; } location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) { return 404; } # Ensure this block, which passes PHP files to the PHP process, is above the blocks # which handle static assets (as seen below). If this block is not declared first, # then Nginx will encounter an infinite rewriting loop when it prepends `/index.php` # to the URI, resulting in a HTTP 500 error response. location ~ \.php(?:$|/) { # Required for legacy support rewrite ^/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+|.+\/richdocumentscode\/proxy) /index.php$request_uri; 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; fastcgi_param modHeadersAvailable true; # Avoid sending the security headers twice fastcgi_param front_controller_active true; # Enable pretty urls fastcgi_pass php-handler; fastcgi_intercept_errors on; fastcgi_request_buffering off; } location ~ \.(?:css|js|svg|gif)$ { try_files $uri /index.php$request_uri; expires 6M; # Cache-Control policy borrowed from `.htaccess` access_log off; # Optional: Don't log access to assets } location ~ \.woff2?$ { try_files $uri /index.php$request_uri; expires 7d; # Cache-Control policy borrowed from `.htaccess` access_log off; # Optional: Don't log access to assets } # Rule borrowed from `.htaccess` location /remote { return 301 /remote.php$request_uri; } location / { try_files $uri $uri/ /index.php$request_uri; } }
Что я уже пробовал
Моим первым побуждением было проверить логи, я поделился ими в начале этого поста, и на их основе я решил проверить, присутствуют ли файлы в обоих контейнерах. Я сделал это двумя разными способами:
У меня есть контейнер Portainer, работающий на том же сервере Docker Host, а также за контейнером Docker NGinX в качестве Proxy Reverse. Я подключил консоль и посмотрел на файлы внутри обоих контейнеров, также сделал это
docker exec container_name -it bash
на обоих контейнерах:Контейнер NGinX, помните, что крепление было на
/usr/share/nginx/html
root@61564cff4e67:/# ls -lha /usr/share/nginx/html total 180K drwxrwxrwx 15 www-data www-data 4.0K Mar 4 13:24 . drwxr-xr-x 3 root root 4.0K Feb 9 04:36 .. -rw-r--r-- 1 www-data www-data 3.2K Mar 4 13:24 .htaccess -rw-r--r-- 1 www-data www-data 101 Mar 4 13:24 .user.ini drwxr-xr-x 47 www-data www-data 4.0K Mar 4 13:24 3rdparty -rw-r--r-- 1 www-data www-data 19K Mar 4 13:24 AUTHORS -rw-r--r-- 1 www-data www-data 34K Mar 4 13:24 COPYING drwxr-xr-x 50 www-data www-data 4.0K Mar 4 13:24 apps drwxr-xr-x 2 www-data www-data 4.0K Mar 4 13:24 config -rw-r--r-- 1 www-data www-data 4.0K Mar 4 13:24 console.php drwxr-xr-x 23 www-data www-data 4.0K Mar 4 13:24 core -rw-r--r-- 1 www-data www-data 6.2K Mar 4 13:24 cron.php drwxr-xr-x 2 www-data www-data 4.0K Mar 4 13:24 custom_apps drwxr-xr-x 2 www-data www-data 4.0K Mar 4 13:24 data drwxr-xr-x 2 www-data www-data 12K Mar 4 13:24 dist -rw-r--r-- 1 www-data www-data 156 Mar 4 13:24 index.html -rw-r--r-- 1 www-data www-data 3.4K Mar 4 13:24 index.php drwxr-xr-x 6 www-data www-data 4.0K Mar 4 13:24 lib -rwxr-xr-x 1 www-data www-data 283 Mar 4 13:24 occ drwxr-xr-x 2 www-data www-data 4.0K Mar 4 13:24 ocm-provider drwxr-xr-x 2 www-data www-data 4.0K Mar 4 13:24 ocs drwxr-xr-x 2 www-data www-data 4.0K Mar 4 13:24 ocs-provider -rw-r--r-- 1 www-data www-data 3.1K Mar 4 13:24 public.php -rw-r--r-- 1 www-data www-data 5.5K Mar 4 13:24 remote.php drwxr-xr-x 4 www-data www-data 4.0K Mar 4 13:24 resources -rw-r--r-- 1 www-data www-data 26 Mar 4 13:24 robots.txt -rw-r--r-- 1 www-data www-data 2.4K Mar 4 13:24 status.php drwxr-xr-x 3 www-data www-data 4.0K Mar 4 13:24 themes -rw-r--r-- 1 www-data www-data 383 Mar 4 13:24 version.php
Контейнер NextCloud FPM, помните, что крепление было на
/var/www/html
root@938c95d0e1ae:/var/www/html# ls -lha total 180K drwxrwxrwx 15 www-data www-data 4.0K Mar 4 13:24 . drwxrwxr-x 1 www-data root 4.0K Feb 16 03:06 .. -rw-r--r-- 1 www-data www-data 3.2K Mar 4 13:24 .htaccess -rw-r--r-- 1 www-data www-data 101 Mar 4 13:24 .user.ini drwxr-xr-x 47 www-data www-data 4.0K Mar 4 13:24 3rdparty -rw-r--r-- 1 www-data www-data 19K Mar 4 13:24 AUTHORS -rw-r--r-- 1 www-data www-data 34K Mar 4 13:24 COPYING drwxr-xr-x 50 www-data www-data 4.0K Mar 4 13:24 apps drwxr-xr-x 2 www-data www-data 4.0K Mar 4 13:24 config -rw-r--r-- 1 www-data www-data 4.0K Mar 4 13:24 console.php drwxr-xr-x 23 www-data www-data 4.0K Mar 4 13:24 core -rw-r--r-- 1 www-data www-data 6.2K Mar 4 13:24 cron.php drwxr-xr-x 2 www-data www-data 4.0K Mar 4 13:24 custom_apps drwxr-xr-x 2 www-data www-data 4.0K Mar 4 13:24 data drwxr-xr-x 2 www-data www-data 12K Mar 4 13:24 dist -rw-r--r-- 1 www-data www-data 156 Mar 4 13:24 index.html -rw-r--r-- 1 www-data www-data 3.4K Mar 4 13:24 index.php drwxr-xr-x 6 www-data www-data 4.0K Mar 4 13:24 lib -rwxr-xr-x 1 www-data www-data 283 Mar 4 13:24 occ drwxr-xr-x 2 www-data www-data 4.0K Mar 4 13:24 ocm-provider drwxr-xr-x 2 www-data www-data 4.0K Mar 4 13:24 ocs drwxr-xr-x 2 www-data www-data 4.0K Mar 4 13:24 ocs-provider -rw-r--r-- 1 www-data www-data 3.1K Mar 4 13:24 public.php -rw-r--r-- 1 www-data www-data 5.5K Mar 4 13:24 remote.php drwxr-xr-x 4 www-data www-data 4.0K Mar 4 13:24 resources -rw-r--r-- 1 www-data www-data 26 Mar 4 13:24 robots.txt -rw-r--r-- 1 www-data www-data 2.4K Mar 4 13:24 status.php drwxr-xr-x 3 www-data www-data 4.0K Mar 4 13:24 themes -rw-r--r-- 1 www-data www-data 383 Mar 4 13:24 version.php
Docker Server Host Bind MountНаконец, проверьте файлы самого сервера Docker Host, поскольку я хочу не только добиться общего расположения корня для обоих контейнеров, но и иметь постоянные данные на случай, если мне понадобится переместить контейнер:
❯ ll total 180K drwxrwxrwx 15 www-data www-data 4.0K Mar 4 13:24 . drwxrwxr-x 10 Alejandro Alejandro 4.0K Mar 4 13:24 .. drwxr-xr-x 47 www-data www-data 4.0K Mar 4 13:24 3rdparty drwxr-xr-x 50 www-data www-data 4.0K Mar 4 13:24 apps -rw-r--r-- 1 www-data www-data 19K Mar 4 13:24 AUTHORS drwxr-xr-x 2 www-data www-data 4.0K Mar 4 13:24 config -rw-r--r-- 1 www-data www-data 4.0K Mar 4 13:24 console.php -rw-r--r-- 1 www-data www-data 34K Mar 4 13:24 COPYING drwxr-xr-x 23 www-data www-data 4.0K Mar 4 13:24 core -rw-r--r-- 1 www-data www-data 6.2K Mar 4 13:24 cron.php drwxr-xr-x 2 www-data www-data 4.0K Mar 4 13:24 custom_apps drwxr-xr-x 2 www-data www-data 4.0K Mar 4 13:24 data drwxr-xr-x 2 www-data www-data 12K Mar 4 13:24 dist -rw-r--r-- 1 www-data www-data 3.2K Mar 4 13:24 .htaccess -rw-r--r-- 1 www-data www-data 156 Mar 4 13:24 index.html -rw-r--r-- 1 www-data www-data 3.4K Mar 4 13:24 index.php drwxr-xr-x 6 www-data www-data 4.0K Mar 4 13:24 lib -rwxr-xr-x 1 www-data www-data 283 Mar 4 13:24 occ drwxr-xr-x 2 www-data www-data 4.0K Mar 4 13:24 ocm-provider drwxr-xr-x 2 www-data www-data 4.0K Mar 4 13:24 ocs drwxr-xr-x 2 www-data www-data 4.0K Mar 4 13:24 ocs-provider -rw-r--r-- 1 www-data www-data 3.1K Mar 4 13:24 public.php -rw-r--r-- 1 www-data www-data 5.5K Mar 4 13:24 remote.php drwxr-xr-x 4 www-data www-data 4.0K Mar 4 13:24 resources -rw-r--r-- 1 www-data www-data 26 Mar 4 13:24 robots.txt -rw-r--r-- 1 www-data www-data 2.4K Mar 4 13:24 status.php drwxr-xr-x 3 www-data www-data 4.0K Mar 4 13:24 themes -rw-r--r-- 1 www-data www-data 101 Mar 4 13:24 .user.ini -rw-r--r-- 1 www-data www-data 383 Mar 4 13:24 version.php root@myserver /mnt/Volume/data/www
Я не вижу причин, по которым это не сработало бы с точки зрения разрешений, и подтвердил, что файлы присутствуют во всех трех случаях, как и должны.
Проверьте файл конфигурации NGinX для NextCloud FPM nextcloud.conf. После долгих размышлений я пришел к выводу, что единственное, в чем я могу быть не прав, так как я подключаюсь через домен в браузере к контейнеру веб-сервера NGniX, в его журнале есть записи 404 Not Found, а также я получаю ответ от самого экземпляра контейнера NextCloud с ошибкой 404 Not Found. Единственная проблема, с которой я столкнулся, связана с корневой записью в файле конфигурации:
NextCloud Журнал:
172.19.0.5 - 04/Mar/2023:22:36:01 +0000 "GET /index.php" 404
Журнал NGinX:
172.69.67.108 - - [04/Mar/2023:22:36:01 +0000] "GET / HTTP/2.0" 404 36 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36" "xxx.my.ip.xxx"
Поэтому я изменил корневую директиву на
/var/www/html
, и поведение немного изменилось. Я по-прежнему получаю запись 404 Not Found, но только в журналах контейнера веб-сервера NGinX, контейнер NextCloud молчит, поэтому я не добираюсь до него с помощью этого изменения:NextCloud Журнал(пусто, вообще нет записи):
Журнал NGinX:
2023/03/05 00:13:24 [error] 473#473: *4152 "/var/www/html/index.php" is not found (2: No such file or directory), client: 172.69.65.73, server: nextcloud.example.com, request: "GET / HTTP/2.0", host: "nextcloud.example.com" 172.69.65.73 - - [05/Mar/2023:00:13:24 +0000] "GET / HTTP/2.0" 404 174 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36" "xxx.my.ip.xxx"
В поведении веб-сервера есть что-то необычное: я заметил, что после изменения директивы root в журнале отображается фактический домен в кавычках,
"nextcloud.example.com"
хотя раньше там был просто дефис"-"
.Следующим шагом было просто отключить файл конфигурации NGinX default.conf, так как это единственное место, где я могу это сделать.
"-"
Результаты были такими же, как и выше. Я повторил оба сценария 1 и 2, которые уже пробовал. Это"_"
также директива сервера в файле default.conf, так что это был выстрел наугад.Я перепробовал много других настроек в conf, но большинство из них заканчивались ошибками
Too Many Redirections
,Bad Certificate
или просто502
ошибками.
Мое определение того, в чем проблема и где я застрял
Кажется, я очень близок к желаемому результату, поскольку я подключаюсь к обоим контейнерам из браузеров с нужным доменом, и SSL также работает нормально. Однако имя сервера, похоже, не фиксируется файлом конфигурации NGinX, а затем не передается корректно в NextCloud, но я не знаю, что именно нужно изменить.
Поскольку я, по-моему, сузил круг проблем до конкретной, возможно, кто-нибудь сможет помочь мне просмотреть файл конфигурации NGinX nextcloud.conf и указать, что настроено неправильно.
Спасибо, что вообще прочитали этот длинный пост.
решение1
Я разобрался, поэтому предоставлю подробную информацию, чтобы помочь людям, у которых уже есть такая же проблема, и тем, кто может столкнуться с ней в будущем, учитывая, сколько вопросов и проблем я нашел по этой теме без ответов.
Проблема заключалась в расположении корня FPM в параметрах FastCGI файла конфигурации NGinX.
Значит, я был на правильном пути, и проблема была связана с корневой директивой.
После долгого чтения я наткнулся на этот пост:
Как правильно связать контейнеры php-fpm и Nginx Docker?
И вдруг стало ясно, что у меня есть две разные службы, считывающие два разных пути, и одна из них использует корневой путь другой, которого на самом деле не существует.
Помните, я смонтировал том www для совместного использования двумя контейнерами?
- Для контейнера NGinX на
www:/usr/share/nginx/html
- Для контейнера NextCloud FPM на
www:/var/html/www
Идея заключалась в том, чтобы два контейнера совместно использовали файловую систему приложения NextCloud.
Чего я не осознавал, так это того, что в этом развертывании цель NGinX — обслуживать статические файлы, такие как CSS, HTML, JPG, JS и т. д., одновременно перенаправляя вызовы PHP в контейнер NextCloud FPM с параметрами FastCGI.
Когда в файле конфигурации NGinX объявляется корневая директива, она задается как переменная $document_root
.
root /usr/share/nginx/html;
Таким образом, если задать в качестве корня путь к контейнеру NGinX, /usr/share/nginx/html
это позволит обслуживать статические файлы без проблем, но затем, когда выполняется вызов PHP, он передается обработчику php в контейнере NextCloud FPM, а поскольку этого местоположения нет во втором контейнере, он не может найти файл PHP.
Чтобы исправить это, я поискал блок с параметрами FastCGI и искал $document_root
переменную, нашел ее, и теперь она выглядит так:
location ~ \.php(?:$|/) {
# Required for legacy support
rewrite ^/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+|.+\/richdocumentscode\/proxy) /index.php$request_uri;
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;
fastcgi_param modHeadersAvailable true; # Avoid sending the security headers twice
fastcgi_param front_controller_active true; # Enable pretty urls
fastcgi_pass php-handler;
fastcgi_intercept_errors on;
fastcgi_request_buffering off;
}
Обратите внимание, что строка, в которой указано, fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
формирует путь скрипта с уже объявленным корнем, поэтому при обработке nextcloud.example.com
он пытается выполнить чтение index.php
, и это результирующий вызов контейнера NextCloud FPM:
/usr/share/nginx/html/index.php
Правильным ответом было бы:
/var/www/html/index.php
Поэтому я создал новую переменную с именем $fpm_root
и установил ее в значение /var/www/html/
, затем изменил строку, которая говорит, fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
наfastcgi_param SCRIPT_FILENAME $fpm_root$fastcgi_script_name;
Теперь при каждом вызове статического контента будет определен путь к контейнеру NGinX, а при вызове PHP-контента — путь к контейнеру NextCloud FPM.
Вот как теперь выглядит весь раздел:
location ~ \.php(?:$|/) {
# Required for legacy support
rewrite ^/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+|.+\/richdocumentscode\/proxy) /index.php$request_uri;
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
set $path_info $fastcgi_path_info;
set $fpm_root /var/www/html/;
try_files $fastcgi_script_name =404;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $fpm_root$fastcgi_script_name;
fastcgi_param PATH_INFO $path_info;
fastcgi_param HTTPS on;
fastcgi_param modHeadersAvailable true; # Avoid sending the security headers twice
fastcgi_param front_controller_active true; # Enable pretty urls
fastcgi_pass php-handler;
fastcgi_intercept_errors on;
fastcgi_request_buffering off;
}
Теперь он работает и проходит все внутренние проверки работоспособности и безопасности NextCloud после того, как я добавил строку:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
Заключение
Надеюсь, это поможет тем, кто ищет решение этой проблемы. Проблема заключалась в том, что у меня было два разных пути для служб, обрабатывающих оба типа контента, статический и PHP, и только один из них был правильно настроен в файле конфигурации NGinX.
У вас может быть два (или более) разных корневых расположения для развертывания Docker FPM, и этого, вероятно, будет достаточно для работы или развертывания статического контента в двух или более различных приложениях, использующих один и тот же контейнер FPM для обработки вызовов PHP для NextCloud, WordPress, PHPPGAdmin, Laravel или чего-либо еще, над чем вы работаете.