+2.26
4 читателя, 59 топиков

Бесплатный облачный PHP-MySQL хостинг для небольшого сайта на основе Amazon AWS

Для наших целей вполне хватит PHP, MySQL и доступа по FTP.

Для решения этой задачи идеально подходит Веб сервис от Амазона в котором удивительным образом сочетается способность выдерживать большие нагрузки с бесплатным пакетом ресурсов на первый год после регистрации. В бесплатный пакет входит много чего, но в данный момент нас будут интересовать:
  • Виртуальный сервер в формате micro на основе Linux с доступом по SSH.
  • 10Гб места в Elastic Block Storage плюс 1Гб под бэкапы.
  • 15 Гб трафика в месяц.
  • Выделенный внешний IP адрес.
Нам понадобится кредитная карта, которую примет Amazon(и снимет 2 доллара) и сотовый телефон под рукой.

Регистрируемся на Amazon
Процедура регистрации обычно не вызывает вопросов. Единственный совет — вводить реальные или близкие к реальным данные. Семенов Горбунковых с улицы Горького давно не регистрируют, а если неправильно указать индекс города, то система даст скрытый отлуп на этапе проверки кода по телефону.
Перед тем как вбивать данные кредитной карты, нужно убедиться что по ней доступно для снятия минимум 85р для Mastercard и 75р для Visa. В зависимости от региона и типа кредитной карты в конце процесса регистрации нас могут попросить подтвердить свой сотовый телефон. Тут правил 3 — вписывать номер нужно без восьмерки и кода страны (10 цифр), не забывать правильно выбирать страну и начинать вводить код с клавиатуры только после того как синтезированная телефонная барышня перестанет говорить и затаится в ожидании. Если подтвердить не попросят, значит Амазону очень понравилась ваша кредитка и у них еще еще не было проблем с пользователями из вашего диапазона адресов. Но поскольку нас больше всего интересует сервис EC2 (для которого верификация обязательна), то подтверждать 4 цифры по телефону придется в любом случае. После регистрации с карты снимут 1 доллар (и потом его не вернут) и сразу предоставят доступ к сервису хранения файлов S3 и к шикарной консоли управления

К слову сказать, с самого начала все картинки из этого сообщения лежали именно на сервисе S3 и 5Гб места на нем тоже входят в бесплатный годовой пакет (но бесплатный лимит кончился меньше чем за сутки). На S3 можно создать корзину (Create Bucket), включить галку Enabled на вкладке Website и легко организовать хранилище файлов. Например, если назвать корзину словом test86 и положить в нее файл tеst85.7z, то из браузера он будет виден по адресам test86.s3.amazonaws.com/tеst85.7z и s3.amazonaws.com/test86/tеst85.7z. Обратите внимание, что без изменения дополнительных опций при загрузке, файлы сможет увидеть только владелец этой корзины. Чтобы открыть доступ к просмотру одного или нескольких файлов нужно выделить их и выбрать в меню Actions/Make Public. Кроме S3 у Амазона есть еще масса интересных сервисов, но речь сегодня пойдет только о EC2.

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

а с карты спишется еще один доллар.

Добавление пользовательской группы
Не теряя времени даром, щелкаем на ссылку Security Groups слева. Создаваемую по умолчанию группу лучше не трогать, но она нас никак не устраивает с точки зрения прав доступа (все порты любые действия). Поэтому создадим свою группу с более ограниченными правами

и назовем ее, например, web.

После создания добавим несколько правил в закладке Inbound

По аналогии добавим для общего доступа (Source: 0.0.0.0/0), к портам 20-21, TCP порты 1024-1048, HTTP и HTTPS. Разрешать доступ по SSH с любого адреса я бы поостерегся, поэтому лучше вписать в строку Source: или свой статический IP или подсеть своего провайдера (что-нибудь типа 211.207.171.0/24). В результате должно получится что-то похожее на

Щелкаем на Apply Rule Changes и переходим к следующему этапу.

Создание SSH ключей
Ключи нужны для доступа на сервер по SSH и они могут быть созданы и в процессе развертывания образа выбранной ОС, но в IE и Chrome наблюдаются периодические глюки с отдачей файла ключей на скачивание. Поэтому лучше сделать это заранее и если заглючит, то повторить.
Для генерации ключей выбираем Key Pairs в меню и давим пару кнопок.

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

Развертывание образа Операционной Системы
Итак, у нас есть ключ и дополнительная пользовательская группа. Теперь можно смело нажимать Launch Instance из меню EC2 Dashboard.

Согласимся на Classic Wizard.

Наш выбор это 32-x или 64-х битный Amazon Linux AMI.

Оставляем все установки по умолчанию.

Включаем защиту от удаления.

Теги вбивать не обязательно.

Будем использовать уже сгенерированные ключи.

В конфигурации фаервола оставляем только Security Group индекс-web.

Проверяем установки и запускаем.

После запуска в списке Instances появится наш микро-сервер.

Регистрируем IP адрес для сервера
В меню Elastic IPs сначала резервируем себе IP адрес.

И тут же присваиваем его нашему запущенному серверу.

Обратите внимание что резервирование незакрепленного за работающим сервером IP адреса не входит в бесплатный пакет. За это придется платить по центу в час. Как только IP присваивается запущенному северу, он тут же становится бесплатным.
В нашем примере Амазон выдал серверу адрес 107.21.246.159 и в дальнейшем мы его будем часто использовать, но в вашем случае во всех действиях и командах его нужно будет заменять на адрес, который выдали лично вам.

Подключаемся к серверу по SSH
Для этой цели можно использовать массу разнообразных программ, но вся дальнейшая инструкция написана для виндового и бесплатного PuTTY (прямая ссылка на загрузку).
Из архива нам в первую очередь понадобится puttygen.exe. Запускаем, выбираем Conversions/Import key.

и пересохраняем приватный кей как SSH2 RSA .ppk файл. На этом этапе не помешает как следует запаролить ключ.

После этого запускаем putty.exe, вбиваем наш IP в поле Host Name.

в разделе SSH-Auth указываем путь к .ppk ключу.

и нажимаем кнопку Open. В окошке терминала не должно быть никаких сообщений об ошибках, а в предложение:
login as:

нужно ввести ec2-user.

Теперь будем настраивать по SSH.
По ходу настройки иногда придется нажимать кнопку y чтобы соглашаться с предложениями установить все вместе с зависимостями. После ввода каждой команды нужно дождаться окончания работы и только потом вводить следующую.

Обновление и подготовка к настройке сервера
Сразу после входа хорошо бы обновиться. Для этого говорим:
sudo yum -y update

В системе нам не помешает Миднайт Командер (там более привычный для мышевозов редактор):
sudo yum install mc

Создадим пользовательскую группу virtwww:
sudo groupadd virtwww

Добавим пользователей:
sudo useradd www -g virtwww -d /var/www
sudo useradd webserver -g virtwww

и зададим пароли посложнее:
sudo passwd www
sudo passwd webserver

На всякий случай еще раз установим права на каталог:
sudo chown www:virtwww /var/www
sudo chmod 0750 /var/www

Теперь наш сервер полностью готов к установке сервисов.

Установка MySQL
Установим MySQL:
sudo yum install mysql-server mysql

Добавим его в автозапуск:
sudo /sbin/chkconfig --levels 235 mysqld on

и запустим:
sudo service mysqld start

После этого зададим пароль пользователю root:
mysql -u root
USE mysql

не забудьте вписать что-то свое вместо s10ZniYpar00L
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('s10ZniYpar00L');

Запретим подключение к базе без пароля:
DELETE FROM user WHERE password = '';
DELETE FROM user WHERE user.user= '';

и обновим привилегии:
FLUSH PRIVILEGES;

Удалим тестовую базу:
DROP DATABASE test;

и выйдем из консоли управления MySQL сервером:
\q


Настройка FTP
Установим vSFTPd:
sudo yum install vsftpd

Добавляем его в автозапуск и пробуем запустить:
sudo /sbin/chkconfig --levels 235 vsftpd on
sudo service vsftpd start

Редактируем конфигурацию:
sudo mcedit  /etc/vsftpd/vsftpd.conf

Изменяем значения параметров:
anonymous_enable=NO
local_enable=YES
write_enable=YES

Добавляем в конец файла:
pasv_enable=YES
pasv_min_port=1024
pasv_max_port=1048
pasv_address=107.21.246.159

Не забудьте вписать тут свой IP
Кнопкой F2 сохраняем изменения, выходим из редактора через F10 и перезапускаем FTP сервер:
sudo service vsftpd restart

Теперь можно пробовать подключиться к нашему серверу по FTP любым клиентом с поддержкой PASV режима.
В качестве имени хоста используем наш IP, пользователь www, пароль из шага номер 8. Режим PASV включен принудительно. Подключаемся и пробуем залить в папку /var/www любой файл. Если не получается, говорим:
sudo chmod 0755 /var/www

и пробуем еще раз.
Если залилось с самого начала, то не нужно менять права с 750 на 755 (это дополнительная дырка в безопасности)
и проверяем права доступа к файлу. Он должен создаться с правами 0644.

Установка Apache и PHP
Сначала ставим Апач:
sudo yum install httpd mod_ssl

После него PHP:
sudo yum install php

Отдельной строчкой регэкспы:
sudo yum install pcre-devel

и общей кучей модули и зависимости для PHP:
sudo yum -y install aspell aspell-en aspell-ru cvs php-gd php-intl php-mbstring php-mysql php-pdo php-soap php-xml php-xmlrpc php-pspell php-devel php-pear

Добавляем Apache в автозапуск и пробуем его запустить:
sudo /sbin/chkconfig --levels 235 httpd on
sudo service httpd start

Если все запустилось, корректируем конфигурацию под амазоновский сервер и пользователя webserver:
sudo mcedit /etc/httpd/conf/httpd.conf

Ищем и корректируем в тексте следующие строчки
ServerTokens Prod
TraceEnable Off
KeepAlive On
MaxKeepAliveRequests 256
KeepAliveTimeout 10
User webserver
Group virtwww

Строку TraceEnable Off возможно придется добавить.
Кнопкой F2 сохраняем изменения, выходим из редактора через F10 и перезапускаем Apache:
sudo service httpd restart

Разрешаем изменение файлов через ftp:
sudo chown www:virtwww /var/www/html /var/www/icons /var/www/error /var/www/cgi-bin

Убираем основную вредительскую дырку в конфиге PHP:
sudo mcedit /etc/php.ini

Ищем строку magic_quotes_gpc и ставим ее в положение On:
magic_quotes_gpc = On

Для совместимости не помешает включить короткие теги:
short_open_tag = On

Кнопкой F2 сохраняем изменения, выходим из редактора через F10 и перезапускаем Apache:
sudo service httpd restart

Если на каком-либо этапе апач перестанет запускаться, откатываем изменения и смотрим что произошло в логах:
sudo mcview  /var/log/httpd/error_log
sudo mcview  /var/log/httpd/access_log

После того как все запустилось закрываем терминал:
exit

и возвращаемся в консоль управления в барузере.

Включаем балансировку нагрузки (Load Balancers)
Этот шаг в принципе можно пропустить, но это делать нежелательно. Балансировка входит в бесплатный пакет и я не вижу зачем отказываться от такой полезной вещи. Система Load Balancers периодически обращается к какому либо URL на сервере и делает выводы из времени отклика. Отсюда логически вытекает самая распространенная ошибка в настройке. По умолчанию предлагается пинговать индексную страницу сайта, а кто знает сколько она может весить в произвольном случае? В результате при каждой проверке тратится вроде бы немножко трафика, но за месяц может накапать целое ведро. Поэтому создадим для этой системы специальную страничку ping.html и впишем туда одинокую единичку без юникодов, пробелов и переводов строк. В результате на проверку всегда будет тратиться ровно 1 байт трафика. Этот файл нужно загрузить через ftp в корень сайта перед созданием балансера.
Имя может быть произвольным, но уникальным если балансеров несколько.

Целью проверки выбираем ping.html

Проверять будем наш уже запущенный сервер


Ура и все! Можно открывать в браузере наш IP адрес, заливать PHP скрипты через FTP и общаться из них с MySQL. Пример:

Не забывайте периодически контролировать расходы ресурсов в разделе управления аккаунтом и постарайтесь не пропустить момент, когда ваш бесплатный хостинг вдруг станет платным. При превышении лимитов любого из бесплатных сервисов, он не останавливается, а становится платным.
Расценки за превышение бесплатных норм для S3 и EC2

Некоторые способы борьбы с DDoS

log2ban
Как работает log2ban
Для обнаружения ботов, каждый запрос к серверу, отмечается идентификатором из свойств запроса (например из IP адреса и URL: «1.2.3.4/login.php»). Когда количество обращений с определенным ID достигает установленного предела, в пределах временного окна обнаружения, IP клиента передается в качестве аргумента для внешней команды (BAN_IP_COMMAND) или собранных для пакетной блокировки (см. «Блокировка списков»).

Log2ban работает над логами сервера в реальном времени, и не предназначен для использования в качестве анализатора архива логов. Следует использовать средства файрволла, чтобы произвести саму блокировку (настройки и скрипты для ipset прилагаются в примере).

Скрипт читает лог в реальном времени, с помощью, например «tail -f» или аналогичную команду, как указано в конфигурации. Если команда посылает EOF, log2ban завершит свою работу. Если команда прекратить писать записи журнала на стандартный вывод, процесс log2ban будет висеть вечно.

Настройка
По умолчанию поддерживается шаблон логов Apache/Nginx. Изменения, внесенные в формат должны быть отражены в переменной ACCESS_LOG_RECORD_FORMAT.

Можно также настроить правила обнаружения. Наиболее важным параметром является TOLERANCE_MARGIN (количество хитов в окне). Второй наиболее важными являются WINDOW_SIZE (размер окна в слотах) и SLOT_INTERVAL. (размер слота в секундах) Более короткий интервал и увеличенный размер означает лучшее обнаружение (и худшую производительность).

Чтобы изменить правила вычисления ID, измените функцию «create_server_hit_id».

Чтобы изменить правила пропуска строки в логи, измените функцию «skip». По умолчанию пропускаются запросы на статические типы файлов.

Блокировка списков
Для использования блокировки по спискам, включите базу данных, обработайте логи какое-то время, а затем выполните
python log2ban.py print (banned | allbanned)

распечатать собранные IP-адреса на stdout. «banned» будет печатать только новые IP-адреса (с момента прошлого print banned), в то время как «allbanned» будет печатать каждый запрещённый IP, независимо от того, был он ранее напечатан или нет.

После нескольких дней IP-адреса будут разбанены, для получения их списка:
python log2ban.py print (unbanned)

Эта команда напечатает каждый IP, который был забанен в период current_time — DAYS_UNBAN, и удалит записи из базы данных.

Производительность
log2ban достаточно быстр сам по себе, но для очень быстрорастущих логов обработка запросов может стать проблемой. Рассмотрите возможность отключения регистрации запросов на статические ресурсы, такие как изображения, скрипты и таблицы стилей. Дальнейшая оптимизация может включать в себя более простой формате логов (CSV), вместо того чтобы использовать формат по умолчанию, который обрабатывается модулем apachelog через регулярные выражения.

Установка и интеграция с файрволлом
Процесс описан для Debian Squeeze 6.0, для других дистрибуций может отличаться.
Установите ipset:
sudo apt-get install module-assistant xtables-addons-source

sudo module-assistant prepare

sudo module-assistant auto-install xtables-addons-source

depmod -a

Проверьте что он работает
ipset -L

Если вы получаете не пустой ответ, например ошибки 'Module ip_set not found', то ipset не установлен правильно. Погуглите на предмет решения этой проблемы для вашей конкретной инсталляции. Общая идея в том, что модуль ядра ip_set должен быть локально скомпилирован и загружен в ядро.

Установите MongoDB, Python и PIP:
sudo apt-get install mongodb python-pip

Установите модули для питона:
sudo pip install apachelog pexpect pymongo

Склонируйте репозиторий log2ban:
git clone git://github.com/unicodefreak/log2ban.git

В файле log2ban.py, настройте следующую команду, если необходимо.
ECHO_LOG_COMMAND = "tail -f /var/log/nginx/access.log" 

Добавьте следующий текст в /etc/logrotate.d/nginx:
/var/log/nginx/*log {

 daily

 rotate 10

 missingok

 notifempty

 compress

 sharedscripts

 postrotate

 [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`

 /etc/init.d/log2ban stop

 /etc/init.d/log2ban start

 endscript

}

Установите скрипты
sudo mkdir /opt/log2ban

sudo cp log2ban/log2ban.py /opt/log2ban/

sudo cp log2ban/ipset-control.sh /opt/log2ban/

sudo cp log2ban/init-scripts/log2ban-debian.sh /etc/init.d/log2ban

sudo chmod +x /etc/init.d/log2ban

sudo chmod +x /opt/log2ban/ipset-control.sh


Запустите MongoDB
sudo /etc/init.d/mongodb start

Запустите log2ban
sudo /etc/init.d/log2ban start


Добавьте в root cron script следующую команду, например для обновления адресов каждые 5 минут
*/5 * * * * /opt/log2ban/ipset_control.sh update


Пусть поработает какое-то время. Проверьте, если какие-либо IPs are blocked:
sudo ipset -L

Если список похож на правду, то остался последний шаг — подключить iptables.
Добавьте строку:
-A INPUT -m set --match-set autoban src -j DROP

в файл /etc/firewall.conf и выполните
sudo /etc/init.d/networking restart

Как настроить cron для jimbot?

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

При этом необходимо определять что бот уже запущен, чтобы не запускать лишних копий.
Скачать скрипт вы можете отсюда: bot.sh
Не забываем менять переменные в bot.sh, на ваши:
JAVA=/usr/bin/java //установленная java стандартно
JAR_HOME=/home/home/chat //записываем путь до папки с нашим ботом
JAR=jimb.jar //имя самого jar файла бота

Затем предоставьте ему(bot.sh) права на запуск.
chmod 777 bot.sh

1) Затем вводим команду crontab –e в putty
2) Появится редактор vi
3) Нажимаете кнопку INSERT на клавиатуре
4) Вводите задание (команду)
Например:
/home/bot/bot.sh // ПУТЬ до bot.sh

5) После ввода задания(команды), нажимаем ESC на клавиатуре
6) Далее пишем (тем самым сохраняя изменения в cron)
!w:

7) Выходим с редактора vi
!q:

8) Набрав «crontab -l» можно убедиться, что наши задания добавлены.

Теперь наш бот будет перезагружаться каждые сутки в 4 часа утра.

Основные системные показатели на PHP

Рассматриваться будет работа на Ubuntu Server. Под другие nix-системы тоже должно работать, но, возможно, с доработками. Windows серверы не рассматриваются вовсе.
Все решения сделаны «в лоб», без изысков и фанатичной минимализации/оптимизации. Я использовал jQuery для того, чтобы получить json посредством Ajax, и вывести его на страницу. Примеры простые, и могут быть переделаны под любой другой способ передачи/вывода.

1. Загрузка CPU
Начнем с самого сложного. Сложного потому, что мне не сразу удалось найти способ получения информации о загрузке процессора, а впоследствии, и не сразу найти способ ее обрабатывать. Первой мыслью была «использовать exec(»top -n 1")", однако top не писал в стандартный вывод, а сохранение его (вывод) в файл на диск через '>', приводило к появлению огромного количества 'мусора', что сильно затрудняло последующий парсинг. В итоге, все свелось к чтению нужных файлов в виртуальной файловой системе, подключенной в /proc. Файл, в котором хранится информация о текущем использовании процессора называется /proc/stat. По сути, это не файл, а точка доступа к структурам данных ядра, но нам это знать не обязательно, потому что нам будет достаточно прочитать содержимое, а сделать это можно, как и в случае с простым файлом, через file(). Теперь можно привести кусочек кода, который эту информацию достает. После него я объясню, что было сделано, и зачем.
$file=file("/proc/stat");
$tmp=explode(" ",$file[0]);
$cpu1=$this->session->userdata("cpu1");
$cpu2=$this->session->userdata("cpu2");
$cpu3=$this->session->userdata("cpu3");
$cpu4=$this->session->userdata("cpu4");
$cpu=(100/($tmp[5]-$cpu4))/(($tmp[2]-$cpu1)+($tmp[3]-$cpu2)+($tmp[4]-$cpu3))*100;
       
$this->session->set_userdata(array("cpu1"=>$tmp[2],"cpu2"=>$tmp[3],"cpu3"=>$tmp[4],"cpu4"=>$tmp[5]));

Объяснение начнем с содержимого файла:
> cat /proc/stat
cpu  2255 34 2290 22625563 6290 127 456 0 0
cpu0 1132 34 1441 11311718 3675 127 438 0 0
cpu1 1123 0 849 11313845 2614 0 18 0 0
intr 114930548 113199788 3 0 5 263 0 4 [... еще куча цифр ...]
...

В первой строчке /proc/stat содержится информация о количестве потраченного процессором времени (усредненное для всех ядер/потоков) на выполнение (по порядку): процессов пользователя, высокоприоритетных процессов пользователя, системных процессов, простоя, ожидания ввода/вывода, аппаратных и программных прерываний. В следующих строках, начинающихся на 'cpu', приведены те же данные для каждого ядра/потока в отдельности. В нашем случае вся интересующая информация содержится в первой строке, поэтому дальше разбирать файл не будем.
В приведенном кусочке кода так же есть сохранение этих данных в сессию CodeIgniter. Это сделано для того, чтобы определять разницу (дельту) между текущими и предыдущими значениями показателей. Загрузка процессора представляет собой отношение дельты простоя к сумме дельт затрат на процессы. Другими словами, мы сравниваем количество простоя и работы с момента последнего запроса. Естественно, чем реже будут происходить эти запросы, тем сильнее будет усреднено значение загрузки процессора за это время.

2. Оперативная память
Информацию о количестве свободной оперативной памяти можно найти в файле /proc/meminfo:
> cat /proc/meminfo
MemTotal:        2052604 kB
MemFree:          246012 kB
Buffers:          792332 kB
Cached:           584716 kB
...

Отсюда мы будем брать две первые строчки, и извлекать из них цифры:
$file=file("/proc/meminfo");
$memory["total"]=substr($file[0],strpos($file[0]," "),strrpos($file[0]," ")-strpos($file[0]," "));
$memory["free"]=substr($file[1],strpos($file[1]," "),strrpos($file[1]," ")-strpos($file[1]," "));

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

3. Swap file
Тут еще проще — берем строчку из /proc/swaps:
> cat /proc/swaps
Filename                                Type            Size    Used    Priority
/dev/sda1                               partition       7811064 2732    -1
...

В нем перечислены все подключенные своп-файлы, их типы, объемы и занятое место. Нам просто надо «выдернуть» нужные цифры из нужных строк. В моем случае своп один, и строчку я обрабатываю одну:
$file=file("/proc/swaps");
$tmp=explode("\t",substr($file[1],strpos($file[1],"partition")));
$swap["total"]=$tmp[1];
$swap["free"]=$tmp[1]-$tmp[2];

Здесь пояснения тоже не нужны.

4. Жесткие диски
В моем примере будет приведен код, который извлекает информацию о количестве свободного места на дисках, точки монтирования которых находятся в /mnt. Ухищрения типа чтения и парсинга файлов из /proc здесь использовать не будут — для этой цели достаточно стандартных disk_free_space() и disk_total_space():
$drives=array();
if($dir=opendir("/mnt")){
  while(false !== ($file = readdir($dir))) {
    $arr=array();
    if(($file!=".")&&($file!="..")){
      $arr["path"]="/mnt/".$file;
      $arr["free"]=disk_free_space("/mnt/".$file);
      $arr["total"]=disk_total_space("/mnt/".$file);
      $drives[]=$arr;
    }
  }
}

5. Uptime
В качестве небольшого бонуса получим и продолжительность работы системы с последнего запуска:
$uptime=exec("uptime");
$uptime=explode(",",substr($uptime,strpos($uptime,"up")+3));
$time=explode(":",$uptime[1]);
$uptime=$uptime[0]." ".$time[0]." hours ".$time[1]." minutes";

Совсем банальный подход — вызов exec(), и форматирование результата.

Вывод
Мы смогли получить всю интересующую нас информацию — о заполненности жестких дисков, о загрузке процессора, о состоянии памяти и свопа и даже о продолжительности работы сервера. Как выводить эту информацию, каждый может придумать сам, в зависимости от требований. Я же поделюсь способом, который использую сам.
Сперва я собираю полученные данные в ассоциативный массив и вывожу его как json:
$result["cpu"]=$cpu;
$result["memory"]=$memory;
$result["swap"]=$swap;
$result["uptime"]=$uptime;
json_encode($result);

На выходе получается следующее:
{"uptime":"34 days   5 hours 45 minutes","cpu":1.7361111111111,"memory":{"total":"2052604","free":"191424"},"swap":{"total":"7811064","free":7808332}}

И, уже в браузере, я работаю с результатом при помощи jQuery:
var json=$.parseJSON(data);
$("#systemInfo").html("CPU: "+json.cpu+"<br />Memory free "+json.memory.free+" / "+json.memory.total);


Установка cs 1.6 сервера на Linux

  • Создание сервера CS 1.6 и его настройки
  • Создание сервера сounter-strike 1.6 в Linux
  • Установка сервера counter strike 1.6 (Linux)
  • Установка сервера CS 1.6 на Linux

Установку будем производить на операционной системе CentOS 6.0. Перед установкой сервера counter-strike 1.6 имеем чистую систему, как раз после установки. Единственное, были выполнены команды:
yum update
yum install mc

Создадим папку где будем хранить весь исходный материал для серверов
[root@cs hdd2]# mkdir source

Скачаем hldsupdatetool.bin
[root@cs hdd2]# wget http://www.steampowered.com/download/hldsupdatetool.bin

Даём нужные права на файл:
[root@cs hdd2]# chmod +x hldsupdatetool.bin

Запускаем hldsupdatetool.bin
[root@cs hlds]# ./hldsupdatetool.bin
-bash: ./hldsupdatetool.bin: /lib/ld-linux.so.2: bad ELF interpreter: Нет такого файла или каталога
[root@cs hlds]#

У меня возникла ошибка. Решил её установкой:
[root@cs hlds]# yum install ld-linux.so.2
Пробуем снова
[root@cs hlds]# ./hldsupdatetool.bin

На вопрос отвечаем «YES»
Enter 'yes' to accept this agreement, 'no' to decline: yes

Выдало ошибку: «sh: uncompress: команда не найдена»
Enter 'yes' to accept this agreement, 'no' to decline: yes
sh: uncompress: команда не найдена
tar: Это не похоже на tar-архив
tar: Завершение работы с состоянием неисправности с из-за возникших ошибок
[root@cs hlds]# 

Решаем её следующим образом:
[root@cs hlds]#ln -s /usr/bin/gunzip /usr/bin/uncompress

Пробуем снова:
[root@cs hlds]# ./hldsupdatetool.bin

Если увидим ниже написанное, то все ок.
Enter 'yes' to accept this agreement, 'no' to decline: yes
extracting steam.tar.Z...done

Проверяем, появились ли нужные нам файлы:
[root@cs hlds]# ls
hldsupdatetool.bin  readme.txt  steam

Обновляемся, причем нас попросят это сделать два раза:
[root@cs hlds]# ./steam
Checking bootstrapper version ...
Getting version 45 of Steam HLDS Update Tool
Downloading. . . . . . . . . . . .
Steam Linux Client updated, please retry the command
[root@cs hlds]#
[root@cs hlds]# ./steam
Checking bootstrapper version ...
Getting version 45 of Steam HLDS Update Tool
Downloading. . . . . . . . . . . .
Steam Linux Client updated, please retry the command
CAsyncIOManager: 0 threads terminating.  0 reads, 0 writes, 0 deferrals.
CAsyncIOManager: 21 single object sleeps, 0 multi object sleeps
CAsyncIOManager: 0 single object alertable sleeps, 0 multi object alertable sleeps
[root@cs hlds]#

Создаем файл, через который будем в дальнейшем обновлять сервер:
[root@cs hlds]# touch update.sh

Даем нужные права на файл:
[root@cs hlds]# chmod +x update.sh

Записываем необходимое для обновления в файл:
[root@cs hlds]# echo ./steam -command update -game cstrike -dir . > update.sh

Проверяем:
[root@cs hlds]# cat update.sh
./steam -command update -game cstrike -dir .
[root@cs hlds]#

Скачиваем (обновляем) сервер:
[root@cs hlds]# ./update.sh
Checking bootstrapper version ...
Updating Installation
No installation record found at .
No installation record found at .
No installation record found at .
Checking/Installing 'Counter-Strike Base Content' version 35

0.16%   downloading ./cstrike/cl_dlls/client.dll
0.16%   downloading ./cstrike/classes/ak47.res
0.16%   downloading ./cstrike/classes/arctic.res
0.16%   downloading ./cstrike/classes/aug.res
0.16%   downloading ./cstrike/classes/autoselect_ct.res
0.16%   downloading ./cstrike/classes/autoselect_t.res
0.16%   downloading ./cstrike/classes/awp.res
0.16%   downloading ./cstrike/classes/cancelbutton.res
0.16%   downloading ./cstrike/classes/default.res
0.16%   downloading ./cstrike/classes/defuser.res
0.16%   downloading ./cstrike/classes/deserteagle.res
0.16%   downloading ./cstrike/classes/elites.res
0.16%   downloading ./cstrike/classes/equipment.res

Ждем пока скачается
99.06%  downloading ./valve/valve.rc
99.06%  downloading ./valve/valvecomm.lst
100.00% downloading ./valve/xeno.wad

Connection Reset, errno 104 "Connection reset by peer"
CAsyncIOManager: 0 threads terminating.  0 reads, 0 writes, 0 deferrals.
CAsyncIOManager: 76 single object sleeps, 0 multi object sleeps
CAsyncIOManager: 0 single object alertable sleeps, 0 multi object alertable sleeps
[root@cs hlds]#

Создадим скрипт для запуска-проверки сервера:
[root@cs hlds]# chmod +x start.sh
[root@cs hlds]# vi start.sh

Содержимое файла «start.sh»
#!/bin/bash
echo «Starting CS:1.6»
sleep 1
./hlds_run -binary ./hlds_i686 -game cstrike -secure -console -pingboost 1 +exec server.cfg -verify_all +port 27015 +maxplayers 22 +map de_dust2 +ip 0.0.0.0

Запускаем
[root@cs hlds]# ./start.sh
Starting CS:1.6
Auto-restarting the server on crash

Console initialized.
scandir failed:/hdd2/source/hlds/./valve/SAVE
scandir failed:/hdd2/source/hlds/./platform/SAVE
Protocol version 48
Exe version 1.1.2.6/Stdio (cstrike)
Exe build: 16:56:12 Mar  8 2010 (4883)
STEAM Auth Server
couldn't exec listip.cfg
couldn't exec banned.cfg
Server IP address 0.0.0.0:27015
scandir failed:/hdd2/source/hlds/./valve/SAVE
scandir failed:/hdd2/source/hlds/./platform/SAVE
[S_API FAIL] SteamAPI_Init() failed; unable to update local steamclient. Continuing with current version anyway.

scandir failed:/hdd2/source/hlds/./valve/SAVE
scandir failed:/hdd2/source/hlds/./platform/SAVE
[S_API FAIL] SteamAPI_Init() failed; unable to update local steamclient. Continuing with current version anyway.

couldn't exec listip.cfg
couldn't exec banned.cfg
scandir failed:/hdd2/source/hlds/./valve/SAVE
scandir failed:/hdd2/source/hlds/./platform/SAVE
[S_API FAIL] SteamAPI_Init() failed; unable to update local steamclient. Continuing with current version anyway.

Connection to Steam servers successful.
   VAC secure mode is activated.
Птн Сен  2 07:22:45 NOVST 2011: Server Quit

[root@cs hlds]#

Исправляем ошибки:
couldn't exec listip.cfg

Создаем файл в listip.cfg папке cstrike:
[root@cs hlds]# touch cstrike/listip.cfg

Ошибка
couldn't exec banned.cfg

Создаем файл в banned.cfg папке cstrike:
[root@cs hlds]# touch cstrike/banned.cfg

Ошибка
scandir failed:/hdd2/source/hlds/./valve/SAVE

Создаем папки valve/SAVE в корне сервера
[root@cs hlds]# mkdir valve/SAVE

Ошибка
scandir failed:/hdd2/source/hlds/./platform/SAVE

Создаем папки platform/SAVE в корне сервера
[root@cs hlds]# mkdir platform
[root@cs hlds]# mkdir platform/SAVE

Пробуем запустить снова:
[root@cs hlds]# ./start.sh
Starting CS:1.6
Enabling debug mode
./hlds_run: line 134: gdb: команда не найдена
Please install gdb first.

Исправляем ошибку:
[root@cs hlds]# yum install gdb

Проверяем:
[root@cs hlds]$ ./start.sh
Starting CS:1.6
Enabling debug mode
Auto-restarting the server on crash

Console initialized.
Protocol version 48
Exe version 1.1.2.6/Stdio (cstrike)
Exe build: 16:56:12 Mar  8 2010 (4883)
STEAM Auth Server
Server IP address 0.0.0.0:27015
[S_API FAIL] SteamAPI_Init() failed; unable to update local steamclient. Continuing with current version anyway.

[S_API FAIL] SteamAPI_Init() failed; unable to update local steamclient. Continuing with current version anyway.

[S_API FAIL] SteamAPI_Init() failed; unable to update local steamclient. Continuing with current version anyway.

Connection to Steam servers successful.
   VAC secure mode is activated.

Пользователь для сервера
Создадим пользователя от которого будем управлять и запускать сервер:
[root@cs hlds]# useradd gsrv

Установим пароль для пользователя «gsrv»:
[root@cs hlds]# passwd gsrv
Смена пароля для пользователя gsrv.
Новый пароль :
Повторите ввод нового пароля :
passwd: все токены проверки подлинности успешно обновлены.
[root@cs hlds]# 

Передаем права пользователю gsrv
[root@cs hlds]# chown -R gsrv:gsrv source/

Дальше все действия будем выполнять от пользователя gsrv
[root@cs hdd2]# su gsrv
[gsrv@cs hdd2]$


Настройка IPTABLES
Создадим файл
[root@cs rc.d]# vi /etc/rc.d/rc.fw

со следующим содержимым:
#! /bin/sh
WAN_IF="eth0"
WAN_IP="ИП_АДРЕС_ВАШЕГО_СЕРВЕРА"

LO_IF="lo"
LO_IP="127.0.0.1"
LO_MASK="255.0.0.0"
LO_NET="$LO_IP/$LO_MASK"

SERV_PORT="27015:27025"
SHH_PORT="22"

IPT="/sbin/iptables"
$IPT -F
$IPT -t nat -F
$IPT -t mangle -F
$IPT -X
$IPT -P INPUT DROP
$IPT -P OUTPUT ACCEPT
$IPT -A INPUT -i $LO_IF -j ACCEPT
$IPT -A OUTPUT -o $LO_IF -j ACCEPT
$IPT -A INPUT -p ICMP --icmp-type 8 -j ACCEPT
$IPT -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -p TCP --dport 22 -j ACCEPT
$IPT -A INPUT -p tcp --dport 27015 -j ACCEPT
$IPT -A INPUT -p udp --dport 27015 -j ACCEPT

[root@cs rc.d]# chmod +x rc.fw

[root@cs init.d]# yum install screen

Установка phpmyadmin на CentOS

Установка phpmyadmin на CentOS

Скачать: sourceforge.net/projects/phpmyadmin/

phpMyAdmin — веб-приложение с открытым кодом, написанное на языке PHP и представляющее собой веб-интерфейс для администрирования СУБД MySQL. phpMyAdmin позволяет через браузер осуществлять администрирование сервера MySQL, запускать команды SQL и просматривать содержимое таблиц и баз данных. Приложение пользуется большой популярностью у веб-разработчиков, так как позволяет управлять СУБД MySQL без непосредственного ввода SQL команд, предоставляя дружественный интерфейс.

Устанавливаем из репозитория
Centos 6 — i386
# wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.i686.rpm

Centos 6 — x86_64
# wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm

Centos 5 — i386
# wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.i386.rpm

Centos 5 — x86_64
# wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm

Для CentOS 5 устанавливаем ключь Dag GPG
# rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt


Проверяем что скачали пакет без ошибок:
# rpm -K rpmforge-release-*.rpm

Устанавливаем пакет:
# rpm -i rpmforge-release-*.rpm

Переходим к установке phpmyadmin:
# yum install phpmyadmin

Устанавливаем доступ с определенных ip:
# vi /etc/httpd/conf.d/phpmyadmin.conf

#
#  Web application to manage MySQL
#

<Directory "/usr/share/phpmyadmin">
  Order Deny,Allow
  Deny from all
  Allow from 127.0.0.1 192.168.0.0/24
</Directory>

Alias /phpmyadmin /usr/share/phpmyadmin
Alias /phpMyAdmin /usr/share/phpmyadmin
Alias /mysqladmin /usr/share/phpmyadmin

Правим следующий файл
# vi /usr/share/phpmyadmin/config.inc.php

Меняем в нем
$cfg['Servers'][$i]['auth_type'] = ‘cookies‘;

на
$cfg['Servers'][$i]['auth_type'] = ‘http‘;

Перезапускаем веб сервер:
# service httpd restart

Набираем в браузере
http://<ip адрес сервера или доменное имя>/phpmyadmin/

phpmyadmin можно изменить ню любое другое слово
http://<ip адрес сервера или доменное имя>/phpmyadmin/
Редактируем Alias в /etc/httpd/conf.d/phpmyadmin.conf

Второй вариант установки:
качаем
# wget http://sourceforge.net/projects/phpmyadmin/files/phpMyAdmin/3.4.5/phpMyAdmin-3.4.5-all-languages.zip/download?_test=goal

распаковываем в веб-директорию сервера, заходим и радуемся

Ошибки:
1. Крукозябра в phpmyadmin

2. При cookie-аутентификации

При cookie-аутентификации, в конфигурационном файле необходимо задать парольную фразу установив значение директивы $cfg['blowfish_secret'].
Решение:
в файле /usr/share/phpmyadmin/config.inc.php редактируем параметр $cfg['blowfish_secret']. Необходимо это для того, чтобы зашифровать пароль, используя cookie. Пример:
$cfg['blowfish_secret'] = 'super_puper_secret';

3. Невозможно загрузить расширение mcrypt! Проверьте настройки PHP.

Решение: Необходимо поставить php-mcrypt и libmcrypt

Настройка сети в CentOS Linux

Разберем настройку сетевого интерфейса и маршрутов в Linux. В данном случае на примере CentOS.

Системные файлы конфигурации:
/etc/hosts – список ip-адресов и назначенных им имен.
/etc/resolv.conf – в этом файле указываются DNS сервера. DNS-сервер задается директивой nameserver
пример:
[root@localhost ~]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 8.8.8.8
[root@localhost ~]#

/etc/host.conf – файл указывает последовательность использования механизмов разрешения имени.
Пример: (сначала используем /etc/hosts а только потом DNS-сервер)
[root@localhost ~]# cat /etc/host.conf
order hosts,bind
[root@localhost ~]#

/etc/init.d/network – скрипт останавливающий и запускающий работу сети
/proc/sys/net/ipv4/ip_forward – включение маршрутизации для своих интерфейсов, если у вас два или более интерфейсов её нужно включить.
Проверить включен или нет:
[root@localhost ~]# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0
[root@localhost ~]#

или
[root@localhost ~]# cat /proc/sys/net/ipv4/ip_forward
0
[root@localhost ~]#

или
[root@localhost ~]# grep forward /etc/sysctl.conf
# Controls IP packet forwarding
net.ipv4.ip_forward = 0
[root@localhost ~]#

Включить: (Действовать будет до перезагрузки)
[root@localhost ~]# echo '1' > /proc/sys/net/ipv4/ip_forward
У вас есть новая почта в /var/spool/mail/root
[root@localhost ~]#

или
[root@localhost ~]# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
[root@localhost ~]#

/etc/sysconfig/network — указываем, является ли наш сервер доступным по сети, по каким протоколам и указываем наше имя сервера.
[root@localhost ~]# cat /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=alice2k.ru
[root@localhost ~]#

Здесь можно указывать default gateway
GATEWAY=192.168.1.1 — в этом случае gateway имеет адрес 192.168.1.1, у вас может быть другой.
Описание:
NETWORKING=yes — будет ли наш сервер работать в сети
NETWORKING_IPV6=no — тоже самое только для Ip6
HOSTNAME=centos52 — имя нашего сервера
/etc/sysconfig/network-scripts/ — скрипты влияющие на работу сетевого интерфейса
Для нас самое большое значение имеют скрипты ifcfg-*. Именно в них описываются настройки сетевых интерфейсов присутствующих в сервере.
[root@localhost ~]# ls -l /etc/sysconfig/network-scripts/ifcfg-*
-rw-r--r-- 1 root root 274 Мар 17 00:06 /etc/sysconfig/network-scripts/ifcfg-eth0
-rw-r--r-- 1 root root 254 Июл  4  2009 /etc/sysconfig/network-scripts/ifcfg-lo
[root@localhost ~]#

Описание параметров и их значения:
BOOTPROTO — (static,none,dhcp,bootp)
DEVICE — (eth0) название интерфейса
HWADDR — (00:0C:29:43:5B:3D) — MAC-адрес нашей сетевой карты.
ONBOOT — (yes) — включать ли этот интерфейс автоматически при включение сервера.
IPADDR — (127.0.0.1) — ip-адрес интерфейса.
NETMASK — (255.0.0.0) — сетевая маска
NETWORK — (127.0.0.0) — сеть в которой находится наш ip-адрес
BROADCAST — (127.255.255.255) — адрес широковещательной рассылки
GATEWAY — (192.168.0.1) — шлюз через который мы попадаем в другие сети
Настройки для DHCP
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
Настройки для статики:
DEVICE=eth0
BOOTPROTO=static
BROADCAST=192.168.0.255
IPADDR=192.168.0.88
NETMASK=255.255.255.0
NETWORK=192.168.0.0
GATEWAY=192.168.0.1
ONBOOT=yes
Прописываем маршруты
root@localhost ~]# netstat -r
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
192.168.77.0    *               255.255.255.0   U         0 0          0 eth0
link-local      *               255.255.0.0     U         0 0          0 eth0
default         192.168.77.77   0.0.0.0         UG        0 0          0 eth0
[root@localhost ~]# 

или
[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.77.0    *               255.255.255.0   U     0      0        0 eth0
link-local      *               255.255.0.0     U     1002   0        0 eth0
default         192.168.77.77   0.0.0.0         UG    0      0        0 eth0
[root@localhost ~]#

/etc/sysconfig/network-scripts/route-eth0 — статический маршрут для eth0
Для того чтобы прописать маршруты для какого либо интерфейса, необходимо создать файл route-<название интерфейса> в каталоге /etc/sysconfig/network-scripts/ После того как все готово к работе, мы перезагружаем сетевой сервис.
Пример:
[root@localhost ~]# cat /etc/sysconfig/network-scripts/route-eth1
192.168.148.0/24 via 192.168.147.1
[root@localhost ~]#

или
[root@localhost ~]# route add -net 192.168.148.0/24 gw 192.168.147.1


Другие примеры:
настройка сети в консоли
system-config-network-tui

настрока сети в графике
system-config-network-gui

Посмотреть настройки сети:
toor@babylol:~$ ifconfig
eth0      Link encap:Ethernet  HWaddr 90:e6:ba:44:a4:3d  
          inet addr:192.168.15.199  Bcast:192.168.15.255  Mask:255.255.255.0
          inet6 addr: fe80::92e6:baff:fe44:a43d/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6739839 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6370782 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:3046437053 (3.0 GB)  TX bytes:1870686129 (1.8 GB)
          Interrupt:20 Память:f9fc0000-f9fe0000 

toor@babylol:~$ 

Настройки сетевых интерфейсов хранятся в /etc/sysconfig/network-scripts/
[root@nskgw etc]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
NM_CONTROLLED="yes"
ONBOOT=yes
HWADDR=00:1B:21:8E:31:44
TYPE=Ethernet
BOOTPROTO=dhcp
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth0"
UUID=5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03
[root@nskgw etc]# 

[root@babylol etc]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
BROADCAST=192.168.12.255
HWADDR=00:19:5B:72:57:C5
IPADDR=192.168.12.200
NETMASK=255.255.255.0
NETWORK=192.168.12.0
ONBOOT=yes
[root@a2k etc]# 

Рестарт сеть:
[root@a2k ~]# /etc/init.d/network restart
Деактивируется интерфейс eth0:                             [  OK  ]
Деактивируется интерфейс-петля:                            [  OK  ]
Активируется интерфейс loopback:                           [  OK  ]
Активируется интерфейс eth0:                               [  OK  ]

Настройка сети с помощью ifconfig и route.
[root@a2k ~]# ifconfig -a eth0 192.168.1.200 netmask 255.255.255.0
[root@a2k ~]# route add default gw 192.168.1.100

Установка дополнительного жесткого диска в CentOS

Итак. У нас есть установленная система CentOS 5.6 и есть желание поставить еще один диск на котором планируем размещать файлы ftp.
В ОС Linux разделы называются:
/dev/hda — это Primary Master
/dev/hdb — Primary Slave
/dev/hdc — Secondary Master
/dev/hdd — Secondary Slave
Первый раздел на Primary Master называется /dev/hda1, второй — /dev/hda2 и т.д.

Читать дальше →

utf8 - кодировка по умолчанию в mysql

При добавлении следующих строк, кодировка по дефолту становится UTF-8
/etc/mysql/my.cnf
[client]
default-character-set = utf8
[mysql]
default-character-set  =utf8
[mysqld]
default-character-set = utf8
skip-character-set-client-handshake
collation-server = utf8_unicode_ci
init-connect = 'SET NAMES utf8'
character-set-server = utf8

как сбросить пароль root mysql

требуется: сменить пароль root

установлен mysql server 5.1 essential
останавливаем сервис: net stop mysql
запускаем mysqld.exe –skip-grant-tables

открываем еще одну консоль, запускаем mysql под рутом без пароля:
mysql -uroot

выбираем базу mysql:
use mysql

меняем пароль рута:
UPDATE user SET Password=PASSWORD(’123123′) WHERE User=’root’;

готово.