Создаем игровые сервера и сдаем их в аренду

Тема в разделе "Администрирование серверов", создана пользователем odies, 20 мар 2013.

  1. odies

    odies

    Регистрация:
    20 мар 2013
    Сообщения:
    9
    Симпатии:
    6
    Здравствуйте уважаемые пользователи!
    Сегодня я поделюсь с вами секретом, как я создавал игровые сервера с последующей сдачей в аренду.
    В данной теме я объясню как арендовать виртуальный сервер "VDS" (VDS — он же VPS — Virtual Dedicated(Private) сервер — виртуальная машина, сервер — нужен он, когда обычного хостинга мало, а выделенный сервер дорого), как его настроить и как начать зарабатывать деньги с умом.
    Так сложилось, что легче всего и без проблем у меня получилось работать толька с ОС Ubuntu, поэтому на протяжении всей статьи я буду использовать только ее. И так, приступим.
    Уверенно настраиваем себя на успех, и первым делом идем покупать наш будущий сервер. После покупки сервера сразу обращаемся в Тех Поддержку и просим установить нам на сервер Ubuntu - 12.04.1 LTS. Для работы я заранее советую использовать удобнейшую программку Bitvise SSH Client. Она отличается от стандартных ssh клиентов тем, что одновременно работая в консоли, мы можем одновременно в режиме проводника просматривать файлы сервера, папки, создавать, удалять, скачивать и закачивать файлы.

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

    В этой части статьи мы установим и настроим веб-сервер, рассчитанный на большое количество соединений.
    • Сначала установим стандартный «детский» набор пакетов для веб сервера.
    Код:
    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 [email protected]
    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/myserv.ru /etc/apache2/sites-enabled/myserv.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")[code]
     
    [LIST]
    [*]Теперь сделаем так, чтобы домашняя директория пользователя автоматически создавалась если она не существует
    [/LIST]
    [code]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 шифрование со стороны клиента, и далеко не все фтп клиенты поддерживают его.
    Установка комплекса управления игровыми серверами – Open Game Panel

    Open game panel – он же OGP — единственное из мною найденных бесплатное решение, которое позволяет осуществлять мониторинг и управление разнообразными игровыми серверами. На момент написания статьи поддерживаются более 50 разных игр с серверами на платформах Windows и Linux. В том числе такие популярные как Counter-Strike (2D, 1.5, 1.6, Source, GO) и Minecraft( Vanilla, Bukkit)
    Состоит комплекс из двух частей – веб-морды, через которую осуществляется мониторинг и управление(фронтэнд) и агента – сервиса, который висит на машинах с игровыми серверами и передает логи в фронтэнд, а команды из фронэнда игровым серверам.
    • Первым делом регистрируемся на http://www.opengamepanel.org – для установки это не обязательно, но на сайте можно скачать дополнительные модули(например систему биллинга), темы и прочие плюшки.
    • Устанавливаем необходимые пакеты
    Код:
    aptitude update
    aptitude install libxml-parser-perl libpath-class-perl libarchive-any-perl screen/[code]
    [LIST]
    [*]Если система x64, то дополнительно устанавливаем ia32-libs
    [/LIST]
    [code]aptitude install ia32-libs
    • Скачиваем сам агент
    Код:
    wget "http://www.opengamepanel.org/downloads/ogp_agent_nightly.tar.gz" -O agent.tar.gz
    tar xf agent.tar.gz
    cd agent
    • Устанавливаем. Внимание – я предварительно создал пользователя в системе, включил его в группы root и sudo и создал ему домашний каталог – это все необходимо для того чтобы агент корректно работал.
    Код:
    bash ./install.sh
    • У нас будут спрашивать имя пользователя под которым будет крутиться сервис – нужно указать того, про которого я говорил в предыдущем пункте, его пароль, директорию в которой будут находиться исполняемые файлы(/home/имя пользователя/OGP) и попросят ввести ключ агента – это не пароль пользователя, а ключ управления агентом, он нам пригодится позже, и еще нас попросят согласиться с правилами политики Steam.
    • После установки залогиниваемся под созданным пользователем и запускаем
    Код:
    cd /home/имя пользователя/OGP
    perl ./ogp_agent.pl --log-stdout
    • Нам должны написать что все в порядке, процесс запущен и слушает на 12679 порту.
    • Нажимаем ctrl+c, логинимся под рутом и прописываем – это нужно для того чтобы сервис стартовал при запуске ситемы
    Код:
    update-rc.d ogp_agent defaults
    • Если серверов (выделенных или виртуальных) несколько, то агент необходимо установить на каждом
    • Теперь установим веб-интерфейс от OGP, скачиваем архив и распаковываем
    Код:
    wget "http://www.opengamepanel.org/downloads/ogp_web_nightly.tar.gz" -O upload.tar.gz
    tar xf upload.tar.gz
    • Перемещаем содержимое папки upload в папку, в которой у нас лежит сайт
    • В браузере открываем адрес_сайта.зона/папка_с_ogp/ и выбираем язык, если вдруг насм говорят что не хватает прав на создание каких-либо файлов или папок то выдаем права 777 chmodом, для этого зайдем в папку с ogp и выполним команду.
    Код:
    chmod 777 –v –R *
    Возвращаемся в веб-интерфейс и нажимаем «Повторить», потом «Дальше»
    • Указываем параметры подключения к БД и нажимаем «Дальше»
    • Регистрируем учетную запись администратора и нажимаем «Дальше»• Далее следуем инструкциям, возможно в следующей статья я опишу процесс добавления серверов в OGP
     
    Big-Proger, AlexV и Baco нравится это.