Цели конверсий и ретаргетинга Яндекс.Метрики и Contact Form 7

Считаем лиды(потенциальных клиентов) пришедших по рекламе и просто так — напрямую.  Для этого подключаем события успешной отправки сообщений(запрос обратной связи, и консультаций) из формы ContactForm7 WordPress к цели в Яндекс.Метрике. Читать далее «Цели конверсий и ретаргетинга Яндекс.Метрики и Contact Form 7»

Дублировать страницы WordPress

С помощью кода добавленного в function.php можно добавить возможность копирования уже существующих страниц или записей: Читать далее «Дублировать страницы WordPress»

Instagram виджет для сайта

Домашняя страница: http://inwidget.ru/#adaptive

Бесплатный Instagram виджет для сайта:

Транслируйте ваши фотографии из Instagram.com прямо на вашем сайте.

Особености:

  • Множество настроек
  • Прямые ссылки на фотографии
  • Кнопка перехода к странице профиля
  • Фотография профиля
  • Статистика профиля
  • Вывод фотографий по нескольким хэш-тегам
  • Вставка виджета одной строкой в HTML
  • Адаптивность
  • Множество скинов
  • Автоопределение языка
  • Работает без ACCESS_TOKEN
  • Без рекламы
  • Для любого использования
  • Открытый исходный код
  • Подробная инструкция

Потребуется:

PHP

PHP >= 5.4.0
с библиотекой cURL   СКАЧАТЬ ВИДЖЕТ > INWIDGET-1.3.1.zip Последняя версия 1.3.1. от 05 февраля 2019 г. Исходный код на GitHub >

Демонстрация работы:

По умолчанию:

Без профиля:

Мини:

HTML <!-- По умолчанию -->
<iframe src='/inwidget/index.php' data-inwidget scrolling='no' frameborder='no' style='border:none;width:260px;height:330px;overflow:hidden;'></iframe>

<!-- Без профиля -->
<iframe src='/inwidget/index.php?toolbar=false' data-inwidget scrolling='no' frameborder='no' style='border:none;width:260px;height:320px;overflow:hidden;'></iframe>

<!-- Мини 1 -->
<iframe src='/inwidget/index.php?width=100&inline=2&view=12&toolbar=false' data-inwidget scrolling='no' frameborder='no' style='border:none;width:100px;height:320px;overflow:hidden;'></iframe>

<!-- Мини 2 -->
<iframe src='/inwidget/index.php?width=100&inline=1&view=3&toolbar=false' data-inwidget scrolling='no' frameborder='no' style='border:none;width:100px;height:320px;overflow:hidden;'></iframe>

Горизонтальная ориентация:

HTML <!-- Горизонтальная ориентация -->
<iframe src='/inwidget/index.php?width=800&inline=7&view=14&toolbar=false' data-inwidget scrolling='no' frameborder='no' style='border:none;width:800px;height:295px;overflow:hidden;'></iframe>

Крупные preview:

HTML <!-- Крупные preview -->
<iframe src='/inwidget/index.php?width=800&inline=3&view=9&toolbar=false&preview=large' data-inwidget scrolling='no' frameborder='no' style='border:none;width:800px;height:850px;overflow:hidden;'></iframe>

Разные цветовые схемы:

HTML <!-- Синий -->
<iframe src='/inwidget/index.php?skin=modern-blue' data-inwidget scrolling='no' frameborder='no' style='border:none;width:260px;height:315px;overflow:hidden;'></iframe>

<!-- Зелёный -->
<iframe src='/inwidget/index.php?skin=modern-green' data-inwidget scrolling='no' frameborder='no' style='border:none;width:260px;height:315px;overflow:hidden;'></iframe>

<!-- Красный -->
<iframe src='/inwidget/index.php?skin=modern-red' data-inwidget scrolling='no' frameborder='no' style='border:none;width:260px;height:315px;overflow:hidden;'></iframe>

<!-- Оранжевый -->
<iframe src='/inwidget/index.php?skin=modern-orange' data-inwidget scrolling='no' frameborder='no' style='border:none;width:260px;height:315px;;overflow:hidden;'></iframe>

<!-- Фиолетовый -->
<iframe src='/inwidget/index.php?skin=modern-violet' data-inwidget scrolling='no' frameborder='no' style='border:none;width:260px;height:315px;overflow:hidden;'></iframe>

<!-- Чёрный -->
<iframe src='/inwidget/index.php?skin=modern-black' data-inwidget scrolling='no' frameborder='no' style='border:none;width:260px;height:315px;overflow:hidden;'></iframe>

<!-- Жёлтый -->
<iframe src='/inwidget/index.php?skin=modern-yellow' data-inwidget scrolling='no' frameborder='no' style='border:none;width:260px;height:315px;overflow:hidden;'></iframe>

<!-- Серый -->
<iframe src='/inwidget/index.php?skin=modern-grey' data-inwidget scrolling='no' frameborder='no' style='border:none;width:260px;height:315px;overflow:hidden;'></iframe>

Адаптивный режим ( Открыть демонстрацию в новом окне ):

  Виджет будет автоматически подстраиваться под размеры блока или окна браузера. Подробнее > HTML <!-- Адаптивный режим -->
<iframe src='/inwidget/index.php?adaptive=true' data-inwidget scrolling='no' frameborder='no' style='border:none;width:100%;height:315px;overflow:hidden;'></iframe>

Установка виджета на сайт:

1. Загрузите исходный код виджета в корень вашего сайта:

Для этого скачайте архив с исходным кодом виджета. Извлеките папку /inwidget из архива. Загрузите папку /inwidget в корень вашего сайта со всеми файлами внутри.

СКАЧАТЬ ВИДЖЕТ > INWIDGET-1.3.1.zip

Или используйте composer Console composer.phar require aik27/inwidget Console composer require aik27/inwidget Примечание. Виджет использует относительные пути, поэтому вы можете загрузить его в любую папку, если у вас нет доступа к корню сайта. Не забудьте при этом изменить путь в IFRAME.

2. Установите права на запись для папки /inwidget/cache:

В папке /inwidget/cache виджет будет хранить кэшированные данные.
Если для директории будут отсутствовать права на запись, вы увидите ошибку ERROR #101.

3. Настройте виджет:

Отредактируйте файл /inwidget/config.php
Вам потребуется указать логин в Instgram и другие параметры.

Список параметров: LOGIN – логин аккаунта в инстаграм из которого будут транслироваться фотографии. HASHTAG – хэш-теги через запятую (например: girl, man). Если вы хотите транслировать фотографии других пользователей, либо вывести фотографии с очень специфичным тегом, используйте эту опцию. Выборка фотографий будет производиться со всего мира в порядке того, как фотографии были отмечены искомым тегом. Обратите внимание, что тулбар с аватаркой и статистикой будет автоматически скрыт. ACCESS_TOKEN – хэш-ключ выданный приложением, которому вы разрешили доступ к своему профилю.
Поле НЕ является обязательным. Если вы заполните его, то запросы начнут отправляться через endpoints API (https://www.instagram.com/developer/). При этом, виджет будет обладать только теми правами и лимитами на выборку данных, которыми обладает само приложение. О том, как самостоятельно получить токен смотрите здесь. authLogin и authPassword – логин и пароль от любого аккаунта для авторизации. Поля НЕ являются обязательными. Авторизация необходима для альтернативных способов получения данных в случае выхода из строя основных. Советую завести для этого отдельный аккаунт с отключенной двухшаговой аутентификацией. Данные авторизации не передаются третьим лицам, в том числе автору виджета. loginAvailable - если вы хотите выводить разные логины на разных страницах сайта, добавьте в этот массив список логинов, которые разрешенны к показу. Затем вы сможете передавать необходимый логин в виджет с помощью GET переменной. Например: /inwidget/index.php?login=fotokto_ru tagsAvailable - если вы хотите выводить разные теги на разных страницах сайта, добавьте в этот массив список тегов, которые разрешены к показу. Затем вы сможете передавать необходимый тег в виджет с помощью GET переменной. Например: /inwidget/index.php?tag=photography. Данную настройку можно комбинировать с "loginAvailable" и "tagsFromAccountOnly". tagsBannedLogins – логины заблокированных пользователей через запятую (например: mark18, kitty45). Фотографии перечисленных пользователей не будут выводиться в виджете при использовании поиска по хештегам. tagsFromAccountOnly – искать фотографии с тегами только в аккаунте пользователя [ true / false ]. Виджету придётся сначала получить фотографии из вашего профиля, а затем перебором искать снимки с тегами, перечисленными в опции HASHTAG. Чтобы поиск был более результативным рекомендуется увеличить значение опции imgCount. imgRandom – выводить фотографии в случайном порядке [ true / false ] imgCount – сколько фотографий запрашивать из Instagram. Влияет на размер кэша. cacheExpiration – через сколько часов обновлять кэш. cacheSkip – не использовать кэш [ true / false ]. Если присвоить true, то кэш будет проигнорирован и запросы к API будут отправляться при каждой загрузке виджета. Используйте эту опцию только для отладки. cachePath – путь к директории с кэш файлами skinDefault – скин виджета по умолчанию [default / modern-blue / modern-green / modern-red / modern-orange / modern-grey / modern-black / modern-violet / modern-yellow] skinPath – путь к деректории со скинами langDefault – язык виджета по умолчанию [ ru / en / ua ] langAuto – автоматически определять язык пользователя [ true / false ] langPath – путь к деректории с локализациями
Внимание! Если после первичной настройки вы решите изменить LOGIN, HASHTAG или tagsBannedLogins,
изменения вступят в силу только после удаления файла с кэшем или после того, как кэш устареет.

4. Вставьте виджет в сайт с помощью следующего кода:

HTML <!-- По умолчанию -->
<iframe src='/inwidget/index.php' scrolling='no' frameborder='no' style='border:none;width:260px;height:330px;overflow:hidden;'></iframe>
Ещё примеры вставки с различным отображением виджета: HTML <!-- Без профиля -->
<iframe src='/inwidget/index.php?toolbar=false' data-inwidget scrolling='no' frameborder='no' style='border:none;width:260px;height:320px;overflow:hidden;'></iframe>

<!-- Мини 1 -->
<iframe src='/inwidget/index.php?width=100&inline=2&view=12&toolbar=false' data-inwidget scrolling='no' frameborder='no' style='border:none;width:100px;height:320px;overflow:hidden;'></iframe>

<!-- Мини 2 -->
<iframe src='/inwidget/index.php?width=100&inline=1&view=3&toolbar=false' data-inwidget scrolling='no' frameborder='no' style='border:none;width:100px;height:320px;overflow:hidden;'></iframe>

<!-- Горизонтальная ориентация -->
<iframe src='/inwidget/index.php?width=800&inline=7&view=14&toolbar=false' data-inwidget scrolling='no' frameborder='no' style='border:none;width:800px;height:295px;overflow:hidden;'></iframe>

<!-- Крупные preview -->
<iframe src='/inwidget/index.php?width=800&inline=3&view=9&toolbar=false&preview=large' data-inwidget scrolling='no' frameborder='no' style='border:none;width:800px;height:850px;overflow:hidden;'></iframe>

Точная настройка отображения виджета:

Параметры передаются как GET переменные при обращении к скрипту виджета.
К примеру, чтобы уставить ширину виджета 600px и вывести в строку пять фотографий, нужно добавить соотвествующие параметры в URL к скрипту. Т.е.: /inwidget/index.php?width=600&inline=5 Список параметров:

  • width – ширина виджета (по умолчанию 260px).
  • inline – количество фотографий в строке (по умолчанию 4 шт.).
  • view – сколько фотографий отображать в виджете (по умолчанию 12 шт., максимально 30 шт., можно исправить в config.php).
  • toolbar – отобразить тулбар с аватаркой и статистикой (значения true/false, по умолчанию true).
  • preview – размер и качество изображений (small – маленькие до 320px, large – большие до 640px, fullsize – полноразмерые, по умолчанию стоит large)
  • lang – язык виджета (значения ru / en, по умолчанию берутся настройки из config.php). Приоритет этого параметра выше чем для настроек в config.php.
  • skin – скин виджета (значения default / modern-blue / modern-green / modern-red / modern-orange / modern-grey / modern-black / modern-violet / modern-yellow). По умолчанию default. Приоритет этого параметра выше чем для настроек в config.php.
  • adaptive — адаптивный режим (значения true / false, по умолчанию false). Виджет будет автоматически подстраиваться под размеры блока или окна браузера.

Как сделать виджет адаптивным?:

Добавьте GET переменную «adaptive» при обращении к скрипту виджета. Пример: /inwidget/index.php?adaptive=true Переменной необходимо присвоить значение true. После этого виджет будет автоматически подстраиваться под размеры блока или окна браузера. При этом GET параметр width будет проигнорирован. Параметр inline будет иметь эффект при ширине виджета более 400px. Ширина iframe увеличится до 100%, а высота подстроится под содержимое блока независимо от того, что вы изначально прописали в стилях iframe.

Открыть демонстрацию в новом окне >

Важно! Если вы используете старый код вставки iframe ( < 1.1.4 ), то вам необходимо прописать тегу атрибут data-inwidget или использовать новый код из инструкции, иначе размеры iframe не будут меняться автоматически. И вам придётся самостоятельно указать длину блока и заботиться о его высоте.

Возможность актуальна для версии >= 1.1.4

Видеоинструкция по получению ACCESS TOKEN:

Виджет может работать с двумя видами API (недокументированное и endpoints). По умолчанию используется недокументированное. Для его работы токен не требуется. Указание ACCESS TOKEN в настройках виджета переводит его на режим работы с Endpoints API (https://www.instagram.com/developer/). Если вы хотите создать собственное приложение в Instagram, то воспользуйтесь видеоинструкцией ниже. Имейте ввиду, что ваше приложение сначала попадёт в «песочницу» со следующими лимитами: 20 – максимальное количество фотографий, которое можно получить в запросе. 500 – максимальное количество запросов в час. И самое главное — фотографии можно получить только из своего аккаунта. Тоже самое касается выборки по тегам.

Имейте ввиду, что Instagram объявил о прекращении поддержки endpoints API к 2020 году. Узнать подробнее >

Зарегистрировать собственное приложение можно здесь:

https://www.instagram.com/developer/

URL для генерации ACCESS TOKEN: https://www.instagram.com/oauth/authorize/?client_id=ВАШ_CLIENT_ID&redirect_uri=ВАШ_URL_АВТОРИЗАЦИИ&response_type=token&scope=basic

Разработчикам плагинов и приложений:

Вы можете подключить код виджета и задать параметры через конструктор класса.
При использовании примера ниже будьте внимательны с путями к файлам. Классы поддерживают автозагрузку.

По умолчанию используется недокументированное API с помощью библиотеки instagram-php-scraper.
Для переключения на endpoint API нужно указать ACCESS_TOKEN в config.php или аргументах конструктора.

#require_once 'inwidget/classes/Autoload.php';
require_once 'inwidget/classes/InstagramScraper.php';
require_once 'inwidget/classes/Unirest.php';
require_once 'inwidget/classes/InWidget.php';

try {
	
	// Options may change through class constructor. For example:
	
	$config = array(
		'LOGIN' => 'fotokto_ru',
		'HASHTAG' => '',
		'ACCESS_TOKEN' => '',
		'authLogin' => '',
		'authPassword' => '',
		'tagsBannedLogins' => '',
		'tagsFromAccountOnly' => false,
		'imgRandom' => true,
		'imgCount' => 30,
		'cacheExpiration' => 6,
		'cacheSkip' => false,
		'cachePath' =>  $_SERVER['DOCUMENT_ROOT'].'/inwidget/cache/',
		'skinDefault' => 'default',
		'skinPath'=> '/inwidget/skins/',
		'langDefault' => 'ru',
		'langAuto' => false,
		'langPath' => $_SERVER['DOCUMENT_ROOT'].'/inwidget/langs/',
	);
	$inWidget = new \inWidget\Core($config);
	
	// Also, you may change default values of properties

	/*
	$inWidget->width = 800;	// widget width in pixels
	$inWidget->inline = 6; // number of images in single line
	$inWidget->view = 18; // number of images in widget
	$inWidget->toolbar = false;	// show profile avatar, statistic and action button
	$inWidget->preview = 'large'; // quality of images: small, large, fullsize
	$inWidget->adaptive = false; // enable adaptive mode
	$inWidget->skipGET = true; // skip GET variables to avoid name conflicts
	$inWidget->setOptions(); // apply new values
	*/
	
	$inWidget->getData();
	include 'inwidget/template.php';

}
catch (\Exception $e) {
	echo $e->getMessage();
}

Кроме того, вы можете переопределить в коде значение большинства свойств, которые по умолчанию передаются через GET переменные.

Возможность актуальна для версии >= 1.1.9

Коды ошибок:

ERROR #101 — не удаётся получить доступ к файлу с кэшем. Нужно изменить права на директорию /inwidget/cache Если файл не существует, виджет пытается создать его. Если файл существует, виджет пытается открыть его на чтение и запись. Отсутствие прав на чтение или запись файлов в директорию /inwidget/cache вызовет ошибку. Если до изменения прав на директорию в ней уже был файл с кэшем, просто удалите его, т.к. на него также установлены некорректные права. ERROR #102 — не удаётся получить время последнего изменения файла. Возможно, данная функция ограниченна или не поддерживается файловой системой вашего сервера. Для того, чтобы определить, актуален ли ещё кэш, виджет использует время последнего изменения файла в папке /inwidget/cache. Если не удаётся определить время, кэш всегда будет неактуальным, что приведёт к постоянным запросам к API Instagram. ERROR #500 — неизвестная ошибка.

Для выяснения деталей смотрите, что было записано в кэш. Данная ошибка сгенерированна официальным API, либо библиотекой instagram-php-scraper. В большинстве случаев означает проблемы при отправке или получении данных запроса от сервера Instagram. Чтобы виджет попытался отправить запрос ещё раз, удалите файл с кэшем и обновите страницу на которой выводится виджет.

Многие из таких ошибок связаны с неправильной настройкой вашего хостинга. Наиболее частые:

Failed to connect to www.instagram.com port 443 – ваш сервер не может подключиться к серверу Instagram. Причин для этого может быть множество. Например:

  • на сервере включен и неправильно сконфигурирован протокол IPv6, в то время как PHP по умолчанию пытается отправлять запросы через него минуя IPv4
  • на сервере установлена старая версия криптографического ПО (OpenSSL), которое не поддерживает новые SSL сертификаты и протаколы шифрования, используемые Instagram
  • проблема в библиотеке сURL, которая фактически не работает в следствии прочих настроек (скажем DNS) или излишней заботы хостинг-провайдера о нагрузке на свои сервера
  • кратковременные перебои связи на маршруте Ваш сервер <-> Instagram

Unknown body format – проблема с дешифровкой ответа от сервера Instagram. Все ответы, которые даёт сервер Instagram возвращаются в формате JSON. В PHP для работы с ним существует стандартная одноимённая библиотека. Проверьте, что она включена (extension=json.so) и работает исправно (json_encode / json_decode).

XMPP на сайт

Модификация JWChat для обеспечения сервиса онлайн-консультации

Для многих организаций всё более актуальным становится вопрос упрощения и ускорения двустороннего взаимодействия с клиентами посредством ИТ. На корпоративных сайтах, как правило, можно встретить номера телефонов, адреса электронной почты, контакты менеджеров в различных системах сообщений, какую-либо разновидность гостевой книги (что то вроде «задать вопрос») и, в лучшем случае, форум.

Перед нами вопрос: каким образом можно обеспечить клиенту, зашедшему на сайт, удобную форму отправки вопроса и получение ответа «не отходя от кассы».

Предоставление контактов в популярных системах мгновенных сообщений не является для нас решением задачи, так как для ответа может потребоваться несколько людей (менеджеров, технических специалистов, экономистов). Да и внешний вид странички с «аськами» менеджеров идёт не на пользу представительскому имиджу организации. Большинство обычных пользователей не захотят ничего слышать о регистрации на форуме или в корпоративной системе сообщений, так как не рассчитывают на долгосрочное партнёрство или просто им легче набрать номер телефона.

Существует замечательная система онлайн-поддержки LiveZilla, которая однако предполагает наличие специального софта у операторов исключительно под ОС Windows. Внутренняя система сообщений в нашем предприятии организована с помощью XMPP, и не хотелось что то менять или нагружать менеджеров дополнительным программным средством. Внешние пользователи тоже могут подключаться и задавать вопросы в отдельной конференции, но это не пользуется популярностью (что не удивительно).

Таким образом, было принято решение разместить на сайте XMPP-клиент на Javascript. После прочтения нескольких обзоров (в том числе на Хабре) и практического изучения таких клиентов, я решил использовть для этой цели JWChat.

Реализация

Вновь установленный JWChat на начальной странице предлагает авторизоваться, либо зарегистрироваться.

JWChat

Как я уже писал выше, обязательная регистрация отобьёт желание к общению у большинства посетителей сайта. В JWChat на этот случай предусмотрена возможность гостевого входа. Прописываем в файле config.js нужные нам параметры:

var GUEST_ACC = "client";
var GUEST_PWD = "pass";

Так как учётная запись гостевая, то ничего страшного, что пароль будет в открытом виде. Возможность подключения нескольких клиентов сохраняется, так как к ресурсу добавляется случайное число в диапазоне от 0 до 999.

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

JWChat


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

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

Таким образом, на странице онлайн-консультации я расположил все необходимые элементы с помощью фреймов и объединил скрипты, выполняемые в трёх отдельных окнах в один код, устранив конфликты некоторых переменных и функций. Ссылки на отдельные окна были заменены ссылками на фреймы нового окна.

Процедура авторизации под гостевой записью выполнялась сразу при событии onload в уже существующей функции init(). Я решил не переделывать кардинально HTML-код (так как это повлекло бы значительные изменения и кода Javascript), а лишь настроить CSS и убрать все ненужные элементы с помощью свойства display:none и нулевой ширины одного из фреймов.

После авторизации происходит автоматическое подключение к нужной конференции (можно настроить на сервере или в закладках гостевого пользователя с помощью полноценного XMPP-клиента). С помощью диалога prompt у пользователя запрашивается имя. Если имя по какой-либо причине не было введено, то вместо него присваивается номер от 0 до 999. Дополнительно к имени я добавляю префикс и постфикс, одинаковые для всех пользователей.

Использование

Учитывая невысокую посещаемость и специфику нашего сайта, было удивительно наблюдать достаточно большое количество вопросов, заданных с помощью нового сервиса (в том числе даже от иностранцев). Пока все клиенты остались довольны нововведением, что не стеснялись с помощью него же и сообщать. Кроме того, пользователи теперь не только задают вопросы, а сразу договариваются с сотрудниками обо всём и даже знакомятся с коллегами по профессии.

Стоит отметить, что в конференции для клиентов в рабочие часы постоянно находятся несколько наших сотрудников (подключенных через полноценный XMPP-клиент): менеджеры и специалисты для быстрого ответа, начальство — для контроля, а некоторые — просто из интереса. Таким образом, пользователь получает удобный и быстрый способ взаимодействия с нами прямо через свой браузер, менеджеры — новый источник потенциальных покупателей, а начальство и служба безопасности — прозрачность диалога с клиентом.

JWChat

Проксирование запросов Apache во внутренюю сеть

Часть 1. Настройка домашнего хостинга на FreeBSD

Для трансляции изображения с камеры из внутренней сети на сайт потребуется прокси модуль апача. Само вещание ведёт ContaCam 7.0(для Windows XP). Понравилось, что сразу и онлайн-вещание и возможность посмотреть записи обнаруженных движений. Вставил трансляцию на страницу с помощью фрейма: <iframe allowtransparency=»true» scrolling=»no» style=»border:1px solid #ededed» src=»http://webcam.site:8800″ frameborder=»0″ height=»750″ width=»750″>

Чтобы маршрут до DVR сервера апач выбрал через внутреннюю сеть, включаем mod_proxy. Это модуль Apache для перенаправления соединений (то есть, шлюз, пропускающий их). Он доступен для использования так же, как любой другой стандартный модуль или базовая конфигурация. В целом, mod_proxy – это не один модуль, а набор модулей, каждый из которых обладает особенными функциональными возможностями.

Некоторые из этих модулей:

  • mod_proxy: основной прокси-модуль Apache, который управляет соединениями и перенаправляет их.
  • mod_proxy_http: функции прокси-сервера для протоколов HTTP и HTTPS.
  • mod_proxy_ftp: функции прокси-сервера для протокола FTP.
  • mod_proxy_connect: тунеллирование SSL.
  • mod_proxy_ajp: взаимодействие с протоколом AJP.
  • mod_proxy_wstunnel: работа с веб-сокетами (например, WS и WSS).
  • mod_proxy_balancer: кластеризация и балансировка нагрузки.
  • mod_cache: кэширование.
  • mod_headers: управление заголовками HTTP.
  • mod_deflate: сжатие.

Примечание: чтобы получить дополнительную информацию о mod_proxy и Apache, читайте официальную документацию Apache.

Активация модулей

В httpd.conf раскомментировать нужные proxy модули Возможно апач попросит раскомментировать дополнительно модуль xml2enc

Также можно выполнить следующие команды, чтобы активировать модули по одному:

a2enmod proxy
a2enmod proxy_http
a2enmod proxy_ajp
a2enmod rewrite
a2enmod deflate
a2enmod headers
a2enmod proxy_balancer
a2enmod proxy_connect
a2enmod proxy_html

В файле конфигурации виртуальных хостов вставить блок кода:

<VirtualHost *:*>
ProxyPreserveHost On
# Servers to proxy the connection, or;
# List of application servers:
# Usage:
# ProxyPass / http://[IP Addr.]:[port]/
# ProxyPassReverse / http://[IP Addr.]:[port]/
# Example:
ProxyPass / http://0.0.0.0:8080/
ProxyPassReverse / http://0.0.0.0:8080/
ServerName localhost
</VirtualHost>

Активация балансировки нагрузки

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

Отредактируйте настройки виртуального хоста (как в предыдущем разделе), используя следующие конфигурации:

<Proxy balancer://mycluster>
# Define back-end servers:
# Server 1
BalancerMember http://0.0.0.0:8080/
# Server 2
BalancerMember http://0.0.0.0:8081/
</Proxy>
<VirtualHost *:*>
# Apply VH settings as desired
# However, configure ProxyPass argument to
# use "mycluster" to balance the load
ProxyPass / balancer://mycluster
</VirtualHost>

Активация SSL для поддержки обратного прокси

При использовании сертификатов и соединений SSL нужно также активировать промежуточный виртуальный хост. Для этого используйте нижеприведенный блок кода.

Listen 443
NameVirtualHost *:443
<VirtualHost *:443>
SSLEngine On
# Set the path to SSL certificate
# Usage: SSLCertificateFile /path/to/cert.pem
SSLCertificateFile /etc/apache2/ssl/file.pem
# Servers to proxy the connection, or;
# List of application servers:
# Usage:
# ProxyPass / http://[IP Addr.]:[port]/
# ProxyPassReverse / http://[IP Addr.]:[port]/
# Example:
ProxyPass / http://0.0.0.0:8080/
ProxyPassReverse / http://0.0.0.0:8080/
# Or, balance the load:
# ProxyPass / balancer://balancer_cluster_name
</VirtualHost>

Перезапустить службу апача.

Теперь Apache будет проксировать соединения на внутренние серверы приложений.

Источник: https://www.8host.com/blog/ustanovka-http-servera-apache-kak-obratnogo-proksi-s-pomoshhyu-mod_proxy/

Используем свободные телефоны для пользы дела

MediaDeb: Debian для китафонов чипах MediaTek

В этой заметке я расскажу о том, как превратить старый убитый китафон на чипе MediaTek, пылящийся на полке, уже даже без обновлений от производителя в… сервер под управлением Debian Stretch! Оную операцию я проделал для UMI-X2 и iOcean X8, и прошивки для оных и можно скачать по ссылке у меня в блоге. Учитывая, что типичный китайский телефон уже давно имеет по четыре, а то и десять процессорных ядер и 2GB оперативной памяти, а то и больше, результат получается намного более производительным, чем тот же Raspbberry PI, при схожем окружении.

Дайте догадаюсь, на полке пылится старый телефон? В котором скорее всего 4 или даже 8 ядер, в котором есть 2 GB RAM а то и больше, и уж точно хватает флеша? И не смотря на это производитель забил на апдейты. Или, быть может разбит экран, пластик поцарапан, антенна отвалилась и т.п. Аппарат за замену мы давно купили, старый уже не продашь, ибо никому даром не нужен, а выкидывать жалко.

Именно такие старые аппараты у меня и пылились на чердаке, вот и решил я из них сделать небольшие такие сервачки с debian на борту.

Так что я готов представить общественности первую версию моего небольшого проектика ‘MediaDeb’, который позволяет запустить на mediatek’овских трубках debian. И нет, это не chroot, где отдельные программы из debian запускаются параллельно с android. Это полноценная установка debian с кастомным ядром, в котором включено все, что нужно чтобы развернуть systemd, iotop и прочие нужности, отключен некоторые android-специфичные вещи, которые ломают debian-окружение. Сам же android выпилен из системы во имя экономии оперативной памяти и флеша.

Иными словами, если можно просто взять телефон, прошить его через SP Flash Tool debian прошивкой, воткнуть usb провод и вуоля: устройство определиться как композитное усб устройство с сетевым адаптером, виртуальным ком-портом и флешкой. Последовательный порт можно использовать, чтобы получить доступ к консоли, если вдруг неправильно настроена сеть. По умолчанию прошивка попытается получить IP адрес через dhcp на rndis интерфейсе. Теперь этого зомби можно положить на полку и представить, что мы арендовали небольшой выделенный сервер.

На что годится такой зомби?

В моем случае основное применение для этих зомби-телефонов – кросс-сборка программного обеспечения для arm используя платформу непрерывной интеграции jenkins. Так же в таком варианте этот аппарат можно использовать как небольшой дешевый сервер, например для персонального блога (долгое время этот самый блог крутился на сервере со схожими характеристиками).

А батарея не разбухнет постоянно держать аппарат на зарядке?

Если батарею телефона постоянно держать на зарядке, т.е. заряженной до 4.2 вольт, то через некоторое время она раздуется и будет ни на что не пригодна. Вдумчивая раскурка исходных кодов с применением зеленого чая показала, что это значение захардкожено в драйвере PMIC. А значит его можно отредактировать и выставить, например, в значение 3.7-3.8 вольт, что позволит батарее месяцами находиться на зарядке, и при этом в случае сбоя питания этого хватит чтобы успеть корректно завершить работу. Пока этот batteryhack сделан только для UMI-X2, Iocean-X8 на очереди.

В каком все состоянии?

Пока проект находится в зачаточной стадии (т.е. собирается на моей машине, результат вполне сносно работает). Я добавил базовую поддержку трубок UMI-X2 (MT6589, 4 ядра) и iOcean X8 (MT6592, 8 ядер). Базовая поддержка телефонов на этих чипсетах должна быть сравнительно простой. Если хотите помочь и портировать это безобразие на свою трубку – милости просим на github

В следующих заметках я постараюсь рассказать про то, как портировать MediaDeb на другие устройства на базе чипов mtk.

Источник:

https://ncrmnt.org/2017/08/04/mediadeb-debian-%D0%B4%D0%BB%D1%8F-%D0%BA%D0%B8%D1%82%D0%B0%D1%84%D0%BE%D0%BD%D0%BE%D0%B2-%D1%87%D0%B8%D0%BF%D0%B0%D1%85-mediatek/?lang=ru

Фото: Дарья Григоревская