Вопрос или проблема
У меня есть окружение Coolify с docker compose, включающим PHP веб-сервер и прокси nginx. Прокси nginx обслуживает статические файлы и выступает в качестве прокси для PHP сервера.
У меня настроены два домена в Coolify следующим образом
https://app.example.org:80
, https://static.example.org:80
Это мой файл Docker compose:
version: '3.8'
services:
app:
image: php:8.3-fpm-alpine
container_name: php-app
working_dir: /var/www/html
volumes:
# - ./:/var/www/html
- ./config:/var/www/html/config
- ./backup:/var/www/html/backup
- ./userdata:/var/www/html/userdata
- ./.logs:/var/www/html/.logs
ports:
- "9000:9000"
environment:
PHP_OPCACHE_ENABLE: "1"
PHP_OPCACHE_MEMORY_CONSUMPTION: "128"
build:
context: .
dockerfile: Dockerfile
networks:
- app-network
webserver:
image: nginx:alpine
container_name: nginx-web
volumes:
- ./nginx/sites:/etc/nginx/sites
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./shared_assets:/var/www/html/shared_assets
- ./instances:/var/www/html/instances
environment:
- ENVIRONMENT=production
ports:
- "89:80"
depends_on:
- app
networks:
- app-network
networks:
app-network:
Для Nginx у меня настроены два сайта
server {
listen 80;
server_name static.example.org;
root /var/www/html/shared_assets;
index index.html index.htm;
# Обслуживание статических файлов из папки shared_assets
location /assets/ {
alias /var/www/html/shared_assets/assets/; # Исправьте путь alias, чтобы он соответствовал фактическому местоположению в файловой системе
try_files $uri $uri/ =404;
}
}
server {
listen 80;
server_name app.example.org;
root /var/www/html/instances/app/public;
index index.php;
add_header Access-Control-Allow-Origin "*";
location / {
try_files $uri /index.php$is_args$args;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass app:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ /\.ht {
deny all;
}
}
Обслуживание статических файлов работает, но приложение выдает тайм-аут шлюза. Эта настройка работает на моем локальном компьютере без проблем.
Какая может быть причина проблемы?
Проблема заключалась в том, что fpm слушал запросы только на 127.0.0.1. Добавление
RUN sed -i 's/^listen = .*/listen = 0.0.0.0:9000/' /usr/local/etc/php-fpm.d/www.conf
в Dockerfile решило проблему.
Ответ или решение
Когда вы сталкиваетесь с ошибкой "Gateway Timeout" при проксировании запросов к PHP в окружении Coolify с использованием Docker, важно понимать, что проблема часто заключается в неправильной настройке серверного окружения. Давайте рассмотрим решение и выясним, как избежать подобных ошибок в будущем.
Проблема
Ваша конфигурация описывает использование Nginx в качестве прокси-сервера для PHP с помощью FastCGI. Сообщение об ошибке "Gateway Timeout" обычно указывает на то, что Nginx не может получить ответ от вашего PHP-FPM (FastCGI Process Manager). Причинами могут быть следующие:
-
Неправильная настройка сетевого взаимодействия: Если PHP-FPM (в данном случае ваш контейнер
app
) настроен на прослушивание только локального адреса (127.0.0.1), то Nginx (контейнерwebserver
), находясь в другом контейнере, не сможет к нему подключиться. -
Неверно указан порт или адрес в конфигурации Nginx: Для выполнения запросов к PHP-FPM ваш Nginx должен быть настроен на корректный адрес и порт.
Решение
В вашем случае решение проблемы оказалось довольно простым: изменение конфигурации PHP-FPM в Dockerfile. Вы добавили строку:
RUN sed -i 's/^listen = .*/listen = 0.0.0.0:9000/' /usr/local/etc/php-fpm.d/www.conf
Это изменило параметр listen
в конфигурации PHP-FPM на 0.0.0.0:9000
, что позволило PHP-FPM принимать соединения не только от localhost, но и от Nginx, находящегося в другом контейнере.
Важные выводы по итогам
-
Прослушивание на всех интерфейсах: Убедитесь, что PHP-FPM настроен на прослушивание внешних запросов, чтобы другие сервисы, такие как Nginx, могли к нему подключаться.
-
Конфигурация Docker: Всегда проверяйте ваши Docker Compose файлы и убедитесь, что контейнеры находятся в одной сети и могут взаимодействовать между собой.
-
Логи и отладка: Используйте логи Nginx и PHP-FPM для диагностики проблем. Включите детализированные логи, если это необходимо.
-
Тестирование локально и в облаке: Помните, что локальная среда может отличаться от облачной. Настройки, которые работают на локальной машине, могут потребовать корректировок после переноса в облако.
Следуя этим рекомендациям, вы сможете избежать возникновения Gateway Timeout и других проблем, связанных с взаимодействием контейнеров в архитектуре Docker.
Заключение
Неправильная настройка сетевых интерфейсов является частой причиной ошибок "Gateway Timeout". Правильное значение параметра listen
в конфигурации PHP-FPM и убедительность в сетевом взаимодействии между контейнерами являются важными аспектами надежной работы вашей системы. Будьте внимательны к деталям и тестируйте ваши конфигурации.