сперва настраиваем Ubuntu или Debian: подключение к серверу через терминал с SSH c логином от root
ssh root@ip_server
Обновляет систему
apt update && apt upgrade -y
Меняет пароль root
passwd
Добавляет пользователя
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 [опции] ВладелецГруппаДругие файл(ы)
- Опция
-R
позволяет рекурсивно изменять права доступа для каталога Владелец
— права доступа в числовом виде для владельцаГруппа
— права доступа в числовом виде для группыДругие
— права доступа в числовом виде для других
Изменяет владельца и/или группу файла или директории.
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:
echo "deb https://download.angie.software/angie/ubuntu/ `lsb_release -cs` main" \
| sudo tee /etc/apt/sources.list.d/angie.list > /dev/null
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
sudo nano /etc/angie/angie.conf
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: Перезагрузка конфигурации
При любом изменении конфигурации, для применения изменений процесс 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 не использует сквозную нумерацию своих процессов для каких-либо прикладных целей.
справка 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, создайте или отредактируйте (как 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.htmllocation = /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
Получение сертификата LetsEncrypt на сервере Angie начиная с версии 1.5.0 с помощью модуля Acme. Обеспечивает автоматическое получение сертификатов с использованием протокола ACME По умолчанию этот модуль не собирается; его сборку необходимо включить с помощью параметра конфигурации --with-http_acme_module
.
В пакетах из наших репозиториев модуль уже включен в сборку.
Шаги для включения запроса сертификатов в конфигурации:
-
Настройте клиент ACME в блоке
http
с помощью директивы acme_client, задающей уникальное имя клиента и другие параметры; можно настроить несколько клиентов ACME. -
Укажите домены, для которых обновляются сертификаты: для доменных имен, перечисленных во всех директивах server_name всех блоков
server
с директивами acme, указывающими на один и тот же клиент ACME, будет выдан единый сертификат. -
Убедитесь, что принимаются вызовы ACME: сейчас Angie поддерживает только проверку доменных имен по HTTP, что требует ответа на специальный запрос на порту 80 от удостоверяющего центра (CA); это так называемый вызов ACME.
-
Настройте 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; # Нет ответа, соединение закрыто
}
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
Генерирует ключ
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
Let’s Encrypt использует ACME-протокол для подтверждения ваших прав на данное доменное имя, а также для выпуска сертификата для него. Чтобы получить сертификат Let’s Encrypt, вам необходимо использовать ACME-клиент.
Представленные ниже ACME-клиенты разрабатываются сторонними организациями. Let’s Encrypt не управляет их разработкой, не проверяет их код и не предоставляет гарантий их безопасности и надёжности.
Существуют ACME-клиенты в виде расширений для браузеров, но мы не приводим их здесь по причине необходимости ручного обновления сертификатов.
Рекомендуемый клиент: 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 с помощью диспетчера пакетов ОС, такого как apt
, dnf
или yum
, вам следует удалить их перед установкой Certbot snap, чтобы убедиться, что при выполнении команды certbot
используется привязка, а не установка из диспетчера пакетов вашей ОС. Точная команда для этого зависит от вашей операционной системы, но распространенными примерами являются sudo apt-get remove certbot
, sudo 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
Для 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 на Debian/Ubuntu
Далее приведены команды для установки/обновления до PHP 8.2, а подробные шаги описаны ниже.
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*
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 пакетов, существующих в текущей системе, и сохраняет их в текстовый файл packages.txt
. Это помогает восстановить тот же список пакетов в PHP 8.2.
При новой установке этот шаг не требуется.
dpkg -l | grep php | tee packages.txt
Репозитории поддерживаемые Ondřej Surý содержат основные пакеты PHP и постоянно обновляются.
После добавления этого репозитория в список источников программного обеспечения, первоначальную установку и обновление можно будет выполнить с помощью стандартных команд apt
.
sudo add-apt-repository ppa:ondrej/php # Нажмите Enter, когда будет предложено.
sudo apt update
sudo apt install apt-transport-https lsb-release ca-certificates
software-properties-common
sudo add-apt-repository ppa:ondrej/php # Нажмите Enter, когда будет предложено.
sudo apt update
Все пакеты PHP 8.2, доступные в репозитории, добавленном на шаге 2, следуют шаблону именования php8.2-
. Расширения пакета PHP, такие, как json
, ctype
, date
, random
и т.д. не нужно устанавливать вручную.
Пакет 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 пакеты.
В системе, в которой веб-сервер интегрируется с PHP, установите дополнительные пакеты API сервера. Ниже приведены примеры наиболее популярных комбинаций:
sudo apt install php8.2-fpm
sudo a2enconf php8.2-fpm
sudo a2disconf php8.1-fpm # При обновлении с более старой версии PHP
sudo service apache2 restart
Установка PHP в качестве модуля Apache не рекомендуется, если только это не требуется для пограничного варианта использования.
sudo apt install libapache2-mod-php8.2
sudo a2enmod php8.2
sudo a2dismod php8.1 # При обновлении с более старой версии PHP
sudo service apache2 restart
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;
Для проверки установленной версии выполните следующие команды PHP CLI:
php -v
php -m
Ожидается, что вывод покажет PHP 8.2 вместе со списком установленных расширений PHP.
Для проверки интеграции с веб-сервером, попробуйте запустить PHP файл через веб-сервер.
Следующие команды удаляют старые версии PHP. Рекомендуется не удалять их, пока не будет проверена правильность установки PHP 8.2.
sudo apt purge php8.1* # Измените "php8.1" на имена старых версий 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
идеи взяты здесь
Чтобы принимать запросы 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.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.
Хотя сокет 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
После того, как вы настроили адрес, который прослушивает 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
создаем тестовый файл 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
входим под рутом
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
должно получиться:
- Моя первая важная запись
- А вот вторая ценная запись
- А в третьей записи будет ♥
если это получилось то значит среда PHP готова к работе с сервером mySQL
Composer — это популярный менеджер зависимостей PHP, который упрощает процесс установки и обновления зависимостей проекта.
Предполагается что PHP и необходимые зависимости установлены
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 в 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