Настраиваем сервер для LiveStreet. Часть II. Vim, файловая система, hostname.

Предыдущие части:

Итак, мы успешно зашли в консоль сервера. Первое что нужно сделать — перезагрузить его командой:
reboot

Замечание: Я буду стараться каждую отдельную команду оборачивать с блок как вот тут. Т.е. в этих инструкция — одна команад = один блок. Любая команда запускается на выполнение, набиранием оной в консоли и нажимаем клавиши ENTER после этого. Можно скопировать в буфер, сбросить в консоль правой кнопкой мыши и, опять же, ENTER.

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

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


Устанавливаем текстовый редактор vim (если он уже был установлен, а многие хостеры включают его в минимальную конфигурацию, то ничего страшного не произойдет):
apt-get -y install vim

Замечание: Я знаю что матёрые администраторы обольют меня презрением, но всю первичную установку я буду описывать так, как будто она происходит от имени root. По моему мнению, во время первичной установки sudo это некому не нужные дополнительные препоны. Но в какой-то из последующих частей, ближе к концу, коснемся и этого.

vim штука очень мощная, и для замшелого пользователя Windows, весьма не привычная. С его помощью мы будем редактировать файлы в консоли. К счастью, из всей его необъятной мощи нам хватит трёх команд:
  • выйти из редактора не сохраняя изменения: ESC :q! ENTER
  • выйти из редактора сохранив все изменения: ESC :qw ENTER
  • находясь в редакторе включить режим редактирования: i (при этом в нижнем левом углу консоли появится надпись "-- INSERT --" )
В режиме редактирования, текст редактируется там, где мигает большой зелёный курсор. Гонять курсор по экрану — просто стрелками. В место где мигает курсор, сбрасывается содержимое буфера обмена по правой кнопке мыши.

OК. Редактор у нас есть, теперь настраиваем файловую систему.

Сначала смотрим что у нас есть командой:
mount

Выдаст что-то в таком духе:
/dev/sda1 on / type ext4 (rw)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)

Нас интересует первая строка «on /» которая олицетворяет собой корневую файловую систему. Если там ext3, а не ext4 — не повезло. Рекомендовать менять это самостоятельно, и описывать процесс, не стану. Это не очень сложно, но всё же я не могу отнести эту тему к доступной для новичка. Однако, это стоит того и для уверенных в себе несколько советов:

Чем ext4 лучше ext3? — много чем, но для нас главным образом интересно то, что она быстрее.

Итак, вносим некоторые изменения.

Для начала создадим раздел для временных файлов nginx:
mkdir /var/spool/nginx

Открываем vim-ом конфигурацию файловой системы:
vim /etc/fstab

В конце файла добавляем три следующих строки (за эти три строки огромная благодарность уходит господину Orhideous ):
tmpfs /dev/shm tmpfs size=32M,rw,nosuid,nodev,noatime 0 0
tmpfs /lib/init/rw tmpfs size=32M,rw,nosuid,nodev,noatime 0 0
tmpfs /var/spool/nginx tmpfs size=128M,mode=01777,uid=33,gid=33,noatime 0 0
tmpfs — это выделение оперативной памяти под файловую систему. RAM-disk, по-простому. Первые две строки это просто ограничение доступного места в паре не нужным нам системных разделов, которые присутствуют в Debian. tmpfs — умная штука, оно захватывает память по необходимости. То, что мы тут указали это верхняя граница просто. Так что не думайте, что этими тремя строками мы сразу отъели у системы 192Mb.

Последняя — это мы монтируем тот самый раздел который мы позже будем использовать для временных файлов nginx. Потому что память работает очень быстро :). В примере выше, я выделил под это дело 128Mb. Сколько выделять… В принципе, больше 128M не надо даже для весьма загруженных сайтов ( даже если у вас черте знает сколько доступных Gb, много выделять под это большого смысла не имеет). Для не больших сайтов на VPS, полагаю, хватит и 32-64M.

Обращаю внимание на uid=33,gid=33 в последней строке. Это id юзера www-data и группы www-data. Под управлением этого юзера будут работать все наши сервисы связанные в сайтом, и nginx в том числе. Этот юзер и эта группа, присутствуют в OS изначально, и по идее всегда имеют такие id. Но, не лишне, убедится в этом командами:
id -u www-data

id -g www-data

Последние что нам нужно сделать в /etc/fstab — это выставить опцию noatime нашей корневой файловой системе. Для этого ищем строку её описывающую. Она не обязательно будет первой. Это что-то что в качестве «mount point» имеет просто символ /. Cписок изначальных опций в ней может выглядеть по разному. Что-то такое:
defaults
или такое:
rw
Или, даже, список чего-нибудь. Просто в конце списка опций ставим запятую и пишем noatime, больше там ничего не меняя. У нас на сервере, например, в итоге корневая строка выглядит так:
/dev/md/2 / ext4 defaults,noatime 0 0
Для чего? — Linux, по умолчанию, пишет в файловую систему дату последнего обращения к файлу. Т.е. каждый раз, когда вы читаете файл, что-то дополнительно пишется. Учитывая объемы операций чтения файлов, которые демонстрирует любой сайт — это не малая работа. Для нас эта особенность — просто напрасная трата ресурсов, и опция её выключает.

Замечание: конечно это надо не столько с корневым разделом, сколько с разделом где будут лежать файлы нашего сайта и базы данных. Но, как правило, это корень. Если у вас это не так, или допустим, у вас несколько разделов из-за больших жестких дисков — проставить noatime на все из них, тоже не грех.

Замечание для VPS: существует рекомендация о том, что при использовании ext4 c VPS стоит увеличить timeout. Хотя я лично не могу ни подтвердить ни опровергнуть нужность этого, совет кажется мне разумным. Делается просто — меняется значение по умолчанию (которое 30) в файле /sys/block/sda/device/timeout на 120.

Замечание для храбрых: в случае использования ext4, есть еще одна хорошая опция, помимо noatime, положительно влияющая на производительность: data=writeback. Однако, во-первых с ней связаны, некие теоретические риски. Во-вторых просто прикрутить это в /etc/fstab может привести к печальным последствиям (система после перезагрузки свалится в readonly mode), нужно делать командой tune2fs. В общем, информацию я дал, дальше google и на свой страх и риск.

И ещё полезная заметка по теме от господина ewden : livestreet.ru/blog/14223.html

Внеся все изменения, убеждаемся что нигде ничего плечом не задели, и выходим с сохранением оных.

Теперь настраиваем hostname. По умолчанию хостер может дать серверу оригинальное имя. Наш, например, назывался мило: Debian-60-squeeze-64-minimal. Нам это не очень безразлично, потому что имя хоста используется кое-какими сервисами, например почтой. Лучше чтоб он назывался так же как наш домен без www.

Поправить это крайне просто, идём в файл /etc/hostname:
vim /etc/hostname
и правим имя на нужное нам. Потом, аналогично, идём в файл /etc/hosts
vim /etc/hosts
и там везде где есть старое имя — меняем на новое.

После всех этих изменений, рестартуем систему (можно и без рестарта было бы обойтись, но так проще, а заодно и проверим ):
reboot


После успешного рестарта вызываем опять команду:
mount
чтобы убедится что наши изменения файловой системы вступили в силу и команду
hostname -v
чтобы убедится, что и имя изменилось.

И это, к слову, был последний рестарт, который мы будем делать.

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

49 комментариев

avatar
Первое что нужно сделать — перезагрузить его
Не приучайте юзеров так делать! Разве что после первоначальной настройки. Аптайм наше всё!
avatar
Аптайм дурацкая метрика, и не всегда зависящая от мастерства сисадмина. Вот прошлой ночью Селектел просто выключил оба моих облачных сервера. Не перезагрузил, а именно выключил. Написал в поддержку — говорят сбой хоста. Ну и какой смысл в аптайме?
avatar
Смысл в доступности ресурса. Для некоторых компаний ребут создает весомые проблемы/убытки.
Я лишь выразил свое мнение. А вы, уж коль желаете, можете при каждом коннекте по ssh ребутать сервер.
avatar
Аптайм доступность только косвенно определяет. В компаниях, где доступность так важна, ресурсы живут на кластерах. Как пример — у svyaznoy.ru десятки виртуалок на дюжине хостов. Никогда аптайм этих виртуалок меня не интересовал — доступность измерялась внешним скриптом, который делал HTTP запросы к серверу. А вообще чаще всего из-за тормозов базы или внешних систем все виртуалки с апачами забивались висящими коннектами и привет. Это реально било по доступности и с этим постоянно боролись.
avatar
Не приучайте юзеров так делать! Разве что после первоначальной настройки. Аптайм наше всё!
О первоначальной настройке и речь, в общем-то.
avatar
Вот Вы, Уважаемый, приводите ссылки на живую миграцию с ext3 на ext4. А Вы сами то пробовали? Знаете к чему приведёт вся эта процедура?
avatar
Насчёт опций монтирования fs я кстати делал заметку. Можно наверно тут её добавить дополнительно.
avatar
Да, я делал. Дважды. Я не привожу не проверенных линков.
avatar
Все мои попытки сделать на тестовых виртуалках приводили к краху системы после ребута.
Да и кстати статья с дебиан-администратора тоже.
После ребута фс всегда переходила в readonly и соотвественно не в консоли не рассмотреть что случилось и что не так, не в журналах (логах) В readonly же всё.
Теоретически можно опробовать system rescue cd, он он предпологает, что возможна хотя-бы эмитация физ. доступа к серверу.
avatar
Мне процесс особенно сложным не показался, хотя делал я не на VPS. Прописываешь fstab, убиваешь все демоны которые цепляются за корневой раздел, переключаеш его в readonly, последовательно прогоняешь по нему fsck.ext3, tune2fs и fsck.ext4 как описано в первом линке. И reboot. Но это в любом случае никому не нужная возня — лучше сразу хостера попросить сделать ext4 во время установки. Ну и на системе с живыми данными я бы тоже не стал. Во время первичного сетапа если только.
avatar
Вы делали в обычной работающей системе или в режиме восстановления?
avatar
В обычной, работающей.
avatar
Странно. Ну да ладно )
avatar
У меня все получилось! Делов на 2 минуты — полет нормальный… Осталось только файлы преобразовать… Хочу заюзать e4defrag…
avatar
Gmugra , Прошу прощения, кстати, за оффтоп. Интересно, а вы упустите процесс тонкой настройки pam-модулей, selinux, etc или это ждать в след. частях? :)
avatar
Нет друзья, в дебри опускаться не будем :) Во-первых я и сам не силён в вопросе, во-вторых наша цель установить LiveStreet всё же. Итак, похоже, 10+ частей будет.
avatar
Хотя-бы настройку iptables+ipset надо. Иначе… Сервер в инете и без фаерфола == беспорядочный секс с каждым встречным не предохраняясь. ))
avatar
Если умеете хорошо — напишите :) Включим в общее оглавление.
avatar
Не то чтобы хорошо, но на уровне закрыть все, открыть всё что надо, раздать нат, заблокировать/лимитировать что-то по мелочам дополнительно.
avatar
C ipset разве один раз сталкивался, когда была сильная атака спамом. Собирал с блек-листов >10к айпи адресов и туда.
avatar
Опишите что знаете, что реально применяли. Мой опыт в этом деле настолько мал что я не хочу врать :)
avatar
Пока нет статьи об iptables выложу пример базовых правил, (вдруг кто уже разворачивается по этим статьям):
#!/bin/sh
### Скрипт конфигурации IPTables ###
# Очищаем предыдущие записи
iptables -F
# Установка политик по умолчанию
iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
# Разрешаем локальный интерфейс
iptables -A INPUT -i lo -j ACCEPT
# Простая защита от DoS-атаки
iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
# Защита от спуфинга
iptables -I INPUT -m conntrack --ctstate NEW,INVALID -p tcp --tcp-flags SYN,ACK SYN,ACK -j REJECT -$
# Защита от попытки открыть входящее соединение TCP не через SYN
iptables -I INPUT -m conntrack --ctstate NEW -p tcp ! --syn -j DROP
# Закрываемся от кривого icmp
iptables -I INPUT -p icmp -f -j DROP
# REL, ESTB allow
iptables -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p udp -m state --state RELATED,ESTABLISHED -j ACCEPT
# Разрешаем рабочие порты
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -p udp --sport 53 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -p tcp --dport 143 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# Разрешение главных типов протокола ICMP
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 11 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 12 -j ACCEPT
# Защита сервера SSH от брутфорса
iptables -A INPUT -p tcp –syn –dport 22 -m recent –name root –set
iptables -A INPUT -p tcp –syn –dport 22 -m recent –name dmitro –update –seconds 30 –hitcount 3 -j D$
iptables -A INPUT -p tcp –dport 22 -j ACCEPT
# Просмотр
iptables -L --line-number
echo
echo "Adding DONE, maybe OK"
echo "Saving to rc, PSE wait!"
service iptables save
echo
service iptables restart
echo "Done"

А еще менять нужно порт SSH обязательно, поэтому 22 поменяйте на свой.
ewden, надеюсь Вы с Gmurga забабахаете совместную статью все таки по этой теме. Потому что толку, что Вы тут распинаетесь в конечном итоге не будет для того, кто будет строго следовать мануалам…
avatar
Зависит от времени, которого итак на многое не хватает.
По вашему скрипту, на первый взгляд, могут быть два совета кстати.
После «случайного» iptables -F придётся либо ехать в цод, либо писать хостинг-провайдеру, пусть сделают iptables -P INPUT ACCEPT.
Два, sh как-бы сюда писать не надо. Более правильным будет в /etc/network/interfaces написать:
iface eth0 inet static
[...]
	pre-up iptables-restore /etc/network/iptables.conf

Вешать ssh на другой порт, всё-же не думаю нужным.
Сделать авторизацию по ключам, и фиг пролезут. Дабы не доставали, можно ещё поставить fail2ban.
avatar
Но ведь нам нужно убрать другие правила. Лучше все с нуля подгонять, какая альтернатива?
Все правила просто вписать в конфиг вместо sh? Да, верно, это будет лучшим решением.
Кстати чтобы избежать курьезов, лучше убрать iptables из автозагрузки, пока не станет ясно, что все впорядке. Ну по крайней мере у меня машину можно из панельки хостера отправить в жесткий ребут или потушить.
Без fail2ban никуда, но ssh Я все равно меняю… Тем более, что владелец только Я один, поэтому мне не трудно указать порт при подключении. Тут уже от паранойи каждого зависит)
Зависит от времени, которого итак на многое не хватает.
Понимаю, но надеюсь скоро она все-таки появиться ;)
avatar
Да, просто прописать в конфиг /etc/network/iptables.conf.
Например
-A INPUT -i eth0 -p tcp --dport 20 -j ACCEPT

Если вас реально хотят взломать, то никакой другой порт не поможет.
И «нормальный» параноик бы делал port knocking, и уж точно не на базе одного iptables. Благо есть выбор инструментов различных для этого.

Насчёт автозагрузки, вы правы. Но можно сделать и круче. Для работы ресурса отдельный апплинк, а для обслуживания сервера вами отдельный, который будет в строжайшем секрете. ;)
Потеряли основной апплинк — есть резервный. Через него и работаем.
avatar
С knocking у меня пока не получилось подружиться пока… =\
avatar
Могу подкинуть предельно простой вариант на базе iptables. Успешно работает на одном из моих серверов.
avatar
Конечно давайте! =)
avatar
-N sshportknock
-A sshportknock -m conntrack --ctstate NEW -m recent --rcheck --name SSH -j ACCEPT
-A sshportknock -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A sshportknock -m tcp -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -m conntrack --ctstate NEW -m tcp -p tcp --dport 29374 -m recent --name SSH --set -j DROP
-A INPUT -m conntrack --ctstate NEW -m tcp -p tcp --dport 28374 -m recent --name SSH --remove -j DROP
-A INPUT -p tcp --dport 22 -j sshportknock

29374 открывает, 28374 закрывает.
avatar
Спасибо, буду пробовать! =)
avatar
!!!WARNING!!!
Если будете использовать пример с правилами для IPTABLES исправьте строки с 22 портом на следующие:
iptables -A INPUT -p tcp --syn --dport 22 -m recent --name root --set
iptables -A INPUT -p tcp --syn --dport 22 -m recent --name dmitro --update --seconds 30 --hitcount 3 -j D$
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

Перед параметрами syn dport и т.п. должно быть два тире, а не один дефис. Видимо, когда копипастил — запортачил, сорри.
avatar
Вот еще кое какие наработки от Orhideous, может какие нибудь вам известны и вы их добавите в документацию?
avatar
Какое то время назад господин Orhideous любезно пообщался со мной в личке, из чего я вынес много полезного. Что-то из этого, что я считаю не особо сложным, и что и лично проверил на практике — попадёт в заметки, конечно.

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

Господин ewden , например уже активно сотрудничает, за что ему большущее спасибо, и следующая часть будет состоять наполовину из его рекомендаций.

Присоединяйтесь. :)
avatar
Gmugra , у меня после команды mount выдало
/dev/simfs on / type simfs (rw,relatime)
proc on /proc type proc (rw,relatime)
sysfs on /sys type sysfs (rw,relatime)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,relatime)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime)

Как исходя из этого узнать тип файловой системы?
avatar
Прочитать.
avatar
Я так понимаю файловая система simfs.
avatar
Далее находясь в редакторе попытался выйти используя команду ESC :qw ENTER, но получил not an editor command. Бегло погуглив не нашел такой команды, зато нашел ESC :x ENTER. C помощью ейной сохранился и вышел.
avatar
Изменения в файлах /etc/hostname и /etc/hosts после рестарта системы не сохранились.
Файл /sys/block/sda/device/timeout у меня не нашелся.

Последние что нам нужно сделать в /etc/fstab — это выставить опцию noatime нашей корневой файловой системе. Для этого ищем строку её описывающую. Она не обязательно будет первой. Это что-то что в качестве «mount point» имеет просто символ /.
Вообще не понял. В конфигурации /etc/fstab у меня изначально имеется
proc  /proc       proc    defaults    0    0
none  /dev/pts    devpts  rw          0    0

Где ставить запятую? :)

В общем жесть :(
avatar
В том, что вы показали, тут корневой раздел не описан. Так что трогать не надо.
А вообще, не OpenVZ ли у вас?
avatar
да, именно OpenVZ.
avatar
Я с OpenVZ никогда не сталкивался, так что посоветовать ничего не могу. Выглядит у вас всё очень экзотично. Но не сохраняющиеся изменения в конфигурационных файлах это нечто очень странное… Вы уверены что вы изменения действительно сохранили?
avatar
Можно помучаю нубскими вопросами?
1.
выйти из редактора не сохраняя изменения: ESC :q! ENTER
выйти из редактора сохранив все изменения: ESC :qw ENTER
находясь в редакторе включить режим редактирования: i (при этом в нижнем левом углу консоли появится надпись "-- INSERT --" )
Что это означает? Необходимо последовательно нажать эти клавиши на клавиатуре или что?
2.
Открываем vim-ом конфигурацию файловой системы:
vim /etc/fstab
В конце файла
У меня просто появляется чёрный экран, как понять что у меня открылся нужный мне файл?
avatar
1. Да, это именно последовательность нажатия клавиш.
2. Пустой чёрный экран означает что файла не было и vim просто открывает «пустой» файл с тем чтоб вы могли могли создать новый. Но файла /etc/fstab не быть не может… проверьте его наличие например с помощью mc
avatar
Смешно конечно, но мне 6 дебиан отвечает:
fuser: command not found
WTF???
avatar
Наверное у вас он не стоит:
apt-get install psmisc
avatar
Можно поставить command-not-found, который в таком случае бы сообщил, какой пакет надо поставить. ;)
avatar
Выполняю mount и получаю

А в /etc/fstab у меня только это
avatar
(Случайно отправил.) Использую VDS на OpenVZ. Подскажите, что с этим делать?
avatar
подскажите: заказал debian 6 + предустановленное ПО на fastvps.ru. добавил домен залил файлы. права на папки пользователя admin. все работет, фото грузится. выставляю с теми же правами пользователя/группу www-data и как результат не могу залить фото. я так понимаю необходимо сменить пользователя от которого работают сервисы. в fstab выставить www-data?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.