Вопрос или проблема
Я хочу развернуть установку Drupal в подкаталоге поддомена. Я использую контейнеры Docker, так как запускаю различные сервисы и благодаря этому могу придерживаться одной и той же синтаксической и структурной настройки.
Я запускаю обратный прокси-сервер jwilder-nginx, за которым у меня стоит обычный веб-сервер nginx на поддомене website.domain.com (оригинальный домен скрыт).
Я уже получаю доступ к index.html (website.domain.com) и установке phpMyAdmin (website.domain.com/pma), и теперь хочу развернуть несколько установок Drupal на website.domain.com/v22, website.domain.com/v23 и т.д., но не могу получить доступ к подкаталогам поддомена.
Эти установки Drupal – это контейнеры Docker drupal-fpm-alpine, которые имеют копию работающего сайта с другого.domain.com с адаптированным drupal-site-settings.php.
v23:
container_name: v23
image: drupal:8.7.8-fpm-alpine
restart: unless-stopped
networks:
- proxy-tier
volumes:
- ./html/v23:/var/www/html
v22:
...
v21:
...
Мой nginx.conf выглядит следующим образом:
server {
listen 80;
listen [::]:80;
server_name website.domain.com;
location / {
# Первая попытка обслужить запрос как файл, затем
# как каталог, затем вернуться к отображению 404.
try_files $uri =404;
}
location ~ \/pma/ {
rewrite ^/pma(/.*)$ $1 break;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_pass http://pma;
}
location /v23/ {
location ~ / {
try_files $uri /index.php$is_args$args;
}
rewrite ^/core/authorize.php/core/authorize.php(.*)$ /core/authorize.php$1;
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass v23:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location ~ /\.ht {
deny all;
}
location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
expires max;
log_not_found off;
}
}
location /v22/ {
#...
fastcgi_pass v22:9000;
#...
}
location /v21/ {
#...
fastcgi_pass v21:9000;
#...
}
}
Эта конфигурация является измененной копией конфигурации моего работающего nginx.conf с другого.domain.com, где я запускаю Drupal без подкаталога, но это не работает. В итоге я сейчас застрял с загруженным index.php и ошибкой 404 Not Found на website.domain.com/v23.
#2024/09/18 15:32:47 [error] 7#7: *1 directory index of "/etc/nginx/html/v23/" is forbidden, client: 172.25.0.4, server: website.domain.com, request: "GET /v23/ HTTP/1.1", host: "website.domain.com"
Если я пытаюсь получить доступ к самому index.php через website.domain.com/v23/index.php, он просто загружает этот файл вместо того, чтобы запускать его через php-fpm.
Может кто-нибудь направить меня к рабочему решению для этого?
Ответ или решение
Для настройки установки Drupal в подпапках на поддомене с использованием сервера Nginx и контейнеров Docker, вам необходимо внести определенные изменения в конфигурацию Nginx и убедиться, что все соответствующие пути корректно настраиваются для работы с PHP-FPM.
Шаг 1: Конфигурация Docker
В вашем docker-compose.yml
убедитесь, что для каждого экземпляра Drupal (v21, v22, v23) настроены правильные тома и имена контейнеров. Примерный фрагмент для установки v23 может выглядеть следующим образом:
version: '3.7'
services:
v23:
container_name: v23
image: drupal:8.7.8-fpm-alpine
restart: unless-stopped
networks:
- proxy-tier
volumes:
- ./html/v23:/var/www/html
# Добавьте дополнительные экземпляры v22, v21 аналогичным образом
Шаг 2: Настройка конфигурации Nginx
Ваш текущий фрагмент конфигурации Nginx нуждается в исправлениях. Приведем обновленный пример конфигурации:
server {
listen 80;
listen [::]:80;
server_name website.domain.com;
root /var/www/html;
location / {
try_files $uri $uri/ =404;
}
location /pma/ {
rewrite ^/pma(/.*)$ $1 break;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_pass http://pma;
}
location /v23/ {
try_files $uri $uri/ /v23/index.php$is_args$args;
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass v23:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$v23$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location ~ /\.ht {
deny all;
}
}
location /v22/ {
try_files $uri $uri/ /v22/index.php$is_args$args;
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass v22:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$v22$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
location /v21/ {
try_files $uri $uri/ /v21/index.php$is_args$args;
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass v21:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$v21$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
expires max;
log_not_found off;
}
}
Шаг 3: Проверка прав доступа к папкам
Убедитесь, что у контейнера Nginx есть доступ к директориям с вашими установками Drupal. Проверьте права доступа:
chmod -R 755 ./html/v23
chmod -R 755 ./html/v22
chmod -R 755 ./html/v21
Также проверьте, что у пользователя, под которым работает Nginx, есть права доступа к папкам, где установлены Drupal (например, www-data
).
Шаг 4: Проверка конфигурации и перезапуск
После внесения всех изменений проверьте конфигурацию Nginx на наличие ошибок:
nginx -t
Если ошибок нет, перезапустите Nginx, чтобы применить изменения:
docker-compose restart <nginx-service-name>
Заключение
Теперь, после всех модификаций, вы должны иметь возможность получить доступ к вашим установкам Drupal по адресам website.domain.com/v22
, website.domain.com/v23
и т.д. Убедитесь, что все пути правильно настроены и доступ к файлам не ограничен.
Если у вас по-прежнему возникают проблемы, проверьте логи Nginx и PHP-FPM на наличие дополнительных подсказок об ошибках.