Установка и настройка серверного ПО: PHP и Nginx под управлением Ubuntu

Раздел: Администрирование веб-серверов -> Настройка Nginx и PHP на конкретной ОС

Настройка Nginx и PHP на Ubuntu

Для совместной работы Nginx и PHP на Ubuntu наиболее распространённым решением является использование PHP-FPM (FastCGI Process Manager). Ниже описан процесс установки и базовой настройки.

Как установить Nginx и PHP-FPM на Ubuntu?

Обновление списка пакетов и установка:

sudo apt update
sudo apt install nginx php-fpm php-mysql

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

sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl start php*-fpm
sudo systemctl enable php*-fpm

Заменить * на версию PHP, например php8.1-fpm.

Как создать конфигурацию серверного блока для обработки PHP?

Создание файла конфигурации для сайта:

sudo nano /etc/nginx/sites-available/example.com

Пример базовой конфигурации:

server {
    listen 80;
    server_name example.com;
    root /var/www/example.com;
    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;
    }
}

Создание симлинка для включения сайта:

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

Типичная ошибка: 502 Bad Gateway

Эта ошибка возникает, если Nginx не может связаться с PHP-FPM. Проверить работу PHP-FPM можно командой sudo systemctl status php*-fpm. Убедиться, что в конфигурации fastcgi_pass указан правильный путь к сокету. Также проверить права доступа на сокет (обычно /var/run/php/php*-fpm.sock) - пользователь nginx должен иметь доступ.

Как выбрать между Unix-сокетом и TCP-портом для связи Nginx и PHP-FPM?

В конфигурации выше используется Unix-сокет. Это повышает производительность, но работает только в рамках одной системы. Альтернатива - TCP-порт:

fastcgi_pass 127.0.0.1:9000;

В файле пула PHP-FPM (/etc/php/*/fpm/pool.d/www.conf) нужно изменить параметр listen:

listen = 127.0.0.1:9000

TCP-порт удобен при разделении Nginx и PHP-FPM на разные хосты или контейнеры.

Ошибка: файл PHP не обрабатывается, а загружается как текст

Причина - отсутствие или неправильная настройка блока location для PHP. Убедиться, что директива include snippets/fastcgi-php.conf; присутствует. Если используется TCP, проверить, что порт не заблокирован фаерволом.

Как настроить несколько версий PHP на одном сервере?

Установка нескольких версий:

sudo apt install php8.1-fpm php8.2-fpm

Для каждого сайта можно указать свой сокет или порт. Например, для PHP 8.2:

fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;

В конфигурации пула также можно использовать разные порты.

Какие меры безопасности стоит применить при настройке Nginx и PHP?

Ограничить доступ к файлам конфигурации и скрыть версию PHP:

location ~ /\.ht {
    deny all;
}
location ~ \.php$ {
    fastcgi_hide_header X-Powered-By;
    ...
}

Также рекомендуется отключить выполнение PHP в директориях с загружаемыми файлами, например через директиву location ~ /uploads/.*\.php$ { deny all; }.

Как добавить поддержку HTTPS через Let's Encrypt?

Установка Certbot:

sudo apt install certbot python3-certbot-nginx

Получение сертификата:

sudo certbot --nginx -d example.com

Certbot автоматически изменит конфигурацию Nginx.

Расширенные примеры настройки Nginx и PHP на Ubuntu

Ниже приведены подробные примеры конфигураций и команд с выводом результатов.

Пример
# Просмотр статуса PHP-FPM
sudo systemctl status php8.1-fpm
● php8.1-fpm.service - The PHP 8.1 FastCGI Process Manager
     Loaded: loaded (/lib/systemd/system/php8.1-fpm.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2025-04-07 10:00:00 UTC; 1h ago
       Docs: man:php-fpm8.1(8)
   Main PID: 12345 (php-fpm8.1)
     Status: "Processes active: 0, idle: 2, Requests: 42, slow: 0, Traffic: 0.0req/sec"
      Tasks: 3 (limit: 2301)
     Memory: 24.5M
        CPU: 0.2s
     CGroup: /system.slice/php8.1-fpm.service
             ├─12345 php-fpm: master process (/etc/php/8.1/fpm/php-fpm.conf)
             ├─12346 php-fpm: pool www
             └─12347 php-fpm: pool www
Пример
# Пример конфигурации пула PHP-FPM с пользовательскими параметрами
sudo nano /etc/php/8.1/fpm/pool.d/www.conf
Пример
[www]
user = www-data
group = www-data
listen = /run/php/php8.1-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
slowlog = /var/log/php-fpm-slow.log
request_terminate_timeout = 300
Пример
# Проверка синтаксиса конфигурации Nginx
sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Пример
# Пример серверного блока с кэшированием FastCGI
server {
    listen 80;
    server_name example.com;
    root /var/www/example.com;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_cache fastcgi_cache;
        fastcgi_cache_valid 200 1h;
        fastcgi_cache_use_stale error timeout updating;
    }
}
Пример
# Настройка upstream для балансировки между несколькими PHP-FPM пулами
upstream php_backend {
    server unix:/var/run/php/php8.1-fpm.sock weight=3;
    server unix:/var/run/php/php8.2-fpm.sock weight=1;
}

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

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass php_backend;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}
Пример
# Ограничение доступа к чувствительным файлам
server {
    ...
    location ~ /(\.git|\.env|composer\.json|composer\.lock) {
        deny all;
    }
    location ~ ^/uploads/.*\.php$ {
        deny all;
    }
    ...
}

Настройка Nginx и PHP на Ubuntu - comments

En
Ubuntu php nginx (php)