Установка и настройка серверного ПО: PHP и Nginx под управлением Ubuntu
Настройка 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;
}
...
}