cp /путь к образу/вм.img /путь к резервной копии/ вмОт.img
и заново запускаем нашу Виртуальную машину
VBoxManage startvm -type=headless Имя ВМ
Вы можете написать для этой операции скрипт, который уже будет копировать, архивировать и отправлять копию куда вам нужно, но основной принцип прост. Как я уже писал, что на момент копирования ВМ будет не доступна.
#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
#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 для этого стаим пакет:
Все настройка Виртуальной машины завершена в дальнейшем, когда настроите доступ к ней напрямую без vnc можно запускать как демона нашу ВМ для этого выполните комманду
Для начало нам нужно создать изображения с водяным знаком, мне проше все это сделать в 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
После того, как ваш ключ готов, открываем WinScp и в полях: Host name: – адрес(или имя) вашего сервера User name: – имя пользователя под которым был добавлен ключ на сервере Password: – пропускаем, он нам не нужен Private key file: – указываем путь к с генерированному ключу при помощи pyttygen
Все теперь просто жмем кнопочку Save… и видим готовое подключение
Теперь каждый раз при открытие WinScp нам нужно будет только выбрать нужное подключение и нажать кнопочку Login
Открываем, через ваш любимый редактор файл настроек 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 минут все последующие запросы будут выдаваться из кэша. Это позволит снизить нагрузку и увеличить скорость работы вашего сайта.