вторник, 29 октября 2024 г.

Обновление php с 8.0 до 8.3 в Rocky Linux 9.4 (Blue Onyx)

1. Добавление репозитариев
# dnf install epel-release -y
# dnf install dnf-utils http://rpms.remirepo.net/enterprise/remi-release-9.rpm

2. Построение кеша
# dnf makecache -y

3. Сброс модуля php
# dnf module reset php

4. Просмотр репозитариев, из которых возможна установка php
# dnf module list php
Last metadata expiration check: 0:00:34 ago on Sat 26 Oct 2024 08:40:59 PM +04.
Rocky Linux 9 - AppStream
Name                    Stream                     Profiles                                     Summary
php                     8.1                        common [d], devel, minimal                   PHP scripting language
php                     8.2                        common [d], devel, minimal                   PHP scripting language
Remi's Modular repository for Enterprise Linux 9 - x86_64
Name                    Stream                     Profiles                                     Summary
php                     remi-7.4                   common [d], devel, minimal                   PHP scripting language
php                     remi-8.0                   common [d], devel, minimal                   PHP scripting language
php                     remi-8.1                   common [d], devel, minimal                   PHP scripting language
php                     remi-8.2                   common [d], devel, minimal                   PHP scripting language
php                     remi-8.3                   common [d], devel, minimal                   PHP scripting language
php                     remi-8.4                   common [d], devel, minimal                   PHP scripting language

5. Установка php 8.5
# dnf module -y install php:remi-8.3

6. Установка расширений php
# dnf -y install php php-{common,pear,cgi,curl,mbstring,gd,mysqlnd,gettext,bcmath,json,xml,fpm,intl,zip,imap}

7. Перезагрузка apache
# systemctl restart httpd


воскресенье, 28 июля 2024 г.

Установка Arch Linux на машину с UEFI. Настройка сети, установка sshd и firewalld.

Образ дистрибутива Arch Linux скачивается через Torrent или по HTTP(S) ссылкам с серверов, которые можно найти на странице загрузки: https://archlinux.org/download/.

Если установка производиться в Virtualbox с ПК, подключенного к роутеру, раздающему IP по DHCP, то настройки виртуальной машины после создания должны быть такими:


При загрузки машины с поддержкой UEFI с образа Arch Linux будет показано меню:
 
Нужно выбрать «Arch Linux install medium (x86_64, UEFI)». После этого произойдет загрузка Arch Linux в Live режиме и будет выдано приглашение:
 
На данном этапе нужно провести настройку сети, что бы из загруженной в Live режиме системы был доступ в Интернет. Если имеем дело с виртуальной машиной, и роутером, раздающим IP адреса по DHCP, то доступ в Интернет будет сразу.
Проверка состояния интерфейса и выданного IP адреса:
# ip a
Проверка доступности сети выполняется обычным пингом:
# ping archlinux.org
Следующим этапом нужно провести разметку диска.
Проверка списка дисков выполняется командой:
# fdisk -l
Диски, пригодные для установки системы, должны иметь имена типа /dev/sda или /dev/sdb.
Разбиение диска начинается с создание таблицы разделов. Эта операция выполняется с помощью программы cfdisk:
# cfdisk /dev/sda
Для машин запускающихся с помощью UEFI, необходима таблица разделов типа GPT.
В таблицу разделов нужно добавить: раздел EFI, раздел подкачки swap и корневой раздел.
1) Создаем раздел EFI
[New] -> Partition size: 512М 
Затем выбираем пункт меню [Type] -> [EFI System]
2) Создаем раздел подкачки. Размер раздела swap должен быть равен размеру оперативной памяти в системе:
[New] -> Partition size: 4G 
Затем выбираем пункт меню [Type] -> [Linux swap]
3) Оставшееся место выделяем для корневого раздела ОС Linux (/)
[New] -> Partition size: 23.5G (Оставшееся место) 
Должно получиться примерно так:
Применяем изменения выбрав пункт меню [ Write ]. Система задаст вопрос "Are you sure you want to write the partition table to disk?" вводим «yes» и нажимаем Enter
Выходим из программы создания разделов, выбрав пункт меню [ Quit ]
Созданные разделы можно посмотреть
# fdisk -l
или 
# lsblk
Теперь нужно отформатировать разделы и инициировать swap область:
# mkfs.vfat -F32 /dev/sda1
# mkswap /dev/sda2
# swapon /dev/sda2
# mkfs.ext4 /dev/sda3

Созданные и отформатированные разделы нужно примонтировать в Live OS Linux в директорию /mnt:
# mount /dev/sda3 /mnt
Выполняем установку системы Arch Linux в /mnt
# pacstrap /mnt base base-devel linux linux-firmware
Это занимает некоторое время (2-10 минут).

Зафиксируем расположение дис-ков в системе, сгенерируя файл fstab
# genfstab -U –p /mnt >> /mnt/etc/fstab

Сменим корневой каталог операционной системы на /mnt с помощью утилиты arch-chroot
# arch-chroot /mnt /bin/bash
Установим привычный редактор nano в устанавливаемую ОС:
# pacman -S nano
Установим NetworkManager, который потребуется для настройки сети в дальнейшем:
# pacman -S networkmanager

Устанавливаем временную зону
# ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtime

Далее нужно сгенерировать локали для возможности работы в консоли с английским и русским шрифтом. Для этого нужно в файле /etc/locale.gen
# nano /etc/locale.gen
раскомментировать строки
en_US.UTF-8 UTF-8
ru_RU.UTF-8 UTF-8

Затем выполнить:
# locale-gen
Следующая запись в файле задает локаль языка по умолчанию
# nano /etc/locale.conf
Вписываем строку:
LANG=en_US.UTF-8
Установка шрифтов и раскладки клавиатуры Alt + Shift
# nano /etc/vconsole.conf
FONT=cyr-sun16
KEYMAP=ruwin_alt_sh-UTF-8
(смена раскладки клавиатуры Alt + Shift.)

Задаем имя системы:
# echo 'kvs3-arch' >> /etc/hostname
Прописываем имя в файл hosts
# nano /etc/hosts
127.0.0.1 localhost
::1 localhost
127.0.0.1 kvs3-arch


Определение пользователей:
Для начало нужно установить пароля root
# passwd
А затем создать пользователя системы, например пользователя korolev
# useradd -m -g users -G wheel -s /bin/bash korolev
# passwd korolev

Что бы пользователи группы wheel могли иметь возможность переключаться в root необходимо сделать изменение в файле /etc/sudoers
# nano /etc/sudoers
Раскомментируем строку
%wheel ALL=(ALL:ALL) ALL
Установим загрузчик:
# pacman -S grub efibootmgr
Создаем директорию boot для EFI загрузчика:
# mkdir /boot/efi
Затем монтируем boot раздел диска в новую структуру ОС:
# mount /dev/sda1 /boot/efig
# grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB --removable
# grub-mkconfig -o /boot/grub/grub.cfg

Выходим из arch-chroot
# exit
Рекурсивно отмонтируем все примонтированные диски в /mnt
# umount -R /mnt
Выключаем систему:
# halt
Удаляем загрузочный образ Arch Linux из машины и загружаемся. При загрузке мы должны увидеть интерфейс загрузчика:
После загрузки машины, проверяем наличие сети и интерфейсов:
# ip a
Выполняем настройку сетевого интерфейса (enp0s3), прописав IP адрес вручную. Для этого будем использовать службу NetworkManager, а не установленную по умолчанию службы systemd-networkd. Выбор NetworkManager обусловлен тем, что данная утилита используется в работе с файрволом firewalld, который мне нравиться больше iptables.
Отключаем службу systemd-networkd и запускаем NetworkManager
# systemctl stop systemd-networkd
# systemctl disable systemd-networkd
# systemctl start NetworkManager
# systemctl enable NetworkManager

Запускаем утилиту конфигурирования сетевых интерфейсов
# nmtui
Прописываем данные интерфейса, например, так:
Выходим из утилиты nmtui и перезапускаем NetworkManager:
# systemctl restart NetworkManager
Для того, что бы убедиться, что после перезагрузки машины все настройки сети были применены, перезагружаемся
# reboot
После загрузки машины, вновь подключаемся к консоли.
Выполним синхронизацию локальной базы данных репозиториев и обновление системы Arch Linux
# pacman -Syu
Устанавливаем openssh, для того что бы к машине можно было подключаться по сети по SSH
# pacman -S openssh
# systemctl start sshd
# systemctl enable sshd

Установка firewalld:
# pacman -S nftables firewalld
# systemctl enable firewalld
# systemctl start firewalld
# firewall-cmd --set-default-zone=public
# firewall-cmd --permanent --zone=public --add-interface=enp0s3
# firewall-cmd --reload

По умолчанию в firewalld открыт доступ по ssh и есть возможность работы клиенту DHCPv6

На этом все, базовая установка системы закончена.

вторник, 28 мая 2024 г.

Установка и использование модуля WSGI в Apache на RokyLinux 8

WSGI (Web Server Gateway Interface) интерфейс между веб-сервером и web-приложением, реализованном на языке Python.

Перед установкой модуля WSGI необходимо убедиться, что в системе уже установлен apache и Python3.
Проверка работы установленного Apache:
# systemctl status httpd
● httpd.service - The Apache HTTP Server

Проверка версии python:
# python
Python 3.9.18 (main, Jan 4 2024, 00:00:00)


Установка модуля WSGI выполняется так:
# dnf -y install python3-mod_wsgi

Теперь серверу Apache нужно "рассказать", какие файлы запускать с помощью модуля WSGI.
Для этого создадим отдельный файл в конфигурации Apache
# nano /etc/httpd/conf.d/wsgi.conf
И вписываем туда строки:
WSGIScriptAlias /wsgi /var/www/html/wsgi.py
WSGIScriptAlias /wsgicmd /var/www/wsgi

Строка «WSGIScriptAlias /wsgi /var/www/html/wsgi.py» указывает, что при обращении к http://<ipадрес>/wsgi будет запускать скрипт /var/www/html/wsgi.py
А вот следующая директива «WSGIScriptAlias /wsgicmd /var/www/wsgi» разрешает запуск любого скрипта python из директории /var/www/wsgi после обращения к URL http://<ipадрес>/wsgicmd/<Скрипт> (например, http://10.10.49.166/wsgicmd/test.py запустит скрипт /var/www/wsgi/test.py)
Для применения изменений нужно перезапустить apache:
# systemctl restart httpd

Скрипты WSGI, запускаемые через сервер apache и модуль python3-mod_wsgi должны представлять из себя файл к кодом python, содержащий функцию приложения. Функция приложения должна называться «application». Функция обязательно принимает два аргумента:
1. Словарь среды, который содержит данные о входящем HTTP-запросе (строка запроса, заголовки, входные переменные и пр). Типовое имя словаря - «environ».
2. Функция, обеспечивающая HTTP-ответ обратно клиенту. Типовое имя этой функции: «start_response». После вызова start_response функции, основная функция возвращает текстом HTML тело загружаемой браузером страницы.

Для тестирования работы WSGI можно создать файл приложения на python:
# nano /var/www/wsgi/wsgi.py
def application(environ, start_response):
    status = '200 OK'
    response_header = [('Content-type','text/html')]     
    html = 'WSGI My Test 0'.encode("utf-8")
    start_response(status, response_header)
    return [html]


Теперь обратившись по URL http://IPадрес/wsgicmd/wsgi.py мы должны получить ответ в браузере:
«WSGI My Test 0»

Если в коде python будут ошибки, то вывод ошибок будет в логах web-сервера, в файле /var/log/httpd/error_log.
Пользователю будет показано сообщение:


Получение переменных GET и POST можно организовать так:
from urllib.parse import parse_qs
# Метод parse_qs разбивает строку и преобразует переменные в массив

def application(environ, start_response):
     status = '200 OK'
     response_header = [('Content-type','text/html')]
     html = "WSGI Тест 0<br>"

     # Метод отправки запроса HTTP (GET или POST):
     html += " REQUEST_METHOD: " + environ['REQUEST_METHOD'] + "<br>"

     # Получаем переменные из метода GET
     if environ['REQUEST_METHOD'] == 'GET':
         html +="Данные из метода GET:<br>"
         html +="Полная строка запроса:<br>"
         html +=environ['QUERY_STRING']+"<br>"
         html +="Переменные GET:<br>"
         get_env = parse_qs(environ['QUERY_STRING'], keep_blank_values=True)
         for x in get_env:
             html += x + ' => ' + get_env[x][0] + "<br>"

     # Получаем переменные из метода POST
     if environ['REQUEST_METHOD'] == 'POST':
         html +="Данные из метода POST:<br>"
         html +="Полная строка запроса:<br>"
         post_str = environ['wsgi.input'].read()
         html +=post_str.decode('utf-8')+"<br>"
         post_env = parse_qs(post_str.decode('utf-8'), keep_blank_values=True)
         for x in post_env:
             html += x + ' => ' + post_env[x][0] + "<br>"

    # Тестовая форма отправки POST запроса с этой страницы
    html +="<hr>"
    html +="<form method=post>"
    html +="<input name='name_p' type='text'>"
    html +="<input name='y_p' type='text'>"
    html +="<input type='submit'>"
    html +="</form>"

    # Вывод результатов
    start_response(status, response_header)
    # Преобразуем в байтовыую строку
    html = html.encode("utf-8")
    return [html]