Skip to content

Instantly share code, notes, and snippets.

@llcawc
Last active May 11, 2024 09:39
Show Gist options
  • Save llcawc/71599de16bb3430bd3338c997a9c6b38 to your computer and use it in GitHub Desktop.
Save llcawc/71599de16bb3430bd3338c997a9c6b38 to your computer and use it in GitHub Desktop.
Сервер Angie для Ubuntu

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

сперва настраиваем Ubuntu или Debian: подключение к серверу через терминал с SSH c логином от root

ssh root@ip_server

Обновляет систему

apt update && apt upgrade -y

Меняет пароль root

passwd

Настройка user пользователя

Добавляет пользователя

adduser user

Даёт права sudo

adduser user sudo

добавим существующего пользователя user в группу www-data без смены для него основной группы: подробнее здесь

sudo usermod -a -G www-data user

Выходит

logout

Подключается от user

ssh user@ip_server

Создаёт папку для ключей

mkdir ~/.ssh

Локально: копирует публичный ключ на рабочем компе

cat ~/.ssh/id_rsa.pub

Сервер: вставляет ключ на сервере

nano ~/.ssh/authorized_keys

Выставляет папке права

chmod -R 700 ~/.ssh/

Забирает права на папку для сайтов

sudo chown -R $USER:$USER /var/www/

Настройка доступа к папкам и файлам web-сервера

После установки web-сервера нужно установить правильные права доступа для пользователей и групп. В этом нам помогут команды chown (изменить владельца) и chmod (изменить права доступа). Рассмотрим эти команды, а потом установим владельца для директории /var/www и права доступа к ней.

В Linux существует всего три вида прав — право на чтение (read), запись (write) и выполнение (execute), а также три категории пользователей, к которым они могут применяться — владелец файла (user), группа владельца (group) и все остальные (others).

Команда chmod

Изменяет прав доступа к файлу или директории.

chmod [опции] ВладелецГруппаДругие файл(ы)
  • Опция -R позволяет рекурсивно изменять права доступа для каталога
  • Владелец — права доступа в числовом виде для владельца
  • Группа — права доступа в числовом виде для группы
  • Другие — права доступа в числовом виде для других

Команда chown

Изменяет владельца и/или группу файла или директории.

chown [опции] владелец[:группа] файл(ы)

Опция -R — позволяет рекурсивно изменять владельца каталога.

Исходные данные

После установки web-сервера

  • Web-сервер запущен под пользователем и группой www-data
  • Директории виртуальных хостов расположены в /var/www

Нам нужно обеспечить минимальные права для web-сервера (чтение директорий и файлов), чтобы он мог работать. И предоставить необходимые права на создание, редактирование и удаление файлов и директорий разработчику.

Создадим пользователя user и назначим ему основную группу www-data:

sudo useradd -m -s /bin/bash -g www-data user

Или добавим существующего пользователя user в группу www-data без смены для него основной группы: подробнее здесь

sudo usermod -a -G www-data user

Зададим пароль для нового пользователя:

sudo passwd user
Введите новый пароль UNIX:
Повторите ввод нового пароля UNIX:
passwd: пароль успешно обновлён

Изменяем владельца

Устанавливаем владельца и группу для всех директорий /var/www:

sudo find /var/www -type d -exec chown user:www-data {} \\; -print

Устанавливаем владельца и группу для всех файлов /var/www:

sudo find /var/www -type f -exec chown user:www-data {} \\; -print

Здесь можно обойтись одной командой (но с двумя нагляднее):

chown -R user:www-data /var/www

Устанавливаем права

Устанавливаем права для всех директорий /var/www:

$ sudo find /var/www -type d -exec chmod 755 {} \\; -print

Теперь ситуация такая:

  • Пользователь user(разработчик) имеет право на чтение и запись директорий, потому что является их владельцем
  • Пользователь www-data (web-сервер) имеет право на чтение директорий, потому что принадлежит к группе www-data

Устанавливаем права для всех файлов /var/www:

sudo find /var/www -type f -exec chmod 644 {} \\; -print

Теперь ситуация такая:

  • Пользователь user (разработчик) имеет право на чтение и запись файлов, потому что является их владельцем
  • Пользователь www-data (web-сервер) имеет право на чтение файлов, потому что принадлежит к группе www-data

Для наглядности посмотрим на права всех файлов и директорий:

cd /var/www
ls -laR
или
ls -lha

Для работы системы управления сайтом octobercms или wintercms необходимо настроить доступ web-сервера для записи файлов в папке themes и storage для этого даем права на запись в этой папке для всей группы www-data:

sudo chown -R user:www-data /var/www/example.com/html/storage
sudo chmod -R 775 /var/www/example.com/html/storage

Устанавливаем сервер Angie

Установите вспомогательные пакеты для подключения репозитория Angie:

 sudo apt update
sudo apt install -y ca-certificates curl lsb-release

Скачайте открытый ключ репозитория Angie для проверки подлинности пакетов:

sudo curl -o /etc/apt/trusted.gpg.d/angie-signing.gpg \
    https://angie.software/keys/angie-signing.gpg

Подключите репозиторий Angie:

для Ubuntu:

echo "deb https://download.angie.software/angie/ubuntu/ `lsb_release -cs` main" \
    | sudo tee /etc/apt/sources.list.d/angie.list > /dev/null

для Debian:

echo "deb https://download.angie.software/angie/debian/ `lsb_release -cs` main" \
    | sudo tee /etc/apt/sources.list.d/angie.list > /dev/null

Обновите индексы репозиториев:

sudo apt update

Установите пакет Angie:

sudo apt install -y angie

(Дополнительно) Установите пакеты необходимых вам динамических модулей.

  • устанавливаем модуль brotli
sudo apt install -y angie-module-brotli

Настраивает конфиг angie

sudo nano /etc/angie/angie.conf

Команды редактора Nano

  • Ctrl G (F1) — открыть справку
  • Ctrl X (F2) — выйти из nano или закрыть буфер
  • Ctrl O (F3) — записать файл или отмеченую область на диск
  • Ctrl R (Ins) — вставить другой файл в текущий nano (или в новый буфер)
  • Ctrl J (F4) — выровнять текущий параграф
  • Ctrl W (F6) — найти строку
  • Ctrl \\ (Alt R)— найти и заменить
  • Ctrl / (Alt G)— перейти на строку номер ..
  • Ctrl A — начало строки
  • Ctrl E — конец строки
  • Ctrl C — показать позицию курсора
  • Ctrl K (F9) — удалить строку
  • Ctrl 6 (Alt A) — начать/закончить выделение текста
  • Alt 6 (Alt ^) — копировать строку или выделение в буфер
  • Ctrl U (F10) — вставить содержимое буфера в текущее положение курсора

Пример конфига angie.conf для обслуживания по протоколу http с жатием gzip и brotli

user www-data;
worker_processes auto;
worker_rlimit_nofile 65536;

# Load Brotli module
load_module modules/ngx_http_brotli_filter_module.so;
load_module modules/ngx_http_brotli_static_module.so;

error_log  /var/log/angie/error.log notice;
pid        /var/run/angie.pid;

events {
    worker_connections      65536;
}

http {

    # Basic
    sendfile                  on;
    tcp_nopush                on;
    tcp_nodelay               on;
    types_hash_max_size       2048;
    server_tokens             off;
    ignore_invalid_headers    on;

    # Decrease default timeouts to drop slow clients
    keepalive_timeout         40s;
    send_timeout              20s;
    client_header_timeout     20s;
    client_body_timeout       20s;
    reset_timedout_connection on;

    # Hash sizes
    server_names_hash_bucket_size 64;

    # Mime types
    include       /etc/angie/mime.types;
    default_type  application/octet-stream;

    # Logs
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    log_format extended '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" rt="$request_time" '
                        '"$http_user_agent" "$http_x_forwarded_for" '
                        'h="$host" sn="$server_name" ru="$request_uri" u="$uri" '
          'ucs="$upstream_cache_status" ua="$upstream_addr" us="$upstream_status" '
                        'uct="$upstream_connect_time" urt="$upstream_response_time"';

    access_log  /var/log/angie/access.log  main;

    # Gzip
    gzip on;
    gzip_disable "msie6";
    gzip_vary off;
    gzip_proxied any;
    gzip_comp_level 5;
    gzip_min_length 1000;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types
        application/atom+xml
        application/javascript
        application/json
        application/ld+json
        application/manifest+json
        application/rss+xml
        application/vnd.geo+json
        application/vnd.ms-fontobject
        application/x-font-ttf
        application/x-web-app-manifest+json
        application/xhtml+xml
        application/xml
        font/opentype
        image/bmp
        image/svg+xml
        image/x-icon
        text/cache-manifest
        text/css
        text/javascript
        text/plain
        text/vcard
        text/vnd.rim.location.xloc
        text/vtt
        text/x-component
        text/x-cross-domain-policy;

    # Brotli
    brotli on;
    brotli_comp_level 6;
    brotli_static on;
    brotli_types
        application/atom+xml
        application/javascript
        application/json
        application/rss+xml
        application/vnd.ms-fontobject
        application/x-font-opentype
        application/x-font-truetype
        application/x-font-ttf
        application/x-javascript
        application/xhtml+xml
        application/xml
        font/eot
        font/opentype
        font/otf
        font/truetype
        image/svg+xml
        image/vnd.microsoft.icon
        image/x-icon
        image/x-win-bitmap
        text/css
        text/javascript
        text/plain
        text/xml
        text/$;

    # Virtual Hosts
    include /etc/angie/sites-enabled/*;

    # Configs
    include /etc/angie/http.d/*.conf;

}

Проверяет конфиг angie

sudo angie -t

Для запуска/перезапуска сервера angie и проверки статуса в зависимости от типа системы используют два типа команд. Это связано с тем как система обрабатывает процессы. Для ubuntu и некоторых версий Debian применяется современная система запуска служб Systemd использующий команды systemctl, а если при запуске WSL вы видите что-то типа:

$ sudo systemctl
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Узел выключен

то это означает что система Systemd в системе WSL недоступна надо пользоваться старыми обычными командами управления сервисами: service.

Запуск, перезапуск и проверка статуса с использованием `Systemd:

// запустить сервис
sudo systemctl start angie

// Список сервисов добавленных в автозагрузку
sudo systemctl list-unit-files --type=service --state=enabled

// проверить находится ли сервис уже в автозагрузке
sudo systemctl is-enabled angie

// посмотреть находится ли сервис в автоазагрузке, а также проверить запущен ли он в данный момент и посмотреть последние логи:
sudo systemctl status angie

// Добавить сервис в автозагрузку
sudo systemctl enable angie

Запуск, перезапуск и проверка статуса с использованием `System V (SysVinit "service"):

sudo service angie start
sudo service angie restart
sudo service angie status

// проверка и рестарт
sudo angie -t && sudo service angie restart
// или проверка и перезагрузка
sudo angie -t && sudo service angie reload

При любом изменении конфигурации, для применения изменений процесс Angie необходимо либо перезапустить процесс полностью, предварительно проверив конфигурацию синтаксически:

sudo angie -t && sudo service angie restart

либо перезагрузить, что позволит не прерывать обработку текущих соединений.

sudo angie -t && sudo service angie reload

справка Angie: Касательно изменения конфигурации

Для того чтобы Angie перечитал файл конфигурации, нужно послать главному процессу сигнал HUP. Главный процесс сначала проверяет синтаксическую правильность конфигурации, а затем пытается применить новую конфигурацию, то есть, открыть лог-файлы и новые слушающие сокеты. Если ему это не удается, то он откатывает изменения и продолжает работать со старой конфигурацией. Если же удается, то он запускает новые рабочие процессы, а старым шлет сообщение о плавном выходе. Старые рабочие процессы закрывают слушающие сокеты и продолжают обслуживать старых клиентов. После обслуживания всех клиентов старые рабочие процессы завершаются.

Angie отслеживает поколение конфигурации каждого своего процесса; нумерация начинается с единицы при запуске сервера, а номера растут при каждой перезагрузке конфигурации и указаны в именах процессов:

sudo angie
ps aux | grep angie

    angie: master process v1.5.0 #1 [angie]
    angie: worker process #1

После успешной перезагрузки конфигурации (вне зависимости от наличия изменений) номера поколений у процессов, получивших новую конфигурацию, увеличатся:

sudo angie -s reload
ps aux | grep angie

    angie: master process v1.5.0 #2 [angie]
    angie: worker process #2

Если какие-то из рабочих процессов предыдущих поколений продолжают работу, это сразу будет заметно:

ps aux | grep angie

    angie: worker process #1
    angie: worker process #2

Примечание Не следует считать номер поколения конфигурации в имени процесса «номером» самого процесса; Angie не использует сквозную нумерацию своих процессов для каких-либо прикладных целей.

Опции Описание
-? или -h вывод справки по параметрам командной строки
-c файл использование альтернативного конфигурационного файла файл вместо файла по умолчанию.
-e файл использование альтернативного лог-файла ошибок файл вместо файла по умолчанию. Специальное значение stderr выбирает стандартный файл ошибок
-g директивы задание глобальных директив конфигурации, например:
angie -g "pid /var/run/angie.pid; worker_processes `sysctl -n hw.ncpu`;"
-p префикс задание префикса пути angie, т.е. каталога, в котором будут находиться файлы сервера (по умолчанию — каталог /usr/local/angie)
-q вывод только сообщений об ошибках при тестировании конфигурации
-s сигнал отправка сигнала главному процессу: stop, quit, reopen, reload
-t тестирование конфигурационного файла: Angie проверяет синтаксическую правильность конфигурации, а затем пытается открыть файлы, описанные в конфигурации
-T то же, что и -t, а также вывод конфигурационных файлов в стандартный поток вывода
-v вывод версии Angie
-V вывод версии Angie, версии компилятора и параметров конфигурации сборки

Автозагрузка для WSL дистрибутивов Debian без systemd :

источник здесь и здесь

Чтобы запустить любую произвольную команду при запуске WSL, создайте или отредактируйте (как sudo/etc/wsl.conf :

sudo nano /etc/wsl.conf

со следующим содержимым:

[boot]
command = <command to run as root>; <other command to run as root>

Например:

[boot]
command="service ssh start; service cron start"

или

[boot]
systemd=true;
command="service angie start"

Если после запуска sudo systemctl status angie есть ошибка с PID, То этот скрипт исправляет ошибку с PID:

mkdir /etc/systemd/system/angie.service.d
printf "[Service]\\nExecStartPost=/bin/sleep 0.1\\n" > /etc/systemd/system/angie.service.d/override.conf
systemctl daemon-reload
systemctl restart angie

Проверяет Brotli

curl -H 'Accept-Encoding: br' -I http://example.com
Content-Encoding: br

Устанавливает файрвол

sudo apt install ufw

Добавляет angie.ini

sudo nano /etc/ufw/applications.d/angie.ini
[Angie HTTP]
title=Web Server
description=Enable ANGIE HTTP traffic
ports=80/tcp

[Angie HTTPS] \\
title=Web Server (HTTPS) \\
description=Enable ANGIE HTTPS traffic
ports=443/tcp

[Angie Full]
title=Web Server (HTTP,HTTPS)
description=Enable ANGIE HTTP and HTTPS traffic
ports=80,443/tcp

Проверяет список приложений

sudo ufw app list

Включает файрвол

sudo ufw enable

Разрешает сервисы

sudo ufw allow 'Angie Full'
sudo ufw allow 'OpenSSH'

Проверяет статус

sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
Angie Full                 ALLOW       Anywhere
OpenSSH                    ALLOW       Anywhere
Angie Full (v6)            ALLOW       Anywhere (v6)
OpenSSH (v6)               ALLOW       Anywhere (v6)

Настраиваем папку Сайта

Создаёт папку для сайта

sudo mkdir -p /var/www/example.com/html

Добавляет индексный файл

sudo nano /var/www/example.com/html/index.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>example.com</title>
  </head>
  <body>
    <h1>Hello from example.com!</h1>
    <p>How did you end up here?</p>
  </body>
</html>

Создаёт папки для конфига

sudo mkdir -p /etc/angie/sites-available/
sudo mkdir -p /etc/angie/sites-enabled/

редактирует файл конфигурации (незабудь поменять 'example.com' на имя своего домена)

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.html index.htm index.php;

    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;
    }
}

Ниже описано действие этих директив и блоков расположения:

  • listen — определяет, что будет прослушивать порт Angie. В данном случае он будет прослушивать порт 80, используемый по умолчанию для протокола HTTP.
  • root — определяет корневую директорию документа, где хранятся файлы, обслуживаемые этим сайтом.
  • index — задает для Angie приоритет обслуживания файлов индекса для этого сайта. Довольно часто вы указываете файлы index.html, которые имеют высший приоритет по сравнению с файлами index.php, чтобы обеспечить быструю настройку начальной страницы в приложениях PHP. Вы можете менять эти настройки в зависимости от потребностей вашего приложения.
  • server_name — определяет, на какие доменные имена и/или IP-адреса должен реагировать ваш серверный блок. Эта директива должна указывать на доменное имя или публичный IP-адрес вашего сервера.
  • location / — первый блок расположения включает директиву try_files, которая проверяет наличие файлов или директорий, соответствующих запросу URI. Если Angie не сможет найти соответствующий ресурс, будет возвращена ошибка 404.
  • location ~ /.ht — отвечает за файлы .htaccess, которые Angie не обрабатывает. При добавлении директивы deny all, если любой из файлов .htaccess попадет в корневую директорию документа, они не будут выводиться посетителям.
  • error_page 404 — обработка файла с ошибкой 404 (файл не найден) как статического файла 404.html
  • location = /404.html — блок расположения корня для статического файла 404.html

Включает конфиг - создает символическую ссылку в папке sites-enabled

sudo ln -s /etc/angie/sites-available/example.com.conf /etc/angie/sites-enabled/

Проверяет конфиг и перезагрузка angie :

sudo angie -t && sudo service angie reload

Проверяет работу angie

sudo systemctl status angie

Смотреть адрес домена

ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\\/.*$//'

Проверяет домен

curl example.com

Настройка HTTPS

Вариант 1: Автоматическое получение сертификата

Получение сертификата LetsEncrypt на сервере Angie начиная с версии 1.5.0 с помощью модуля Acme. Обеспечивает автоматическое получение сертификатов с использованием протокола ACME По умолчанию этот модуль не собирается; его сборку необходимо включить с помощью параметра конфигурации --with-http_acme_module.

В пакетах из наших репозиториев модуль уже включен в сборку.

Шаги для включения запроса сертификатов в конфигурации:

  1. Настройте клиент ACME в блоке http с помощью директивы acme_client, задающей уникальное имя клиента и другие параметры; можно настроить несколько клиентов ACME.

  2. Укажите домены, для которых обновляются сертификаты: для доменных имен, перечисленных во всех директивах server_name всех блоков server с директивами acme, указывающими на один и тот же клиент ACME, будет выдан единый сертификат.

  3. Убедитесь, что принимаются вызовы ACME: сейчас Angie поддерживает только проверку доменных имен по HTTP, что требует ответа на специальный запрос на порту 80 от удостоверяющего центра (CA); это так называемый вызов ACME.

  4. Настройте SSL с использованием полученного сертификата и ключа: Модуль делает сертификаты и ключи доступными в виде встроенных переменных, которые можно использовать в конфигурации для заполнения ssl_certificate и ssl_certificate_key.

Ключи и сертификаты клиентов хранятся в кодировке PEM в соответствующих подкаталогах каталога, заданного с помощью параметра конфигурации --http-acme-client-path:

ls /var/lib/angie/acme_client/example

  account.key  certificate.pem  private.key

Клиенту ACME требуется учетная запись на сервере CA. Для ее создания и управления ею клиент использует закрытый ключ (account.key); если ключа у него еще нет, ключ создается при запуске. Затем клиент использует его для регистрации учетной записи на сервере.

Примечание Если у вас уже есть ключ учетной записи, поместите его в подкаталог клиента перед запуском для повторного использования учетной записи.

Клиент ACME также использует отдельный ключ (private.key) для запросов на подпись сертификата (CSR); если нужно, этот ключ сертификата также создается автоматически при запуске.

При запуске клиент запрашивает сертификат, если его еще нет, подписывая и отправляя CSR для всех доменов, которыми он управляет, серверу CA. Сервер проверяет владение доменом по HTTP и выдает сертификат, который клиент сохраняет локально (certificate.pem).

Когда приближается завершение срока действия сертификата или изменяется список доменов, клиент подписывает и отправляет еще один CSR на сервер CA. Сервер снова проверяет владение и выдает новый сертификат, который клиент устанавливает локально, заменяя предыдущий.

Здесь клиент ACME с именем example управляет доменами example.com и www.example.com. Сертификат и его ключ доступны через префиксные переменные $acme_cert_<name> и $acme_cert_key_<name>. Они содержат соответствующие файлы, которые используются с ssl_certificate и ssl_certificate_key:

server {
    listen 443 ssl;
    http2 on;

    server_name example.ru;
    root /var/www/example.ru/html;
    index index.html index.php index.xml;

    acme example;
    ssl_certificate $acme_cert_example;
    ssl_certificate_key $acme_cert_key_example;

    # pass the PHP scripts to FastCGI server listening on UNIX sock
    #
    location ~ \.php$ {
        fastcgi_pass   unix:/run/php/php8.2-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.ru/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.ru/html;
    }
    # deny access to .htaccess files, if Apache's document root concurs with angie's one
    location ~ /\.ht {
        deny  all;
    }
}
server {
    listen 443 ssl;
    http2 on;

    server_name www.example.ru;
    return 301 https://example.ru$request_uri;

    acme example;
    ssl_certificate $acme_cert_example;
    ssl_certificate_key $acme_cert_key_example;
}
server {
    listen 80;
    listen [::]:80;

    server_name example.ru www.example.ru;
    return 301 https://example.ru$request_uri;
}

Как уже отмечалось, порт 80 должен быть открыт для вызовов ACME по HTTP. Однако, как указывает предыдущий пример, директива listen для этого порта может стоять в отдельном блоке server. Если существующего блока с такой директивой у вас нет, вы можете ограничить его только вызовами ACME:

server {
    listen 80;
    return 444; # Нет ответа, соединение закрыто
}

Оптимизация HTTPS-сервера

документация Angie

sudo nano /etc/angie/angie.conf

Вариант настройки:

# Load Brotli module
load_module modules/ngx_http_brotli_filter_module.so;
load_module modules/ngx_http_brotli_static_module.so;

user www-data;
worker_processes auto;
worker_rlimit_nofile 65536;

error_log  /var/log/angie/error.log notice;
pid        /var/run/angie.pid;

events {
    worker_connections      65536;
}

http {

    # Basic
    sendfile                  on;
    tcp_nopush                on;
    tcp_nodelay               on;
    types_hash_max_size       2048;
    server_tokens             off;
    ignore_invalid_headers    on;

    # Decrease default timeouts to drop slow clients
    keepalive_timeout         40s;
    send_timeout              20s;
    client_header_timeout     20s;
    client_body_timeout       20s;
    reset_timedout_connection on;

    # Hash sizes
    server_names_hash_bucket_size 64;

    # Acme Let's Encrypt certificate enable
    resolver 127.0.0.53; # требуется для директивы 'acme_client'
    acme_client terra https://acme-v02.api.letsencrypt.org/directory;
    acme_client ceterra https://acme-v02.api.letsencrypt.org/directory;
    acme_client panel https://acme-v02.api.letsencrypt.org/directory;

    ssl_session_cache         shared:SSL:10m;
    ssl_session_timeout       10m;

    # Mime types
    include       /etc/angie/mime.types;
    default_type  application/octet-stream;

    # Logs
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    log_format extended '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" rt="$request_time" '
                        '"$http_user_agent" "$http_x_forwarded_for" '
                        'h="$host" sn="$server_name" ru="$request_uri" u="$uri" '
                        'ucs="$upstream_cache_status" ua="$upstream_addr" us="$upstream_status" '
                        'uct="$upstream_connect_time" urt="$upstream_response_time"';

    access_log  /var/log/angie/access.log  main;

    # Dynamic gzip:
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    #text/html is always included by default, no need to include explicitely
    gzip_types  text/plain text/xml text/css
                application/x-javascript application/javascript application/ecmascript text/javascript application/json
                application/rss+xml
                application/xml
                image/svg+xml
                application/x-font-ttf application/vnd.ms-fontobject image/x-icon;

    # Dynamic brotli:
    brotli on;
    brotli_comp_level 6;
    #text/html is always included by default, no need to include explicitely
    brotli_types  text/plain text/xml text/css
                  application/x-javascript application/javascript application/ecmascript text/javascript application/json
                  application/rss+xml
                  application/xml
                  image/svg+xml
                  application/x-font-ttf application/vnd.ms-fontobject image/x-icon;

    # Virtual Hosts
    include /etc/angie/sites-enabled/*;

    # Configs
    # include /etc/angie/http.d/*.conf;
}

Браузеры обычно сохраняют полученные промежуточные сертификаты, подписанные доверенными центрами сертификации, поэтому активно используемые браузеры уже могут иметь требуемые промежуточные сертификаты и не выдать предупреждение о сертификате, присланном без связанной с ним цепочки сертификатов. Убедиться в том, что сервер присылает полную цепочку сертификатов, можно при помощи утилиты командной строки openssl, например:

openssl s_client -connect www.godaddy.com:443

Certificate chain
 0 s:/C=US/ST=Arizona/L=Scottsdale/1.3.6.1.4.1.311.60.2.1.3=US
     /1.3.6.1.4.1.311.60.2.1.2=AZ/O=GoDaddy.com, Inc
     /OU=MIS Department/CN=www.GoDaddy.com
     /serialNumber=0796928-7/2.5.4.15=V1.0, Clause 5.(b)
   i:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc.
     /OU=http://certificates.godaddy.com/repository
     /CN=Go Daddy Secure Certification Authority
     /serialNumber=07969287
 1 s:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc.
     /OU=http://certificates.godaddy.com/repository
     /CN=Go Daddy Secure Certification Authority
     /serialNumber=07969287
   i:/C=US/O=The Go Daddy Group, Inc.
     /OU=Go Daddy Class 2 Certification Authority
 2 s:/C=US/O=The Go Daddy Group, Inc.
     /OU=Go Daddy Class 2 Certification Authority
   i:/L=ValiCert Validation Network/O=ValiCert, Inc.
     /OU=ValiCert Class 2 Policy Validation Authority
     /CN=http://www.valicert.com//emailAddress=info@valicert.com

Настройка сертификата SSL - вариант 2

используем ACME клиент - certbot

Генерирует ключ

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Создаёт папку для снипетов

sudo mkdir -p /etc/angie/snippets/

Создаёт снипет для SSL

sudo nano /etc/angie/snippets/ssl-params.conf
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;

ssl_dhparam /etc/ssl/certs/dhparam.pem;

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;

add_header Strict-Transport-Security "max-age=63072000" always;

Получение сертификата Let's Encrypt с помощью certbot

Сайт: Let's Encrypt

Let’s Encrypt использует ACME-протокол для подтверждения ваших прав на данное доменное имя, а также для выпуска сертификата для него. Чтобы получить сертификат Let’s Encrypt, вам необходимо использовать ACME-клиент.

Представленные ниже ACME-клиенты разрабатываются сторонними организациями. Let’s Encrypt не управляет их разработкой, не проверяет их код и не предоставляет гарантий их безопасности и надёжности.

Существуют ACME-клиенты в виде расширений для браузеров, но мы не приводим их здесь по причине необходимости ручного обновления сертификатов.

Рекомендуемый клиент: Certbot

Установка certbot:

Если нет менеджера пакетов snap, устанавливаем:

sudo apt update
sudo apt install snapd

Если команда sudo не установлена (обычно из-за того, что во время установки был предоставлен пароль root), вы можете установить snap, сначала переключившись на учетную запись root:

sudo su root
sudo apt update
sudo apt install snapd

Либо выйдите из системы и снова войдите в нее, либо перезапустите систему, чтобы убедиться, что пути snap обновлены правильно.

После этого установите core snap, чтобы получить последнюю версию snapd.

sudo snap install core
  core 16-2.45.2 from Canonical✓ installed

Удалите certbot-auto и все пакеты Certbot OS Если у вас установлены какие-либо пакеты Certbot с помощью диспетчера пакетов ОС, такого как aptdnf или yum, вам следует удалить их перед установкой Certbot snap, чтобы убедиться, что при выполнении команды certbot используется привязка, а не установка из диспетчера пакетов вашей ОС. Точная команда для этого зависит от вашей операционной системы, но распространенными примерами являются sudo apt-get remove certbotsudo dnf remove certbot или sudo yum remove certbot.

sudo apt remove certbot
sudo apt autoclean

Устанавливает certbot:

sudo snap install --classic certbot

Подготовка команды certbot

sudo ln -s /snap/bin/certbot /usr/bin/certbot

Подтвердите уровень защиты плагина

sudo snap set certbot trust-plugin-with-root=ok

Для доступа к сайту при обновлении сертификата необходимо внести дополнения в файл конфига сайта под управлением WinterCMS:

sudo nano /etc/angie/sites-available/example.com.conf

Добавить в секцию server разрешение на доступ:

# Block access to all dot files and folders except .well-known
location ~ /\.(?!well-known).* { deny all; }
location ~ ^/.well-known/acme-challenge { try_files $uri 404; }

Выпускает сертификат

sudo certbot certonly --webroot -w /var/www/example.com/html -d example.com -d www.example.com

Ответ сервера:

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for example.com and www.example.com

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/example.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/example.com/privkey.pem

This certificate expires on 2023-11-24.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   <https://letsencrypt.org/donate>
 * Donating to EFF:                    <https://eff.org/donate-le>
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Меняет конфиг сайта

sudo nano /etc/angie/sites-available/example.com.conf
server {
    listen 80;
    listen [::]:80;

    server_name example.com www.example.com;
    return 301 https://example.com$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;

    server_name www.example.com;
    return 301 https://example.com$request_uri;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;

    include snippets/ssl-params.conf;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;

    server_name example.com;
    root /var/www/example.com/html;
    index index.html index.xml;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;

    include snippets/ssl-params.conf;

    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;
    }
}

Проверяет конфиг и перезагружает сервер angie:

sudo angie -t && sudo service angie reload

Проверяет домен

  • curl <http://example.com> — редирект
  • curl <https://example.com> — сайт

как проверить возможность автоматического обновления сертификатов:

sudo certbot renew --dry-run

# или для nodejs сервера:

sudo /usr/bin/certbot certonly --webroot -w /var/www/example.com/app/public -d example.com -d www.example.com --dry-run

Установка cron:

sudo crontab -e

С новой строки написать команду (каждый вторник в 0:30):

30 0 * * 2 /usr/bin/certbot certonly -n --webroot -w /var/www/example.com/html -d example.com -d www.example.com

или лучше сразу для всех серверов (каждый вторник в 0:30):

30 0 * * 2 /usr/bin/certbot renew

Let's Encrypt разрешает и рекомендует производить обновление за 30 дней до окончания действующего сертификата.

Посмотреть cron:

sudo crontab -l

Подробнее о обновлении сертификата SSL смотри здесь:

Как получить сертификат Let's Encrypt - Losst

И здесь:

Как установить бесплатный SSL-сертификат от Let's Encrypt на VPS – Beget

Установка MySQL


Устанавливает пакеты

sudo apt -y install mysql-server

Запусткает скрипт безопасности

sudo mysql_secure_installation

При установке mySql v8 надо первоначально настроить доступ для пользователя 'root' @'localhost'.

Входит в mysql

sudo mysql

дает команду и вводит новый паспорт:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by 'mynewpassword';

Далее после запуска mysql_secure_installation на смену и ужесточение пароля отвечаем No, а на остальные 4 вопроса Yes.

Входит в оболочку mysql с пользователем "root" и затем вводит паспорт:

sudo mysql -u root -p

полная команда для входа:

mysql -u 'пользователь' -p 'пароль' -h 'хост_или_ip_сервера_MySQL'

Все команды заканчиваются точкой с запятой.

смотрит версию сервера и дату

SELECT VERSION(), CURRENT_DATE;

смотрит все базы:

SHOW DATABASES;

создаёт новую базу:

CREATE DATABASE имя_базы_данных;

создаёт нового пользователя:

CREATE USER 'имя_пользователя'@'хост_или_IP_машины' IDENTIFIED BY 'пароль_пользователя';

при указании хоста для подключения к MySQL серверу можно неуказывать @'хост_или_IP_машины' тогда по умолчанию будет символ процента (%) и создаваемый пользователь может соединяться с сервером MySQL с любого IP адреса или хоста.

Задаёт права пользователя для выполнения любых действий с созданной базой данных:

GRANT ALL PRIVILEGES ON имя_базы_данных.* TO 'имя_пользователя'@'хост_или_IP_машины';

Опция ALL указывает на то, что пользователю разрешаются любые действия с определённой БД. Полный список прав, которые можно выдавать пользователям с помощью команды GRANT.

Cоздаёт суперюзера, т.е. обладающего глобальными привилегиями для осуществления различных действий со всеми БД на сервере:

GRANT ALL PRIVILEGES ON *.* TO 'имя_пользователя'@'хост_или_IP_машины';

Очищает кэш MySQL сервера после установки и изменний привилегий:

FLUSH PRIVILEGES;

Выбор базы данных для работы:

USE имя_базы_данных;

смотрит текущего пользователя и его текущую выбраную базу данных:

SELECT USER(), DATABASE();

Удаляет базу данных:

DROP DATABASE имя_базы_данных;

удалить пользователя:

DROP USER IF EXISTS имя_пользователя;

выводит на экран список всех существующих на текущем MySQL сервере пользователей:

SELECT User FROM mysql.user;

Если нужно посмотреть хосты, с которых пользователи могут коннектиться к серверу, и список привилегий:

SELECT User, Host, Grant_priv FROM mysql.user;

импортирует дамп базы данных на сервер MySQL из файла:

mysql -u 'имя_пользователя' -p'пароль' 'имя_базы_данных' < 'путь_и_имя_файла_дампа'

импортирует базу данных из архива:

gunzip > 'имя_файла_архива.sql.gz' | mysql -u 'user' -p'пароль' 'имя_базы_данных'

экспортирует базу данных с сервера MySQL в файл дампа:

mysqldump -u имя_пользователя -p имя_базы_данных > путь_и_имя_файла_дампа

выходит из консоли mysql:

exit

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

Для Ubuntu 22.04.1 LTS будет установлен по умолчению PHP 8.1.2

за основу берем команды с расчетом вебразработки 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-FPM:

sudo systemctl status php8.2-fpm.service

или

sudo service php8.2-fpm status

Руководство по установке/обновлению PHP 8.2

Как установить PHP 8.2 на Debian/Ubuntu

Далее приведены команды для установки/обновления до PHP 8.2, а подробные шаги описаны ниже.

Ubuntu

sudo dpkg -l | grep php | tee packages.txt
sudo add-apt-repository ppa:ondrej/php # Нажмите Enter, когда будет предложено.
sudo apt update
sudo apt install php8.2 php8.2-cli php-8.2{bz2,curl,mbstring,intl}

sudo apt install php8.2-fpm
# Или
# sudo apt install libapache2-mod-php8.2

sudo a2enconf php8.2-fpm

# При обновлении со старой версии PHP:
sudo a2disconf php8.1-fpm

## Удаление старых пакетов
sudo apt purge php8.1*

Debian

sudo dpkg -l | grep php | tee packages.txt

sudo apt install apt-transport-https lsb-release ca-certificates wget -y
sudo wget -O /etc/apt/trusted.gpg.d/php.gpg <https://packages.sury.org/php/apt.gpg>
sudo sh -c 'echo "deb <https://packages.sury.org/php/> $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
sudo apt update

# Добавьте в фигурные скобки все нужные вам расширения.
sudo apt install php8.2 php8.2-cli php8.2-{ctype,curl,xml,fileinfo,gd,json,mbstring,mysql,sqlite3,zip}

sudo apt install php8.2-fpm
# ИЛИ
# sudo apt install libapache2-mod-php8.2

sudo a2enconf php8.2-fpm

# При обновлении со старой версии PHP:
sudo a2disconf php8.1-fpm

## Удаление старых пакетов
sudo apt purge php8.1*

Подробное руководство по установке/обновлению PHP 8.2

1. Сохраните список расширений PHP

Следующая команда выводит список всех связанных с PHP пакетов, существующих в текущей системе, и сохраняет их в текстовый файл packages.txt. Это помогает восстановить тот же список пакетов в PHP 8.2.

При новой установке этот шаг не требуется.

dpkg -l | grep php | tee packages.txt

2. Добавить ondrej/php PPA в качестве репозитория

Репозитории поддерживаемые Ondřej Surý содержат основные пакеты PHP и постоянно обновляются.

После добавления этого репозитория в список источников программного обеспечения, первоначальную установку и обновление можно будет выполнить с помощью стандартных команд apt.

Ubuntu LTS Версии

sudo add-apt-repository ppa:ondrej/php # Нажмите Enter, когда будет предложено.
sudo apt update

Debian

sudo apt install apt-transport-https lsb-release ca-certificates
software-properties-common
sudo add-apt-repository ppa:ondrej/php # Нажмите Enter, когда будет предложено.
sudo apt update

3. Установка PHP 8.2 и расширения

Все пакеты PHP 8.2, доступные в репозитории, добавленном на шаге 2, следуют шаблону именования php8.2-. Расширения пакета PHP, такие, как jsonctypedaterandom и т.д. не нужно устанавливать вручную.

Пакет php8.2-common включает в себя несколько распространённых пакетов PHP. Позже можно выборочно отключить ненужные расширения.

sudo apt install php8.2 php8.2-cli php8.2-{ctype,curl,xml,fileinfo,gd,json,mbstring,mysql,sqlite3,zip}

Добавьте в фигурные скобки все необходимые расширения для новой установки. При обновлении существующей установки PHP в файле packages.txt, созданном в шаге 1, должны быть перечислены все текущие PHP пакеты.

4. Установка и включение серверных API

В системе, в которой веб-сервер интегрируется с PHP, установите дополнительные пакеты API сервера. Ниже приведены примеры наиболее популярных комбинаций:

Сервер Apache с PHP-FPM

sudo apt install php8.2-fpm
sudo a2enconf php8.2-fpm
sudo a2disconf php8.1-fpm # При обновлении с более старой версии PHP
sudo service apache2 restart

Apache c PHP в качестве модуля Apache

Установка PHP в качестве модуля Apache не рекомендуется, если только это не требуется для пограничного варианта использования.

sudo apt install libapache2-mod-php8.2
sudo a2enmod php8.2
sudo a2dismod php8.1 # При обновлении с более старой версии PHP
sudo service apache2 restart

Nginx с PHP-FPM

sudo apt install php8.2-fpm
sudo service nginx restart

Затем отредактируйте соответствующий файл конфигурации Angie/Nginx, чтобы он указывал на новый PHP сокет в директиве fastcgi_pass:

- fastcgi_pass unix:/run/php/php8.1-fpm.sock;
+ fastcgi_pass unix:/run/php/php8.2-fpm.sock;

5. Проверьте инсталляцию PHP 8.2

Для проверки установленной версии выполните следующие команды PHP CLI:

php -v
php -m

Ожидается, что вывод покажет PHP 8.2 вместе со списком установленных расширений PHP.

Для проверки интеграции с веб-сервером, попробуйте запустить PHP файл через веб-сервер.

6. Очистка старых пакетов PHP

Следующие команды удаляют старые версии PHP. Рекомендуется не удалять их, пока не будет проверена правильность установки PHP 8.2.

sudo apt purge php8.1* # Измените "php8.1" на имена старых версий PHP.

Это также удалит файлы конфигурации для удаляемых пакетов.

Запуск нескольких версий PHP

Нет необходимости устанавливать PHP 8.2 и удалять старую версию PHP, потому что можно одновременно запускать несколько версий PHP на одном сервере.

PHP 8.2 CLI будет установлен в /usr/bin/php8.2 по умолчанию и связан с php символической ссылкой, другие версии PHP будут установлены в (/usr/bin/php80, /usr/bin/php7.4 и т.д.). По умолчанию php связано символической ссылкой с последней версией PHP по умолчанию, но это можно изменить.

Команда update-alternatives предоставляет простой способ переключения между версиями PHP для PHP CLI, если несколько версий ссылаются на один и тот же php путь.

sudo update-alternatives --config php

Запуск этой команды вызывает интерактивное приглашение выбрать путь для php указывающий на нужную версию PHP.

There are 2 choices for the alternative php (providing /usr/bin/php).

  Selection    Path             Priority   Status
------------------------------------------------------------
* 0            /usr/bin/php8.2   82        auto mode
  1            /usr/bin/php8.1   81        manual mode
  2            /usr/bin/php8.2   82        manual mode

То же самое можно выполнить без интерактивной подсказки:

update-alternatives --set php /usr/bin/php8.1

Подключение 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.1/fpm/pool.d/www.conf

Затем найдите директиву listen и проверте что задан для нее путь к файлу сокета UNIX следующим образом - listen = /run/php/php8.1-fpm.sock

Если вы используете сокет UNIX, вам также необходимо установить соответствующие разрешения на чтение/запись для файла, чтобы разрешить подключения с веб-сервера ANGIE. По умолчанию Angie работает как пользователь www-data в Ubuntu.

Найдите параметры listen.owner и listen.group и задайте им значение www-data. Также установите режим на 0660, для параметра listen.mode.

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

Хотя сокет UNIX быстрее сокета TCP/IP, он менее масштабируем, поскольку он может поддерживать межпроцессное взаимодействие только в одной и той же ОС. Если Nginx и внутренний сервер приложений (PHP-FPM) работают в разных системах, вам придется настроить php-fpm для прослушивания сокетов TCP/IP для удаленного подключения.

sudo nano /etc/php/8.1/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 редактирует файл конфигурации домена (незабудь поменять 'example.com' на имя своего домена)

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.2-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        /etc/angie/fastcgi_params;
    }

    # deny access to .htaccess files, if Apache's document root concurs with angie's one
    location ~ /\.ht {
        deny  all;
    }

    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;
    }
}

Для прослушивания через сокет TCP/IP редактирует файл конфигурации домена (незабудь поменять 'example.com' на имя своего домена)

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;
    }
    # deny access to .htaccess files, if Apache's document root concurs with angie's one
    location ~ /\.ht {
        deny  all;
    }

    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;
    }
}

проверяет конфиг angie и перезапускает службы

sudo angie -t && sudo service angie restart
sudo systemctl restart php8.1-fpm

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

создаем тестовый файл test.php ( вместо example.com укажи свой домен )

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 www-data:www-data /var/www/

открыть в браузере по имени домена или по ip

http://имя_домена_или_IP

Настройка сервера 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.1-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.1-fpm

Тестирование подключения к базе данных для PHP

входим под рутом

sudo mysql -u root -p

создаем тестовую базу

CREATE DATABASE testdatabase;

создаём нового пользователя user с паролем pass11word

CREATE USER 'user'@'%' IDENTIFIED BY 'pass11word';

даём для user привелегии для доступа к базе testdatabase

GRANT ALL PRIVILEGES ON testdatabase.* TO 'user'@'%';

закрываем mysql

exit

проверка базы, входим под новым user

mysql -u user -p

смотрим базы

SHOW DATABASES;

создадим тестовую таблицу с именем todo_list

CREATE TABLE testdatabase.todo_list (
  item_id INT AUTO_INCREMENT,
  content VARCHAR(255),
  PRIMARY KEY(item_id)
);

добавим в базу данных

INSERT INTO testdatabase.todo_list (content) VALUES ("Моя первая важная запись");
INSERT INTO testdatabase.todo_list (content) VALUES ("А вот вторая ценная запись");
INSERT INTO testdatabase.todo_list (content) VALUES ("А в третьей записи будет ♥");

смотрим что получилось и выходим

SELECT * FROM testdatabase.todo_list;
exit

создаёт новый файл todo_list.php в корне сайта

sudo nano /var/www/example.com/html/todo_list.php

Следующий скрипт PHP подключается к базе данных MySQL и запросам по содержимому таблицы todo_list, выводя результаты в список. Если существует проблема подключения к базе данных, будет выдана ошибка.

Скопируем это содержимое в скрипт todo_list.php:

<?php
$user = "user";
$password = "pass11word";
$database = "testdatabase";
$table = "todo_list";

try {
  $db = new PDO("mysql:host=localhost;dbname=$database", $user, $password);
  echo "<h2>TODO</h2><ol>";
  foreach($db->query("SELECT content FROM $table") as $row) {
    echo "<li>" . $row['content'] . "</li>";
  }
  echo "</ol>";
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

забрать права на все вновь созданные файлы

sudo chown -R www-data:www-data /var/www/

открывам страницу в браузере

http://example.com_or_IP/todo_list.php

должно получиться:

TODO

  1. Моя первая важная запись
  2. А вот вторая ценная запись
  3. А в третьей записи будет ♥

если это получилось то значит среда PHP готова к работе с сервером mySQL

Установка и использование Composer в Ubuntu

Composer — это популярный менеджер зависимостей PHP, который упрощает процесс установки и обновления зависимостей проекта.

Предполагается что PHP и необходимые зависимости установлены

Загрузка и установка Composer

Composer предоставляет написанный на PHP скрипт installer. Мы должны загрузить его, убедиться, что он не поврежден, а затем использовать его для установки Composer.

Убедитесь, что вы находитесь в домашней директории, а затем загрузите установщик с помощью curl:

cd ~
curl -sS <https://getcomposer.org/installer> -o composer-setup.php

Далее мы убедимся, что хэш установщика совпадает с хэшем SHA-384 для последней версии установщика на странице Composer Public Keys / Signatures. Чтобы упростить проверку, вы можете использовать следующую команду для программного получения последней версии хэша со страницы Composer и ее сохранения в переменной оболочки:

HASH=`curl -sS <https://composer.github.io/installer.sig`>

Для проверки полученного значения можно использовать следующую команду:

echo $HASH

Теперь выполните следующий код PHP, приведенный на странице загрузки Composer, чтобы подтвердить безопасность запуска скрипта установки:

php -r "if (hash_file('SHA384', 'composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

Вывод должен выглядеть так:

Installer verified

Если вы увидите сообщение Installer corrupt, вам нужно повторно загрузить скрипт установки и еще раз убедиться, что вы используете правильный хэш. Затем повторите процедуру проверки. После успешной проверки установщика вы можете продолжить.

Чтобы выполнить глобальную установку composer, используйте следующую команду, которая выполнит загрузку и установку Composer в качестве общесистемной команды composer в каталоге /usr/local/bin:

sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer

Чтобы протестировать установку, запустите команду:

composer

как использовать composer можно почитать здесь

Установка PhpMyAdmin

Установка и настройка phpMyAdmin в Windows

Программа phpMyAdmin позволяет наглядно работать с базами данных . Для установки нужно загрузить дистрибутив со страницы https://www.phpmyadmin.net/

В каталоге с сайтом создайте папку phpmyadmin, и скопируйте содержимое файла phpMyAdmin-5.2.1-all-languages.zip.

Открываем Notepad++ и набираем следующий код :

<?php
  
/* Servers configuration */
$i = 0;
  
/* Server: localhost [1] */
$i++;
$cfg['Servers'][$i]['verbose'] = '';
$cfg['Servers'][$i]['host'] = 'localhost';
$cfg['Servers'][$i]['port'] = '';
$cfg['Servers'][$i]['socket'] = '';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = '';
$cfg['Servers'][$i]['nopassword'] = true;
$cfg['Servers'][$i]['AllowNoPassword'] = true;
  
/* End of servers configuration */
  
$cfg['blowfish_secret'] = 'kjLGJ8g;Hj3mlHy+Gd~FE3mN{gIATs^1lX+T=KVYv{ubK*U0V';
$cfg['DefaultLang'] = 'ru';
$cfg['ServerDefault'] = 1;
$cfg['UploadDir'] = '';
$cfg['SaveDir'] = '';
?>

Сохраняем файл под названием config.inc.php в папке phpmyadmin.

Для работы phpmyadmin необходимо наличие php, mysql и сервера.

Теперь открываем Web – браузер и в адресной строке набираем http://phpmyadmin/. В итоге мы увидим то что увидим ... Настройки PhpMyAdmin выполнены , если вы прошли все этапы установки сервера ручной сборки , и все у Вас работает , то наслаждайтесь созданием сайтов .


END

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