Теперь у нас стоит следующая задача: научить наш мини-сервер работать с php. Сейчас уже никому не интересны статические страницы, в которые нужно вносить изменения через ftp. Управление контентом происходит через административные панели. Во времена форумов, интернет-магазинов, лент новостей – html достраивается на лету, а значит, нужен обработчик скриптов на стороне сервера, который этот самый html будет генерить.

В принципе, можно использовать практически любой язык программирования, поддерживаемый CGI. Мы будет использовать «золотой стандарт» для разработки в вебе — PHP.

Добавляем файл index.php с таким содержанием:

<?php
echo 'Здорово! Это уже файл PHP';

Перезапускаем проект:

docker-compose restart

Идём в браузер и обновляем страницу по адресу
http://127.0.0.1:8080/

И что мы видим? Браузер предлагает сохранить наш только что созданный файл index.php. Это происходит, потому что веб-сервер пока ещё не умеет интерпретировать php. Давайте научим его это делать.

Если контейнеры были запущены, останавливаем:

docker-compose stop

В docker-compose.yml добавляем строки (зелёным выделено, то):

version: '3.7'

services:
  nginx:
    image: nginx:latest
    ports:
      - 8080:80
    volumes:
      - .:/usr/share/nginx/html/www
      - ./docker-compose/nginx/nginx.conf:/etc/nginx/nginx.conf
    links:
      - php

  php:
    image: php:fpm
    volumes:
      - .:/usr/share/nginx/html/www

Будем использовать последнюю версию php-fpm. Выбор fpm обусловлен тем, что мы используем nginx, который работает посредством Fast-CGI Process Manager. Как видно из конфига, мы добавили новый образ php и связали его с nginx посредством директивы links. Также потребовалось подмонтировать папку, такую же, как и в nginx, чтобы обеспечить взаимную работу контейнеров.

Также нужно внести изменения в конфигурационный файл для nginx, чтобы включить поддержку php. Открываем docker-compose/nginx/nginx.conf (зелёным – строки, которые изменены или добавлены):

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include mime.types;
    default_type application/octet-stream;
    sendfile on;
    keepalive_timeout 65;
    proxy_cache_path /usr/share/nginx/cache levels=1:2 keys_zone=image-preview:10m;

    server {
        listen 80;
        server_name creative.local;
        root /usr/share/nginx/html/www;
        index index.php index.html;
        error_log  /var/log/nginx/error.log;
        access_log /var/log/nginx/access.log;

        client_max_body_size 32m;

        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass php:9000;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }
    }
}

Здесь мы добавили:

  • корневую папку по умолчанию (директива root);
  • файлы для ведения логов доступа и ошибок;
  • включили специфичную обработку для запросов, содержащих «.php». Для них подключен fpm, индексный файл объявлен index.php (показывает, какой файл пытаться загрузить, если запрос приходит без явного указания запрашиваемого файла ).

Удаляем файл index.html. Теперь он нам не потребуется.

Стартуем контейнеры:

docker-compose up -d

В адресную строку вставляем:

127.0.0.1:8080

и нажимаем «enter»:

Что и требовалось. Файл интерпретируется правильно.

Какие команды нужно запомнить:

docker-compose up -d –buildЗапускает сборку (пересборку) контейнеров. Требуется при первом запуске или если что-то меняли в конфигурации докера.
docker-compose startСтартует контейнеры. Выполняем каждый раз, когда нам нужно запустить наш виртуальный сервер.
docker-compose stopОстанавливает контейнеры данного проекта. Нужно, например, чтобы внести изменения в конфигурацию, или происходит конфликт с другими контейнерами.
docker-compose psВыводит список запущенных контейнеров. Требуется обычно в случае поиска причин, почему не работает. Иногда не все контейнеры запускаются по причиние различных ошибок.
docker-compose logsВыводит логи контейнеров. Часто используется в связке с предыдущей командой.

Все команды выполняются из папки с проектом докера. В других папках проектов будут запускаться соответствующие контейнеры. Если папка не содержит файлов докера, будет ошибка.

На самом деле, команд не так уж много, они быстро запоминаются при ежедневном использовании (smile).

Как правило, требуется ещё один компонент для работы полноценного стека php — база данных. Этот контейнер мы добавим в следующей статье.

От a-pro

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *