Category Archives: 3D

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

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

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

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

По поводу аренды, обращайтесь по телефону/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

Запуск приложения в режиме «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

НАСТРОЙКА 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/

Копирование большого количества файлов через SSH

SCP (Secure CoPy) — программа для удаленного копирования фалов по сети между хостами.

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

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

Пример 1: Копируем файл «file.txt» из удаленного сервера на локальный компьютер.

$ scp user@remote.host:file.txt /some/local/directory

Пример 2: Копируем файл «file.txt» с локального компьютера на удаленный сервер.

$ scp file.txt user@remote.host:/some/remote/directory

Пример 3: Копируем папку «dir1» с локального хоста в директорию «dir2» на удаленном хосте.

$ scp -r dir1 user@remote.host:/some/remote/directory/dir2

Пример 4: Копируем файл «file.txt» с одного удаленного сервера «remote.host1» на другой удаленный сервер «remote.host2».

$ scp user@remote.host1:/directory/file.txt user@remote.host2:/some/directory/

Пример 5: Копируем файлы «file1.txt» и «file2.txt» с локального компьютера в Ваш домашний каталог на удаленном сервере.

$ scp file1.txt file2.txt user@remote.host:~

Пример 6: Копируем файл «file.txt» с локального хоста на удаленный хост, используя порт 2222.

$ scp -P 2222 file.txt user@remote.host:/some/remote/directory

Пример 7: Копируем файл «file.txt» с локального компьютера в Ваш домашний каталог на удаленном сервере. Сохраняем время изменения и время доступа и права копируемого фала.

$ scp -p file.txt user@remote.host:~

Пример 8: Копируем файл «file.txt» с локального компьютера в Ваш домашний каталог на удаленном сервере. Увеличиваем скорость работы SCP изменяя алгоритм шифрования с AES-128 (по умолчанию) на Blowfish.

$ scp -c blowfish file.txt user@remote.host:~

Пример 9: Копируем файл «file.txt» с локального компьютера в Ваш домашний каталог на удаленном сервере. Ограничиваем ширину канала используемого командой SCP до 100 Kbit/s.

$ scp -l 100 file.txt user@remote.host:~

Пример 10: Копируем несколько файлов с удаленного хост в текущую директорию на Вашем локальном хосте.

$ scp user@remote.host:~/\{file1,file2,file3\} .

Источник: https://www.shellhacks.com/ru/copy-files-ssh-10-examples/


Монтирование удалённого каталога по SSH как локальной папки с помощью SSHFS

При помощи sshfs — клиента файловой системы ssh — мы можем подключить локальный каталог к удалённому местоположению со всеми взаимодействиями файлов в зашифрованном сеансе ssh.

localhost:~$ apt install sshfs

На Ubuntu и Debian установим пакет sshfs, а затем просто приимонтируем удалённое расположение к нашей системе.

localhost:~$ sshfs user@remoteserver:/media/data ~/data/

Источник: https://habr.com/ru/post/435546/

Уровни проработки

Проработка

Часто клиенты задают вопрос: а можно сделать по быстрей работу ? Безусловно, можно. Только, когда делать — нужно чем-то жертвовать. И будет ли клиента и нас устраивать полученный результат — не факт.

Вот на будущее сравнение изображений, сделанных за разное время. Конечно, это 2D-рисунок, но принцип ведь тот же самый…

 

 

Дизайн и визуализация офисов от студии визуализации 3DVisio®

Новые работы дизайна и визуализации офисов от студии визуализации 3DVisio®.

Визуализация офиса, Киев

Визуализация офиса, Киев

3D-визуализация интерьера офиса

3D-визуализация интерьера офиса

3D-визуализация офиса, Киев

3D-визуализация офиса, Киев

Визуализация офиса, Киев

Визуализация офиса, Киев

Визуализация офиса

Визуализация офиса

3D-визуализация офиса

3D-визуализация офиса

3D-визуализация интерьера офиса в Киеве

3D-визуализация интерьера офиса в Киеве

Визуализация экстерьера государственного учреждения

Визуализация экстерьера государственного учреждения

3D-визуализация экстерьера государственного учреждения

3D-визуализация экстерьера государственного учреждения

3D визуализация экстерьера государственного учреждения

3D визуализация экстерьера государственного учреждения

3D визуализация офиса, Киев

3D визуализация офиса, Киев

3D визуализация комнаты ожидания

3D визуализация комнаты ожидания

Визуализация комнаты ожидания

Визуализация комнаты ожидания

Визуализация комнаты ожидания государственного учреждения

Визуализация комнаты ожидания государственного учреждения

3D Визуализация комнаты ожидания государственного учреждения

3D Визуализация комнаты ожидания государственного учреждения

3D-Визуализация комнаты ожидания государственного учреждения

3D-Визуализация комнаты ожидания государственного учреждения

3D-Визуализация комнаты приема граждан

3D-Визуализация комнаты приема граждан

3D Визуализация комнаты приема граждан

3D Визуализация комнаты приема граждан

Визуализация комнаты приема граждан

Визуализация комнаты приема граждан

О нас:
Торговые марки К2® и 3DVisio® имеют более чем 25 летнюю историю становления.
Основные направления деятельности торговых марок:
— 3D-визуализация, дизайн интерьеров, экстерьеров, ландшафтов.
— разработка сайтов и веб-приложений на PHP и Java.
— разработка и поддержка прикладных программных решений для автоматизации предприятий.
— Разработка мобильных приложений.
— Продажа программного обеспечения (в интернет-магазине представлено более 25 тыс. Программных продуктов).
— Реклама в интернет и SEO-оптимизация.
— 3D-анимация.
— полиграфический дизайн и брендинг.
— Хостинг и администрирование серверов.
Наши преимущества:
— Много-летние глубокие знания IT-технологий.
— Комплексный подход.
— Большое количество наработок.
— Полный цикл производства.
— Постоянное совершентсвование технологий и увеличение знаний.

Визуализации от студии 3DVisio: http://3dvisio.org

E-mail: rs@corp2.net

Skype: rudjuk (ищите по rs@corp2.net)

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

Дебют студии визуализации 3DVisio в прямом эфире на радио Европа Плюс 107 fm

Визуализация интерьеров на радио

Визуализация интерьеров на радио

Визуализации от студии 3DVisio: http://3dvisio.org

E-mail: rs@corp2.net

Skype: rudjuk (ищите по rs@corp2.net)

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

 

Ключевые слова:

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