Все о Linux. LinuxRSP.Ru


Cвежие новости Linux и BSD, анонсы статей и книг прямо в почтовый ящик!
Подписаться письмом


 Сегодняшние новости:

25 лет исполнилось ядру Linux

Релиз KDevelop 5.0

Oracle открывает код JDK9 для ARM

Выпущен Timewarrior 1.0.0

Релиз Android 7.0

Percona Memory Engine для MongoDB на базе WiredTiger

PowerShell открыт и доступен для Linux

Форк TrueCrypt: VeraCrypt 1.18

Релиз Snapcraft 2.14

Релиз Go 1.7

Стабильный выпуск рабочего стола Lumina

Вышла первая версия аналога OpenCV - DCV 0.1

Выпуск минималистичной программы для мониторинга jsonmon 3

В MIT разработали новый язык программирования

Первый релиз Qt5Gtk2

Godot 2.1 - новая версия открытого игрового движка

Свободная цифровая станция звукозаписи: Ardour 5.0

Обновление SkypeWeb Plugin for Pidgin

Вышла версия 3.0 Android File Transfer для Linux (и для OS X)

Программный аналог MIDI-контроллера для создания музыки: Launchpadd v1.3

Mozilla спонсирует поддержку Python 3.5 в PyPy

Ef 0.08 - программа для моделирования динамики заряженных частиц

Обновление текстового редактора TEA до версии 42.0.0

Релиз OpenOrienteering Mapper 0.6.4

Вышли Guix и GuixSD 0.11

Релиз Opera 39

Выпуск LibreOffice 5.2

В OpenSSH обнаружены и устранены некоторые уязвимости

Эмулятор FCEUX 2.2.3

Компания Билайн переходит на российскую СУБД с открытым исходным кодом Tarantool

Google

 Новые статьи :

Утилиты для восстановления потерянных данных в Linux

Лучшие файловые менеджеры для Android

20 лучших бесплатных книг о Linux

Как сгенерировать открытый/закрытый SSH-ключ в Linux

Grive - клиент Google Drive для Linux с открытым исходным кодом

Протокол IPv6: варианты подключения

Сервер из образа: DHCP + TFTP + Initrd + OpenVZ

Обзор веб-панелей управления хостингом

Приёмы работы с Vim

Nginx как Reverse Proxy для сайта, использующего SSL

Разработка модулей ядра Linux

Мониторинг нагрузки http-сервера Apache 2

Перевод комментариев к файлу конфигурации Squid

Решение проблем при использовании "1c предприятие" 8.2 в Linux

Advanced Bash-Scripting Guide Искусство программирования на языке сценариев командной оболочки







Rambler's Top100





 
 

Linux-vserver или каждому сервису по песочнице


Для целей размещения проектов я применяю такую схему: каждый сервис запускается в изолированной среде: боевой - отдельно, тестовый - отдельно, телефония - отдельно, веб - отдельно. Это снижает риски взлома систем, позволяет бакапить всё и вся одним rsync'ом на соседний сервер по крону, а в случае слёта железа просто поднять на соседнем железе. (А использование drbd + corosync позволяет это делаеть еще и автоматически)

Для создания изолированной среды есть два подхода, именуемые VDS (виртуализация аппаратуры) и VPS/jail (виртуализация процессного пространства).

Для создания VDS изоляций применяют XEN, VirtualBox, VMWare и прочие виртуальные машины.
Для создания VPS на linux используется либо linux-vserver, либо openvz, либо lxc.

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

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

Так как мне не нужны разные ОС, то всюду применяю linux-vserver (так уж сложилось исторически, применяю с 2004го года, а openvz вышел в открытый доступ в 2005м), а lxc в моём понимании еще не дорос до продакшена (хотя и очень близок уже).

Ниже я опишу базовые операции по запуску LAMP сервера в изолированном окружении.

ОС: debian-stable, 64bit
Начиная с Wheezy поддержка vserver командой debian убрана, поэтому использую ядра с repo.psand.net/info/

Настройка корневой системы для запуска linux-vserver


  echo "deb http://repo.psand.net/ wheezy main" > /etc/apt/sources.list.d/psand.list
  wget -O - http://repo.psand.net/pubkey.txt | sudo apt-key add -
  aptitude update
  aptitude search linux-image-vserver # Ищем тут последнюю версию ядра
  aptitude install linux-image-vserver-3.13-beng util-vserver curl bzip2 # заменить 3.13 на актуальную для вас версию
  curl http://dev.call2ru.com/vs/nss_vserver_64.tar.bz2 | tar xfj -
  cd nss_vserver_64
  make
  make install
  ln -s var/lib/vservers /
  curl curl http://dev.call2ru.com/vs/vserverauth.tar.gz | tar xfz -
  cd vserverauth/vslogin/
  make
  cp vslogin /sbin/
  chmod u+s /sbin/vslogin
  echo /sbin/vslogin >> /etc/shells
  echo -e "auto dummy0\niface dummy0 inet static\n\taddress 192.168.1.250\n\tnetmask 255.255.255.0\n" >> /etc/network/interfaces
  echo -e "\tpre-up /sbin/iptables -t nat -A POSTROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -j MASQUERADE\n"  >> /etc/network/interfaces
  echo -e "\tpost-down /sbin/iptables -t nat -D POSTROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -j MASQUERADE\n"  >> /etc/network/interfaces

После установки - ребут в новое ядро.

Что мы сделали:
  • Установили ядро с поддержкой linux-vserver, установили утилиты для создания/управления vserver'ами.
  • Установили мой модуль nss_vserver[1] и vslogin, который позволяет логиниться по ssh напрямую внутрь vserver'а
  • Настроили интерфейс dummy0, чтобы создать "приватную" сеть для виртуальных машин.


Это позволяет использовать один IP сервера для запуска различных сервисов, разделяя их по логину (например, чтобы войти рутом в вирутальную машину web надо просто логиниться как web-root либо как root@web).

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

Для решения этого, на руте нам понадобится еще nginx:
  aptitude install ngin
  cat > /etc/nginx/sites-available/proxy <<END
server {
        listen 80; # Либо IP:PORT
        proxy_set_header Host  $host; 
        proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header X-SSL  no;

        if ($http_host ~ "(?i)(somesite\.ru)$") {
                rewrite ^(.*)   /web/$1 last;
        }
        # Тут добавить дополнительные if'ы для раскидывания по другим виртуалкам

        # Тут catch-all для всех прочих
        rewrite ^(.*)     /web/$1    last;

        # Определяем форварды внутрь виртуалок
        location /web// {
                proxy_pass http://192.168.1.57/;
                proxy_read_timeout 500;
        }
}
END
  ln -s ../sites-available/proxy /etc/nginx/sites-enabled/
  /etc/init.d/nginx reload


Это позволяет все приходящие запросы на 80й порт раскидывать по разным виртуальным машинам в зависимости от имени.
При необходимости, можно использовать proxy_pass на другой внешний IP, что позволяет перемещать виртуальные сервера по разным машинам без необходимости ожидать полного обновления DNS записей, но это тема для отдельного разговора.

Теперь нам надо создать новую виртуальную машину (номер 57, имя web) в которой установим LAMP.

Создание нового vserver'а


  MIRROR=http://ftp.de.debian.org/debian
  NAME=web
  DOMAIN=mydom.ru
  CONTEXT=57
  vserver $NAME build -m debootstrap --context $CONTEXT --hostname $NAME.$DOMAIN --interface dummy0:192.168.1.$CONTEXT/24 -- -d squeeze -m $MIRROR
  echo default > /etc/vservers/$NAME/app/init/mark
  vserver $NAME start
  vserver $NAME enter
  aptitude update
  aptitude install locales
  echo -e "en_US.UTF-8 UTF-8\nru_RU.UTF-8 UTF-8\n" >> /etc/locale.gen
  locale-gen
  echo -e "127.0.0.1 localhost.localdomain localhost vhost\n192.168.1.250 vroot\n" > /etc/hosts

Это устанавливает базовую систему, делает её автозапускаемой при ребуте корневой системы.

Теперь виртуалка готова к установке в неё необходимого софта. Например, обычный LAMP:
   aptitude install apache2 libapache2-mod-php5 mysql-server php5-mysql php5-mysqli libapache2-mod-rpaf
   editor /etc/apache2/mods-available/rpaf.conf
   #  (в строке "RPAFproxy_ips 127.0.0.1" дописать еще через пробел в конце 192.168.1.57 (IP виртуалки))
  a2enmod rpaf
  /etc/init.d/apache2 restart
  exit


Всё! Теперь у вас на сервере работает апач в совершенно изолированной среде.

К проблемам этого подхода относятся:

1. Прямой вход внутрь виртуальных серверов возможен только по паролю.
2. На корневой системе никому нельзя давать доступа, поэтому на корневой системе должен стоять только проверенный минимум софта (ssh, nginx, iptables и больше ничего).
3. При необходимости прямого доступа до каких-либо портов внутри виртуальных машин, проброс нужно делать с помощью iptables.

Моменты, оставленные за кадром для простоты статьи

1. /var/lib/vservers/* желательно размещать на lvm, чтобы иметь возможность управлять выделением места для виртуальных машин независимо.
2. Управление ресурсами: просто созданная виртуальная машина может съесть все ресурсы машины. Подробнее о настройке лимитов linux-vserver.org/Resource_Limits
3. /tmp/. Внутри виртуалок по умолчанию /tmp/ создаётся как ramdisk в 16m размером. Либо сразу перед "vserver $NAME start" исправить /etc/vservers/$NAME/fstab
4. Полезные сведения, информацию и прочее про linux-vserver можно найти на linux-vserver.org/
Иcтoчник
      

Связь | О проекте LinuxRSP | Реклама | О Linux
© 1999-2017 LinuxRSP