Создание рабочей среды Nginx с PHP
Способы установки веб-сервера Nginx и интерпретатора PHP
Как выполнить базовую установку Nginx и PHP-FPM из репозиториев Ubuntu?
Наиболее распространенный способ для систем Debian/Ubuntu - использование менеджера пакетов apt. Он гарантирует совместимость версий и простоту обновлений.
sudo apt update
sudo apt install nginx php-fpm php-mysqli php-curl php-gd php-xml php-mbstringInstall nginx php (установка nginx и php (англ.))
После установки необходимо запустить службы и добавить их в автозагрузку:
sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl start php7.4-fpm # версия может отличаться
sudo systemctl enable php7.4-fpmNginx apache php (nginx и apache с php)
Теперь требуется настроить Nginx для передачи PHP-запросов на сокет PHP-FPM. Создайте файл конфигурации для своего сайта:
server {
listen 80 default_server;
root /var/www/html;
index index.php index.html index.htm;
server_name _;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
}
}Nginx html php (обработка html и php в nginx)
Проверьте конфигурацию и перезагрузите Nginx:
sudo nginx -t
sudo systemctl reload nginxNginx index php (настройка index.php в nginx)
Для проверки создайте файл info.php в корневой директории:
echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.phpустановка nginx php (установка nginx и php)
Откройте в браузере http://ваш-сервер/info.php - должна появиться страница с информацией о PHP.
Типичные ошибки:
- Ошибка 502 Bad Gateway - обычно PHP-FPM не запущен или неправильно указан путь к сокету. Проверьте статус: systemctl status php7.4-fpm.
- Ошибка 404 при обращении к PHP-файлам - не указан index.php в директиве index или неправильный root.
- Конфликт с Apache - если Apache уже висит на порту 80, остановите его: sudo systemctl stop apache2 && sudo systemctl disable apache2.
Как установить Nginx и PHP на CentOS с помощью yum или dnf?
В дистрибутивах Red Hat и CentOS используется менеджер пакетов yum (или dnf). Репозиторий EPEL часто требуется для Nginx.
sudo yum install epel-release
sudo yum install nginx php-fpm php-mysqlnd php-gd php-xml php-mbstring
sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl start php-fpm
sudo systemctl enable php-fpm
Конфигурация Nginx аналогична, но сокет PHP-FPM может располагаться в /run/php-fpm/www.sock. Убедитесь, что в /etc/php-fpm.d/www.conf указан правильный listen.
Возможные проблемы: ошибка при запуске php-fpm из-за неверного пользователя в пуле - измените user и group на nginx.
Каким образом скомпилировать Nginx и PHP из исходных кодов для гибкой настройки?
Сборка из исходников позволяет добавить модули, недоступные в стандартных репозиториях (например, http2, brotli, специфические расширения PHP). Этот способ требует больше времени и знаний.
Шаг 1: Установка зависимостей
sudo apt install build-essential libpcre3-dev libssl-dev zlib1g-dev
Шаг 2: Сборка Nginx
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar xzf nginx-1.24.0.tar.gz
cd nginx-1.24.0
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --with-http_ssl_module --with-http_v2_module
make
sudo make install
Шаг 3: Сборка PHP
wget https://www.php.net/distributions/php-8.2.0.tar.gz
tar xzf php-8.2.0.tar.gz
cd php-8.2.0
./configure --prefix=/usr/local/php --with-pdo-mysql --with-mysqli --enable-fpm --with-zlib --enable-mbstring
make
sudo make install
sudo cp php.ini-production /usr/local/php/lib/php.ini
sudo cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
После компиляции потребуется вручную настроить systemd unit файлы и прописать пути.
Типичные ошибки: отсутствие библиотек (libxml2, libcurl) - установите их через apt install libxml2-dev libcurl4-openssl-dev перед ./configure. Также возможны проблемы с правами доступа к сокету - задайте группу www-data в пуле.
Как использовать Docker для быстрого развертывания Nginx и PHP?
Контейнеризация изолирует окружение и упрощает перенос приложений между серверами. Следующий docker-compose.yml запускает Nginx и PHP-FPM в отдельных контейнерах, связанных общей сетью.
version: '3.8'
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
- ./nginx.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
php:
image: php:8.2-fpm
volumes:
- ./html:/var/www/html
expose:
- "9000"
Файл nginx.conf внутри контейнера должен направлять запросы на сервис php:9000:
server {
listen 80;
index index.php index.html;
server_name localhost;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
fastcgi_pass php:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
}
}
Запуск: docker-compose up -d. Приложение будет доступно на порту 80 хоста.
Частые проблемы: контейнер PHP не видит файлы, если они не смонтированы в общую папку. Ошибка 502 указывает на недоступность php:9000 - проверьте сеть Docker.
Расширенные примеры конфигураций и команд
Настройка пула PHP-FPM с разными пользователями для нескольких сайтов
Для разделения ресурсов можно создать отдельные пулы с собственными сокетами.
sudo cp /etc/php/7.4/fpm/pool.d/www.conf /etc/php/7.4/fpm/pool.d/site1.conf
sudo nano /etc/php/7.4/fpm/pool.d/site1.conf
Измените следующие директивы:
[site1]
user = site1user
group = site1user
listen = /run/php/site1-fpm.sock
listen.mode = 0660
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
В конфигурации Nginx для соответствующего сайта используйте:
fastcgi_pass unix:/run/php/site1-fpm.sock;
Оптимизация FastCGI кэширования в Nginx для ускорения PHP
Добавьте в блок http или server:
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=mycache:10m max_size=100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
fastcgi_cache mycache;
fastcgi_cache_valid 200 302 60m;
fastcgi_cache_valid 404 1m;
add_header X-Cache $upstream_cache_status;
}
# После перезагрузки Nginx заголовок X-Cache будет показывать HIT или MISS
Конфигурация Nginx для Laravel с правильными правами
Типичный server block для Laravel включает чистые URL и обработку PHP:
server {
listen 80;
server_name example.com;
root /var/www/laravel/public;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
Использование TCP-соединения вместо Unix-сокета для PHP-FPM
Иногда требуется сетевое взаимодействие (разные хосты). В пуле укажите:
listen = 127.0.0.1:9000
В конфигурации Nginx:
fastcgi_pass 127.0.0.1:9000;
# Преимущество: возможность разнести Nginx и PHP на разные серверы. Недостаток: сокет быстрее в локальной сети.
Настройка HTTPS (SSL) для сайта с PHP
Сгенерируйте самоподписанный сертификат или получите Let's Encrypt. Пример server block с SSL:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
root /var/www/html;
index index.php;
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.0-fpm.sock;
include fastcgi_params;
fastcgi_param HTTPS on;
}
}
# При обращении по HTTPS PHP-скрипты будут видеть переменную $_SERVER['HTTPS']='on'