Сборка PHP сервера для администраторов
Основные подходы к развертыванию PHP окружения
Решение: веб-сервер Nginx + PHP-FPM (рекомендуется для продакшена)
Этот вариант обеспечивает высокую производительность, гибкость и безопасность за счет разделения обработки статики и динамики. Подходит для средних и крупных проектов под высокой нагрузкой.
Инструкция по установке и настройке на Ubuntu 22.04:
- Установка Nginx:
sudo apt update && sudo apt install nginx -yустановка сервера apache mysql php (установка сервера apache, mysql и php)
- Установка PHP и PHP-FPM:
sudo apt install php8.1-fpm php8.1-mysql php8.1-xml php8.1-mbstring -yсоздание php сервера (создание и настройка php сервера)
- Запуск и включение автозагрузки:
sudo systemctl start nginx sudo systemctl enable nginx sudo systemctl start php8.1-fpm sudo systemctl enable php8.1-fpmPhp mysql ubuntu (php и mysql на ubuntu)
- Настройка виртуального хоста: создать файл
/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; } } - Активировать сайт и проверить конфигурацию:
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginx - Создать тестовый файл
/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