Как подключить PHP-приложение к веб-серверу Nginx?

«Как подключить PHP-приложение к веб-серверу Nginx?» — вопрос из категории Веб-серверы и балансировка, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для обслуживания PHP-приложений Nginx использует PHP-FPM (FastCGI Process Manager). Nginx обрабатывает статические файлы и проксирует запросы к PHP-скриптам через FastCGI протокол на PHP-FPM, который исполняет код.

Базовая настройка:

  1. Установите PHP-FPM. Конкретный пакет зависит от версии PHP.

    # Для Ubuntu/Debian и PHP 8.2
    sudo apt install php8.2-fpm
  2. Настройте виртуальный хост Nginx. Создайте файл конфигурации, например, /etc/nginx/sites-available/my-php-app.

    server {
        listen 80;
        server_name myapp.local www.myapp.local;
        root /var/www/my-php-app/public; # Корневая директория проекта
        index index.php index.html;
    
        location / {
            try_files $uri $uri/ /index.php?$query_string;
        }
    
        # Обработка PHP-файлов
        location ~ .php$ {
            include snippets/fastcgi-php.conf; # Стандартный конфиг FastCGI параметров
            # Определяем сокет, который слушает PHP-FPM
            fastcgi_pass unix:/run/php/php8.2-fpm.sock;
            # Или TCP-соединение: fastcgi_pass 127.0.0.1:9000;
        }
    
        # Запрещаем доступ к скрытым файлам (например, .env)
        location ~ /. {
            deny all;
        }
    }
  3. Активируйте конфиг и перезагрузите Nginx.

    sudo ln -s /etc/nginx/sites-available/my-php-app /etc/nginx/sites-enabled/
    sudo nginx -t # Проверка синтаксиса конфигурации
    sudo systemctl reload nginx
  4. Убедитесь, что PHP-FPM запущен и слушает сокет.

    sudo systemctl status php8.2-fpm
    # Проверьте путь к сокету в конфиге PHP-FPM: /etc/php/8.2/fpm/pool.d/www.conf
    # Параметр 'listen = /run/php/php8.2-fpm.sock'

Ключевые моменты для production:

  • Безопасность: Настройте fastcgi_param для ограничения выполнения скриптов, используйте open_basedir в PHP.
  • Производительность: Настройте пулы процессов PHP-FPM (pm.max_children, pm.start_servers).
  • Статика: Nginx отлично отдает статические файлы (css, js, изображения) сам, что разгружает PHP-FPM.
  • HTTPS: Обязательно настройте SSL/TLS с помощью директив listen 443 ssl и ssl_certificate.