Настраиваем свой первый VDS сервер в роли веб-сервера №1

18 января 2013, 10:15
Добрый день.

Так уж сложилось, что последнее время пришлось достаточно часто менять VDS провайдеров, и каждый раз приходится заново настраивать систему, поэтому решил написать краткий конспект по настройке. Все нижеописанное корректно работает на ОС Linux Ubuntu server 12.04 LTS. В этой статье я опишу как установить и произвести первичную настройку nginx+apache2, eaccelerator, memcached, fure-ftpd, php, mysql, phpmyadmin а также панели управления игровыми серверами — open game panel.

Начну с краткого описания некоторых терминов.

VDS — он же VPS — Virtual Dedicated(Private) сервер — виртуальная машина, сервер — нужен он, когда обычного хостинга мало, а выделенный сервер дорого. На современном рынке провайдеров, которые предоставляют услуги по аренде VDS великое множество, и у каждого есть свои плюсы и минусы, но их мы обсуждать не будем.
Тип виртуализации — говоря простым языком это то, каким способом организована виртуальная машина. В настоящее время наиболее распространены OpenVZ и XEN. Плюс OpenVZ — низкая стоимость, так как в этом типе виртуализации для всех виртуальных машин запущенных на аппаратном сервере используется специально модифицированное ядро хост-системы. Минус этого типа виртуализации — невозможно менять параметры ядра ОС, также практически всегда присутствует оверселлинг (об это позже). А для серьезных проектов лучше использовать XEN или KVM виртуализацию — там гостевая ОС даже и не знает что она установлена на виртуальную машину, и с ОС можно делать практически все, чего душа пожелает, особенно на XEN-HWM и KVM.
Оверселлинг — провайдеры продают больше ресурсов, чем есть на самом деле. Работает это за счет того что клиенты редко используют ресурсы по тарифу на 100 процентов, но у недобросовестных провайдеров с завышенным коэффициентом оверселлинга могут наблюдаться проблемы, такие как крайне медленная работа машины или невыполнение скриптов по причине нехватки памяти. Возвращаясь к типам виртуализации на XEN и KVM оверселлинг практически невозможен технически.

Выбор хостинг-провайдера


Итак, вы решили купить услугу VDS. Как же следует выбирать провайдера. Начать следует с географии — где территориально будет располагаться ваш сервер.

Германия — плюсы: дешевые тарифы, быстрые каналы, безлимитный трафик, минусы — достаточно большая задержка до России — примерно 80мс, очень серьезно относятся к торрент трекерам, торрент клиентам, варезу и т. п.
Голландия, Канада — то же самое то и Германия, но немного дороже, но основной плюс — законодательство которое лояльнее относится к различным видам хранимой и передаваемой информации, за которую у нас по голове не гладят.
США — в большинстве своем считают трафик, большие пинги до России — в общем, не самый лучший вариант.
Россия, Украина — минимальные задержки до Российской аудитории, в большинстве случаев псевдобезлимитный трафик (снижение скорости после определенного порога или необходимость соблюдать пропорции входящего\исходящего Российского\зарубежного трафика), не самые надежные дата центры — практически в каждом периодически случаются массовые отключения сервиса на несколько часов, несмотря на три независимых электроввода, резервирование каналов интернет и дизель-генераторы.
Выбор типа виртуализации
Если позволяют ресурсы, то это однозначно KVM или XEN. Но не у всех провайдеров доступны эти типы виртуальных машин, да и денег оно стоит немного больших, нежели OpenVZ. Поэтому если ваш проект это некий сайт\два\десять с невысокой посещаемостью (примерно до 10000 уникальных хостов в день) и\или какой-нибудь ICQ чат, то OpenVZ для вас будет вполне достаточно.
Ну а если требуется выполнять какие-либо более ресурсоемкие задачи, такие как размещение игровых серверов или видеочаты лучше выбрать XEN | KVM, также эти типы виртуализации стоит выбирать, если есть необходимость создания VPN-туннелей. Здесь VPN поднять проще, чем на OpenVZ.
Настройка сервера

Далее буду рассказывать про разные фичи, которые я настраивал на своем сервере, какие-то могут быть вам полезны. Операционная систем, которую я использую — Ubuntu 12.04.1 LTS. Так как подавляющее большинство выполняющихся далее команд требуют root привилегий, а я человек ленивый то все действия я выполняю под рутом. Залогиниться сразу под рутом обычно нельзя, поэтому заходим под пользователем с правами sudo и выполняем команду sudo -s

Пересобираем ядро


Если вы выбрали OpenVZ, то можете смело пропускать эту часть статьи.
Данная процедура не даст ощутимого прироста производительности, и нужна эта процедура только для саморазвития и «потренироваться на будущее».
качаем исходники последней стабильной версии ядра с сайта kernel.org. На данный момент это версия 3.6.7

wget http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.6.7.tar.bz2


• Распаковываем архив

tar -xjf linux-3.6.7.tar.bz2


• Устанавливаем необходимые для компиляции пакеты

aptitude update
aptitude install build-dep linux kernel-package


• заходим в папку с исходниками и генерируем конфигурацию ядра. В нашем случае все будет проходить автоматически — в ядро будут включены только те модули, которые необходимы текущему железу. Если же вам хочется вручную сконфигурировать ядро, то прошу гуглить по запросу make config или make menugonfig.

cd linux-3.6.7
make localyesconfig


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

fakeroot make-kpkg —initrd —append-to-version=-custom kernel_image kernel_headers


• поднимаемся на каталог выше и устанавливаем пакеты

cd ..
dpkg -i linux-*.deb


• Перезагружаемся и проверяем, что ядро встало.

reboot
uname -r


• Вот и все, в вашей системе новое ядро.

Меняем часовой пояс и имя ПК


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

dpkg-reconfigure tzdata


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

hwclock —set —date=”11/24/2012 16:19:55«


• Чтобы изменить имя сервера, откроем файл /etc/hostname и заменим содержимое на желаемое имя сервера.

Устанавливаем nginx c бэкэндом apache2, PHP, MySQL, phpmyadmin


В этой части статьи мы установим и настроим веб-сервер, рассчитанный на большое количество соединений.

• Сначала установим стандартный „детский“ набор пакетов для веб сервера.

aptitude update
aptitude install mysql-server mysql-client libmysqlclient15-dev apache2 apache2-doc apache2-mpm-prefork apache2-utils libexpat1 ssl-certlibapache2-mod-php5 libapache2-mod-ruby php5 php5-common php5-curl php5-dev php5-gd php5-idn php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-mhash php5-ming php5-mysql php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl phpmyadmin g++


• Нас будут просить задать пароль от MySQL, потом спросят чем обрабатывать phpmyadmin — нужно ответить то апачем, и спросят пароль от MySQL для нужд phpmyadmin
• На момент написания статьи phpmyadmin автоматически не прописывался в конфигурации apache2, вследствие чего по адресу адрес_сайта.зона/phpmyadmin мы видим ошибку 404, поэтому открываем файл /etc/apache2/apache2.conf и в конец дописываем строчку

Include /etc/phpmyadmin/apache.conf


• Включаем модули apache2

a2enmod include
a2enmod rewrite
a2enmod suexec
a2enmod ssl


• Рисуем дефолтный конфиг апача. Для этого открываем /etc/apache2/sites-available/default стираем в этом файле все и пишем следующее:

<VirtualHost *:800>
ServerAdmin твой@e-mail

DocumentRoot /home/www/адрес_сайта.зона
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /home/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order deny,allow
deny from all
allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory „/usr/lib/cgi-bin“>
AllowOverride All
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>

ErrorLog /var/log/apache2/error.log

# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel crit

CustomLog /var/log/apache2/access.log combined

Alias /doc/ „/usr/share/doc/“
<Directory „/usr/share/doc/“>
Options Indexes MultiViews FollowSymLinks
AllowOverride All
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>

</VirtualHost>



• То, что указан восьмисотый порт — это не ошибка, на стандартном для http восьмидесятом порту будет висеть nginx. Параметр DocumentRoot по неизвестным мне причинам большинство советуют указывать /var/www/…, на мой же взгляд логичнее держать важные данные в /home — проще будет настраивать резервное копирование.
• Правим файл /etc/apache2/ports.conf

NameVirtualHost *:800
Listen 800


• Копируем файл /etc/apache2/sites-available/default в /etc/apache2/sites-enabled/адрес_сайта
• Директории и файлы с конфигами лучше называть по адресам сайтов т. к. в будущем это упростит поиск нужных конфигов\директорий, например /home/www/tweedle.ru /etc/apache2/sites-enabled/tweedle.ru
• Правим файл /etc/apache2/apache2.conf — меняем значение параметра MaxClients на 20, сделать это надо в двух местах.
• Прописываем репозиторий nginx, для этого откроем файл /etc/apt/sources.list и допишем в конец

deb http://nginx.org/packages/ubuntu/ precise nginx
deb-src http://nginx.org/packages/ubuntu/ precise nginx


• Устанавливаем nginx и apache2-mod-rpaf

wget http://nginx.org/keys/nginx_signing.key
apt-key add nginx_signing.key
aptitude update
aptitude install libapache2-mod-rpaf libpcre3 libpcre3-dev nginx


• Далее настроим nginx, для этого открываем файл /usr/local/etc/nginx/nginx.conf и заменяем содержимое следующим

user www-data;
worker_processes 1;

error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

events {
worker_connections 1024;
}

http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
server_names_hash_bucket_size 64;
access_log /var/log/nginx/access.log;

sendfile on;
#tcp_nopush on;

#keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on;


gzip on;
gzip_proxied any;
gzip_min_length 300;
gzip_http_version 1.0;
gzip_buffers 4 8k;
gzip_comp_level 9;
gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;
}


include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;


• в том случае если роль веб-сервера является основной ролью вашего сервера и\или сайты имеют большую посещаемость значение worker_processes выставляем равным количеству доступных ядер ЦП, в противном случае одного процесса будет вполне достаточно
• создаем конфиг для нашего сайта /etc/nginx/sites-enabled/адрес_сайта.зона

server {
listen 80;
server_name адрес_сайта.зона;
access_log /var/log/nginx.access_log;
location ~* \.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|tar|wav|bmp|rtf|swf|ico|flv|txt|xml|docx|xlsx|mp3|bsp)$ {
root /home/www/адрес_сайта.зона/;
index index.php index.html index.htm;
access_log off;
expires 30d;
}
location ~ /\.ht {
deny all;
}
location / {
proxy_pass http://127.0.0.1:800/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-for $remote_addr;
proxy_set_header Host $host;
proxy_connect_timeout 60;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_redirect off;
proxy_set_header Connection close;
proxy_pass_header Content-Type;
proxy_pass_header Content-Disposition;
proxy_pass_header Content-Length;
}
}


• устанавливаем memcached, никаких дополнительных настроек для него не требуеся

aptitude install memcached


• устанавливаем eAccelerator

aptitude install php5-dev
aptitude install make
cd /tmp/
wget https://github.com/downloads/eaccelerator/eaccelerator/eaccelerator-0.9.6.1.tar.bz2
tar xvjf eaccelerator-0.9.6.1.tar.bz2
cd eaccelerator-0.9.6.1


• теперь, прежде чем мы скомпилируем eAccelerator, поправим один баг в коде, из за которого возникают всяческие проблемы, например перестает работать авторизация в phpmyadmin. Откроем файл eaccelerator.c, строка 867. Заменим if (php_check_open_basedir(realname TSRMLS_CC)) { на if (php_check_open_basedir(p->realfilename TSRMLS_CC)) { Сохраняемся и продолжаем…

phpize
./configure —enable-eaccelerator=shared
make
make install



• Создаем папку для кэша, и даем на нее права

mkdir -p /var/cache/eaccelerator
chmod 0777 /var/cache/eaccelerator


• Настраиваем php для работы с eaccelerator, для этого откроем файл /etc/php5/apache2/php.ini и допишем сверху

[PHP]
extension = „eaccelerator.so“
eaccelerator.shm_size = „16“
eaccelerator.cache_dir = „/var/cache/eaccelerator“
eaccelerator.enable = „1“
eaccelerator.optimizer = „1“
eaccelerator.check_mtime = „1“
eaccelerator.debug = „0“
eaccelerator.filter = „“
eaccelerator.shm_max = „0“
eaccelerator.shm_ttl = „0“
eaccelerator.shm_prune_period = „0“
eaccelerator.shm_only = „0“
eaccelerator.compress = „1“
eaccelerator.compress_level = „9“
eaccelerator.allowed_admin_path = „/var/www/eaccelerator“


• Перезапускаем сервисы, убедившись что в /home/www/имя_сайта лежит сайт

service apache2 restart
service nginx restart
service memcached restart


• Теперь мы имеем достаточно шустрый веб-сервер, который потребляет меньше 100Мб оперативной памяти. Todo: Есть один недочет — phpmyadmin, который доступен по адресу адрес_сайта.зона/phpmyadmin отображается некрасиво(без картинок), временное решение, которое я могу предложить — открывать phpmyadmin по адресу адрес_сайта.зона:800/phpmyadmin

Установка FTP сервера pure-ftpd с поддержкой MySQL


ФТП сервер пригодиться нам для простого и быстрого и удобного переноса информации с сервера и на сервер.
• Устанавливаем pure-ftpd с поддержкой mysql

aptitude install pure-ftpd-mysql


• Создаем группу для пользователей ftp и пользователя в ней — это делается для того чтобы впоследствии было удобней следить за тем, что происходит на вашем сервере.

groupadd -g 4001 ftpusers && useradd -u 4001 -s /bin/false -d /bin/null -c „pureftpd user“ -g ftpusers ftp


• Создадим базу данных в MySQL для pure-ftpd. Это можно сделать и через phpmyadmin, но великим и могучим копипастом это быстрее сделать в консоли

mysql -u root —p


CREATE DATABASE pureftpd;
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO 'pureftpd'@'localhost' IDENTIFIED BY 'пароль_для_pureftpd';
FLUSH PRIVILEGES;


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

USE pureftpd;
CREATE TABLE ftpd (
User varchar(16) NOT NULL default '',
status enum('0','1') NOT NULL default '0',
Password varchar(64) NOT NULL default '',
Uid varchar(11) NOT NULL default '-1',
Gid varchar(11) NOT NULL default '-1',
Dir varchar(128) NOT NULL default '',
ULBandwidth smallint(5) NOT NULL default '0',
DLBandwidth smallint(5) NOT NULL default '0',
comment tinytext NOT NULL,
ipaccess varchar(15) NOT NULL default '*',
QuotaSize smallint(5) NOT NULL default '0',
QuotaFiles int(11) NOT NULL default 0,
PRIMARY KEY (User),
UNIQUE KEY User (User)
) ENGINE=MyISAM;

quit;



• Теперь настроим pure-ftpd, для этого откроем файл /etc/pure-ftpd/db/mysql.conf и сделаем его содержание таким:

MYSQLSocket /var/run/mysqld/mysqld.sock
MYSQLUser pureftpd
MYSQLPassword пароль_для_pureftpd
MYSQLDatabase pureftpd
MYSQLCrypt md5
MYSQLGetPW SELECT Password FROM ftpd WHERE User=»\L» AND status=«1» AND (ipaccess = «*» OR ipaccess LIKE «\R«)
MYSQLGetUID SELECT Uid FROM ftpd WHERE User=»\L» AND status=«1» AND (ipaccess = «*» OR ipaccess LIKE «\R«)
MYSQLGetGID SELECT Gid FROM ftpd WHERE User=»\L«AND status=»1» AND (ipaccess = «*» OR ipaccess LIKE «\R«)
MYSQLGetDir SELECT Dir FROM ftpd WHERE User=»\L«AND status=»1» AND (ipaccess = «*» OR ipaccess LIKE «\R«)
MySQLGetBandwidthUL SELECT ULBandwidth FROM ftpd WHERE User=»\L«AND status=»1» AND (ipaccess = «*» OR ipaccess LIKE «\R«)
MySQLGetBandwidthDL SELECT DLBandwidth FROM ftpd WHERE User=»\L«AND status=»1» AND (ipaccess = «*» OR ipaccess LIKE «\R«)
MySQLGetQTASZ SELECT QuotaSize FROM ftpd WHERE User=»\L«AND status=»1» AND (ipaccess = «*» OR ipaccess LIKE «\R«)
MySQLGetQTAFS SELECT QuotaFiles FROM ftpd WHERE User=»\L«AND status=»1» AND (ipaccess = «*» OR ipaccess LIKE «\R«)


• Теперь сделаем так, чтобы домашняя директория пользователя автоматически создавалась если она не существует

echo „yes“ > /etc/pure-ftpd/conf/CreateHomeDir


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

echo „yes“ > /etc/pure-ftpd/conf/ChrootEveryone


• И наконец отключим проверку хостнеймов пользователей — это значительно ускорит процесс авторизации и немного сократит количество трафика.

echo „yes“ > /etc/pure-ftpd/conf/DontResolve


• Перезапустим сервис чтобы применить настройки

service pure-ftpd-mysql restart


• Теперь создадим пользователя www-ftp с GID и UID 4002, домашней директорией /home/www лимитами скорости загрузки\отдачи по одному мегабайту в секунду и без ограничений по занимаемому дисковому пространству. Приведу пример с использованием командной строки, вы же можете использовать и „выполнить SQL-запрос“ в phpmyadmin, или даже воспользоваться „добавить строки“ в phpmyadmin — но в этом случае нужно не прошляпить то, что пароль в БД храниться в виде его md5 хеша, и в поле password выбрать „Функция“ md5

mysql -u root -p


USE pureftpd;
INSERT INTO `ftpd` (`User`, `status`, `Password`, `Uid`, `Gid`, `Dir`, `ULBandwidth`, `DLBandwidth`, `comment`, `ipaccess`, `QuotaSize`, `QuotaFiles`) VALUES ('www-ftp', '1', MD5('пароль_для_пользователя_www-ftp'), '4002', '4002', '/home/www', '1024', '1024', 'Комментарий', '*', '0', '0');
quit;


• Вот и все, можно пробовать подключаться к вашему фтп серверу по адресу адрес_сайта.зона c логином www-ftp и указанным паролем.
• Если вы собираетесь передавать по протоколу ФТП данные, которые не должны попасть в чужие руки, то не лишним будет настроить TLS шифрование. Для этого выполним следующее:

echo 1 > /etc/pure-ftpd/conf/TLS
mkdir -p /etc/ssl/private/


• Устанавливаем пакет openssl, если он не установлен и генерируем сертификат.

aptitude update
aptitude install openssl
openssl req -x509 -nodes -days 3652 -newkey rsa:2048 -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem


• Отвечаем на вопросы — эти данные будут отображаться в созданном сертификате.
• Устанавливаем права доступа на сертификат и перезапускаем pure-ftpd

chmod 600 /etc/ssl/private/pure-ftpd.pem
service pure-ftpd-mysql restart


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