Сборка PHP сервера для администраторов

Раздел: Администрирование -> Установка и настройка

Основные подходы к развертыванию PHP окружения

Решение: веб-сервер Nginx + PHP-FPM (рекомендуется для продакшена)

Этот вариант обеспечивает высокую производительность, гибкость и безопасность за счет разделения обработки статики и динамики. Подходит для средних и крупных проектов под высокой нагрузкой.

Инструкция по установке и настройке на Ubuntu 22.04:

  1. Установка Nginx:
    sudo apt update && sudo apt install nginx -y

    установка сервера apache mysql php (установка сервера apache, mysql и php)

  2. Установка PHP и PHP-FPM:
    sudo apt install php8.1-fpm php8.1-mysql php8.1-xml php8.1-mbstring -y

    создание php сервера (создание и настройка php сервера)

  3. Запуск и включение автозагрузки:
    sudo systemctl start nginx
    sudo systemctl enable nginx
    sudo systemctl start php8.1-fpm
    sudo systemctl enable php8.1-fpm

    Php mysql ubuntu (php и mysql на ubuntu)

  4. Настройка виртуального хоста: создать файл /etc/nginx/sites-available/example.com с содержимым:
    server {
        listen 80;
        server_name example.com;
        root /var/www/example.com/public;
        index index.php index.html;
    
        location / {
            try_files $uri $uri/ /index.php?$query_string;
        }
    
        location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php8.1-fpm.sock;
        }
    
        location ~ /\.ht {
            deny all;
        }
    }
  5. Активировать сайт и проверить конфигурацию:
    sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
    sudo nginx -t
    sudo systemctl reload nginx
  6. Создать тестовый файл /var/www/example.com/public/index.php:
    <?php phpinfo(); ?>

Возможные проблемы и их решение:

  • Ошибка 502 Bad Gateway – не запущен PHP-FPM или неверный путь к сокету. Проверить статус:
    sudo systemctl status php8.1-fpm
  • Файлы не отображаются, скачиваются – отсутствует блок location для PHP. Проверить наличие include snippets/fastcgi-php.conf.
  • Конфликт портов: если 80 занят (например, Apache), остановить его:
    sudo systemctl stop apache2

Как быстро запустить PHP сервер для разработки без установки веб-сервера?

Решение: встроенный сервер PHP (PHP built-in server). Идеально для локальной разработки, тестирования API, изолированных проектов. Не подходит для продакшена из-за однопоточности и отсутствия безопасности.

php -S localhost:8000 -t /path/to/project

Запуск с указанием корневого каталога и роутинга:

php -S 0.0.0.0:8080 -t public public/router.php

Частые ошибки:

  • Порт занят – изменить номер:
    php -S localhost:8081
  • Встроенный сервер не поддерживает .htaccess – все правила нужно прописывать в роутере.

Как настроить PHP на сервере Apache с модулем mod_php?

Решение: классическая связка Apache + mod_php (обработка PHP внутри процесса Apache). Подходит для простых проектов, shared хостинга, устаревших систем.

Установка на Ubuntu:

sudo apt install apache2 php libapache2-mod-php -y
sudo systemctl restart apache2

Включить поддержку PHP для файлов .php (обычно настроено по умолчанию). Для приоритета index.php перед index.html:

sudo a2enmod dir
sudo nano /etc/apache2/mods-enabled/dir.conf

Типичные проблемы:

  • Браузер скачивает .php файлы – модуль не подключен или не перезагружен. Проверить:
    sudo a2enmod php8.1
  • Высокое потребление памяти из-за встроенного в Apache PHP – рекомендуется перейти на PHP-FPM.

Как изолировать PHP-окружение с помощью Docker?

Решение: контейнеризация через Docker Compose. Позволяет точно воспроизвести окружение, избежать конфликтов версий, упростить развертывание на разных машинах.

version: '3.8'
services:
  web:
    image: nginx:alpine
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html
      - ./default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php
  php:
    image: php:8.1-fpm
    volumes:
      - ./html:/var/www/html
    environment:
      - PHP_MEMORY_LIMIT=256M

Затем создать default.conf для Nginx и запустить:

docker-compose up -d

Возможные сложности:

  • Ошибка монтирования томов – проверить пути и права доступа.
  • Недоступность расширений – добавлять через Dockerfile с docker-php-ext-install.

Как получить готовое окружение для разработки без ручной настройки?

Решение: использование предустановленных пакетов (XAMPP, WAMP, MAMP). Подходит для новичков, быстрого прототипирования, локального тестирования без глубоких знаний конфигурации.

XAMPP включает Apache, MariaDB, PHP, Perl. После установки запустить панель управления и стартовать Apache. Документы размещать в /opt/lampp/htdocs (Linux) или C:\xampp\htdocs (Windows).

Недостатки и ошибки:

  • Небезопасно для продакшена – открыты порты, стандартные пароли, уязвимости.
  • Конфликт с другими службами (например, MySQL уже запущен). Остановить системный MySQL:
    sudo systemctl stop mysql

Расширенные примеры настройки PHP сервера

Пример 1. Встроенный сервер PHP с пользовательским роутером

Создадим файл router.php для обработки всех запросов и перенаправления на index.php:

Пример
<?php
$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
if ($uri === '/api') {
    header('Content-Type: application/json');
    echo json_encode(['status' => 'ok']);
    return true;
}
return false;
?>

Запуск:

Пример
php -S 0.0.0.0:9000 -t . router.php

При обращении к http://localhost:9000/api вернётся JSON, остальные запросы будут обрабатываться как статика.

Пример 2. Nginx + PHP-FPM с поддержкой кэширования FastCGI

Добавим в конфигурацию сервера кэш для повышения производительности:

Пример
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=phpcache:100m inactive=60m;

server {
    ...
    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
        fastcgi_cache phpcache;
        fastcgi_cache_valid 200 60m;
        fastcgi_cache_use_stale error timeout updating;
        add_header X-Cache-Status $upstream_cache_status;
    }
}

Проверка кэша: заголовок X-Cache-Status: HIT при повторном запросе.

Пример 3. Docker Compose с несколькими версиями PHP

Запуск двух контейнеров с PHP 7.4 и 8.1 для тестирования обратной совместимости:

Пример
version: '3.8'
services:
  php74:
    image: php:7.4-fpm
    volumes:
      - ./app74:/var/www/html
    networks:
      - app
  php81:
    image: php:8.1-fpm
    volumes:
      - ./app81:/var/www/html
    networks:
      - app
  web:
    image: nginx:alpine
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./app74/index.php:/usr/share/nginx/html74/index.php
      - ./app81/index.php:/usr/share/nginx/html81/index.php
    ports:
      - "8080:80"
    depends_on:
      - php74
      - php81
networks:
  app:

Соответствующий nginx.conf направляет запросы в разные бекенды по URI.

Пример 4. Оптимизация PHP-FPM пула

Настройка динамического пула в /etc/php/8.1/fpm/pool.d/www.conf:

Пример
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 15
pm.max_requests = 500

Результат: при пике нагрузки создаётся до 50 процессов, после снижения количество уменьшается до 5.

Пример 5. Скрипт для автоматического развертывания PHP сервера через Ansible

Плейбук устанавливает Nginx, PHP-FPM и настраивает сайт:

Пример
---
- hosts: webservers
  become: yes
  tasks:
    - name: Install nginx
      apt:
        name: nginx
        state: present
    - name: Install php-fpm
      apt:
        name: php8.1-fpm
        state: present
    - name: Copy site config
      copy:
        src: default.conf
        dest: /etc/nginx/sites-available/default
      notify: restart nginx
    - name: Create web root
      file:
        path: /var/www/site
        state: directory
    - name: Deploy index.php
      copy:
        content: "<?php phpinfo(); ?>"
        dest: /var/www/site/index.php
  handlers:
    - name: restart nginx
      service:
        name: nginx
        state: restarted

Запуск:

Пример
ansible-playbook -i inventory playbook.yml

Создание и настройка PHP сервера - comments

En
создание php сервера (php)