среда, 24 января 2024 г.

Установка и настройка PHP 8.2 в связке с Nginx

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 файл будет другой. 
php --ini | grep "Loaded Configuration File" 

Результат: 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

Признаки "плохого кода"

Кратко рассмотрим 12 признаков, когда код можно улучшить: 1. Duplicated Code  — иногда повторяющийся код не всегда несет в себе пользу. Выде...