Интеграция PHP с веб-сервером: практические руководства

Раздел: Веб-разработка -> Настройка сервера

Подключение PHP к сайту: варианты настройки

Как настроить взаимодействие PHP с веб-сервером для обработки динамических страниц?

Наиболее эффективное и современное решение - связка веб-сервера Nginx и PHP-FPM (FastCGI Process Manager). Этот подход обеспечивает высокую производительность, изоляцию процессов и гибкость конфигурации. Далее представлена инструкция по настройке для операционной системы Ubuntu/Debian.


# Установка Nginx и PHP-FPM
sudo apt update
sudo apt install nginx php-fpm php-mysql php-curl php-xml

# Проверка статуса PHP-FPM
sudo systemctl status php8.1-fpm
  

Www root php (корень www в php)

После установки необходимо создать конфигурационный файл для сайта в каталоге /etc/nginx/sites-available/.


server {
    listen 80;
    server_name example.com;
    root /var/www/example;

    index index.php index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }
}
  

127.0 0.1 index php (доступ к index.php на локальном сервере)

Затем активируйте сайт и перезагрузите Nginx:


sudo ln -s /etc/nginx/sites-available/example /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
  

подключить php к сайту (подключение php к сайту)

Типичная ошибка - 502 Bad Gateway. Она возникает, если PHP-FPM не запущен или сокет указан неверно. Проверьте статус сервиса и путь к сокету в файле /etc/php/8.1/fpm/pool.d/www.conf.

Ещё одна проблема - No input file specified. Это происходит, когда корневой каталог (root) не совпадает с реальным расположением файлов или директива try_files настроена некорректно. Убедитесь, что файл index.php существует и путь к нему соответствует root.

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

Для веб-сервера Apache существует встроенный модуль mod_php, который загружает интерпретатор PHP непосредственно в процесс сервера. Это простой способ для начинающих или при использовании классического хостинга.


# Установка Apache и модуля PHP (Debian/Ubuntu)
sudo apt install apache2 php libapache2-mod-php

# Включение модуля (обычно активируется автоматически)
sudo a2enmod php8.1
sudo systemctl restart apache2
  

После установки Apache сам обрабатывает файлы .php. Достаточно поместить их в DocumentRoot (обычно /var/www/html/).


<?php
phpinfo();
?>
  

Если браузер скачивает PHP-файл вместо его выполнения, модуль не подключён или не настроен обработчик. Проверьте наличие файла /etc/apache2/mods-enabled/php8.1.load и директиву AddType в конфигурации.

Конфликты с другими модулями (например, mod_security) могут вызывать 500 ошибку. Временно отключите сторонние модули для диагностики.

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

Встроенный сервер PHP (PHP CLI SAPI) предназначен для тестирования и локальной разработки. Он запускается одной командой и не требует установки Apache или Nginx.


# Запуск сервера на порту 8000 в текущем каталоге
php -S localhost:8000

# Указание конкретного корневого каталога
php -S localhost:8080 -t /path/to/project/public
  

Сервер обрабатывает только статические файлы и PHP-скрипты. Для маршрутизации используется встроенный роутер (файл router.php).


php -S localhost:8000 router.php
  

Ошибка Address already in use - порт занят. Укажите другой порт или завершите процесс, занимающий порт.

Сервер не поддерживает HTTPS и параллельные запросы (однопоточный). Для production-среды он непригоден.

Как работает PHP через CGI на сервере IIS (Windows)?

На Windows с IIS PHP можно подключить через модуль FastCGI. Это официальный способ Microsoft для работы PHP в среде Windows.


# Установка PHP (например, в C:\PHP) и настройка через диспетчер IIS:
# - Добавить сопоставление обработчика (Handler Mapping):
#   Путь запроса: *.php
#   Модуль: FastCgiModule
#   Исполняемый файл: C:\PHP\php-cgi.exe
  

Конфигурация через Web.config:


<configuration>
  <system.webServer>
    <handlers>
      <add name="PHP-FastCGI" path="*.php" verb="*" modules="FastCgiModule" scriptProcessor="C:\PHP\php-cgi.exe" resourceType="Unspecified" />
    </handlers>
  </system.webServer>
</configuration>
  

Ошибка 500 Internal Server Error - часто связана с неверными правами доступа к папке PHP или отсутствием расширений (например, php_mysql.dll). Проверьте журнал событий IIS.

При использовании php-cgi.exe могут возникать проблемы с производительностью из-за создания нового процесса на каждый запрос. Рекомендуется использовать php-fpm через Windows WSL или Docker.

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

Docker позволяет запускать PHP вместе с веб-сервером в изолированном контейнере. Это удобно для быстрой развёртки и одинакового окружения на всех этапах разработки.


# docker-compose.yml
version: '3'
services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./src:/var/www/html
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php

  php:
    image: php:8.2-fpm
    volumes:
      - ./src:/var/www/html
  

Запуск: docker-compose up -d. Конфигурация Nginx аналогична примеру с PHP-FPM, только fastcgi_pass указывает на сервис php:9000.

Проблема с правами доступа к файлам - контейнеры запускаются от пользователя www-data, а файлы на хосте могут принадлежать root. Настройте UID/GID или используйте volume с user mapping.

Кэширование образов и пересборка контейнеров при изменении зависимостей требует понимания Dockerfile и слоёв.

Расширенные примеры конфигураций и результатов выполнения кода.

1. Настройка пула PHP-FPM для нескольких сайтов

Пример

; /etc/php/8.1/fpm/pool.d/site1.conf
[site1]
user = site1
group = site1
listen = /run/php/site1.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 5
chdir = /
Пример

; /etc/php/8.1/fpm/pool.d/site2.conf
[site2]
user = site2
group = site2
listen = 127.0.0.1:9000
pm = ondemand
pm.max_children = 5
pm.process_idle_timeout = 10s

Результат: разные пулы с разными пользователями и сокетами. В Nginx указывается соответствующий сокет или порт.

2. Обработка PHP без перезаписи URL (Apache .htaccess)

Пример

# .htaccess в корне сайта
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

Результат: все запросы, не ведущие к реальному файлу, направляются на index.php.

3. Использование переменных окружения для настройки подключения к БД

Пример

<?php
$dbHost = getenv('DB_HOST') ?: 'localhost';
$dbName = getenv('DB_NAME') ?: 'test';
$dsn = "mysql:host=$dbHost;dbname=$dbName";
?>

Результат: скрипт считывает настройки из системных переменных, что удобно для Docker и CI/CD.

4. Запуск PHP-сервера с пользовательским роутером

Пример

<?php
// router.php
$uri = $_SERVER['REQUEST_URI'];
if ($uri === '/' || $uri === '') {
    require 'index.php';
} elseif (file_exists(__DIR__ . $uri)) {
    return false; // отдать статический файл
} else {
    http_response_code(404);
    echo 'Not Found';
}
?>
php -S localhost:8000 router.php
# Результат: при запросе /index.php сервер обрабатывает его, при /style.css отдаёт статику, иначе 404.

5. Конфигурация Nginx с балансировкой PHP-FPM пулов

Пример

upstream php_backend {
    server unix:/run/php/php8.1-fpm.sock weight=3;
    server 127.0.0.1:9000 weight=1;
    server unix:/run/php/php8.1-alt.sock backup;
}

server {
    ...
    location ~ \.php$ {
        fastcgi_pass php_backend;
        include fastcgi_params;
    }
}

Результат: запросы распределяются между несколькими PHP-FPM процессами, обеспечивая отказоустойчивость.

Подключение PHP к сайту - comments

En
подключить php к сайту (php)