One place for hosting & domains

      Добавление

      Добавление области подкачки на Ubuntu 20.04


      Введение

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

      ​​[warning]
      Предупреждение. Хотя подкачка в целом рекомендуется для систем с использованием традиционных жестких дисков, ее использование с SSD-накопителями может со временем вызывать ухудшение работоспособности аппаратного обеспечения. В связи с этим мы не рекомендуем активировать подкачку при использовании услуг DigitalOcean или любого другого провайдера, применяющего SSD-накопители.

      Что такое подкачка?

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

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

      Шаг 1 — Проверка информации о подкачке в системе

      Сначала мы можем посмотреть, есть ли уже в системе область подкачки. Можно иметь несколько файлов или разделов подкачки, но обычно одного достаточно.

      Можно узнать, сконфигурирована ли в системе подкачка, введя:

      Если после этой команды ничего не появляется, в системе сейчас нет области подкачки.

      Можно убедиться в отсутствии активной подкачки при помощи утилиты free:

      Output

      total used free shared buff/cache available Mem: 981Mi 122Mi 647Mi 0.0Ki 211Mi 714Mi Swap: 0B 0B 0B

      В строке ​​​Swap видно​​​, что в системе отсутствует активная подкачка.

      Шаг 2 — Проверка свободного пространства в разделе жесткого диска

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

      Output

      Filesystem Size Used Avail Use% Mounted on udev 474M 0 474M 0% /dev tmpfs 99M 932K 98M 1% /run /dev/vda1 25G 1.4G 23G 7% / tmpfs 491M 0 491M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 491M 0 491M 0% /sys/fs/cgroup /dev/vda15 105M 3.9M 101M 4% /boot/efi /dev/loop0 55M 55M 0 100% /snap/core18/1705 /dev/loop1 69M 69M 0 100% /snap/lxd/14804 /dev/loop2 28M 28M 0 100% /snap/snapd/7264 tmpfs 99M 0 99M 0% /run/user/1000

      В данном случае устройство с / в столбце ​​​​​​Mounted on​​​ — наш диск. В данном примере у нас достаточно места (использовано только 1,4 Гбайт). Ваше использование, вероятно, будет другим.

      Хотя существует много мнений относительно правильного размера области подкачки, на самом деле он зависит от ваших личных предпочтений и требований приложений. Обычно можно начать с объема, равного объему оперативной памяти в системе, или в два раза большего. Еще одно полезное общее правило — любое превышение 4 Гбайт для области подкачки, скорее всего, не нужно, если вы используете ее только для резервирования оперативной памяти.

      Шаг 3 — Создание файла подкачки

      Теперь, когда известно свободное место на жестком диске, можно создать файл подкачки в нашей файловой системе. Мы добавим файл необходимого размера под названием swapfile в корневую (/) директорию.

      Лучше всего создавать файл подкачки при помощи программы fallocate. Эта команда мгновенно создает файл указанного размера.

      Поскольку на сервере в нашем случае 1 Гбайт оперативной памяти, в этом руководстве создадим файл размером 1 Гбайт. Скорректируйте с учетом необходимости на вашем сервере:

      • sudo fallocate -l 1G /swapfile

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

      • -rw-r--r-- 1 root root 1.0G Apr 25 11:14 /swapfile

      Файл создан с правильным выделенным объемом памяти.

      Шаг 4 — Активация файла подкачки

      Теперь, когда у нас есть файл правильного размера, нам нужно превратить его в пространство подкачки.

      Сначала нужно изменить права доступа к файлу, чтобы только пользователи с правами root могли читать его содержимое. Это предотвращает доступ обычных пользователей к файлу — такой доступ может существенно влиять на безопасность.

      Чтобы передать все права доступа пользователям root, введите:

      Проверьте изменение прав доступа, введя следующее:

      Output

      -rw------- 1 root root 1.0G Apr 25 11:14 /swapfile

      Теперь только у пользователя с правами root отмечены флажки чтения и записи.

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

      Output

      Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes) no label, UUID=6e965805-2ab9-450f-aed6-577e74089dbf

      После этого мы можем активировать файл подкачки, чтобы система могла его использовать:

      Убедитесь, что пространство подкачки активировано, введя следующее:

      Output

      NAME TYPE SIZE USED PRIO /swapfile file 1024M 0B -2

      Чтобы подтвердить наши выводы, можем снова проверить ответ утилиты free:

      Output

      total used free shared buff/cache available Mem: 981Mi 123Mi 644Mi 0.0Ki 213Mi 714Mi Swap: 1.0Gi 0B 1.0Gi

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

      Шаг 5 — Сделать файл подкачки постоянным

      В результате внесенных нами изменений файл подкачки активирован для текущей сессии. После перезагрузки сервер не сохранит настройки подкачки автоматически. Мы можем изменить это, добавив файл подкачки к файлу /etc/fstab.

      Сделайте резервную копию файла /etc/fstab на случай если что-то пойдет не так:

      • sudo cp /etc/fstab /etc/fstab.bak

      Добавьте информацию о файле подкачки в конец файла /etc/fstab, введя следующее:

      • echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

      Далее рассмотрим некоторые настройки, которые мы сможем обновить, чтобы настроить пространство подкачки.

      Шаг 6 — Изменение настроек подкачки

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

      Настройка параметра Swappiness

      Параметр swappiness определяет, как часто система выгружает данные из оперативной памяти в пространство подкачки. Его значение выражается числом от 0 до 100 процентов.

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

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

      Можем увидеть текущее значение фактора swappiness, введя следующее:

      • cat /proc/sys/vm/swappiness

      Output

      60

      Для настольного компьютера неплохое значение swappiness — 60. Для сервера, возможно, вы захотите приблизить его к 0.

      Можно задать другое значение swappiness при помощи команды sysctl.

      Например, чтобы установить значение swappiness 10, можно ввести следующее:

      • sudo sysctl vm.swappiness=10

      Output

      vm.swappiness = 10

      Эта настройка будет сохраняться до следующей перезагрузки. Можно автоматически задать это значение при перезагрузке, добавив строку в файл /etc/sysctl.conf:

      • sudo nano /etc/sysctl.conf

      Внизу можно ввести следующее:

      /etc/sysctl.conf

      vm.swappiness=10
      

      Сохраните файл и закройте его после завершения.

      Изменение настроек нагрузки кэш-памяти

      Еще одно связанное значение, которое вы, возможно, захотите изменить — vfs_cache_pressure. Эта настройка определяет, насколько система будет кэшировать данные inode и dentry по сравнению с другими данными.

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

      • cat /proc/sys/vm/vfs_cache_pressure

      Output

      100

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

      • sudo sysctl vm.vfs_cache_pressure=50

      Output

      vm.vfs_cache_pressure = 50

      Опять-таки, это значение действительно только для текущей сессии. Чтобы сделать его постоянным, нужно (как и в случае со swappiness) изменить файл конфигурации:

      • sudo nano /etc/sysctl.conf

      Внизу добавьте строку с новым значением:

      /etc/sysctl.conf

      vm.vfs_cache_pressure=50
      

      Сохраните и закройте файл после завершения.

      Заключение

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

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



      Source link

      Добавление юнит-тестирования в проект Django


      Автор выбрал фонд Open Internet/Free Speech для получения пожертвования в рамках программы Write for DOnations.

      Введение

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

      Тестирование веб-сайта может стать сложной задачей, поскольку он включает несколько слоев логики, например обработку HTTP-запросов, валидацию форм и отрисовку шаблонов. Однако Django предоставляет набор инструментов, которые избавляют от множества проблем при тестировании веб-приложений. В Django предпочтительным способом написания тестов является использование модуля unittest Python, хотя вы можете использовать другие фреймворки для тестирования.

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

      Предварительные требования

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

      Шаг 1 — Добавление набора тестов для вашего приложения Django

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

      Если вы ознакомились с серией обучающих материалов по разработке Django, у вас в распоряжении должно быть приложение Django с именем blogsite​​​.

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

      • cd ~/my_blog_app
      • . env/bin/activate

      Затем перейдите в каталог приложения blogsite, в папку, которая содержит файлы models.py и views.py​​​, а затем создайте новую папку с именем tests:

      • cd ~/my_blog_app/blog/blogsite
      • mkdir tests

      Далее необходимо превратить эту папку в пакет Python, добавив файл __init__.py:

      • cd ~/my_blog_app/blog/blogsite/tests
      • touch __init__.py

      Теперь вы должны добавить файл для тестирования ваших моделей и другой файл для тестирования представлений:

      • touch test_models.py
      • touch test_views.py

      В заключение вы создадите пустой тест-кейс в файле test_models.py: Вам нужно будет импортировать класс TestCase Django и сделать его родительским классом для вашего класса тест-кейса. В дальнейшем вы сможете добавить в этот тест-кейс методы для тестирования логики в ваших моделях. Откройте файл test_models.py:

      Теперь добавьте в файл следующий код:

      ~/my_blog_app/blog/blogsite/tests/test_models.py

      from django.test import TestCase
      
      class ModelsTestCase(TestCase):
          pass
      

      Вы успешно добавили набор тестов в приложение blogsite. Далее вам необходимо заполнить данные для пустого тест-кейса модели, которую вы создали.

      Шаг 2 — Тестирование кода Python

      На этом шаге вы протестируете логику кода в файле models.py. В частности, вы должны будете протестировать метод save модели Post, чтобы убедиться, что при вызове он создает корректный слаг для тайтла поста.

      Давайте начнем с изучения кода, который уже находится в файле models.py для метода save модели Post:

      • cd ~/my_blog_app/blog/blogsite
      • nano models.py

      Вы увидите следующее:

      ~/my_blog_app/blog/blogsite/models.py

      class Post(models.Model):
          ...
          def save(self, *args, **kwargs):
              if not self.slug:
                  self.slug = slugify(self.title)
              super(Post, self).save(*args, **kwargs)
          ...
      

      Мы можем убедиться, что он проверяет, есть ли у поста, который будет сохранен, значение слага, и если нет, вызывает slugify для создания слага. Это тип логики, который вы можете захотеть протестировать, чтобы убедиться, что слаги действительно были созданы при сохранении поста.

      Закройте файл.

      Чтобы протестировать это, вернитесь к файлу test_models.py:

      Затем обновите его содержимое, добавив код в выделенные части:

      ~/my_blog_app/blog/blogsite/tests/test_models.py

      from django.test import TestCase
      from django.template.defaultfilters import slugify
      from blogsite.models import Post
      
      
      class ModelsTestCase(TestCase):
          def test_post_has_slug(self):
              """Posts are given slugs correctly when saving"""
              post = Post.objects.create(title="My first post")
      
              post.author = "John Doe"
              post.save()
              self.assertEqual(post.slug, slugify(post.title))
      

      Этот новый метод test_post_has_slug создает новый пост с именем "My first post", а затем указывает для поста автора и сохраняет пост. После этого, используя метод assertEqual из модуля unittest Python, он проверяет корректность слага для поста. Метод assertEqual проверяет, равны ли два переданных ему аргумента, что определяется оператором "==", и генерирует ошибку в противном случае.

      Сохраните и закройте test_models.py.

      Это пример того, что можно протестировать. Чем больше логики вы будете добавлять в ваш проект, тем больше тестов вам потребуется. Если вы добавите в метод save дополнительную логику или создадите новые методы для модели Post, вам нужно будет добавить сюда дополнительные тесты. Вы можете добавить их в метод test_post_has_slug или создать новые методы тестирования, но их имена должны начинаться с test.

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

      Шаг 3 — Использование тестового клиента Django

      На этом шаге вы напишете тест-кейс, который тестирует представление с помощью тестового клиента Django. Тестовый клиент — это класс Python, который действует как шаблонный браузер, позволяя вам тестировать ваши представления и взаимодействовать с приложением Django таким же образом, как это делал бы пользователь. Вы можете получить доступ к тестовому клиенту, сославшись на self.client в ваших тестовых методах. Давайте, например, создадим тест-кейс в test_views.py. Откройте файл test_views.py​​​:

      Затем добавьте следующее:

      ~/my_blog_app/blog/blogsite/tests/test_views.py

      from django.test import TestCase
      
      
      class ViewsTestCase(TestCase):
          def test_index_loads_properly(self):
              """The index page loads properly"""
              response = self.client.get('your_server_ip:8000')
              self.assertEqual(response.status_code, 200)
      

      ViewsTestCase содержит метод test_index_loads_properly, который использует тестовый клиент Django для посещения стартовой страницы веб-сайта (http://your_server_ip:8000, где your_server_ip — это IP-адрес сервера, который вы используете). Затем тестовый метод проверяет, содержит ли ответ код состояния 200, который означает, что страница отправляет ответ без ошибок. В результате вы можете быть уверены, что при посещении страницы пользователем она также не будет генерировать ошибки.

      Помимо кода состояния вы можете узнать о других свойствах ответа тестового клиента, которые вы можете протестировать, на странице тестирования ответов документации Django.

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

      Шаг 4 — Запуск тестов

      Теперь, когда вы завершили сборку набора тестов для проекта, пришло время запустить эти тесты и посмотреть их результаты. Чтобы запустить тесты, перейдите в папку blog (содержащую файл manage.py приложения):

      Запустите их с помощью следующей команды:

      Вы увидите примерно следующий вывод в вашем терминале:

      Output

      Creating test database for alias 'default'... System check identified no issues (0 silenced). .. ---------------------------------------------------------------------- Ran 2 tests in 0.007s OK Destroying test database for alias 'default'...

      Этот вывод содержит две точки .., каждая из которых отображает выполненный тест-кейс. Теперь вы можете изменить test_views.py, чтобы вызвать падение теста. Сначала откройте файл с помощью следующей команды:

      Затем измените выделенный код на следующий:

      ~/my_blog_app/blog/blogsite/tests/test_views.py

      from django.test import TestCase
      
      
      class ViewsTestCase(TestCase):
          def test_index_loads_properly(self):
              """The index page loads properly"""
              response = self.client.get('your_server_ip:8000')
              self.assertEqual(response.status_code, 404)
      

      Здесь вы изменили код состояния с 200 на 404. Теперь снова запустите тест из каталога с файлом manage.py:

      Вывод должен выглядеть так:

      Output

      Creating test database for alias 'default'... System check identified no issues (0 silenced). .F ====================================================================== FAIL: test_index_loads_properly (blogsite.tests.test_views.ViewsTestCase) The index page loads properly ---------------------------------------------------------------------- Traceback (most recent call last): File "~/my_blog_app/blog/blogsite/tests/test_views.py", line 8, in test_index_loads_properly self.assertEqual(response.status_code, 404) AssertionError: 200 != 404 ---------------------------------------------------------------------- Ran 2 tests in 0.007s FAILED (failures=1) Destroying test database for alias 'default'...

      Вы увидите сообщение, содержащее описание ошибки, указывающее скрипт, тест-кейс и метод, который не был выполнен. Также оно сообщает причину ошибки, в данном случае код состояния не равен 404, в форме сообщения AssertionError: 200 ! = 404. AssertionError здесь возникает в выделенной строке кода в файле test_views.py:

      ~/my_blog_app/blog/blogsite/tests/test_views.py

      from django.test import TestCase
      
      
      class ViewsTestCase(TestCase):
          def test_index_loads_properly(self):
              """The index page loads properly"""
              response = self.client.get('your_server_ip:8000')
              self.assertEqual(response.status_code, 404)
      

      Она указывает, что утверждение является ложным, т. е. код состояния ответа (200) не соответсвует ожидаемому результату (404). Теперь вы можете видеть, что две точки .., идущие перед сообщением об ошибке, теперь превратились в . F, что говорит о том, что первый тест-кейс был пройден успешно, а второй — нет.

      Заключение

      В этом руководстве вы создали набор тестов в вашем проекте Django, добавили тест-кейсы для тестирования логики модели и представления,узнали, как запускать тесты, и проанализировали вывод теста. В качестве следующего шага вы можете создать новые тестовые скрипты для кода Python в других файлах помимо models.py и views.py.

      Ниже представлено несколько статей, которые могут оказаться полезными при создании и тестировании сайтов с помощью Django:

      Также вы можете найти на нашей странице материалов по теме Django другие руководства и проекты.



      Source link

      Добавление и удаление пользователей в CentOS 8


      Введение

      Для добавления или удаления пользователей на сервере с ОС Linux необходимо выполнить следующее. В этом руководстве мы расскажем, как создавать учетные записи пользователя, назначать права sudo и удалять пользователей на сервере CentOS 8.

      Предварительные требования

      В этом обучающем руководстве вы вошли на сервер CentOS 8 как пользователь non-root user, но с привилегиями sudo. Если вы вошли в систему как пользователь root user, то сможете удалить часть sudo всех следующих команд, но они будут работать в любом случае.

      Добавление пользователей

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

      Для добавления нового пользователя нажмите:

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

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

      Примечание. Если ваш сервер SSH не позволяет аутентификацию по паролю, вы не сможете войти в систему,используя новое имя пользователя. Подробную информацию о настройке аутентификации SSH по ключу для нового пользователя можно найти на шаге 5 Первоначальная настройка сервера с CentOS 8.

      Предоставление привилегий sudo пользователю

      Если ваш новый пользователь будет выполнять команды с привилегиями root (административные), вам нужно предоставить ему доступ к привилегиям sudo.

      Для этого добавьте пользователя в группу wheel (предоставляет доступ sudo всем участникам по умолчанию).

      Воспользуйтесь командой usermod для добавления пользователя в группу wheel:

      • sudo usermod -aG wheel sammy wheel

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

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

      Управление пользователями с привилегиями sudo

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

      Чтобы увидеть, какие пользователи входят в группу wheel (и обладают привилегиями sudo), используйте команду lid. lid обычно используется для отображения того, в какие группы входит пользователь, но, если к команде добавить флаг -g, то можно увидеть, какие пользователи входят в группу:

      Output

      centos(uid=1000) sammy(uid=1001)

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

      Удаление пользователей

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

      Чтобы удалить пользователя с сохранением его файлов, используйте команду userdel​​​​​​:

      Если вы хотите удалить домашнюю директорию пользователя вместе с учетной записью, добавьте флаг -r в userdel:

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

      Заключение

      Вы получили знания о том, как добавлять или удалять пользователей с сервера CentOS 8. Эффективное управление позволит вам разделять пользователей на группы и наделять их правами доступа, необходимыми для решения поставленных задач.

      Вы можете настроить конфигурацию вашего сервера CentOS 8 для использования с любым, необходимым вам, программным обеспечением, например, с веб-стеками LAMP или LEMP.



      Source link