Skip to content

Instantly share code, notes, and snippets.

@llcawc
Created June 30, 2025 19:17
Show Gist options
  • Save llcawc/de785e8d8f9b4ce27fb08b3803733d7d to your computer and use it in GitHub Desktop.
Save llcawc/de785e8d8f9b4ce27fb08b3803733d7d to your computer and use it in GitHub Desktop.
Настройка PHP в Angie

Настройка PHP в Angie

Установка базовой версии PHP

Базовые версии 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

Установка PHP 8.4

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

Конфигурация Angie и PHP-FPM

идеи взяты здесь

Чтобы принимать запросы 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 на прослушивание сокета 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.

Настройка PHP-FPM для прослушивания через сокет TCP/IP

Хотя сокет 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

Настройка Angie для работы php-fpm

После того, как вы настроили адрес, который прослушивает 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

Проверка работы php сервера

создаем тестовый файл 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment