Базовые версии PHP дистрибутивов:
- Для Ubuntu 22.04.1 LTS будет установлен по умолчанию PHP 8.1.2
- Для Debian 12 будет установлен по умолчанию PHP 8.2.28
это можно проверить командой:
apt search --names-only '^php[.0-9]{3}$'
за основу берем команды с расчетом веб-разработки wintercms
sudo apt update &&
sudo apt install php-fpm php-ctype php-curl php-xml php-fileinfo php-gd php-json php-mbstring php-mysql php-sqlite3 php-zip -y
Ubuntu
sudo LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php # Press enter to confirm.
sudo apt update
Debian
sudo apt update
sudo apt -y install lsb-release ca-certificates curl apt-transport-https
sudo curl -sSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb
sudo dpkg -i /tmp/debsuryorg-archive-keyring.deb
sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
sudo apt update
После добавления репозитория можно установить PHP 8.4 и необходимые расширения. Для этого нужно выполнить команду:
sudo apt install php8.4-fpm -y
В зависимости от требований проекта могут потребоваться дополнительные расширения, например, для работы с базами данных или обработки изображений. Их можно установить с помощью команды:
sudo apt install php8.4-{ctype,curl,xml,fileinfo,gd,common,mbstring,mysql,sqlite3,zip} -y
После установки всех необходимых пакетов проверяем статус PHP-FPM:
sudo systemctl status php8.4-fpm.service
или
sudo service php8.4-fpm status
идеи взяты здесь
Чтобы принимать запросы FastCGI от Nginx, PHP-FPM может прослушивать сокет TCP/IP или UNIX сокет. Сокеты UNIX являются средством меж процессного взаимодействия, которое обеспечивает эффективный обмен данными между процессами, работающими в одной и той же операционной системе, в то время как сокеты TCP/IP позволяют процессам обмениваться данными по сети.
В отличие от сокета TCP/IP, который идентифицирует сервер по IP-адресу и порту (например, 127.0.0.1:9000), вы можете привязать сервер к сокету UNIX, используя путь к файлу (например, /run/php/php8.1-fpm.sock), который виден в файловой системе.
Сокет UNIX - это особый тип файла - к нему применяются разрешения на доступ к файлам и каталогам (как в случае с любым другим типом файла UNIX), и его можно использовать для ограничения того, какие процессы на хосте могут читать и записывать в файл, (и, таким образом, общаться с внутренним сервером).
Таким образом, сокет UNIX является безопасным, поскольку его могут использовать только процессы на локальном хосте. Сокет TCP/IP может быть доступен из Интернета, и это может представлять угрозу безопасности, если не будут приняты дополнительные меры безопасности, такие как настройка брандмауэра.
Чтобы настроить PHP-FPM на прослушивание сокета UNIX, откройте файл конфигурации пула PHP-FPM по умолчанию, используя свой любимый текстовый редактор при помощи команды:
sudo nano /etc/php/8.4/fpm/pool.d/www.conf
Затем найдите директиву listen и проверите что задан для нее путь к файлу сокета UNIX следующим образом - listen = /run/php/php8.4-fpm.sock
Если вы используете сокет UNIX, вам также необходимо установить соответствующие разрешения на чтение/запись для файла, чтобы разрешить подключения с веб-сервера ANGIE. По умолчанию Angie работает как пользователь angie
.
Найдите параметры listen.owner и listen.group и задайте им значение angie. Также установите режим на 0660, для параметра listen.mode.
Хотя сокет UNIX быстрее сокета TCP/IP, он менее масштабируем, поскольку он может поддерживать меж процессное взаимодействие только в одной и той же ОС. Если Nginx и внутренний сервер приложений (PHP-FPM) работают в разных системах, вам придется настроить php-fpm для прослушивания сокетов TCP/IP для удаленного подключения.
sudo nano /etc/php/8.4/fpm/pool.d/www.conf
Найдите параметр 'listen = ...' и пропишите адрес - 127.0.0.1:9000:
listen = 127.0.0.1:9000
После того, как вы настроили адрес, который прослушивает PHP-FPM, вам нужно настроить Nginx для запроса прокси к нему через этот адрес, используя параметр конфигурации fastcgi_pass, который располагается в файле конфигурации блока виртуального хоста.
Для прослушивания на сокете UNIX редактируем файл конфигурации домена:
sudo nano /etc/angie/sites-available/example.com.conf
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/example.com/html;
index index.php index.html;
# pass the PHP scripts to FastCGI server listening on UNIX sock
#
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.4-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/angie/fastcgi_params;
}
location / {
try_files $uri $uri/ =404;
}
# redirect server error pages to the static page /404.html
error_page 404 /404.html;
location = /404.html {
root /var/www/example.com/html;
}
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/example.com/html;
}
# deny access to .htaccess files, if Apache's document root concurs with angie's one
location ~ /\.ht {
deny all;
}
}
Для прослушивания через сокет TCP/IP редактируем файл конфигурации домена:
sudo nano /etc/angie/sites-available/example.com.conf
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/example.com/html;
index index.php index.html;
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/angie/fastcgi_params;
}
location / {
try_files $uri $uri/ =404;
}
# redirect server error pages to the static page /404.html
error_page 404 /404.html;
location = /404.html {
root /var/www/example.com/html;
}
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/example.com/html;
}
# deny access to .htaccess files, if Apache's document root concurs with angie's one
location ~ /\.ht {
deny all;
}
}
проверяет конфиг angie и перезапускает службы
sudo angie -t && sudo service angie restart
sudo systemctl restart php8.4-fpm
создаем тестовый файл test.php
sudo nano /var/www/example.com/html/test.php
содержимое файла test.php
<!DOCTYPE html>
<html lang="ru">
<head>
<title>Test PHP</title>
<meta charset="utf-8">
<style>
.header {text-align: center; margin: 1rem;}
.btn {
display: inline-block;
padding: 0.75rem 1.5rem;
border-radius: 0.5rem;
color: white;
background-color: blue;
opacity: 0.7;
transition: 0.25s all;
}
.btn:hover {
text-decoration: none;
opacity: 1;
}
</style>
</head>
<body>
<div class="header">
<?php
echo '<h1>Привет Мир!</h1>';
echo '<a href="/" class="btn">home</a>';
?>
</div>
<p>
<?php phpinfo();?>
</p>
</body>
</html>
берём права на все вновь созданные файлы
sudo chown -R user:angie /var/www/
открыть в браузере по имени домена или по ip
# в браузере
http://example.com
# или в командной строке
curl http://example.com
Настройка сервера Angie для работы с wintercms
редактирует файл конфигурации домена (для wintercmc)
sudo nano /etc/angie/sites-available/example.com.conf
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/example.com/html;
location / {
# Let Winter CMS handle everything by default.
# The path not resolved by Winter CMS router will return Winter CMS's 404 page.
# Everything that does not match with the whitelist below will fall into this.
rewrite ^/.*$ /index.php last;
}
# Pass the PHP scripts to FastCGI server
location ~ ^/index.php {
# Write your FPM configuration here
fastcgi_pass unix:/run/php/php8.4-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/angie/fastcgi_params;
}
# This may be needed to allow error codes to be handled correctly through Winter CMS.
# This will also pass any error codes sent from PHP-FPM.
error_page 404 = /index.php;
# Whitelist
## Let Winter handle if static file not exists
location ~ ^/favicon\\.ico { try_files $uri /index.php; }
location ~ ^/sitemap\\.xml { try_files $uri /index.php; }
location ~ ^/robots\\.txt { try_files $uri /index.php; }
location ~ ^/humans\\.txt { try_files $uri /index.php; }
# Block access to all dot files and folders except .well-known
location ~ /\.(?!well-known).* { deny all; }
location ~ ^/.well-known/acme-challenge { allow all; }
## Let nginx return 404 if static file not exists
location ~ ^/storage/app/uploads/public { try_files $uri 404; }
location ~ ^/storage/app/media { try_files $uri 404; }
location ~ ^/storage/app/resized { try_files $uri 404; }
location ~ ^/storage/temp/public { try_files $uri 404; }
location ~ ^/modules/.*/assets { try_files $uri 404; }
location ~ ^/modules/.*/resources { try_files $uri 404; }
location ~ ^/modules/.*/behaviors/.*/assets { try_files $uri 404; }
location ~ ^/modules/.*/behaviors/.*/resources { try_files $uri 404; }
location ~ ^/modules/.*/widgets/.*/assets { try_files $uri 404; }
location ~ ^/modules/.*/widgets/.*/resources { try_files $uri 404; }
location ~ ^/modules/.*/formwidgets/.*/assets { try_files $uri 404; }
location ~ ^/modules/.*/formwidgets/.*/resources { try_files $uri 404; }
location ~ ^/modules/.*/reportwidgets/.*/assets { try_files $uri 404; }
location ~ ^/modules/.*/reportwidgets/.*/resources { try_files $uri 404; }
location ~ ^/plugins/.*/.*/assets { try_files $uri 404; }
location ~ ^/plugins/.*/.*/resources { try_files $uri 404; }
location ~ ^/plugins/.*/.*/behaviors/.*/assets { try_files $uri 404; }
location ~ ^/plugins/.*/.*/behaviors/.*/resources { try_files $uri 404; }
location ~ ^/plugins/.*/.*/reportwidgets/.*/assets { try_files $uri 404; }
location ~ ^/plugins/.*/.*/reportwidgets/.*/resources { try_files $uri 404; }
location ~ ^/plugins/.*/.*/formwidgets/.*/assets { try_files $uri 404; }
location ~ ^/plugins/.*/.*/formwidgets/.*/resources { try_files $uri 404; }
location ~ ^/plugins/.*/.*/widgets/.*/assets { try_files $uri 404; }
location ~ ^/plugins/.*/.*/widgets/.*/resources { try_files $uri 404; }
location ~ ^/themes/.*/assets { try_files $uri 404; }
location ~ ^/themes/.*/resources { try_files $uri 404; }
}
проверяет конфиг angie и перезапускает службы
sudo angie -t && sudo service angie restart
sudo systemctl restart php8.4-fpm
END