Многопоточный сервер
Веб-приложения, написанные следуя клиент/серверной архитектуре, работают по следующей схеме — клиент запрашивает нужный ресурс у сервера и сервер отправляет ресурс в ответ. В этой схеме сервер, ответив на запрос, прерывает соединение.
Такая модель эффективна поскольку каждый запрос к серверу потребляет ресурсы (память, процессорное время и т.д.). Для того чтобы обрабатывать каждый последующий запрос от клиента, сервер должен завершить обработку предыдущего.
Значит ли это, что сервер может обрабатывать только один запрос за раз? Не совсем! Когда сервер получает новый запрос он создаёт отдельный поток для его обработки.
Поток, если простыми словами, это время и ресурсы, что CPU выделаят на выполнение небольшого блока инструкций. С учётом сказанного, сервер может обрабатывать несколько запросов одновременно, но только по одному на поток. Такая модель так же называться thread-per-request model.
Для обработки N запросов серверу нужно N потоков. Если сервер получает N+1 запросов, тогда он должен ждать пока один из потоков не станет доступным.
На рисунке выше, сервер может обрабатывать до 4 запросов (потоков) единовременно и когда он получает следующие 3 запроса, эти запросы должны ждать пока любой из этих 4 потоков не станет доступным.
Один из способов избавиться от ограничений — добавить больше ресурсов (памяти, ядер процессора и т. д.) на сервер, но это не самое лучшее решение….
И, конечно, не забываем о технологических ограничениях.
Блокирующий ввод/вывод
Ограниченное число потоков на сервере не единственная проблема. Возможно, Вам стало интересно почему один поток не может обрабатывать несколько запросов одновременно? всё из-за блокирующих операций ввода/вывода.
Допустим, Вы разрабатываете онлайн магазин и Вам нужна страница где пользователь может просматривать список всех товаров.
Пользователь стучится на http://yourstore.com/products и сервер рендерит HTML файл со всеми продуктами с базы данных в ответ. Совсем не сложно, да?
Но, что же происходит за кулисами?
- Когда пользователь стучится на особый метод или функция должна выполниться, что бы обработать запрос. Маленький кусочек кода (Ваш или фреймворка) анализирует URL-адрес запроса и ищет подходящий метод или функцию. Поток работает.
- Теперь нужный метод или функция выполняется, так как и в первом пункте — поток работает.
- Так как Вы хороший разработчик, Вы сохраняете все системные логи в файл, ну и конечно же, что бы быть уверенными, что роутер выполняет нужный метод/функцию — Вы так же логируете строку “Method X executing!!». Но всё это блокирующие операции ввода/вывода. Поток ждёт.
- Все логи сохранены и следующие строки функции выполняются. Поток работает снова.
- Время обращаться к базе данных и получать все продукты — простой запрос, вроде , выполняет свою работу, но угадайте что? Да-да, это блокирующая операция ввода/вывода. Поток ждёт.
- Вы получили массив или список всех продуктов, но убедитесь, что Вы всё это залогировали. Поток ждёт.
- Теперь у Вас есть все продукты и пришло время рендерить шаблон для будущей страницы, но перед этим Вам нужно их прочитать. Поток ждёт.
- Движок рендеринга делает свою работу и шлёт ответ клиенту. Поток работает снова.
- Поток свободен, словно птица в небесах.
На сколько медленны операции ввода/вывода? Ну это зависит от конкретной. Давайте обратимся к таблице:
Операции сети и чтения с диска слишком медленные. Представьте сколько запросов или обращений к внешним API ваша система могла бы обработать за это время.
Подбивая итоги: операции ввода/вывода заставляют поток ждать и тратить ресурсы впустую.
Express.js
Express является лидером среди базовых JavaScript- фреймворков. Это гибкая среда на базе Node.js для разработки веб и мобильных приложений.
Express также можно назвать «фреймворком для других фреймворков», поскольку существует множество других фреймворков, построенных с использованием Express. Coursera, IBM, Nike, Paypal, Sony Playstation, , Uber и Unsplash создали свои сайты с помощью Express.js.
Express.js был создан Ти Джеем Головайчуком в 2010 году, а затем в 2015 году был приобретен IBM (StrongLoop). В настоящее время он поддерживается Node.js Foundation. Основное преимущество использования Express.js – быстрая разработка на стороне сервера.
Ключевые особенности Express.js:
- Предлагает надежный механизм маршрутизации для обработки динамических URL-адресов
- Позволяет добавлять дополнительное программное обеспечение в любую точку конвейера обработки запросов.
- Упрощает отладку кода.
- Предоставляет шаблонизатор для динамического рендеринга HTML-страниц на стороне сервера, а не на стороне клиента.
Преимущества использования Express.js
- js — одна из старейших платформ, ее поддерживает огромное сообщество разработчиков
- Хорошо задокументирован.
- js обеспечивает быструю разработку с использованием Node.js.
- Фреймворк интегрируется со всеми наиболее популярными системами управления базами данных (СУБД): MongoDB, MySQLи
- Все популярные движки шаблонов, такие как Pug, HAML, EJS, совместимы с Express.js.
- Является одним из самых фреймворков для начинающих разработчиков.
Подготовка системы
Прежде чем мы начнем устанавливать asterisk, нам надо выполнить целый ряд подготовительных действий. Первым делом отключаем selinux. Для этого открываем файл:
YAML
# mcedit /etc/sysconfig/selinux
1 | # mcedit /etc/sysconfig/selinux |
и устанавливаем значение SELINUX=disabled. После этого применяем настройку без перезагрузки сервера:
YAML
# setenforce 0
1 | # setenforce 0 |
Рекомендация по отключению selinux дается в официальной инструкции по установке freepbx, так как это может привести к нарушению процесса инсталляции.
Дальше обновляем систему и ставим пакеты Development Tools:
YAML
# dnf update
# dnf groupinstall core base «Development Tools»
1 |
# dnf update # dnf groupinstall core base «Development Tools» |
И еще некоторые зависимости, которые будут нужны.
YAML
# dnf install tftp-server ncurses-devel sendmail sendmail-cf newt-devel libxml2-devel libtiff-devel gtk2-devel subversion kernel-devel git crontabs cronie cronie-anacron wget sqlite-devel net-tools gnutls-devel unixODBC
1 | # dnf install tftp-server ncurses-devel sendmail sendmail-cf newt-devel libxml2-devel libtiff-devel gtk2-devel subversion kernel-devel git crontabs cronie cronie-anacron wget sqlite-devel net-tools gnutls-devel unixODBC |
В своей работе FreePBX использует базу данных Mysql. В качестве mysql сервера будем использовать mariadb. Для Freepbx версия не критична, так что будем ставить 10.3 из базового репозитория.
YAML
# dnf module install mariadb
1 | # dnf module install mariadb |
Запускаем mysql сервер.
YAML
# systemctl start mariadb
# systemctl enable mariadb
1 |
# systemctl start mariadb # systemctl enable mariadb |
Теперь нам нужно установить asterisk
Установка Node.js
Теперь система готова к установке Node.js из исходного кода. Во-первых, нужно перейти в каталог /usr/src – как правило, именно здесь хранят исходные коды программного обеспечения.
Теперь скачайте последний сжатый архив исходного кода с сайта Node.js (используйте ссылку http://nodejs.org/download/).
Обратите внимание: чтобы использовать более свежую версию node.js, если такая имеется, нужно заменить URL. Теперь нужно распаковать исходные файлы и переместить их в этот каталог
Теперь нужно распаковать исходные файлы и переместить их в этот каталог.
Когда исходный код извлечен, можно подготовить команды компилятора, выполнив скрипт configure:
Как правило, на выполнение этой задачи уходит больше всего времени (в данном случае компилирование заняло 6 минут 34 секунды). Когда компиляция завершена, нужно выполнить общесистемную установку:
Последняя команда поместит скомпилированные двоичные файлы в системный путь, так что все пользователи могут использовать его без дополнительной настройки. По умолчанию двоичный код Node.js должен быть помещен в /usr/local/bin/node.
Доступ в web интерфейс Freepbx
Переходим в браузере по ip адресу или доменному имени сервера и создаем учетную запись администратора Freepbx. При первом заходе в 14-ю версию я увидел ошибку.
Текст ошибки.
Whoops \ Exception \ ErrorException (E_DEPRECATED) Methods with the same name as their class will not be constructors in a future version of PHP; gui_hidden has a deprecated constructor in /var/www/html/admin/libraries/components.class.php on line 571
Насколько я понял, это сообщение о том, что используется какая-то конструкция, которая объявлена Deprecated и скоро не будет работать. Что с этим делать сейчас, я не понял. Нашел баг репорт с этой ошибкой — https://issues.freepbx.org/browse/FREEPBX-19941 Он почему-то отклонен, помещен как дублирующий, но найти эту же ошибку в трекере я не смог.
Если взять версию php 5.6, то там этой ошибки не будет. Freepbx 14 официально поддерживает только 5.6, но откатываться на нее совсем не хочется.
Я решил просто отключить обработчик ошибок bootstrap. Для этого открываем конфиг freepbx и добавляем туда новое значение.
# mcedit /etc/freepbx.conf
$bootstrap_settings = false;
Заходим в web интерфейс freepbx еще раз и создаем администратора.
Потом, используя созданную учетку, логинимся в панель и указываем начальные настройки. Рекомендую выбрать английский язык. Как я уже говорил, перевод на русский так себе, с ним иногда бывает сложно понять суть настроек.
После этого оказываетесь в веб панели Freepbx. Нажмите сверху на Dashboard и увидите сводную информацию по системе. Теперь можно начинать ее настройку, но это тема отдельной статьи. Возможно, до нее у меня когда-нибудь дойдут руки.
Установка Freepbx 15 на Centos 8
Начнем с самого простого 15-я версия на php 7. Качаем архив с официального сайта.
YAML
# cd ~
# wget http://mirror.freepbx.org/modules/packages/freepbx/freepbx-15.0-latest.tgz
1 |
# cd ~ # wget http://mirror.freepbx.org/modules/packages/freepbx/freepbx-15.0-latest.tgz |
Распаковываем архив.
YAML
# tar xfz freepbx-15.0-latest.tgz
1 | # tar xfz freepbx-15.0-latest.tgz |
Устанавливаем Freepbx 15 на Centos 8.
YAML
# cd freepbx
# ./start_asterisk start
# ./install -n
1 |
# cd freepbx # ./start_asterisk start # ./install -n |
Если на mysql установили пароль root, то запускать установку следует с указанием пароля.
YAML
# ./install -n —dbuser root —dbpass password
1 | # ./install -n —dbuser root —dbpass password |
Перезапустите httpd.
YAML
# systemctl restart httpd
1 | # systemctl restart httpd |
На этом установка freepbx закончена. Можно идти в веб интерфейс и проверять. Сначала создадите учетную запись администратора freepbx, потом зайдете под ней в панель управления asterisk. Рекомендую выбрать английский язык. Перевод на русский так себе, с ним иногда бывает сложно понять суть настроек.
Я заметил небольшую проблему. Во время входа панель обращается к какому-то внешнему ресурсу, который с моего сервера плохо доступен. Из-за этого очень долго выполняется вход, потом вылетает ошибка бэкенда и загружается dashboard. В логах apache при этом была ошибка:
YAML
(70007)The timeout specified has expired: AH01075: Error dispatching request to : (polling), referer: http://10.20.1.23/admin/config.php
1 | (70007)Thetimeoutspecifiedhasexpired: AH01075: Error dispatching request to : (polling),referer: http://10.20.1.23/admin/config.php |
Не хватает дефолтного времени в параметре RequestReadTimeout. Ошибка пропала и вход стал выполняться нормально после того, как я увеличил таймауты, добавив в /etc/httpd/conf/httpd.conf.
YAML
RequestReadTimeout header=20-600,MinRate=500 body=20,MinRate=500
1 | RequestReadTimeoutheader=20-600,MinRate=500body=20,MinRate=500 |
Не забудьте после этого перезапустить httpd.
Так же у меня была ошибка с отображением системной информации в виджете System Overview. Вместо полезной информации там была ошибка:
There was an error asking for Overview. Check the error logs for more information.
Как ее исправить, я так и не разобрался.
Create Your Node.js Web Server
Install Node.js
-
Install the
Node Version Manager (NVM) for Node.js. This program helps you manage different Node.js versions on a single system. -
To start using in the same terminal run the following commands:
Verify that you have access to NVM by printing its current version.
You should see a similar output:
-
Install Node.js:
-
Use NVM to run your preferred version of Node.js.
Your output will resemble the following
Create a Test JavaScript File
In the
section you configured NGINX to listen on port to serve its static content. You also configured a reverse proxy to your Linode’s when a request for the file is made. In this section you will create the file to be able to test your Node.js web server that you will create in the
.
-
Create the file in your site’s root directory.
- File: /var/www/example.com/test.js
-
Create the Node.js Web Server File
In this section, you will create a file named that will use Node.js modules to help you write a simple web server that can handle client requests and return responses to them.
-
In your site’s root directory, create the file with the following content.
- File: /var/www/example.com/server.js
-
-
Run a new
tmux session:Press return when prompted.
-
Navigate to your root directory where your file is located.
-
Run your Node.js web server. Appending to the end of a command will keep the web server’s process running in the background.
You should see your terminal return a process ID after issuing the previous command. Return to your command prompt by entering CTRL+C.
-
Exit your tmux session.
-
Open a browser and navigate to your site’s domain or IP address. You should see your site’s page load.
-
Click on the page’s Go to test.js button to load the page whose content will be served dynamically with your Node.js web server.
-
Click on the test page’s Display the date and time button to dynamically display the current date and time.
You have now completed the basic configurations to proxy requests to the Node.js server you wrote. As a next step, you may consider looking into further NGINX configurations to better handle serving
and dynamic content from a
reverse proxy.
There are many frameworks to help you continue to develop web apps using JavaScript. You may consider using
Express.js,
Ember.js, or
Vue.js.
Install Node Using the Node Version Manager
Another way of installing Node.js that is particularly flexible is through NVM, the Node version manager. This piece of software allows you to install and maintain many different independent versions of Node.js, and their associated Node packages, at the same time.
To install NVM on your CentOS 7 machine, visit the project’s GitHub page. Copy the or command from the README file that displays on the main page. This will point you towards the most recent version of the installation script.
Before piping the command through to , it is always a good idea to audit the script to make sure it isn’t doing anything you don’t agree with. You can do that by removing the segment at the end of the command:
Take a look and make sure you are comfortable with the changes it is making. When you are satisfied, run the command again with appended at the end. The URL you use will change depending on the latest version of NVM, but as of right now, the script can be downloaded and executed by typing:
This will install the script to your user account. To use it, you must first source your :
Now, you can ask NVM which versions of Node it knows about:
You can install a version of Node by typing any of the releases you see. For instance, to get version 0.10.30, you can type:
You can see the different versions you have installed by typing:
You can switch between them by typing:
To set this version as the default, type:
You can verify that the install was successful using the same technique from the other sections, by typing:
From the version number output, we can tell that Node is installed on our machine as we expected.
React
Фреймворк с открытым исходным кодом React был создан разработчиками Facebook в 2013 году. React быстро стал самым популярным фреймворком для разработки онлайн-магазинов, поскольку он позволяет создавать динамический интерфейс и выдерживает высокий трафик.
Среди главных особенностей React:
- Состоит из набора компонентов, готовых для переиспользования.
- Использует метод componentDidMount(), который позволяет исполнять код React уже после помещения компонента в DOM.
- Технология рендеринга повышает производительность приложения и избавляет разработчика от лишней работы по перерасчету раскладки страницы.
Вариант 3 — Установка Node из источника
Еще одним способом установки Node.js является загрузка исходного кода и его компиляция.
Воспользуйтесь вашим браузером и перейдите на официальную страницу загрузки Node.js, нажмите правой кнопкой на ссылке Исходный код и нажмите Скопировать адрес ссылки или похожий вариант в зависимости от браузера.
Вернитесь к вашему сеансу SSH, убедившись, что вы находитесь в директории, для которой у вас есть права на запись. Мы будем использовать домашнюю директорию текущего пользователя:
Затем введите , вставьте ссылку, скопированную вами с сайта, и добавьте в конце :
Команда будет использовать утилиту для загрузки исходника, затем передавать его непосредственно в утилиту , которая будет извлекать его в текущую директорию.
Перейдите во вновь созданную директорию исходника:
Существует несколько пакетов, которые нам нужно загрузить из репозиториев CentOS для компиляции кода. Используйте для их установки:
Вам будет предложено подтвердить установку. Введите , а затем , чтобы сделать это. Теперь мы можем настроить и скомпилировать программное обеспечение:
Компиляция может занимать определенное время (около 30 минут для четырехъядерного сервера). Мы использовали опцию для запуска четырех параллельных процессов компиляции. Вы можете пропустить эту опцию или обновить число исходя из количества доступных ядер процессора.
После завершения компиляции вы можете установить программное обеспечение в вашей системе с помощью следующей команды:
Чтобы проверить, что установка выполнена успешно, попросите Node отобразить номер версии:
Если вы увидите правильный номер версии, установка была выполнена успешно. По умолчанию Node также устанавливает совместимую версию , поэтому она также должна быть доступна.
Шаг 4. Установка MongoDB на CentOS 8.
Откройте сеанс терминала, и нам нужно настроить репозиторий MongoDB. Для этого откройте новый файл:
nano /etc/yum.repos.d/mongodb-org-4.2.repo
Добавьте следующее:
name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/development/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc
Теперь установить MongoDB так же просто, как запустить всего одну команду:
dnf install mongodb-org
Демон MongoDB должен быть включен для запуска при загрузке:
sudo systemctl enable mongodb sudo systemctl start mongodb
Затем вам нужно будет определить набор реплик в MongoDB. Вы можете определить его с помощью следующей команды:
Добавьте следующие строки:
replication: replSetName: "myreplica01"
Сохраните и закройте файл, затем перезапустите службу MongoDB:
sudo systemctl restart mongod
Затем войдите в оболочку MongoDB и запустите набор реплик с помощью следующей команды:
mongo > rs.initiate()
Вы должны получить следующие результаты:
Gatsby.js
Gatsby – это современный генератор статических сайтов на основе React и GraphQl. В отличие от Next.js он не выполняет рендеринг на стороне сервера. Вместо этого Gatsby генерирует HTML-контент на стороне клиента во время сборки. Поэтому он обеспечивает высокую производительность и безопасность.
Еще одним важным преимуществом Gatsby.js являются плагины, которые расширяют возможности фреймворка. Gatsby.js используется такими крупными копаниями, как Airbnb, Nike, Flamingo, Freecodecamp и Paypal.
Ключевые особенности Gatsby.js:
- Может использоваться для создания статических сайтов и PWA, которые соответствуют актуальным веб-стандартам.
- Gatsby,js использует новейшие технологии, включая ReactJS, Webpack, GraphQL, современные ES6 + JavaScriptи CSS.
- Возможность использовать любой из пакетов, которые уже использовали с NPM, и большое количество плагинов.
Преимущества Gatsby.js
- Сайты на Gatsby.js в 2–3 раза быстрее, чем созданные на других платформах.
- Статический контент, сгенерированный Gatsby.js, легко читается поисковыми системами.
- Богатая и обширная коллекция плагинов.
Недостатки Gatsby.js
- js не является идеальным решением для создания крупных сайтов корпоративного масштаба.
- Необходимость знания React и GraphQl.
Надеюсь, что эта статья поможет вам выбрать лучший JavaScript-фреймворк для освоения.
Пожалуйста, опубликуйте свои мнения по текущей теме материала. Мы очень благодарим вас за ваши комментарии, дизлайки, подписки, лайки, отклики!
Вадим Дворниковавтор-переводчик статьи «Choose the Best JavaScript Framework for Your Server-Side Development»
Загрузочная флешка для CentOS 8
Лично я давно не пользовался загрузочными флешками для чего-то кроме установки гипервизора. Стараюсь все сервера держать в виртуальных машинах для удобного бэкапа и миграции. Тем не менее, если вам понадобится загрузочная флешка с CentOS 8, вы без проблем ее сделаете. Думаю, это актуально для тех, кто ставит систему на рабочие компьютеры или ноутбуки. Правда в таком случае вам моя статья не подходит, так как она описывает в первую очередь нюансы установки и подготовки системы для работы на сервере. На рабочем ноутбуке я предпочитаю использовать не linux.
Сделать загрузочную флешку с CentOS 8 можно разными способами. Если у вас операционная система Windows, то рекомендую воспользоваться бесплатной программой Win32DiskImager. В случае с linux можно использовать Etcher. Хотя он и для windows есть, но мне показался тяжеловат. disk imager в этом плане удобнее, что не удивительно. Ведь Etcher написан на мерзком Electron, поэтому он тормозит и весит 80 Мб.
Тру админы для создания загрузочных флешек могут использовать DD примерно так:
# dd if=CentOS-8-x86_64-1905-dvd1.iso of=/dev/sdz
Предложенный способ лично не проверял, но не вижу причин, почему это может не работать.
Node.js как конструктор приложений
Платформа Node.js содержит огромное количество полезных модулей, помогающих при работе с файлами и каталогами, взаимодействии по Сети и обработке событий. По текущей статистике, для Node.js выпущено более650 000 пакетов свободного программного обеспечения. То есть создание многих приложений похоже на сборку из кубиков конструктора.
Кроме node и npm, нужно еще установить редактор кода, если его у вас до сих пор нет. Есть несколько удобных редакторов, в том числе Visual Studio Code от Microsoft, Brackets от Adobe и популярный свободный редактор Atom. Все они бесплатные.
В дальнейших статьях мы изучим, как работать с Node.js, как настроить Node.js и какие еще инструменты понадобятся в процессе разработки клиентских приложений. Лучше всего начать обучение с вводного курса «JavaScript с нуля».
«JavaScript с нуля» — практический четырехмесячный курс для тех, кто хочет научиться основам языка сценариев с индивидуальным наставником, разработать фронтенд для интерактивного веб-проекта и положить кейс к себе в портфолио. Курс идеально подойдет дизайнерам-разработчикам и начинающим программистам, кто уже знаком и умеет разрабатывать страницу на HTML и CSS, но не намерен останавливаться в изучении программирования.
Выводы
Мы показали вам три разных способа установки Node.js и npm на ваш сервер Ubuntu 18.04. Выбор метода зависит от ваших требований и предпочтений. Несмотря на то, что установить упакованную версию из репозитория Ubuntu или NodeSource проще, метод nvm дает вам больше гибкости для добавления и удаления различных версий Node.js для каждого пользователя.
Если вы хотите управлять своими пакетами npm с помощью yarn, вы можете проверить это руководство о том, как установить и использовать yarn в Ubuntu 18.04 .
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии ниже.