среда, 13 марта 2024 г.

Настройка https в Nginx (openssl)

Источники: первый, второй.

На виртуальной машине Oracle VM VirtualBox установлен пакет LEMP (Debian 12.4, Nginx, MySQL/Mariadb, PHP 8.2).

Имя web-ресурса: ae-eco.local, для него и будем настраивать сертификат.


1. Обновляем пакеты GNU\Linux:

# apt-get update && apt-get upgrade


2. Создаем каталог для хранения сертификатов и переходим в него:

# mkdir /etc/nginx/ssl && cd /etc/nginx/ssl


3. Генерируем файлы сертификата и ключа:

openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout ae-eco.key -out ae-eco.crt

При генерации сертификата на вопросы отвечаем как считаем нужным, в моём случае:
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:Astrakhan
Locality Name (eg, city) []:Astrakhan
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Private
Organizational Unit Name (eg, section) []:Private
Common Name (e.g. server FQDN or YOUR name) []:ae-eco.local
Email Address []:admin@ae-eco.local



4. В настройке сервера Nginx указываем следующее:

server {
    ...
    listen 443 ssl http2;
    ssl_certificate /etc/nginx/ssl/ae-eco.crt;
    ssl_certificate_key /etc/nginx/ssl/ae-eco.key;
    ...
}



5. Для переадресации со схемы http на https добавляем:

server {
    ...
    if ($scheme != "https") {
        return 301 https://$host$request_uri;
    }
    ...
}



6. Проверяем конфигурацию Nginx:

# nginx -t

или

# nginx -T


7. Перезапускаем Nginx:

# systemctl restart nginx


Заключение:
В моём случае настройка виртуального сервера в файле /etc/nginx/sites-enabled/default для локального web-ресурса ae-eco.local:
server {
listen 80;
listen [::]:80;
listen 443 ssl http2;
server_name ae-eco.local;
ssl_certificate /etc/nginx/ssl/ae-eco.crt;
ssl_certificate_key /etc/nginx/ssl/ae-eco.key;
#redirect non-https traffic
if ($scheme != "https") {
return 301 https://$host$request_uri;
}
root /var/www/ae-eco.local/public_html;
index index.php index.html index.htm index.nginx-debian.html;
access_log /var/www/ae-eco.local/ae-eco.local.access.log;
error_log /var/www/ae-eco.local/ae-eco.local.error.log;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_NAME $document_root$fastcgi_script_name;
include fastcgi_params;
include snippets/fastcgi-php.conf;
}
}

четверг, 29 февраля 2024 г.

golang, начало

Перед установкой golang выполняем обновление ОС GNU/Linux.

Для ubuntu, debian/kalilinux:

# apt update && apt upgrade -y

Для AltLinux:

# apt-get update && apt-get dist-upgrade -y


1. Подготовка окружения для разработки

1.1. Установка golang

Для ubuntu, debian/kalilinux:

# apt install golang -y

Для AltLinux:

# apt-get install golang gcc -y


1.2. Первая программа

Создаём каталог тестового проекта и переходим в него:

# mkdir -p ~/develop/golang/test && cd ~/develop/golang/test


Создаем go-файл `test.go` со следующим содержанием:

# vim test.go

package main

import (

    "fmt"

)

func main() {

    fmt.Println("test string")

}

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

# go run test.go

...если на экране отобразился текст "test string", значит установка прошла правильно.


2. Многофайловые проекты

2.1. Разделение кодовой базы в разных файла одного каталога

Создаем каталог проекта и переходим в него:

# mkdir -p ~/develop/golang/test2 && cd ~/develop/golang/test2


Создаем главный файл проекта следующего содержания:

# vim main.go

package main

import (

    "fmt"

)

func func01() {

    fmt.Println("func01 from main.go file")

}

func main() {

    func01()

    func02()

}


Создаем дополнительный файл с функцией func02 следующего содержания:

# vim func02.go

package main

import (

   "fmt"

)

func func02() {

    fmt.Println("func02 from func02.go file")

}


Запускаем код в режиме интерпретации кода:

# go run main.go func02.go

...на экране должны отобразиться две строки.


Пишем скрипт для запуска следующего содержания:

# vim run.sh

 go run main.go func02.go

Назначаем скрипту атрибут исполняемого файла:

# chmod +x run.sh

Теперь этот проект можно запускать файлом run.sh:

# ./run.sh


2.2. Импорт кода/данных из файлов, расположенных в разных каталогах одного из наших проектов

Все проекты программ разрабатываемые нами на языке golang мы храним в домашнем каталоге "~/develop/golang". Также в среде разработки golang есть служебный каталог (/usr/lib/golang/src), в котором хранятся пакеты стандартной библиотеки golang, такие как "fmt" которая использовалась выше, и те, которые мы закачиваем из внешних репозиториев, на пример с github.ru/gorilla/mux.

Если попробовать в файле `main.go` выполнить импорт, например, пакета "mylib9087", то при попытке выполнения программы мы получим сообщение похожее на "main.go:8:2: package mylib9087 is not in std (/usr/lib/golang/src/mylib9087").

Один из возможных вариантов выполнять импорт наших пакетов которые находятся в структуре каталога "~/develop/golang" это создать на него ссылку в каталоге "/usr/lib/golang/src":

# ln -s ~/develop/golang /usr/lib/golang/src/myapps

В результате, при следующей структуре каталогов наших проектов:

~/develop/golang

    /project1

        /app

            main.go

        /modules

            mymodule.go

далее, из файла `main.go` мы можем выполнить импорт кодовой базы или данных из файла `mymodule.go` следующим образом:

#vim ~/develop/golang/project1/modules/mymodule.go

package modules

import (

    "fmt"

)

func func02() {

    fmt.Println("text from go-file mymodule.go")

}


#vim ~/develop/golang/project1/app/main.go

package main

import (

    "fmt"

    "myapps/project1/modules"

)

func main() {

    fmt.Println("text from go-file main.go")

    func02()

}

При выполнении файла `main.go` в режиме интерпретации мы увидим 2 строки текста, первая из которых будет выведена из файла `main.go`, вторая из файла `func02.go`:

# go run ~/develop/golang/project1/app/main.go 

( статья не закончена, возможны ошибки, пока вариант черновой, пишется по памяти)

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

Debian 12. Настройка web-сервера LEMP (Linux, Nginx, Mysql, Php) + виртуальные хосты

 По памяти:

После установки Debian 12

Шаг 1. Обновляем систему с применением обновлений:

#> apt-get update && apt-get upgrade -y


Шаг 2. Устанавливаем web-сервер Nginx:

#> apt-get install nginx -y


Шаг 3. Устанавливаем и настраиваем СУРБД Maridb:

#>apt-get install mariadb-server mariadb-client -y

#>mysql_secure_installation


Шаг 4. Создаем два каталога для размещения отдельных веб-сайтов:

#>mkdir -p /var/www/jacobs-master.ru/public_html

#>mkdir -p /var/www/workey.online/public_html


Шаг 5. Устанавливаем права на каталоги для пользователя www-data:

#>chown -R www-data:www-data /var/www/jacobs-master.ru/public_html

#>chmod -R 755 /var/www/jacobs-master.ru/public_html

#>chown -R www-data:www-data /var/www/workey.online/public_html

#>chmod -R 755 /var/www/workey.online/public_html


Шаг 6. Устанавливаем Php:

#> apt-get install php php-fpm php-mysql php-common php-cli php-json php-opcache php-readline php-mbstring php-xml php-gd php-curl -y


Шаг 7. Добавить в конец файл `/etc/nginx/sites-available/default` описание виртуальных серверов:

server {

  listen 80;

  listen [::]:80;

  server_name jacobs-master.ru;

  root /var/www/jacobs-master.ru/public_html;

  index index.php index.html index.htm index.nginx-debian.html;

  location / {

    try_files $uri $uri/ /index.php;

  }

# Для обработки php-файлов

  location ~ \.php$ {

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

    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

    include fastcgi_params;

    include snippets/fastcgi-php.conf;

  }

}

server {

  listen 80;

  listen [::]:80;

  server_name workey.online;

  root /var/www/workey.online/public_html;

  index index.php index.html index.htm index.nginx-debian.html;

  location / {

    try_files $uri $uri/ /index.php;

  }

# Для обработки php-файлов

  location ~ \.php$ {

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

    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

    include fastcgi_params;

    include snippets/fastcgi-php.conf;

  }

}


Шаг 8. Проверяем синтаксис настроек nginx:

#> nginx -t


Шаг 9. Перезапускаем сервер nginx:

#> systemctl restart nginx

пятница, 24 ноября 2023 г.

Debian. Изменение Time, Date и Timezone

Просмотр даты:

# date


Просмотр даты, времени и временной зоны:

# timedatectl


Перед ручной корректировкой даты, времени или временной зоны, отключаем синхронизацию времени:

# timedatectl set-ntp no


Изменение даты (в формате "YYYY-MM-DD"):

# timedatectl set-time 2023-11-24


Изменение времени (в формате "hh-mm-ss"):

# timedatectl set-time 10:12


Просмотр временных зон:

# timedatectl list-timezones


Установка временной зоны Europe/Astrakhan (GMT+4):

# timedatectl set-timezone Europe/Astrakhan

вторник, 20 июня 2023 г.

Создание нескольких виртуальных хостов (Apache2 vhosts)

 Источник: https://www.digitalocean.com/community/tutorials/how-to-set-up-apache-virtual-hosts-on-ubuntu-18-04-ru#


Шаг 1. (НЕ ОБЯЗАТЕЛЬНО) Обновляем ОС Debian и устанавливаем Apache2:

# sudo apt-get update && sudo apt-get upgrade

#sudo apt-get install -y apache2


Шаг 2. Создаем каталоги для сайтов:

#sudo mkdir -p /var/www/test1.local

#sudo mkdir -p /var/www/test2.local


Шаг 3. Даем права пользователю на каталоги сайтов:

#sudo chown -R user:user /var/www/test1.local

#sudo chown -R user:user /var/www/test2.local

#sudo chmod -R 755 /var/www


Шаг 4. Создаем конфигурации для сайтов:

#sudo nano /etc/apache2/sites-available/test1.local.conf

<VirtualHost *:80>
    ServerName test1.local
    ServerAdmin admin@test1.local
    DocumentRoot /var/www/test1.local
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>


#sudo nano /etc/apache2/sites-available/test2.local.conf

<VirtualHost *:80>
    ServerName test2.local
    ServerAdmin admin@test2.local
    DocumentRoot /var/www/test2.local
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>


Шаг 5. Проверка конфигурации Apache2

#apachectl -t

[ Syntax OK ] 


Шаг 6. Активация конфигурационных файлов

#sudo a2ensite test1.local.conf

#sudo a2ensite test2.local.conf


Шаг 7. Деактивация сайта по умолчанию

#sudo a2dissite 000-default.conf


Шаг 8. Перезагрузка сервера Apache2

#sudo systemctl restart apache2

#sudo systemctl status apache2


Шаг 9. Настройка файла hosts

В ОС Linux /etc/hosts

В ОС Windows c:\Windows\System.32\Drivers\etc\hosts

добавляем две записи для 2-х созданных виртуальных хостов:

IP_вашего_web_сервер      test1.local
IP_вашего_web_сервер      test2.local

четверг, 23 марта 2023 г.

PHP, ООП, автозагрузка классов (файлы классов в разных каталогов)

При разработке web-приложения на языке PHP с применением средств объектно-ориентированного программирования (ООП), удобно использовать автоматическую загрузку классов, особенно когда классов много, чтобы не использовать require_once или include для каждого файла, содержащего определенным класс.

Идея основана на применении функции Standart PHP Library - spl_autoload_register().
При создании класса: $class = new Class1(), если класс не найден, то вызывается функция spl_autoload_register().

Каждый класс хранится в отдельном файле.

Файл: /test/Framework/Autoloader.php
class Autoloader
{
    // Список каталогов, в которых расположены классы
    public static $dir_list = array('Framework/Core/', 'Framework/UI/');

    public static function register()
    {
        ini_set('unserialize_callback_func', 'spl_autoload_call');
        spl_autoload_register(array(new self, 'autoload'));
    }

    private static function autoload($class)
    {
        foreach (self::$dir_list as $dir)
        {
            $file = trim($dir, '/').'/'.$class.'.php';
            if (is_file($file))
            {
                require_once($file);
            }
        }
    }
}

Файл: /test/index.php
<?php
    required_once('Framework/Autoloader.php');

    // в случае если каталог поиска файлов классов надо установить свой
    // Autoloader::$dir_list = array('Framework/UI');

     Autoloader::register();

    $core = new Core();
    $menu = new Menu();
?>

Autoloader::$dir_list = позволяет определить массив строк, определяющих каталоги, в которых необходимо искать используемые файлы классов, или если для проекта список каталогов является одним и тем же списком, то этот список каталогов можно прописать прямо в статическую переменную класса Autoload `public static $dir_list = ...` и Autoloader::$dir_list не использовать.

Структура каталогов:
/test
    /Framework
        /Core
            Core.php

        /UI
            Menu.php

    Autoloader.php

index.php

вторник, 7 марта 2023 г.

Debian + php + ssmtp (Отправка почты с VDS или VMWare Player)

1. Обновляем Debian
sudo apt-get updat
sudo apt-get upgrade



2. Устанавливаем ssmtp
sudo apt-get install ssmtp


3. Устанавливаем mailutils (для использования `mail` в php-скрипте)
sudo apt-get install mailutils


4. Создаем учётную запись на почтовом сервер Yandex, например, user@yandex.ru с паролем user_111.

4.1. Заходим в настройки Яндекс.Почты созданного профиля и разрешаем "Все настройки" -> "Почтовые программы" и разрешаем доступ к почтовому ящику с помощью почтовых клиентов.

4.2. Создаем отдельный пароль для приложения, чтобы не сообщать сторонним сервисам ваш общий пароль на Яндексе (не помню где именно эта ссылка, можно найти через yandex.ru).


5. Добавляем к концу файл /etc/ssmtp/revaliases (используется для отправки письма с командной строки от имени учётной записи `root` и от исполнительного имени web-службы `www-data`)
root:user@yandex.ru:smtp.yandex.ru:465
www-data:user@yandex.ru:smtp.yandex.ru:465


6. Добавляем в файл /etc/ssmtp/ssmtp.conf настройки подключения к почтовому ящику:
mailhub=smtp.yandex.ru:465
AuthUser=user@yandex.ru
AuthPass=[Пароль из шага 4.2]
rewriteDomain=[hostnmae or domain-name]
hostname=[hostname or domain-name]
UseTLS=Yes
TLS_CA_File=/etc/ssl/certs/ca-certificates.crt
FromLineOverride=Yes
root=user@yandex.ru


Проверка через командную строку:
root@palem:~# echo "Test message!" | ssmtp user@yandex.ru


Проверка через php-скрипт:
<?php
    $to      = 'UserOld@list.ru';
    $subject = 'Test Email';
    $message = 'Hello Igor';
    $headers = 'From: Support Team <user@yandex.ru>' . "\r\n" .
        'Reply-To: support@server.com' . "\r\n" .
        'MIME-Version: 1.0' . "\r\n" .
        'Content-Type: text/html; charset=utf-8' . "\r\n" .
        'Content-Transfer-Encoding: quoted-printable';

    print mail($to, $subject, $message, $headers);
?>

Настройка https в Nginx (openssl)

Источники: первый , второй . На виртуальной машине Oracle VM VirtualBox установлен пакет LEMP (Debian 12.4, Nginx, MySQL/Mariadb, PHP 8.2). ...