Siege нагрузочное тестирование и неожиданная проблема с логированием

Siege — это мощная утилита командной строки для нагрузочного тестирования веб-серверов. Она позволяет имитировать большое количество одновременных пользователей, чтобы оценить производительность и стабильность вашего сайта или приложения.

Недавно при использовании Siege возникла интересная проблема с записью результатов в лог-файл. Команда с опцией -l <имя_файла> (например, -l siege.log) неожиданно приводила к ошибке "Connection refused", даже если сами тесты проходили успешно без записи в лог.

Решение оказалось довольно простым: вместо короткой опции -l необходимо использовать полную форму опции --log=<имя_файла> (например, --log=siege.log). После этого логирование стало работать корректно, и результаты тестов успешно записывались в указанный файл.

Этот случай напоминает о том, что поведение командных утилит может незначительно отличаться в зависимости от версии или операционной системы. Всегда полезно обращаться к официальной документации или тестировать различные варианты опций, если вы сталкиваетесь с неожиданными проблемами.

Как Передать Домен и Базу Данных с Hestia

Введение: В современном мире веб-разработки и управления серверами, где требуется гибкость и оперативность, ключевую роль играет возможность легко передавать ресурсы, такие как домены и базы данных, между пользователями. В этой статье мы рассмотрим, как использовать Hestia Control Panel для эффективной передачи домена пользователю hestia и переноса базы данных другому пользователю с помощью команды v-change-database-owner.

Основная Часть:

  1. Передача Домена:
    • Что такое Hestia Control Panel?
    • Почему важна передача домена?
    • Шаги для передачи домена пользователю hestia:
      • Вход в Hestia Control Panel.
      • Выбор домена для передачи.
      • Использование команды v-change-domain-owner.
      • Проверка передачи домена.
  2. Перенос Базы Данных:
    • Значение баз данных в управлении веб-ресурсами.
    • Процесс переноса базы данных:
      • Выбор базы данных для переноса.
      • Применение команды v-change-database-owner.
      • Важные аспекты безопасности при переносе.
      • Подтверждение успешного переноса.

Заключение: Передача домена и перенос базы данных с использованием Hestia Control Panel - это простые и эффективные процедуры, которые значительно облегчают управление веб-ресурсами. Следуя представленным здесь инструкциям, вы сможете быстро и безопасно осуществить необходимые изменения.

Настроить ssh.exe вместо putty

В windows 10 уже есть интегрирован ssh.exe(наконец-то!) и winscp можно настроить так что бы putty, как не крути, более тяжелая программа вообще не запускалась

делается просто

 %SystemRoot%\Sysnative\OpenSSH\ssh.exe !U@!@ -p !# -t "cd !/ ; /bin/bash"

Drupal 8 commerce2 add custom field checkout


https://www.drupal.org/project/commerce_checkout_order_fields. Just enable it, go to /admin/commerce/config/order-types/default/edit/form-display, scroll down, enable 'Checkout' view, drag/drop fields on the Checkout view, and then go to /admin/commerce/config/checkout-flows/manage/default and add 'Order Fields: Checkout' pane to a step you want. Enjoy

Некие команды для ./occ

Выполнять от юзера www-data

docker exec -it -u 82 dockername /bin/sh

./occ upgrade - обновляет базу

./occ files:scan --all

./occ files:scan grenuy
./occ files:scan --path "grenuy/files/Share uWorld"
sudo -u www-data php occ files:scan --help
  Usage:
  files:scan [-p|--path="..."] [-q|--quiet] [-v|vv|vvv --verbose] [--all]
  [user_id1] ... [user_idN]

Arguments:
  user_id               will rescan all files of the given user(s)

Options:
  --path                limit rescan to the user/path given
  --all                 will rescan all files of all known users
  --quiet               suppress any output
  --verbose             files and directories being processed are shown
                        additionally during scanning
  --unscanned           scan only previously unscanned files

Удаление 5 миллионов файлов

Обычно предлагается удалять через find и рабочий вариант, но в моем случаи 1.5млн удаляло часов 10 что недопустимо долго так перебирать пошел другим путем через цыклы и маски

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
for i in {a..z}
  do
    rm /var/www/*/data/www/*/system/sessions/sess_$i[a-c]*
    rm /var/www/*/data/www/*/system/sessions/sess_$i[d-g]*
    rm /var/www/*/data/www/*/system/sessions/sess_$i[h-k]*
    rm /var/www/*/data/www/*/system/sessions/sess_$i[l-n]*
    rm /var/www/*/data/www/*/system/sessions/sess_$i[p-r]*
    rm /var/www/*/data/www/*/system/sessions/sess_$i[s-v]*
    rm /var/www/*/data/www/*/system/sessions/sess_$i[w-y]*
    rm /var/www/*/data/www/*/system/sessions/sess_$i[y-z]*
    rm /var/www/*/data/www/*/system/sessions/sess_$i[0-2]*
    rm /var/www/*/data/www/*/system/sessions/sess_$i[3-5]*
    rm /var/www/*/data/www/*/system/sessions/sess_$i[6-8]*
    rm /var/www/*/data/www/*/system/sessions/sess_$i[8-9]*
    rm /var/www/*/data/www/*/system/sessions/sess_$i*
 done
 
 
 
 for i in {0..9}
  do
    rm /var/www/*/data/www/*/system/sessions/sess_$i[a-c]*
    rm /var/www/*/data/www/*/system/sessions/sess_$i[d-g]*
    rm /var/www/*/data/www/*/system/sessions/sess_$i[h-k]*
    rm /var/www/*/data/www/*/system/sessions/sess_$i[l-n]*
    rm /var/www/*/data/www/*/system/sessions/sess_$i[p-r]*
    rm /var/www/*/data/www/*/system/sessions/sess_$i[s-v]*
    rm /var/www/*/data/www/*/system/sessions/sess_$i[w-y]*
    rm /var/www/*/data/www/*/system/sessions/sess_$i[y-z]*
    rm /var/www/*/data/www/*/system/sessions/sess_$i[0-2]*
    rm /var/www/*/data/www/*/system/sessions/sess_$i[3-5]*
    rm /var/www/*/data/www/*/system/sessions/sess_$i[6-8]*
    rm /var/www/*/data/www/*/system/sessions/sess_$i[8-9]*
    rm /var/www/*/data/www/*/system/sessions/sess_$i*
 done
 
Или удалить файлы, которые старше семи дней:
 
for f in /tmp/logs/*.log
do
  find $f -mtime +7 -exec rm {} \;
done

Удаление заняло несколько минут времени.

Что бы скачать с googledrive любые по размеру файлы без вопросов нужно подменить FILEID

wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=FILEID' -O- | sed -rn 's/.confirm=([0-9A-Za-z_]+)./\1\n/p')&id=FILEID" -O FILENAME && rm -rf /tmp/cookies.txt

SSL https free auto crbot

1. Скачиваем сам CERBOT:

Код:
wget https://dl.eff.org/certbot-auto

2. Устанвливаем права на CERBOT:

Код:
chmod a+x certbot-auto

3. настраиваем "webroot-path" папка доступна из вне

/etc/letsencrypt
authenticator = webroot
webroot-path = /var/www/grenuydev/data/www/dev.uw-t.com
post-hook = service nginx reload
text = True

./certbot-auto certonly --webroot

test auto renew
certbot-auto renew --dry-run

renew auto
certbot-auto renew --no-self-upgrade

ngnix config:
add file


# cat /etc/nginx/acme
location ^~ /.well-known/ {
proxy_pass http://91.203.5.41:81;
proxy_redirect http://91.203.5.41:81/ /;
root /var/www/grenuydev/data/www/dev.uw-t.com;
}


include acme;
include /usr/local/ispmgr/etc/nginx.inc;
listen 91.203.5.41:443 ssl;
ssl_certificate /etc/letsencrypt/live/example.dev.uw-t.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.dev.uw-t.com/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 SSLv2 SSLv3;

Может пригодиться конвертировать ключи

openssl rsa -outform der -in private.pem -out private.key
openssl x509 -outform der -in your-cert.pem -out your-cert.crt

Обновить в Debian php с 5.4 до 5.5 или 5.6

1. sudo nano /etc/apt/sources.list
2. добавить строчки если хотите до 5.5

deb http://packages.dotdeb.org wheezy-php55 all
deb-src http://packages.dotdeb.org wheezy-php55 all

или

deb http://packages.dotdeb.org wheezy-php56 all
deb-src http://packages.dotdeb.org wheezy-php56 all

3. apt-get update
но скорее всего не сможет обновить проблема с ключами бла бла лечиться тдвумя способами
3.1.
gpg --keyserver packages.dotdeb.org --recv-key E9C74FEEA2098A6E
gpg -a --export E9C74FEEA2098A6E | sudo apt-key add -

или
wget http://www.dotdeb.org/dotdeb.gpg
apt-key add dotdeb.gpg

4. apt-get update
5. apt-get install php5
6. service apache2 restart

ispmanager 4 change phpversion

Два шага, 1 собрать PHP с исходников(другая тема) суть ее в том что бы в отедльных папках были отдельные версии PHP в инете куча статей, может и у меня дойдут руки.
Второй шаг 3 файла создать и перезапустить ispmanager

killall ispmgr

По пути /usr/local/ispmgr/etc
создаем файл ispmgr_mod_phpversion.xml с содержимым

<?xml version="1.0" encoding="UTF-8"?>
  <mgrdata>
    <handler name="phpversion.pl" type="cgi">
      <func>phpversion</func>
      <func>phpversion.edit</func>
      <func>phpversion.delete</func>
      <func>userphpversion</func>
      <func>userphpversion.enable</func>
   </handler>
 
   <metadata name="phpversion" type="list" key="item">
     <toolbar>
       <toolbtn func="phpversion.edit" type="new"  img="t-new" name="new"/>
       <toolbtn func="phpversion.edit" type="edit" img="t-edit" name="edit" default="yes"/>
       <toolbtn func="phpversion.delete" type="group" img="t-delete" name="delete"/>
     </toolbar>
     <coldata>
       <col sort="alpha" sorted="yes" name="item" type="data"/>
       <col sort="alpha" name="path" type="data"/>
     </coldata>
   </metadata>
 
   <metadata name="phpversion.edit" type="form">
     <form>
       <field name="item">
         <input type="text" name="item" />
       </field>
       <field name="path">
         <input type="text" name="path" />
       </field>
     </form>
   </metadata>
 
   <metadata name="userphpversion" type="list" key="item">
     <toolbar>
       <toolbtn func="userphpversion.enable" type="edit"  img="t-on" name="enable" default="yes"/>
     </toolbar>
     <coldata>
       <col sort="alpha" sorted="yes" name="item" type="data"/>
       <col name="props" sort="prop">
         <prop name="active" onimg="t-on" defimg="t-off"/>
       </col>
     </coldata>
   </metadata>
 
   <mainmenu level="7">
     <node name="tool">
       <node name="phpversion"/>
     </node>
   </mainmenu>
 
   <mainmenu level="5">
     <node name="tool">
       <node name="userphpversion"/>
     </node>
   </mainmenu>
 
   <lang name="en">
     <messages name="desktop">
       <msg name="menu_phpversion">PHP versions</msg>
       <msg name="menu_userphpversion">PHP version</msg>
     </messages>
     <messages name="phpversion">
       <msg name="title">PHP versions</msg>
       <msg name="item">Availible versions</msg>
       <msg name="path">Path to binary</msg>
       <msg name="msg_phpversion_delete">Delete version</msg>
       <msg name="hint_new">Add version</msg>
       <msg name="hint_edit">Edit version</msg>
       <msg name="hint_delete">Delete version</msg>
     </messages>
     <messages name="phpversion.edit">
       <msg name="title">Edit version</msg>
       <msg name="title_new">New version</msg>
       <msg name="item">Version value</msg>
       <msg name="path">Path to binary file</msg>	
       <msg name="hint_item">Version value</msg>
       <msg name="hint_path">Path to php-cgi (e.g. /usr/bin/php-cgi)</msg> 
     </messages>
     <messages name="userphpversion">
       <msg name="title">PHP version in use</msg>
       <msg name="item">Availible versions</msg>
       <msg name="hint_enable">Choose version</msg>
     </messages>
   </lang>
   <lang name="ru">
     <messages name="desktop">
       <msg name="menu_phpversion">Версии PHP</msg>
       <msg name="menu_userphpversion">Версия PHP</msg>
     </messages>
     <messages name="phpversion">
       <msg name="title">Версии PHP</msg>
       <msg name="item">Доступные версии</msg>
       <msg name="msg_phpversion_delete">Удалить версию</msg>
       <msg name="hint_new">Добавить версию</msg>
       <msg name="hint_edit">Править версию</msg>
       <msg name="hint_delete">Удалить версию</msg>
     </messages>
     <messages name="userphpversion">
       <msg name="title">Используемая версия PHP</msg>
       <msg name="item">Доступные версии</msg>
       <msg name="hint_enable">Включить версию</msg>
     </messages>
     <messages name="phpversion.edit">
       <msg name="title">Править версию</msg>
       <msg name="title_new">Новая версия</msg>
       <msg name="item">Значение версии</msg>
       <msg name="path">Путь до исполняемого файла</msg>
       <msg name="hint_item">Значение версии (5.1.6, 5.2.10) </msg>
       <msg name="hint_path">Путь до бинарника (например, /usr/bin/php-cgi)</msg>
     </messages>
   </lang>
 </mgrdata>

По пути /usr/local/ispmgr/addon
создаем два файла, первый phpversion(в конце пустая строка обязательная в редакторе не отображается)

5.4 /usr/bin/php-cgi
5.5 /usr/local/share/phpfarm/inst/php-5.5.32/bin/php-cgi
5.6.21 /usr/local/share/phpfarm/inst/php-5.6.21/bin/php-cgi
7.0 /usr/local/share/phpfarm/inst/php-7.0.6/bin/php-cgi

второй файл по пути /usr/local/ispmgr/addon
phpversion.pl

#!/usr/bin/perl
BEGIN { push @INC, '/usr/local/ispmgr/lib/perl' }
 
use Mgr;
use CGI qw/:standard/;
use strict;
use warnings;
 
my $Q = new CGI;
my $func = $Q->param( "func" );
my $conf = '/usr/local/ispmgr/addon/phpversion';
print "<doc>";
 
my $user = $ENV{REMOTE_USER};
if (!defined $user) {
  print "<error>Authentication failed!</error>";
  print "</doc>";
  exit 0;
}
 
if( $func eq 'phpversion' ){
	&List;
} elsif( $func eq "phpversion.delete" ){
	&Delete;
} elsif( $func eq "phpversion.edit" ){
	if(	$Q->param( "sok" ) ){
		if( $Q->param( "elid" ) ){
			&Set;
		} else{
			&New;
		}
		print "<ok/>";
	} else{
		&Get;
	}
}
elsif ($func eq 'userphpversion') {
	&UserList;
}
elsif ($func eq 'userphpversion.enable') {
	&UserSet;
}
 
print "</doc>";
exit 0;
 
sub List {
	if( open( IN, $conf ) ){
		while( <IN> ){
			chomp;
			my @t = split ' ', $_;
			print "<elem><item>" . $t[0] . "</item><path>" . $t[1] ."</path></elem>";
		}
		close( IN );
	}
}
 
sub UserList {
	my $wrapper_path = "/var/www/$user/data/php-bin/php";
	if ( open( WRAPPER, $wrapper_path ) ) {
		my $wrapper = <WRAPPER>;
		chomp $wrapper;
 
		if( open( IN, $conf ) ) {
        	        while( <IN> ){
	                        chomp;
                	        my @t = split ' ', $_;
        	                print "<elem><item>" . $t[0] . "</item>";
				print "<active />" if ( $wrapper eq "#!" . $t[1] );
				print "</elem>";				
	                }
        	        close( IN );
	        }
		close( WRAPPER );
	}
}
 
#sub Get {
#	my $elid = $Q->param( "elid" );
#        print "<elid>$elid</elid><item>$elid</item>" if( $elid );
#}
 
 
sub Get {
	my $elid = $Q->param( "elid" );
        my $ok = 0;
 
        if( open( IN, $conf ) ) {
		for( <IN> ) {
			chomp;
			my @t = split ' ', $_;
                       	if( $t[0] eq $elid ) {
				print '<elid>' . $t[0] . '</elid><item>' . $t[0] . '</item><path>' . $t[1] .'</path>' ;
			}
                        $ok = 1;
                } 
                close( IN );
        }
 
        if( !$ok ) {
                print "<error>Item not found</error>";
        }
}
 
sub Set {
	my $elid = $Q->param( "elid" );
	my $item = $Q->param( "item" );
        my $path = $Q->param( "path" );
	my $ok = 0;
 
	if( open( IN, $conf ) ){
		if( open( OUT, ">$conf.new" ) ){
			for( <IN> ){
				chomp;
				my @t = split ' ', $_;
				if( $t[0] eq $elid ){
					print OUT "$item $path\n";
					$ok = 1;
				} else {
					print OUT $t[0] . ' ' . $t[1] . "\n";
				}
			}
			close( OUT );
		}
		close( IN );
	}
 
	if( $ok ){
		rename( "$conf.new", $conf );
		print "<ok/>";
	} else {
		print "<error>Item hasn`t been updated</error>";
	}
}
 
sub UserSet {
    my $wrapper_path = "/var/www/$user/data/php-bin/php";
    my $php_ini = "/var/www/$user/data/php-bin/php.ini";
 
    unless ( -e $php_ini ) {;
        print "<error>$php_ini not found</error>";
        return;
    };
    my ($login, $pass, $uid, $gid) = getpwnam($user) or print "<error>$user not in passwd file</error>";
 
    chown $uid, $gid, $php_ini or print '<error>you are not a superuser</error>';
    chmod 0644, $php_ini or print '<error>you are not a superuser</error>';
 
    my $elid = $Q->param( "elid" );
    my $item = $Q->param( "item" );
 
    if( open( IN, $conf ) ){
        if( open( OUT, ">", $wrapper_path ) ){
            for( <IN> ){
                chomp;
                my @t = split ' ', $_;
                if( $t[0] eq $elid ){
                    print OUT  '#!' . $t[1] . "\n";
                }
            }
            close( OUT );
        }
        close( IN );
    }
 
    my $check_for_timezone = `cat $php_ini | grep date.timezone`;
    my $is_php_53 = `cat $wrapper_path | grep 5.4`;
 
    # need for bitrix install, only for 5.4
    if ( $is_php_53 && !$check_for_timezone && open( OUT, ">>", $php_ini ) ) {
        print OUT "date.timezone='Europe/Moscow'\n";
        close( OUT );
    }
 
    my $check_for_maillog = `cat $php_ini | grep mail.log`;
    if ( $is_php_53 && !$check_for_maillog && open( OUT, ">>", $php_ini ) ) {
        print OUT "mail.log = \"/var/www/$user/data/mail.log\"\n";
        print OUT "mail.add_x_header = On\n";
        close( OUT );
    }
 
    print "<ok>restart</ok>";
}
 
sub New {
	my $elid = $Q->param( "elid" );
	my $item = $Q->param( "item" );
	my $path = $Q->param( "path" );
	if( open( ADD, ">>$conf" ) ){
		print ADD "$item $path\n";
		close( ADD );
		print "<ok/>";
	} else {
		print "<error>Item hasn`t been added</error>";
	}
}
 
sub Delete {
	my $elid = $Q->param( "elid" );
 
	if( open( IN, "$conf" ) ){
		if( open( OUT, ">$conf.new" ) ){
			for( <IN> ){
				chomp;
				my @t = split ' ', $_;
				print OUT $t[0] . ' ' . $t[1] . "\n" if( $t[0] ne $elid );
			}
			close( OUT );
		}
		close( IN );
	}
 
	rename( "$conf.new", "$conf" );
	print "<ok/>";
}

Скачать пример плагина

Попытка получить тиц 10

Первый шаг, попытаюсь зарегаться на сайте dir.ikernel.org, они очень просили опубликовать обратную ссылку, вот и опубликую здесь 🙂

Глобальный каталог сайтов

Каким я был сегодня #1

У меня была задача быть сегодня сопереживающим и активным.
Для начала сегодня был день Бади, и естественно думал как угодить бади, и это получилось, вот теперь буду везти ей агруз, алычу, вишню, с собственного сада.
Далее с командой, еще помог с дизайнером, но понял, что инициатива наказуемая, начали вылазить с «мелкими просьбами» на голову, хватило сил и мужества начать говорить что НЕТ, что бы не подводить тех людей на которое было распланированное время, после разговора с бади, поехал ставить коронку, где получил предложения поехать в кино от товарища, предложения принял. После поехал к дизайнеру, она вчера жалувалась о своему несчастью, она попросила меня подвезти, ее на лошадях покататься в понедельник, а за одно и самому прокататься с своей девушкой, на что она конечно же получила положительный ответ.
После поехал к девушки, забрал ее, ухаживал за ней, выполнял всяческие желания и т.д. Короче объявил, ДЕНЬ ТВОИХ желаний. И все послушно выполнял… Это было забавно и весело…
После было кино, по дороге зацепили тему работы, потом сосики и дом…
Сейчас перед сном попытаюсь сложить принтер надеюсь получиться… и не будет лишних запчастей. Вот так я день провел…
Кстати девушка сказала, что был заботливый и нежный. Так что миссия более менее выполненная

ЛП программа в агенстве «Развитее»

Вот совсем не давно меня вовлекли в агенство "Развитие" на прохождения курсов. Сначала в первую ступень, далее решил пойти в ЛП.
Подобного уровня курсов я не знаю, первая ступень еще так себе, круто конечно но все же как то не столько сколько ожидал, было несколько упражнений, которые позволили покопаться в прошлом, войти в себя, но много как то не дало.
И все же я решил пойти дальше, в лидерскую, ЛПрограмму.
Лидерская делиться на уикенды, вот прошел первый уикенд, что же могу сказать, это просто ППЦ!!!! Получил в 5 раз больше чем ожидал, услышал и принял то о себе, что не мог принять уже долгие годы, и считал что это не про меня, хотя говорили часто. Очень негатива много ушло. Научился, смотреть на жизнь по другому, начал появляться опыт НАСТОЯЩЕЙ, командной игры, один из интересных моментов, в первый день каждый выбирает себе "БАДИ", это человек, который найбольше тебя бесит, и с которым в жизни ты просто бы не общался, но с помощью тренинга, учишься и с такими работать...
На мир начинаешь смотреть совсем по другому, как то "по-настоящему" что-ли, с помощью тренировок, вспоминаешь как это ПОНАСТОЯЩЕМУ чувствовать радоваться, более того учать переключаться, и делать выводы.
Но даже после окончание первого уикенда не дают спуску, назначают капитана и начинают контролировать что бы ты выполнял СОБСТВЕННЫЕ обещания. И реально начинаешь работать, и стараться более эффективно и делать больше….
Вот их сайт http://razvitie.od.ua/.