1. Установим сторонний репозитарий ondrej/php, где есть все нужные и свежие версии PHP
apt-get install -y software-properties-common
add-apt-repository ppa:ondrej/php
apt-get update
2. Установка PHP 8.2
apt-get install -y php8.2 php8.2-fpm php8.2-mbstring php8.2-xml php8.2-gd php8.2-curl
Проверим версию PHP:
php -v
Найдем где располагается файл конфигурации по умолчанию, стоит заметить, что это файл относиться к cli (консольной) версии PHP, для PHP-FPM файл будет другой.
Результат:
Loaded Configuration File: /etc/php/8.2/cli/php.ini
Запустим PHP-FPM:
systemctl enable --now php8.2-fpm.service
Проверим статут PHP-FPM:
systemctl status php8.2-fpm.service
3. Настройка Nginx и PHP-FPM
Для пула www создался файл конфигурации /etc/php/8.2/fpm/pool.d/www.conf
Выведем его конфигурацию без комментариев:
cat /etc/php/8.2/fpm/pool.d/www.conf | egrep -Ev "^\s*(;|#|$)"
Результат:
[www]
user = www-data
group = www-data
listen = /run/php/php8.2-fpm.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
Как можно заметить по настройкам, пользователь и группа от имени которой работает пул www — это www-data
И для нас это неправильно, ведь у нас Nginx и работает он под пользователем nginx.
Исправим пользователя в файле /etc/php/8.2/fpm/pool.d/www.conf
sed -i "s/www-data/nginx/g" /etc/php/8.2/fpm/pool.d/www.conf
Перезапустим PHP-FPM:
systemctl restart php8.2-fpm.service
Проверим список запущенyых пулов:
ps -ef |grep "[p]hp-fpm: pool"
Результат
nginx
33449 33447 0 14:03 ? 00:00:00 php-fpm: pool www
nginx
33450 33447 0 14:03 ? 00:00:00 php-fpm: pool www
В первом столбце мы видим, что пулы работают под пользователем nginx — это нам и нужно.
4. Nginx.config
user nginx;
# количество использования ядер
worker_processes auto;
events {
# количество запросов на одно ядро
worker_connections 1024;
}
http {
# разрешает|запрещает использование sendfile()
sendfile on;
# передавать файл полными пакетами
tcp_nopush on;
# включается при переходе соединения в состояние keep-alive, включается на SSL-соединениях,
# при небуферизованном проксировании и при проксировании WebSocket.
# tcp_nodelay on;
# в течение которого keep-alive соединение с клиентом не будет закрыто со стороны сервера.
# Значение 0 запрещает keep-alive соединения с клиентами.
keepalive_timeout 65;
# Задаёт максимальный размер хэш-таблиц типов
types_hash_max_size 2048;
# Подключение типов файлов
include /etc/nginx/mime.types;
# Подключение настроек по умолчанию
# include /etc/nginx/conf.d/*.conf;
#_____________________________________________________________________________
# Ограничение запросов на сервер
# Ограничить запросы к серверу до 5 магабайт
# limit_conn_zone $server_name zone=per_vhost:5m;
# Ограничить запросы по IP адрессу до 5 магабайт
# limit_conn_zone $binary_remote_addr zone=per_vhost:5m;
#_____________________________________________________________________________
# Задаёт путь и другие параметры кэша.
# Задаёт путь и другие параметры кэша.
# fastcgi_cache_path /tmp levels=1:2 keys_zone=microcache:10m max_size=500m;
# Задаёт ключ для кэширования
# fastcgi_cache_key "$scheme$request_method$host$request_uri";
# Добавляет указанное поле в заголовок ответа при условии,
# что код ответа равен 200, 201 (1.3.10), 204, 206, 301, 302, 303, 304, 307
# add_header microcache-status $upstream_cache_status;
# $upstream_cache_status - хранит статус доступа к кэшу ответов (0.8.3).
# Статус может быть одним из “MISS”, “BYPASS”, “EXPIRED”, “STALE”, “UPDATING”, “REVALIDATED” или “HIT”.
server
{
# http
listen 80;
listen [::]:80;
server_name localhost;
# Скрыть информацию о версии сервера
server_tokens off;
#_____________________________________________________________________________
# Ограничения
# Список разрешенных IP
# include /etc/nginx/blacklist.conf;
# Запрещенные слова в запросе
# if ($request_uri ~* (rss|feed|xmlrpc|faq|style) ){
# return 403;
# }
#_____________________________________________________________________________
# Включение логов
# Задаёт путь, формат и настройки буферизованной записи в лог.
# access_log /var/log/nginx/host.access.log;
# Конфигурирует запись в лог.
error_log /var/log/nginx/host.error.log;
#_____________________________________________________________________________
# Включение сжатия GZIP
gzip on;
# Минимальное значение в байтах
gzip_min_length 100;
# Уровень сжатия, рекомендуемое до 5
gzip_comp_level 3;
# Тип файлов для сжатия
gzip_types text/javascript;
gzip_types text/css;
gzip_types text/plain;
# Исключение для IE6
gzip_disable "msie6";
#_____________________________________________________________________________
# Установить кеширование(0-on, 1-off)
# set $no_cache 0;
# Не кешировать пост запросы
# if ( $request_method = POST ) { set $no_cache 1; }
# Не кешировать get запросы
# if ( $query_string != "" ) { set $no_cache 1; }
# Не кешировать админ часть на примере WordPress
# if ($request_uri ~* "/wp-admin" ) { set $no_cache 1; }
#_____________________________________________________________________________
# Block css, js, img
# раскомментируйте строки ниже во избежание обработки Yii обращений к несуществующим статическим файлам
location ~ \.(css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
try_files $uri =404;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
root /usr/share/nginx/html/public;
index index.php index.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location / {
add_header Server "Custom Server";
# Можете указать свое значение вместо "Custom Server"
# Перенаправляем все запросы к несуществующим директориям и файлам на index.php
try_files $uri $uri/ /index.php?$args;
}
# location /swoole {
# proxy_pass http://192.168.0.107:8084;
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr; }
location ~ \.php$ {
add_header Server "Custom Server";
# Можете указать свое значение вместо "Custom Server"
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
#_____________________________________________________________________________
# Параметр key_zone
# fastcgi_cache microcache;
# Код ответа и максимальное время хранения
# fastcgi_cache_valid 200 60m;
# fastcgi_cache_bypass $no_cache;
# fastcgi_no_cache $no_cache;
}
}
}
5. Задаем права и владельца
chown -R nginx:nginx /usr/share/nginx/html
chmod -R 775 /usr/share/nginx/html
Если ошибок нет, то перезагружаем конфигурацию Nginx:
nginx -s reload
или
systemctl reload nginx