Делаем резервную копию Виртуальной машины на платформе VirtualBox

И так останавливаем нашу Виртуальную машину


VBoxManage controlvm Имя ВМ savestate

После чего копируем Виртуальную машину


cp /путь к образу/вм.img  /путь к резервной копии/ вмОт.img

и заново запускаем нашу Виртуальную машину


VBoxManage startvm -type=headless Имя ВМ

Вы можете написать для этой операции скрипт, который уже будет копировать, архивировать и отправлять копию куда вам нужно, но основной принцип прост. Как я уже писал, что на момент копирования ВМ будет не доступна.

Автозагрузка виртуальной машины на платформе VirtualBox

Создаем скрипт для будущей автозагрузки


sudo touch /etc/init.d/vboxrun

Теперь открываем файл /etc/init.d/vboxrun из под sudo и приводим его к следующему виду


#!/bin/sh
#Запускаем ВМ 1
tunctl -t virt0 -u username VBoxManage startvm -type=headless VirtMachine1 #Запускаем ВМ 2 из под другого пользователя
tunctl -t virt1 -u username su username –c “BoxManage startvm -type=headless VirtMachine2”

Теперь делаем файл /etc/init.d/vboxrun исполняемым


sudo chmod +x /etc/init.d/vboxrun

Ну и в самом конце делаем наш скрипт System V скриптом


sudo update-rc.d vboxrun defaults 80

Теперь после загрузки системы наш скрипт будет загружаться автоматически, если мы создадим еще одну ВМ, то нужно будет просто добавить ее в наш скрипт

Виртуализация для офиса при помощи VirtualBox

И так поехали, смотрим версию ядра


uname –a

У меня 3.2.0-23-generic-pae, ставим linux-headers для нашего ядра


sudo apt-get install linux-headers-3.2.0-23-generic-pae

Устанавливаем VirtualBox


sudo apt-get install virtualbox

Смотрим типы ос, нам нужна Ubuntu


VBoxManage list ostypes

Создаем виртуальную машину


#name – Имя нашей ВМ
#ostype – тип операционной системы
# register - регистрации ВМ
# basefolder – путь где хранятся файлы настроек ВМ
VBoxManage createvm --name Asterisk --ostype Ubuntu --register --basefolder /disk

Ставим пакеты для настройки сетевого интерфейса


sudo apt-get install bridge-utils  uml-utilities

Теперь настроим сеть, открываем /etc/network/interfaces и меняем старые настройки:


auto eth0
iface eth0 inet static
        address 192.168.1.32
        netmask 255.255.255.0
        network 192.168.1.0
        broadcast 192.168.1.255
        gateway 192.168.1.1
        # dns-* options are implemented by the resolvconf package, if installed
        dns-nameservers 192.168.1.1

На новые:


auto eth0
iface eth0 inet manual
auto br0
iface br0 inet static address 192.168.1.32 netmask 255.255.255.0 network 192.168.1.0 broadcast 192.168.1.255 gateway 192.168.1.1 # dns-* options are implemented by the resolvconf package, if installed dns-nameservers 192.168.1.1 bridge_ports eth0 virt0 bridge_fd 9 bridge_hello 2 bridge_maxage 12 bridge_stp off

Создаем интерфейс


#username имя юзера из под которого запускаем ВМ
sudo tunctl -t virt0 -u username

Настраиваем нашу виртуальную машину


#nic1 – тип сетевого интерфейса bridged
#bridgeadapter1 – имя адаптера, которого мы создали для ВМ
#vram – видеопамять в мегабайтах

VBoxManage modifyvm Asterisk --memory 512 --floppy disabled --audio none --nic1 bridged --bridgeadapter1 virt0 --vram 4 --accelerate3d off --boot1 disk --acpi on --cableconnected1 on

Создаем диск


# size – размер указываем в мегабайтах
VBoxManage createhd --filename /disk/Asterisk.img --size 10240

Добавляем виртуальный ide


VBoxManage storagectl Asterisk --name AsteriskHDD --add ide

Подключаем сам диск


# medium – путь к нашему диску
VBoxManage storageattach Asterisk --storagectl AsteriskHDD --port 0 --device 0 --type hdd --medium /disk/Asterisk.img

Подключаем установочный диск


VBoxManage storageattach Asterisk --storagectl AsteriskHDD --port 1 --device 0 --type dvddrive --medium /home/filipp/ubuntu-12.04-server-i386.iso

Указываем, что загружаемся с dvd привода


VBoxManage modifyvm Asterisk --boot1 dvd

Запускаем нашу ВМ


#n – указывает что запускать vnc server
#m – порт для подключения по vnc
#o – пароль к vnc подключению
# s – сокращенно startvm
VBoxHeadless -s Asterisk -n -m 5900 -o 1234

Теперь подключаемся к нашему серверу на через vnc-client на порт 5900 и ставим Ubuntu
Подключаемся

Если появится ошибка при установке linux This kernel requires the following features not present on the CPU: pae

То надо включить поддержку pae для нашей вирт машины, остановив предварительно нашу ВМ


VBoxManage modifyvm Asterisk --pae on

Установили ОС, а теперь для нормальной производительности ставим guest-additions для этого стаим пакет:


sudo apt-get install virtualbox-guest-additions-iso

iso образ скачался и находится в /usr/share/virtualbox/ теперь нам нужно его подключить

для этого пишем:


VBoxManage storageattach Asterisk --storagectl AsteriskHDD --port 1 --device 0 --type dvddrive --medium /usr/share/virtualbox/VBoxGuestAdditions.iso

И заново запускаем нашу виртуальную машину


VBoxHeadless -s Asterisk -n -m 5900 -o 1234

Монтируем cdrom,если он у вас автоматически не примонтировался


sudo mount -t iso9660 /dev/cdrom /media/cdrom/

обновляем список пакетов


sudo apt-get update

и ставим исходники ядра и gcc


sudo apt-get install linux-headers-3.2.0-23-generic-pae gcc make

Возможно еще понадобится установить минимальный набор иксов для


sudo apt-get install xserver-xorg xserver-xorg-core

после чего из под рута


cd /media/cdrom
./VBoxLinuxAdditions.run

Все настройка Виртуальной машины завершена в дальнейшем, когда настроите доступ к ней напрямую без vnc можно запускать как демона нашу ВМ для этого выполните комманду


VBoxManage startvm -type=headless Asterisk

Добавляем водяной знак к изображению при помощи PHP

Для начало нам нужно создать изображения с водяным знаком, мне проше все это сделать в Photoshop’e. Добавляет дополнительный слой, а основной удаляем и получается прозрачный фон и на него добавим на водяной знак:
Создаем

Полученное изображения сохраняем в формате png

Теперь создадим изображения для миниатюр

Создаем

И так же сохраним его, у нас получилось 2 файла

Основной

Теперь начинаем писать код для нашего скрипта, для начало создадим файл с настройками config.php с таким исходным кодом:



  define('system_slash','\');
//Файлы, которые ищем в директория, расширения через запятую
define('image_mask', '.jpg,.png'); /*
* Размеры миниатюр, не более этого
*/
define('img_min_width', 200);
define('img_min_height', 150); //Путь к водяному знаку для миниатюр
define('image_min_water', 'D:\mytkani\watermark\min.png');
//Путь к водяному знаку
define('image_water', 'D:\mytkani\watermark\max.png'); ?>

Теперь напишем класс, который будет искать нужные нам файл в директории и поддиректориях, создаем файл class_directory_list.php и пишем код:


 file_mask = explode(',', image_mask);
            while (FALSE !== ($file = readdir($handle))) {
                //Поиск поддерикторий
                if($subdir) {
                    if(is_dir($dir.system_slash.$file)) {
                        if(($file != '.')&&($file!='..')) {
                            //Рекурсивно погружаем поддиректории
                            $sdir = new DirectoryList($dir.system_slash.$file,true);
                            $this->concateFileList($sdir->getFileList());
                        }
                    }
                }
                if($this->isFileImage($file)) {
                    $this->file_list[] = $dir.system_slash.$file;
                }
            }

        } else {
            new Exception(Не удалось открыть директорию $dir);
        } 
    }
    
    /**
     * Проверяет соответствует ли файл указанной маске
     * @param string $file Имя файла
     */
    private function isFileImage($file){
        foreach( $this->file_mask as $mask) {
            if( substr(strtolower($file), (strlen($mask)*-1))==$mask) 
                    return true;
        }
        return false;
    }

    /**
     * Возращает массив файлов
     * @return array - Имя файлов
     */
    public function getFileList() {
        return $this->file_list;
    }
    
    /**
     * Объеденяет два листа в один основной
     * @param array $new_list - Указатель на массив с файлами
     */
    private function concateFileList(&$new_list) {
        if(count($new_list)>0) {
            foreach ($new_list as $element) {
                $this->file_list[] = $element;
            }
        }
    }
}

?>

Осталось только создать сам скрипт, который будет добавлять водяной знак на изображения, создаем run.php и пишем в нем:


getFileList();

    //Грузим водяной знак для миниатюры
    $imgWaterMin = imagecreatefrompng(image_min_water);
    if ($imgWaterMin === false)
        new Exception(Ошибка загрузки водяного знака для миниатюр);
    $imgWaterMinHeight = imagesy($imgWaterMin);
    $imgWaterMinWidth = imagesx($imgWaterMin);
    imagealphablending($imgWaterMin, true);//устанавливам режим смешивания изображения

    //Грузим стандартный водяной знак
    $imgWater = imagecreatefrompng(image_water);
    if ($imgWaterMin === false)
        new Exception(Ошибка загрузки водяного знака для основных изображений);
    $imgWaterHeight = imagesy($imgWater);
    $imgWaterWidth = imagesx($imgWater);
    imagealphablending($imgWater, true);

    //Теперь загружаем картинки на которые будем наносить водяной знак
    foreach ($file_list as $file) {
        $fmask = substr(strtolower($file), -3);
        switch ($fmask) {
            case 'png':
                $image = imagecreatefrompng($file);
                break;
            case 'jpg':
                $image = imagecreatefromjpeg($file);
                break;
            default :
                new Exception(Нету реализации для обработки данного формата);
                break;
        }
        if ($image === false) {
            echo Не удалось загрузить файл $filen;
        } else {
            imagealphablending($image, true);
            //Добавляем водяной знак
            $imgWidth = imagesx($image);
            $imgHeight = imagesy($image);
            if (($imgHeight <= img_min_height) && ($imgWidth <= img_min_width)) {
                imagecopy($image, $imgWaterMin, $imgWidth - $imgWaterMinWidth, 
                        $imgHeight - $imgWaterMinHeight, 0, 0, $imgWaterMinWidth, $imgWaterMinHeight);
            } else {
                imagecopy($image, $imgWater, $imgWidth - $imgWaterWidth, 
                        $imgHeight - $imgWaterHeight, 0, 0, $imgWaterWidth, $imgWaterHeight);
            }
            //Сохраняем результат
            imagejpeg($image,$file);
            imagedestroy($image);
        }
    }
} catch (Exception $e) {
    echo $e->getMessage();
}
?>

Наш скрипт готов, теперь проверим его. В файле run.php в строке


    //Получаем список фалов
    $dir = new DirectoryList('D:\putty_key', true);
    $file_list = $dir->getFileList();

мы указали путь к директории, в ней у нас находятся файлы в которые будет добавлен водяной знак
Директория

Запускаем наш скрипт из консоли или из под веб сервера, обратившись к файлу run.php
И видим результат работы:
Результат
Все графические файлы в указанном каталоге стали с водяным знаком.
Исходник можете скачать по ссылке ImageWater.rar

Заходим на сервер по scp через winscp с авторизацией по ключу

Для начало нам понадобится сделать ключ, делается он с помощью puttygen.exe

Как с генерировать ключ и скопировать его вы можете посмотреть в этой статье
Подключение через putty с авторизацией по ключу

После того, как ваш ключ готов, открываем WinScp и в полях:
Host name: – адрес(или имя) вашего сервера
User name: – имя пользователя под которым был добавлен ключ на сервере
Password: – пропускаем, он нам не нужен
Private key file: – указываем путь к с генерированному ключу при помощи pyttygen

Настройка

Все теперь просто жмем кнопочку Save… и видим готовое подключение

Подключаемся

Теперь каждый раз при открытие WinScp нам нужно будет только выбрать нужное подключение и нажать кнопочку Login

Кэширование в nginx, ускоряем работу сайта

Заходим в папку с настройками nginx

cd /etc/nginx

Открываем, через ваш любимый редактор файл настроек nginx.conf и добавляем код:

#Задаёт путь и другие параметры  кэша
       proxy_cache_path /disk/cache levels=1:2 keys_zone=cache:30m max_size=1G;
# Задаёт имя каталога для хранения временных файлов с данными, полученными от проксируемых серверов
        proxy_temp_path /var/lib/nginx/proxy 1 2;
# Запрещает обработку некоторых полей заголовка
        proxy_ignore_headers Expires Cache-Control;
# Определяет, в каких случаях можно использовать устаревший закэшированный ответ
        proxy_cache_use_stale error timeout invalid_header http_502;
# Задаёт условия, при которых ответ не будет сохраняться в кэш
        proxy_no_cache $cookie_session;

Теперь в раздел настроек нашего сайта в блок location, который мы хотим кэшировать добавим код(в данном примере кешируем раздел сайта со статьями )

#кэшироваться будет  только  http://ваш сайт/articles/
location ^~ /articles/ { proxy_cache cache;
# Задаёт время кэширования
proxy_cache_valid 40m;
# Задаёт время кэширования для 404 кодов ответа
proxy_cache_valid 404 10m;
#-----------------------------------
#тут ваши настройки location
#-----------------------------------
}

Все теперь перезагружаем nginx


sudo /etc/init.d/nginx restart

Все теперь раздел /articles/ у нас кэширует запросы, а актуальность составляет 40 минут. Это значит, что после первого запроса к разделу сайта, он попадет в кэш и в течении 40 минут все последующие запросы будут выдаваться из кэша. Это позволит снизить нагрузку и увеличить скорость работы вашего сайта.