Создание рабочей среды Nginx с PHP

Раздел: Администрирование веб-серверов -> Настройка веб-сервера 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-mbstring

Install nginx php (установка nginx и php (англ.))

После установки необходимо запустить службы и добавить их в автозагрузку:

sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl start php7.4-fpm   # версия может отличаться
sudo systemctl enable php7.4-fpm

Nginx 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 nginx

Nginx 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'

Установка Nginx и PHP - comments

En
установка nginx php (php)