Author Archives: rudjuk

Сдается танцевальный зал возле м. Лукьяновская. Ул. Белорусская 30

Размер зала около 25-30 кв. м.
Стоимость аренды: 100 грн/час.

В офисе есть 2 туалета.

Фотографии зала:

По поводу аренды, обращайтесь по телефону/Viber: +38 067 901-63-22

 

Сдается 2 комнаты офиса возле м. Лукьяновская. Адрес г. Киев, ул. Белорусская 30

Сдается 2 комнаты офиса в г. Киев, ул. Белорусская 30.
Общая площадь комнат: 30 кв. м.

В офисе есть 2 туалета.
3 линии интернет.
Wifi.
Автономное отопление.
Вход в офис с улицы Белорусская 30.

Стоимость аренды: 12$/кв. м
Итого за 30 кв. м.: 9720 грн/мес.
Коммунальные платежи включены в стоимость.

Эскиз помещения (Зелёным показаны комнаты, которые сдаются в аренду):Офис в аренду Белорусская 30Фотографии помещения:

По поводу аренды, обращайтесь по телефону/Viber: +38 067 901-63-22

 

 

Введение в интерфейс Мemcached для MySQL InnoDB

В предыдущих статьях серии:

В MySQL 5.6 появилось memcache-совместимое хранилище ключ-значение на базе движка Innodb.

InnoDB Memcache Daemon предоставляет вам стабильность innodb для данных вида ключ-значение, доступ к которым может быть организован через более быстрый и оптимизированный протокол memcached. При использовании данного протокола будут пропущены: парсинг запроса, его оптимизация и остальные части обработки, которые не требуются.

С помощью mysqlnd_memcache, вы можете прозрачно направлять ваши запросы к такому memcache-совместимому интерфейсу.

Установка

Стандартные пакеты MySQL 5.6, которые поставляются Ubuntu (Trusty), не включают в себя плагин memcache. Для использования этого плагина вам потребуется установить его из официальных apt-репозиториев MySQL-я (для Debian 7.x Wheezy, Ubuntu 12.04 Precise и Ubuntu 14.04 Trusty).

После того как вы установили MySQL 5.6 (или выше), необходимо войти в MySQL под суперпользователем и выполнить следующее:

SOURCE /usr/share/mysql/innodb_memcached_config.sql;
INSTALL PLUGIN daemon_memcached SONAME "libmemcached.so";

Скрипт innodb_memcached_config.sql делает несколько вещей, и первое, что он делает — это создаёт базу данных innodb_memcache, которая содержит три таблицы:

  1. cache_policies: в этой таблице хранятся правила, как выполняются команды GET, SET, DELETE и FLUSH.
  2. containers: эта таблица содержит список ваших таблиц, к которым возможен доступ с помощью memcache
  3. config_options — в этой таблице хранятся настройки memcache, а именно — разделитель многоколоночных значений — separator (по умолчанию вертикальная черта “|”) и разделитель обращения к таблицам table_map_delimiter (по умолчанию точка “.”)

Второе, что выполняет скрипт — загружает сам плагин и запускает memcache демона внутри MySQL.

Теперь всё готово, чтобы использовать этот плагин.

Создание memcache хранилища

Так как движок memcache устанавливает некоторые требования к таблицам, то не каждая innodb таблица может быть автоматически использована в качестве такого хранилища. Для использования вы должны настроить так называемую коллекцию.

Каждая коллекция имеет название, которое используется для обращения к ней через memcache, а также содержит ряд столбцов:

  • name: название для обращения к коллекции через memcache
  • db_schema: название базы данных
  • db_table: название таблицы
  • key_columns: название столбца, содержащего ключ (пусть вас не смущает множественное число, это один столбец)
  • value_columns: названия столбцов, указанные через запятую, которые содержат значение. В memcache-значении все значения этих столбцов будут разделены вертикальной чертой (как указано в таблице config_options)
  • flags: какие флаги memcache установить
  • cas_column: название столбца для CAS-значения, устанавливаемого memcache-ем
  • expire_time_column: название столбца, в котором хранится время «протухания» (в секундах) или 0 если не «протухает» никогда
  • unique_idx_name_on_key: название индекса, который накладывает ограничение UNIQUE на столбец ключа. Если столбец ключа является первичным ключом, укажите PRIMARY

Для того чтобы организовать наше хранилище, мы создадим новую базу данных kv_data и таблицу kv_store в ней:

CREATE DATABASE kv_data;
USE kv_data;

CREATE TABLE kv_store (
    `key` VARCHAR(255),
    `value` VARCHAR(1024),
    `flags` INT, 
    `cas` BIGINT UNSIGNED, 
    `exp` INT,
    primary key(`key`)
) ENGINE = INNODB;

Далее, мы сообщим плагину о нашем хранилище, создав контейнер:

INSERT INTO innodb_memcache.containers(
    name, 
    db_schema, 
    db_table, 
    key_columns, 
    value_columns, 
    flags, 
    cas_column,
    expire_time_column,
    unique_idx_name_on_key
) VALUES (
    'kv_data',
    'kv_data',
    'kv_store',
    'key',
    'value',
    'flags',
    'cas',
    'exp',
    'PRIMARY'
);

После того как вы это сделали, вам нужно немного подождать, чтобы это вступило в силу или перезапустить MySQL.

Использование memcache интерфейса

Теперь, когда у вас запущен и работает memcache интерфейс innodb, вы можете вставлять (insert) данные также как в обычную таблицу БД или, конечно же, посредством протокола memcache, — что можно осуществить с помощью telnet-а.

При использовании протокола memcache — по умолчанию и минимальное — количество операций перед тем, как данные будут сброшены в innodb, является 32, как указано в настройке daemon_memcached_w_batch_size. Это означает, что данные становятся видны в MySQL каждые 32 операции. Такова плата за производительность. Исключением из правил является использование binlog-репликации, в том случае, если она постоянно установлена в 1.

Для того чтобы MySQL изменения были сразу доступны через memcache, вы должны выполнить:

SET TRANSACTION ISOLATION TO READ-UNCOMMITTED;

Для использования memcache интерфейса с помощью telnet, используйте его следующим образом:

$ telnet localhost 11211

telnet> set test.key 0 0 11
Hello World
STORED

telnet> get test.key
VALUE test.key 0 11
Hello World
END

Использование нескольких коллекций

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

Для доступа к данным другой коллекции у вас есть два варианта:

Первый наиболее близок к MySQL-евскому оператору USE. Вы просто обращаетесь к самой коллекции и далее любые запросы оперируют с этой коллекцией, пока она не будет изменена на другую.

Перед именем коллекции, для отличия от ключей, ставится префикс — два знака @:

telnet> get @@kv_data
VALUE @@kv_data 0 16
kv_data/kv_store
END

Второй — это использовать полное имя. В этом случае как раз вступает в игру table_map_delimeter, посредством чего мы просто ставим перед коллекцией префикс @@collection и после table_map_delimeter. Таким образом, обращение к test.key становится  @@kv_data.test.key

telnet> get @@kv_data.test.key
VALUE @@kv_data.test.key 0 11
Hello World
END

Я рекомендую всегда использовать такой синтаксис, т. к. вы можете случайно сменить коллекцию в каком-нибудь вызванном участке кода без возврата к предыдущей коллекции.

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

Теперь вы можете просто обращаться к вашим данным через интерфейс memcache, используя PHP расширение memcached или memcache (memcached extension, memcache extension). В том числе, вы можете настроить ваш обработчик сессий использовать этот подход. А также вы можете использовать обычные SQL запросы. Однако, с плагином mysqlnd_memcache вы можете прозрачно перенаправлять SQL запросы на memcache интерфейс, когда это необходимо.

По умолчанию запросы сопоставляются с регулярным выражением, указанном в константе MYSQLND_MEMCACHE_DEFAULT_REGEXP:

/^\s*SELECT\s*(.+?)\s*FROM\s*`?([a-z0-9_]+)`?\s*WHERE\s*`?([a-z0-9_]+)`?\s*=\s*(?(?=["'])["']([^"']*)["']|([0-9e\.]*))\s*$/is

Если запрос соответствует, далее плагин проверяет, что в настройках коллекции перечисленны только поля из таблицы и что в секции WHERE только одно условие с простым сравнением по ключу.

Для нашего примера этому условию будет соответствовать вот такой запрос:

SELECT `value` FROM kv_store WHERE `key` = 'test.key';

Однако ни один из таких не будет:

SELECT * FROM kv_store WHERE `key` = 'test.key';
SELECT `value` FROM kv_store WHERE `key` = `test.key` AND value LIKE '%foo%';
SELECT `key` FROM kv_store WHERE value LIKE '%foo%';

Такие запросы могут быть выполнены с помощью механизмов одного из расширений: mysql, mysqli или pdo, и будут перехвачены незаметно для вас.

Плагин mysqlnd_memcache не обрабатывает запросы на запись.

Несмотря на это ограничение, его использование может определённо улучшить ваш код (тем, что вам не требуется реализовывать обращение к memcache/memcached API) и получить большой выигрыш в производительности при незначительных изменениях.

Запись, Репликация и пул Memcache

Memcached известен своей простой настройкой пула memcached-ов для балансировки нагрузки и отказоустойчивости, но как обстоят дела с memcache-интерфейсом для InnoDB? В некотором роде похожий обработчик присутствует в MySQL репликации, тем, что каждый слейв может быть использован как сервер Memcache-а в режиме только-для-чтения, впрочем, те же правила для разделения чтения и записи применимы и при работе с Memcache-ем.

Вы должны убедиться, что вы используете только плагин mysqlnd_memcache для доступа к вашему пулу и связать его с плагином mysqlnd_ms для организации разделения чтения и записи. Однако это означает, что вы упустите возможность воспользоваться высоко производительным иинтерфейсом Memcache-а на запись.

Так как нет способа указать memcache(d) расширению, что сервера используются в режиме только-на-чтение, то невозможно использовать стандартную топологию репликации master+slaves в качестве пула memcached-ов.

Заключение

Memcached интерфейс для InnoDB — это намного более быстрый способ использования MySQL для простых хранилищ ключ-значение, но при этом имеет все преимущества великолепного движка InnoDB.

Хотя он и не является настолько быстрым, как сам memcached, он позволяет вам устранить “ещё один шарнир” в вашей инфраструктуре, при этом являясь простой заменой для memcached.

Кроме того, были некоторые радикальные улучшения производительности memcached движка для innodb в предстоящем релизе MySQL 5.7 в особенности для больших мультиядерных систем.

В следующей статье этой серии мы рассмотрим кеширование запросов для дальнейшего повышения производительности.

Источник: https://phpprofi.ru/blogs/post/27

Включение Slow Query Log без перезапуска MySQL

Порой при работе приложений, работающих с бд, возникает падение производительности, в качестве одного из вариантов может быть убогий неоптимизированый запрос, выполняемый дольше чем планировалось. Для отслеживания данных запросов придумали Slow Query Log, состоит журнал из SQL выражений, времени начала запроса, общего времени выполнения, времени блокировки и прочей полезной информации.
Включать данный лог можно на ходу, не перезапуская сервер, единственное что необходимо — доступ на запись для процесса от имени которого будет создан лог-файл.

Логинимся...
mysql -u root -p
Устанавливаем месторасположение лог-файла
mysql> SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
Определям что считать медленным запросом, по-умлочанию 10 секунд, с версии 5.1.21 можно выставить 0, что позволяет собирать все запросы
mysql> SET GLOBAL long_query_time = 5;
Ну и осталось включить
mysql> SET GLOBAL slow_query_log = 'ON';
Еще можно включить логирование запросов неимеющих индексов
mysql> SET GLOBAL log_queries_not_using_indexes = 'ON';

Данные значения будут сохранены до следующей перезагрузки mysql, если необходимо чтобы оно сохрянялось следует добавить в my.cnf

[mysqld]
…
slow_query_log = ON
slow_query_log = /var/log/mysql/slow.log
long_query_time = 5
log_queries_not_using_indexes = ON

Для того что бы узнать текущие значения:

mysql> SHOW GLOBAL VARIABLES LIKE 'slow\_%';
+------------------------------------+-------------------------+
| Variable_name                      | Value                   |
+------------------------------------+-------------------------+
| slow_launch_time                   | 2                       |
| slow_query_log                     | ON                      |
| slow_query_log_file                | /var/log/mysql/slow.log |
| slow_query_log_timestamp_always    | OFF                     |
| slow_query_log_timestamp_precision | second                  |
| slow_query_log_use_global_control  |                         |
+------------------------------------+-------------------------+

mysql> SHOW GLOBAL VARIABLES LIKE 'long_query_time';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 5.000000  |
+-----------------+-----------+

mysql> SHOW GLOBAL VARIABLES LIKE 'log_queries_not_using_indexes';
+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| log_queries_not_using_indexes | ON    |
+-------------------------------+-------+

Для более детального анализа лучше собирать все запросы, указывая long_query_time = 0, и желательно хотя бы за сутки, а после прогнать их через pt-query-digest из percona-toolkit, который приведет логи к более читаемому виду.

Источник: https://h1d3.org/posts/vkliuchenie-slow-query-log-bez-perezapuska-mysql.html

Как добавить «резиновый» SplashScreen в XE7

Как известно, в XE7 упростили возможность добавления заставки (SplashScreen) для нашего приложения. В этой заметке я расскажу как добавлять «статичную» и «резиновую» заставки. Данная заметка будет интересна тем, кто не умеет читать по-английски или просто не читает справку по студии. По большей части, эта заметка является вольным переводом справочного материала, с некоторыми добавлениями от меня.

Update (14.10.14): Добавил ссылку на архив с примером.
Update (14.10.14): Добавил дополнение к правилу №3 
Update (16.10.14) Добавил информацию о «резиновой» заставке на весь экран (FullScreen)

Общие правила для двух типов заставок.
  1. Картинки добавлять необходимо через меню «Project > Options > Application» вкладка «Artwork». Перед этим, не забудьте выбрать платформу.
  2. Добавляемые картинки должны быть строго определённого разрешения. Это «426×320», «470×320», «640×480», «960×720».
  3. Картинки должны быть в формате «png»
  4. Далее пункты разделяются….

 

Статичная заставка.
Мы можем задать режим отображения картинки (disabled, clamp, repeat, mirror), подробности в Android API
Можем указать «Splash gravity», как отображать картинку, если её размер меньше чем размер экрана.
 
Резиновая заставка.
Данный метод очень хорошо подходит в ситуации, когда вы хотите выводить логотип компании на фоне, цвет которого отличается от чёрного и без растягивания самого логотипа.
 
Чтобы сделать заставку, при которой ваш логотип на картинке будет всегда статичным, а всё остальное будет растягиваться необходимо, создать 9-patch изображения. Данные изображения содержат служебную информацию в четырёх дополнительных пикселях.
 
Изображения содержат информацию о блоках отображения картинки. Это блок масштабирования и блок контента.
  • Блок масштабирования – определяет области изображения, которые будут растягиваться.
  • Блок контента – определяет область изображения, где будет отображаться контент (в нашем случае форма, об этом чуть позже). 

 

Правило №0. Два пикселя (слева и сверху) – говорят о том, какая часть изображения будет растягиваться. Два пикселя (снизу и справа) – определяют область контента.
Правило №1. Всегда готовим картинки с разрешением меньше необходимого на 1 пиксель с каждой стороны. Пример: Нужно добавить 426×320, значит, создаём картинку 424×318.
Правило №2. Пиксели, определяющие блоки, закрашиваются чёрным цветом.
Правило №3. (В нашем случае.) Область контента всегда должна иметь размеры всей картинки. Иначе, в результате неправильной разметки области контента форма будет неправильно отрисовываться. Будьте внимательны с этим правилом, я уже успел попасться на нём.
Дополнение в правилу №3: Если использовать вторую утилиту (об этом ниже), то область контента — это синяя область, а растягиваемая область — это зелёная область.
 
Рассмотрим пример из справки. Картинка в чёрном цвете, но нам сейчас это не важно.
 

Из этого примера следует, что:

  1. Stretchable Area – области изображения, которые будут растягиваться. В данном случае будет растягиваться всё, кроме логотипа (пламени/огня).  
  2. Padding Box – стороны закрашены полностью, а значит область контента равна размеру изображения (Правило №3)

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

Теперь посмотрим утилиты, которые специально разработаны для создания картинок с расширением «.9.png». 
  1. Встроенная утилита «draw9patch», находится тут «C:\Users\Public\Documents\Embarcadero\Studio\15.0\PlatformSDKs\adt-bundle-windows-x86-20131030\sdk\tools\lib». Позволяет открывать png картинки, вручную закрашивать нужные области и сохранять с расширением «.9.png».
  2. Утилита, написанная сторонним разработчиком, пользователем HabraHabr’а. Страничка с описанием утилиты: http://habrahabr.ru/company/alee/blog/136667/. Утилита позволяет разметить области (зелёные (растягиваемые) и синие (контент)), не закрашивая при этом вручную пиксели, всё происходит автоматически. Сохраняет картинки с расширением «.9.png».

 

Я использую вторую утилиту и всем советую её, т.к. очень удобно и быстро.
 
Значит, что мы делаем:
  1. Создаём картинки размерами на 2 пикселя меньше (по ширине и высоте) чем требует студия и сохраняем в png формате
  2. Открываем эти картинки в любой утилите или вообще всё делаем в фотошопе.
  3. Размечаем области и сохраняем с расширением «.9.png»
  4. Добавляем картинки в проект (этот шаг рассмотрен ниже, более подробно)
Добавление «.9.png» картинок в проект:
  1. Заходим в меню «Project > Options > Application»
  2. Выбираем платформу «All configurations – Android platform»
  3. Во вкладке «Artwork», прописываем пути до картинок с расширением «.9.png»
  4. Проверяем галочку «Include splash image», она должна быть установлена
  5. Собираем проект, в «Project Manager» выбираем «Android» и жмём «Build»
  6. Идём в меню «Project > Deployment», выбираем платформу «Debug configuration – Android platform»
  7. Снимаем галочку с файла «splash_image_def.xml»
  8. Далее есть два способа добавления/использования наших новых картинок
Способ №1.
Не забываем снять галочку с файла «splash_image_def.xml».
В «Deployment Manager» находим все наши картинки и меняем имя в столбце «Remote Name», с имени «splash_image.png» на «splash_image_def.9.png» для каждой картинки.
Всё, компилим проект и радуемся.
 
Способ №2.
Этот способ связан с созданием своего файла «splash_image_def.xml».
 
Не забываем снять галочку со стандартного файла «splash_image_def.xml».
Меняем имена картинок в столбце «Remote Name», с имени «splash_image.png» на «splash_image.9.png» для каждой картинки.
Создаём в любом текстовом редакторе (например: Notepad++) файл с именем «splash_image_def.xml» и содержанием:
<?xml version="1.0" encoding="utf-8"?>
<nine-patch
xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/splash_image"
android:dither="true"/>
 
Сохраняем в папке с проектом.
Заходим в «Deployment Manager» и добавляем этот файл. В столбце «Remote Name» прописываем имя «splash_image_def.xml» и в столбце «Remote Path» прописываем путь «res\drawable\».
Всё, компилим проект и радуемся.


Update (16.10.14 17:03) Заставка на весь экран (без статус бара)
Выяснилось, что сплешскрин в Delphi XE7 сделан по способу, который я описывал для версии XE5. (XE5: Добавляем Splash Screen в приложение для Android)
Если вы хотите чтобы сплешскрин растягивался на весь экран, т.е. статус бар не было видно, то следующая инструкция для вас:
1) Создаём файл «styles.xml» и прописываем в нём
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="AppTheme" parent="@android:style/Theme.NoTitleBar">
<item name="android:windowBackground">@drawable/splash_image_def</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
</style>
</resources>
Сохраняем в папке/подпапке с проектом.
2) Заходим в меню «Project > Deployment», снимаем галочку со стандартного файла «styles.xml».
3) Добавляем (деплоим) наш файл «styles.xml», в столбце «Remote Path» прописываем путь «res\values\»
4) Компилим наш проект и наслаждаемся заставкой на весь экран.


Итог: Теперь вы умеете создавать резиновые заставки.

Исходный код: Скачать с Google Drive
Копия второй утилиты: Скачать с Google Drive


Материал на английском языке:
http://docwiki.embarcadero.com/RADStudio/XE7/en/Application_Options#Splash_Images
 
Источник: https://delphifmandroid.blogspot.com/2014/10/splashscreen-xe7.html
P.S. Оказалось все гораздо проще.
Нужно просто заменить в файле splash_image_def.xml, который находится в Android64/Release строчку:
android:drawable="@android:color/black
на 
android:drawable="@android:color/white

Настройка EXIM4 для отправки почтовых сообщений в Linux

Что это такое?

Exim4 это агент пересылки почтовых сообщений, фактически является простым SMTP-сервером. В нашей статье мы рассмотрим пересылку через SMTP-сервера таких крупных компаний как Google и Yandex. Стоит отметить, что в нашей инструкции предполагается только отправка сообщений, например это удобно для отчетности о работе приложений или событиях.

Установка и настройка

Прежде всего обновите локальный список пакетов с помощью вашего пакетного менеджера, например на Ubuntu и Debian это можно сделать с помощью apt:

apt-get update

Для установки выполните команду:

apt-get install exim4

Примечание: если вам необходимо использовать ACL и другие расширенные функции, то установите exim4-daemon-heavy:

apt-get install exim4-daemon-heavy

Чтобы перейти к настройке, выполните команду:

dpkg-reconfigure exim4-config

Нажмите Ok для начала настройки.

На следующем шаге выберите “mail sent by smarthost; received via SMTP or fetchmail” и нажмите Ok.

Примечание:

  • internet site; mail is sent and received directly using SMTP — этот вариант подходит для автономной системы с полным доступом к Интернету. Демон Exim принимает сообщения на локальные домены и доставляет их. Исходящая почта будет доставлена непосредственно на почтовые серверы домена получателя.
  • mail sent by smarthost; received via SMTP or fetchmail — этот вариант подходит для автономной системы с ограниченным доступом к Интернету. Демон Exim принимает сообщения на локальные домены и доставляет их. Исходящая почта будет доставлена на Smart host, а уже потом на почтовые серверы домена получателя.
  • mail sent by smarthost; no local mail — этот вариант подходит для клиентской системы, все электронные письма отправляются на Smart host без каких-либо локальных доменов.
  • local delivery only; not on a network — этот вариант подходит для серверов не подключенных к сети Интернет. Сообщения принимаются и доставляются только для локальных доменов, т.е. отправка на удаленные (внешние) домены не поддерживается.

Здесь введите имя хоста или ваше доменное имя.

Нажмите Ok.

Введите адрес локальной петли, если exim будет использоваться только локальными сервисами. Оставьте поле пустым, для прослушивания всех интерфейсов, или перечислите нужные через символ “;”.

Следующее поле оставьте пустым при отсутствии локальных доменов.

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

 

 

Источник: https://1cloud.ru/help/linux/nastrojka-exim4

На следующем шаге укажите список доменов, для которых Exim будет ретранслировать сообщения, выполняя роль Smarthost`а. Если сервер не должен быть smarthost для другого хоста, оставьте этот список пустым.

Здесь укажите адрес используемого smtp-сервера:

smtp.yandex.ru::587
smtp.gmail.com::587
mail.example.com::587

На следующий вопрос ответьте No, если необходимо скрыть локальное имя сервера.

Нажмите Ok.

В обычном режиме работы Exim выполняет поиск DNS при запуске, а также при получении или доставке сообщений. Этот параметр следует выбрать, если в системе используется Dial-on-Demand. Если сервер всегда имеет доступ к Интернету, этот параметр должен быть отключен.

Выберете место хранения почты: в каталоге /var/mail или в домашней директории для каждого пользователя.

На вопрос о разделении файла конфигурации на маленькие — ответьте Yes. Так будет более удобно конфигурировать exim4 далее.

Далее необходимо добавить данные о почтовом ящике, с которого будет происходить отправка почты. Для этого, с помощью текстового редактора, например vi, откройте на редактирование следующий файл:

vi /etc/exim4/passwd.client

Добавьте в него строку следующего вида, указав ваш логин и пароль.

Для Gmail

smtp.google.com:username@gmail.com:password

Для Yandex:

smtp.yandex.ru:username@yandex.ru:password

Для вашего SMTP-сервера:

mail.example.com:username@example.com:password

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

# password file used when the local exim is authenticating to a remote
# host as a client.
#
# see exim4_passwd_client(5) for more documentation
#
# Example:
### target.mail.server.example:login:password
smtp.google.com:cloud@gmail.com:12345

Следующие настройки будут выполнены на примере почтового сервиса gmail.

Далее внесем изменения в файл /etc/exim4/exim4.conf.template. Откройте его на редактирование с помощью текстового редактора:

vi /etc/exim4/exim4.conf.template

Найдите строку со следующим содержимым:

.ifdef DCconfig_smarthost DCconfig_satellite

После нее вставьте следующие строки:

send_via_gmail:
driver = manualroute
domains = ! +local_domains
transport = gmail_smtp
route_list = * smtp.gmail.com

Найдите первую строку со следующим содержимым:

transport/30_exim4-config_remote_smtp_smarthost

После нее вставьте следующие строки:

gmail_smtp:
driver = smtp
port = 587
hosts_require_auth = $host_address
hosts_require_tls = $host_address

Найдите строку со следующим содержимым:

begin authenticators

После нее вставьте следующие строки, почтовый адрес и пароль измените на ваши:

gmail_login:
driver = plaintext
public_name = login
client_send = : user@gmail.com : password

Также из файла необходимо удалить следующий блок строк, чтобы не было ошибок авторизации:

login:
  driver = plaintext
  public_name = LOGIN
.ifndef AUTH_CLIENT_ALLOW_NOTLS_PASSWORDS
  # Return empty string if not non-TLS AND looking up $host in passwd-file
  # yields a non-empty string; fail otherwise.
  client_send = "<; ${if and{\
                          {!eq{$tls_out_cipher}{}}\
                          {!eq{PASSWDLINE}{}}\
                         }\
                      {}fail}\
                 ; ${extract{1}{::}{PASSWDLINE}}\
                 ; ${sg{PASSWDLINE}{\\N([^:]+:)(.*)\\N}{\\$2}}"
.endif

Сохраните изменения и закройте файл.

Чтобы изменения вступили в силу, перезагрузите почтовый сервис:

sudo /etc/init.d/exim4 restart

Чтобы проверить корректность настроек, отправляем тестовое письмо:

echo «Testing our Exim» | mail -s Test example@example.com

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

Исчточник: https://1cloud.ru/help/linux/nastrojka-exim4

 

Партнерка К2

Рекламируйте интернет-магазин программной продукции https://corp2.net и зарабатывайте 5% от заказов клиентами сайта, которые перешли в течении месяца по Вашей ссылке.

Наша продукция продаётся на самых топовых ресурсах Украины: Розетка, Hotline, F.ua, Prom, Zakupka, Allbiz, Allo и т.п. И если клиенты нашего сайта сделают заказ в течении месяца после того, как зашли по Вашей ссылке на наш сайт, то Вам начислится 5% стоимости сделанных и оплаченных клиентами заказов.

Много ли 5% ? Заказы бывают от 5 тыс. грн до миллиона. Таким образом, на одном заказе Вы можете потенциально зарабатывать 250 — 50000 грн.

Инструкция регистрации в партнерке

Заходите на сайт: https://corp2.net

Нажмите кнопку Регистрация.

Вводите регистрационные данные.



После этого, Вам на почту будет выслано подтверждение.
Авторизируетесь на сайте https://corp2.net.




Переходите в раздел Партнерская программа.




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

Добавив к любой странице сайта: ?promo_id=<ВашКод> вы получите Вашу персонифицированную ссылку рекламодателя.
Публикуйте подобные ссылки и зарабатывайте вместе с нами!

Запуск приложения в режиме «daemon» в Linux

Часто случается ситуация, что нужно запустить приложение в Linux, которое не должно быть завершено при выходе пользователя, а режима демона у приложения нет.
На этот случай можно воспользоваться парой приемов.

Первый способ

Запустить в сессии программы screen, которая не завершается при выходе пользователя.

screen -d -m команда

использованные параметры:
-d -m — Запустить новый сеанс screen, но не подключаться к нему.

Так же можно использовать параметр:
-S имя — задать имя сессии screen для удобства поиска сессии по имени.

Пример:
screen -d -m -S backgroud_ping ping 127.0.0.1

1 screen -d -m -S backgroud_ping ping 127.0.0.1

Эта команда запустит пинг адреса 127.0.0.1 и присвоит сессии имя backgroud_ping.

Для возврата к приложению и получению управления нужно:

посмотреть список активный сессий screen: screen -ls

1 screen -ls

в выводе консоли мы увидим имя и PID процесса: There is a screen on: 1218.backgroud_ping (13.05.2016 15:43:34) (Detached) 1 Socket in /var/run/screen/S-root.

123 There is a screen on:        1218.backgroud_ping     (13.05.2016 15:43:34)   (Detached)1 Socket in /var/run/screen/S-root.

запущенная сессия будет иметь имя backgroud_ping, и в данном случае, PID будет 1218.

теперь остается подключиться к процессу screen, это делается командой: screen -r номер_PID

1 screen -r номер_PID

в нашем случае это будет: screen -r 1218

1 screen -r 1218

Мы получили обратно управление над приложением.

Второй способ

Использовать утилиту nohup, которая запустит приложение с игнорированием сигналов потери связи (SIGHUP), что позволит продолжить выполнение приложения после выхода пользователя из системы. nohup команда &

1 nohup команда &

вывод будет перенаправлен вместо консоли в файл nohup.out, который будет находиться в папке из которой производился запуск. Посмотреть вывод консоли можно командой: tail -f nohup.out

1 tail -f nohup.out

Пример: nohup ping 127.0.0.1 &

1 nohup ping 127.0.0.1 &

В данном случае вернуться к приложению и получить управление нельзя. его можно только завершить командой kill.

Третий способ

Использовать утилиту start-stop-daemon, которая создана для запуска в фоне приложений, которые сами не умеют переходить в фон. start-stop-daemon -S -b -x путь_и_имя_исполняемого_файла -m -p путь_и_имя_pid_файла

1 start-stop-daemon -S -b -x путь_и_имя_исполняемого_файла -m -p путь_и_имя_pid_файла

использованные параметры:
-S — запустить;
-b — запустить в фоне;
-x — полный путь и имя исполняемого файла;
-m — создать PID-файл с номером процесса;
-p — путь и имя PID-файла.
Если требуется запустить программу с параметрами, то параметры указываются в конце, после двойного тире (подробнее — в примере).

Пример: start-stop-daemon -S -b -x /bin/ping -m -v -p /run/ping.pid — -I eth0 127.0.0.1

1 start-stop-daemon -S -b -x /bin/ping -m -v -p /run/ping.pid — -I eth0 127.0.0.1

В данном примере мы запускаем утилиту ping с параметрами (-I eth0 127.0.0.1) и создаем PID-файл (/run/ping.pid).

Для остановки программы использутся другие параметры: start-stop-daemon -K -x путь_и_имя_исполняемого_файла

1 start-stop-daemon -K -x путь_и_имя_исполняемого_файла

или start-stop-daemon -K -p путь_и_имя_pid_файла

1 start-stop-daemon -K -p путь_и_имя_pid_файла

использованные параметры:
-K — остановить;
-x — найти по имени запущенной программы;
-p — найти по PID-файлу .

Пример: start-stop-daemon -K -p /run/ping.pid

1 start-stop-daemon -K -p /run/ping.pid

Находим номер процесса, записанный в файл /run/ping.pid и останавливаем его.

Более правильно всегда использовать PID-файлы, потому что имя запускаемой программы не всегда равно имени запущенного процесса.

Источник: https://blackdiver.net/it/linux/4164

Предпродажа VDoc приложения

Канал продукта в Telegram: https://t.me/vdocapp

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

Что такое VDoc

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

Чем VDoc приложение лучше, чем VDoc веб-приложение

  • Стабильность работы. Приложения в отличие от веб-приложений устойчивы к сбоям в сети. Приложение “не свалится” и не “подвиснет”, в отличие от веб-приложений, процессы в которых могут не завершиться при возникновении ошибки выполнения скриптов.
  • Нет ограничений. Браузеры накладывают ограничения на выполнение веб приложений: можно записывать файлы только в рамках каталога браузера (который расположен не удобно для пользователей), файлы нужно загружать по очереди (по одному файлу), при загрузке файлов обратно в систему VDoc, нужно пользователю выбирать файл, нельзя запускать автоматически приложения для работы с файлом, есть ограничения на размер передаваемой информации и многие другие. Все эти ограничения создают не удобство работы с VDoc веб-приложение.
    VDoc приложение же не имеет ограничений!
    С приложением пользователь не тратит время на рутинные операции — всё делает программа автоматически!
  • Высокая скорость работы. VDoc компилируется в машинный код под каждую определенную операционную систему. Для выполнения приложений VDoc не нужны никакие программы-интерпретаторы типа Python, Java-машины, Framework Windows и т.п. VDoc выполняется сам без дополнительных “костылей”!
  • Легкость переноса программмы. Просто скопируйте файл с одного устройства с соответствующей операционной системой на другое устройство.
  • Сворачивание в трей, юзабилити. Vdoc умеет сворачиваться в трей (иконки возле часов), не забирая при этом место на экране. Дизайн приложения может настраиваться и адаптироваться под размер экрана, используя всё выделенное пространство для работы приложения. Работа не в веб-браузере позволяет не смешивать работу приложения с веб-серфингом.
  • Много-звеньевая архитектура. Для работы VDoc используется много-звеньевая архитектура приложения: Клиентское приложение — Сервер приложений — Сервер базы данных. Это наиболее устойчивая и безопасная архитектура работы приложений в интернет.
  • Много-поточность. Благодаря обмену информацией во много потоков Ваши файлы перешлются с максимально возможной скоростью через интернет.
  • Кросс-платформенность.

Серверная часть работает в Windows, Linux, MacOS. Так же есть 2 вариации в каждой операционной системе: в графическом виде, в виде команды для текстовой строки.

Клиентская часть имеет 2 варианта представления:

Desktop вариант: для Windows, Linux, MacOS.

Вариант для мобильных приложений: Android, IOS, Windows, Linux, MacOS.

Так же, есть варианты дистрибутивов в зависимости от разрядности процессоров: 32 разрядный и 64 разрядный.

  • Native приложение. VDoc приложение распространяется в скомпилированном виде под соответствующую разновидность операционных систем. Для его работы не нужно сторонних интерпретаторов и фреймворков.
  • Мобильные приложения. Есть вариант клиентской части для Android и IOS.
  • Полная информация о подключенных пользователей. В отличие от веб-приложения, в VDoc приложении происходит полный контроль над подключением пользователей. Администратор системы видит всех пользователей, которые подключены в данный момент (не зависимо от вида клиентских приложений) и может управлять данными подключениями (отключать, блокировать).
  • Бинарный обмен данными. VDoc приложение обменивается с сервером приложений в бинарном виде. Этот обмен данными выше по скорости, чем обычный JSon и более защищенный от взломов.
  • Поддержка TCP, HTTP, HTTPS. Сервер приложений и само клиентское приложение может работать по различным протоколам будь-то TCP, HTTP, HTTPS. Это позволяет администратору выбрать тот обмен данными, какой ему больше нравится.
  • Импорт/экспорт. Дажатием ctrl+C/ctrl+V Вы можете экспортировать и импортировать информацию из таблицы с файлами. Таким образом, если Вам понадобится куда-то переслать спискок файлов, эту задачу Вы сможете реализовать за несколько секунд.
  • Выполнение длительных процессов. В отличие от веб-приложения, у приложения нет проблем с выполнением длительных процессов. Благодаря этому, пользователи могут синхронизировать свои каталоги, получать каталоги, отправлять каталоги, пересылать и получать огромные объемы данных, проверять сверку файлов с центральным репозитарием.
  • Синхронизация каталогов с центральным репозитарием. Приложение позволяет синхронизировать локальные каталоги с центральным репозитарием. Это затратная по времени операция, но она будет делаться максимально быстро.
  • Загрузка всего каталога на локальный диск. В VDoc веб-приложение из-за ограничений наложенных браузером и временными рамками была проблема загрузки локального каталога. VDoc приложение загрузит много-потоково информацию всего каталога на локальный диск.
  • Выгрузка каталога на сервер. VDoc приложение максимально быстро во много потоков перешлёт Вашу информацию на сервер.
  • Сверка версий файлов с центральным хранилищем. Теперь, в VDoc приложении Вы сможете сравнить файлы с центральным репозитарием.
  • Создание файлов из шаблонов. Прямо из клиетского приложения Вы можете создавать файлы выбирая их из подготовленных Вами шаблонов. Файл создастся и автоматически откроется в нужном Вам редакторе.
  • Другие возможности. Возможности VDoc приложения растут постоянно и не ограничиваются перечисленным списком. Благодаря обновлениям, которые будут поступать бесплатно в течении года после покупки продукта Вы сможете оставаться в тренде развития системы.

Возможности программного комплекса VDoc приложение

  • Поддержка разных языков. Информацию в базу данных Вы можете вносить на разлоичных языках, а так же выбрать нужную Вам локализаци. Если нужной Вам локализации нет и вам она реально нужна, разработчик бесплатно реализует нужный перевод.
  • Динамически подгружаемое дерево. Каким бы разветвленным ни было дерево, сколько бы элементов оно не хранило, Vdoc с максимальной скоростью Вам покажет информацию по ветвям в дереве.
  • Большой объем данных. Что такое терабайт для VDoc ? Это обычный размер данных. В VDoc без проблем могут храниться десятки, если не сотни терабайтов информации, лишь бы было место на серверах ))). При хранении большых объемов информации VDoc все так же продолжает быстро работать.
  • Ограничение прав доступа к узлам. Разветвленная система ограничения прав доступа, позволяет ограничить доступ к ветвям для пользователей.
  • Вирусы и другие вредоносные программы не смогут уничтожить Ваши данные, т.к. не смогут получить доступа к ним…
  • Пользователи не могут уничтожить, удалить или повредить данные, потому что в системе VDoc, информация физически не удаляется, а файлы просто помечаются на удаление, но при этом сохраняются в системе на всегда. И к тому же, все изменения сделаные пользователями логируются и сохраняются.
  • VDoc предназначен для коллективной работы. Если пользователь берет файл в работу, другие участники процесса уведомляются об этом (они видят пользователя, взявшего в работу файл, а так же дату и время начала работы).

Предварительный внешний вид VDoc приложение

Серввер приложений (сворачивается в трей или может работать в виде демона)

Клиентское приложение:

Сравнение продукта с альтернативными решениями хранения информации

VDoc приложение распространяется без передачи исходных кодов в виде дистрибутивов под определенные операционные системы.

Приобретая VDoc приложение Вы получите бесплатно 1 год обновлений.

VDoc нужен каждой компании!

Объявляется предпродажа нового программного продукта VDoc приложение.

ВНИМАНИЕ! Вы можете приобрести полный пакет продукта без ограничения количества подключений на 1 сервер всего за 1500$. Акция действует до выпуска релиза продукта в ареле 2020 года.

Плановый выпуск релиза март-апрель 2020 года.

Чтоб приобрести продукт прямо сейчас, обращайтесь:

Email: rs@corp2.net

Канал продукта в Telegram: https://t.me/vdocapp

Телефон\Viber\Telegram: +38 067 901-63-22

НАСТРОЙКА UWSGI И NGINX ДЛЯ ОБСЛУЖИВАНИЯ ПРИЛОЖЕНИЙ PYTHON В UBUNTU 14.04

Данное руководство поможет настроить простое приложение WSGI, обслуживаемое uWSGI. Веб-сервер Nginx используется в качестве обратного прокси-сервера для более надёжного соединения.

Примечание: Все компоненты установлены на сервер Ubuntu 14.04.

Основные понятия и подходы

Прежде чем приступить к работе, нужно разобраться с основными терминами и понятиями. Следующие три термина на первый взгляд кажутся взаимозаменяемыми, но на самом деле они совсем разные:

  • WSGI: спецификация Python, которая определяет стандартный интерфейс для взаимодействия приложения/фреймворка с сервером приложений/веб-сервером. Её цель – упростить и стандартизировать взаимодействие этих компонентов. По сути, WSGI определяет интерфейс API, который можно использовать с другими протоколами.
  • uWSGI: сервер приложений, который обеспечивает полноценную платформу для разработки и развертывания веб-приложений и сервисов. Этот сервер приложений может обрабатывать приложения, написанные на разных языках. Он взаимодействует с приложением согласно спецификации WSGI. Он может взаимодействовать с другими веб-серверами при помощи различных протоколов. Этот компонент трансформирует запросы стандартного веб-сервера в формат, который может обработать приложение.
  • uwsgi: быстрый бинарный протокол, который реализуется сервером uWSGI для взаимодействия с другими полнофункциональными протоколами. Это wire протокол, а не транспортный протокол. Он лучше всего подходит для взаимодействия с веб-серверами, которые проксируют запросы для uWSGI.

Требования к приложениям WSGI

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

Веб-сервер (uWSGI) должен иметь возможность отправлять запросы приложению. Callable (или точка входа)– псевдотип данных, «нечто, что можно вызвать как функцию». Ожидаемым параметром является словарь с переменными окружения и точка входа веб-сервера.

В ответ приложение отправляет итератор, при помощи которого будет сгенерировано тело запроса клиента. Также оно вызовет точку входа веб-сервера, которую оно получило в виде параметра. Первым параметром при извлечении точки входа будет код состояния HTTP, а вторым – список наборов, каждый из которых определяет заголовок ответа и значение, которое нужно вернуть клиенту.

Установка компонентов

Для начала нужно установить все необходимые программы на сервер Ubuntu 14.04. Для этого можно использовать apt и pip.

Обновите индекс пакетов и установите библиотеку разработки Python, pip (пакетный менеджер Python) и веб-сервер Nginx.

sudo apt-get update
sudo apt-get install python-dev python-pip nginx

После завершения установки вы получите доступ к пакетному менеджеру pip. С его помощью можно установить пакет virtualenv, который позволяет изолировать окружение приложения Python от остальных программ системы.

sudo pip install virtualenv

После этого можно создать общую структуру приложения. Создайте виртуальное окружение и установите в него сервер приложений uWSGI.

Создание каталога и виртуальной среды приложения

Теперь создайте папку для приложения. В ней вы сможете развернуть виртуальную среду и хранить точку входа WSGI.

mkdir ~/myapp/

Откройте этот каталог:

cd ~/myapp

Создайте виртуальную среду с помощью команды virtualenv (для простоты в руководстве она называется myappenv)

virtualenv myappenv

Теперь в каталоге myappenv развёрнуто новое окружение Python. Включите его:

source myappenv/bin/activate

После этого командная строка изменится. Это значит, что виртуальная среда активна:

(myappenv)username@host:~/my_app$

Чтобы покинуть виртуальную среду, используйте команду:

deactivate

Примечание: Если вы вышли из виртуальной среды только что, вернитесь в неё.

Когда виртуальная среда включена, все устанавливаемые приложения Python будут помещены в иерархию этого каталога. Они не смогут повлиять на общесистемные приложения Python. Теперь можно установить сервер uWSGI с помощью pip. Его пакет называется uwsgi (однако не следует путать пакет сервера uWSGI с протоколом uwsgi).

pip install uwsgi

Чтобы убедиться, что установка прошла успешно, запросите версию:

uwsgi --version

Команда должна вернуть версию сервера uWSGI.

Создание приложения WSGI

Теперь нужно создать простое приложение WSGI согласно спецификации WSGI. Это приложение должно состоять из таких компонентов:

  • Интерфейс для callable.
  • Точка входа должна в качестве параметра содержать словарь, в котором хранятся переменные в виде пар «ключ-значение», и точку входа сервера uWSGI.
  • Точка входа должна возвращать итератор, что сгенерирует тело для отправки клиенту.
  • Приложение должно вызывать точку входа веб-сервера с состоянием HTTP и заголовками запросов.

Запишите приложение в файл wsgi.py:

nano ~/myapp/wsgi.py

В этом файле будет находиться простое приложение, созданное согласно WSGI.

Важно! Вносите код, учитывая отступы.

def application(environ, start_response):

start_response('200 OK', [('Content-Type', 'text/html')])
return ["<h1 style='color:blue'>Hello There!</h1>"]

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

Первый параметр называется environ и задаёт словарь переменных. Второй параметр называется start_response и сообщает точке входа веб-сервера uWSGI имя приложения.

Приложение будет выполнять два действия. Во-первых, оно вызовет точку входа, полученную с кодом состояния HTTP и заголовками. В таком случае отправляется ответ 200 ОК, а text/html получает заголовок Content-Type.

Во-вторых, приложение будет возвращать итератор в качестве тела запроса. В данном приложении используется одна строка HTML. Строки тоже относятся к итератору, но в списке uWSGI может обрабатывать целую строку при помощи одного итератора.

Такой файл, скорее всего, будет использоваться как ссылка на остальной код приложения. к примеру, Django-проекты включают файл wsgi.py по умолчанию. Он переводит запросы веб-сервера uWSGI в понятный приложению формат. Упрощенный интерфейс WSGI остаётся таким независимо от сложности самого кода приложения.

Сохраните и закройте файл.

Чтобы протестировать код, запустите uWSGI. Сервер будет использовать HTTP и прослушивать порт 8080. Передайте серверу название сценария:

uwsgi --socket 0.0.0.0:8080 --protocol=http -w wsgi

Теперь посетите в браузере IP-адрес или доменное имя, задав порт 8080. На экране появится фраза:

Hello There!

Остановите сервер, нажав CTRL-C.

Теперь приложение готово. Отключите виртуальную среду:

deactivate

Конфигурационный файл uWSGI

В вышеприведённом примере вы вручную запустили сервер uWSGI и передали ему несколько параметров. Чтобы не делать это вручную всегда, создайте конфигурационный файл.

uWSGI может читать конфигурации в разных форматах; в руководстве для простоты используется формат .ini. Создайте файл myapp.ini:

nano ~/myapp/myapp.ini

В этом файле нужно создать раздел кода [uwsgi]. В нём будут храниться все конфигурации. Задайте настройки самого приложения. Сервер uWSGI должен знать о местонахождении точки входа приложения.

[uwsgi]
module = wsgi:application

Начальный процесс uwsgi должен быть ведущим (master) и порождать множество рабочих процессов (в данном примере 5).

[uwsgi]
module = wsgi:application
master = true
processes = 5

Теперь нужно изменить протокол, с помощью которого uWSGI взаимодействует с другими компонентами. Во время тестирования был установлен протокол —protocol=http, чтобы приложение можно было просмотреть в браузере. Однако в в дальнейшем будет настроен обратный прокси-сервер Nginx, который реализует механизм проксирования uwsgi (быстрый бинарный протокол, с помощью которого uWSGI взаимодействует с другими серверами). Протокол uwsgi является протоколом uWSGI по умолчанию, потому достаточно просто не задавать протокол, чтобы сервер использовал uwsgi.

Поскольку этот конфигурационный файл должен поддерживать взаимодействие с Nginx, замените стандартный порт сокетом Unix. Это более быстрый и безопасный вариант. Сокет будет создан в текущем каталоге (в руководстве он будет называться myapp.sock). Измените права доступа к нему, указав 664, чтобы веб-сервер Nginx имел право на редактирование. Добавьте опцию vacuum, которая удалит сокет сразу после остановки процесса:

[uwsgi]
module = wsgi:application
master = true
processes = 5
socket = myapp.sock
chmod-socket = 664
vacuum = true

Осталось добавить последнюю опцию, которая нужна для поддержки файла Upstart. Upstart и uWSGI по-разному воспринимают сигнал SIGTERM. Чтобы устранить эту проблему, просто добавьте опцию die-on-term.

[uwsgi]
module = wsgi:application
master = true
processes = 5
socket = myapp.sock
chmod-socket = 664
vacuum = true
die-on-term = true

Сохраните и закройте файл.

Создание файла Upstart

Теперь можно настроить автозапуск uWSGI во время загрузки сервера. Поместите его в каталог /etc/init, который проверяет система Upstart (в руководстве файл называется myapp.conf).

sudo nano /etc/init/myapp.conf

Добавьте описание сервиса и установите уровни выполнения. Уровни выполнения стандартного пользователя – 2-5.

Если приложение перейдет на уровень, который не входит в этот диапазон, Upstart остановит его.

description "uWSGI instance to serve myapp"
start on runlevel [2345]
stop on runlevel [!2345]

Теперь установите пользователя и группу, с помощью которых будет запущен процесс. В качестве группы можно указать www-data, чтобы сервер Nginx имел доступ к приложению.

description "uWSGI instance to serve myapp"
start on runlevel [2345]
stop on runlevel [!2345]
setuid demo
setgid www-data

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

После этого добавьте блок script. В нем можно открыть каталог приложения, включить виртуальную среду (вместо символа . используйте source) и запустите uWSGI с помощью файла .ini.

description "uWSGI instance to serve myapp"
start on runlevel [2345]
stop on runlevel [!2345]
setuid demo
setgid www-data
script
cd /home/demo/myapp
. myappenv/bin/activate
uwsgi --ini myapp.ini
end script

Сценарий готов. Сохраните и закройте его.

Запустите сервис:

sudo start myapp

Чтобы убедиться, что сервер запущен, введите:

ps aux | grep myapp
demo   14618  0.0  0.5  35868  5996 ?        S    15:02   0:00 uwsgi --ini myapp.ini
demo   14619  0.0  0.5  42680  5532 ?        S    15:02   0:00 uwsgi --ini myapp.ini
demo   14620  0.0  0.5  42680  5532 ?        S    15:02   0:00 uwsgi --ini myapp.ini
demo   14621  0.0  0.5  42680  5532 ?        S    15:02   0:00 uwsgi --ini myapp.ini
demo   14622  0.0  0.5  42680  5532 ?        S    15:02   0:00 uwsgi --ini myapp.ini
demo   14623  0.0  0.5  42680  5532 ?        S    15:02   0:00 uwsgi --ini myapp.ini
demo   15520  0.0  0.0  11740   936 pts/0    S+   15:53   0:00 grep --color=auto myapp

Теперь сервис будет автоматически загружаться вместе с системой. Чтобы остановить сервис, введите:

sudo stop myapp

Nginx как обратный прокси-сервер для uWSGI

Итак, теперь приложение WSGI работает и поддерживается сервером uWSGI. Также сервис запускается автоматически при помощи Upstart. Процесс uWSGI прослушивает сокет и взаимодействует с протоколом uwsgi.

Теперь нужно настроить Nginx как обратный прокси-сервер. Nginx может проксировать запросы при помощи протокола uwsgi для взаимодействия с uWSGI. Этот протокол быстрее, чем HTTP.

Настройка Nginx очень проста. Нужно только создать новый файл в каталоге sites-available в иерархии Nginx (имя файла должно совпадать с именем приложения, потому в руководстве файл называется myapp).

sudo nano /etc/nginx/sites-available/myapp

В этом файле нужно задать номер порта и доменное имя, к которому относится данный блок server. В данном случае используется стандартный порт 80.

server {
listen 80;
server_name server_domain_or_IP;
}

Чтобы приложение WSGI могло отправлять все запросы на этот домен или IP, нужно создать блок location для запросов, которые начинаются с / (это соответствует всем запросам). Добавьте в него директиву include, чтобы внести ряд параметров по умолчанию из конфигурационного каталога Nginx. Этот файл называется uwsgi_params. После этого нужно передать трафик приложению uWSGI через протокол uwsgi. Для этого используется сокет unix.

server {
listen 80;
server_name server_domain_or_IP;
location / {
include         uwsgi_params;
uwsgi_pass      unix:/home/demo/myapp/myapp.sock;
}
}

Этих настроек достаточно для поддержки простого приложения. Сложным приложениям нужна более тонкая настройка (например, можно определить количество upstream-серверов uWSGI вне этого блока, добавить больше параметров uWSGI, настроить обработку статических файлов Nginx и передавать uWSGI только динамические запросы). В данном случае такие сложные функции не нужны. Просто сохраните и закройте файл.

Чтобы привести новые параметры в исполнение, создайте символьную ссылку на каталог sites-enabled.

sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled

Проверьте конфигурационный файл на наличие ошибок:

sudo service nginx configtest

Если в файле нет ошибок, перезапустите веб-сервер:

sudo service nginx restart

После этого откройте в браузере доменное имя или IP (без номера порта). На экране появится:

Hello There!

Заключение

Теперь у вас есть полностью рабочее простое приложение WSGI. Его можно использовать как шаблон для создания более сложного приложения.

uWSGI может управлять несколькими приложениями, для этого используется так называемый «emperor mode». Вы можете расширить настройки Nginx, добавив балансировку нагрузки. Все компоненты достаточно гибкие, их можно настроить согласно требованиям вашего приложения.

Источник:
https://www.8host.com/blog/nastrojka-uwsgi-i-nginx-dlya-obsluzhivaniya-prilozhenij-python-v-ubuntu-14-04/