В этой мини статье я опишу своими словами как быстро и не имея специальных знаний перейти с хостинга на VPS.
Кому это пригодится:
· тем, кому просто интересно
· тем, кого достало анальное рабство постоянные ограничения со стороны хостера
· тем, кто надумал перейти на VPS, но не хватает теоретических знаний
В этом примере я рассмотрю следующие моменты:
· установка панели управления сервером
· обновление php до версии 5.5.* с родным кешированием
· замена mysql на mariadb
· небольшие твики конфигов сервера
Что потребуется:
· VPS c debian 7 и ssh доступом к нему
· любой клиент ssh (putty для винды, в маке и линуксе уже есть терминал)
· знание вашей cms (где лежат конфиги, как их править и т.п.)
· умение пользоваться днс (настройка A записи)
· базовые знания командной строки линукс
· базовые знания английского языка
· внимательность
Приступим. В качестве примера я буду использовать VPS c 1 cpu 1000mhz, 512 ram и 20gb ssd. Операционная система – debian 7 x86 (32-bit). Если вы предполагаете, что ваши сайты потребуют больших ресурсов (скажем больше 2gb памяти), то выбираем debian 7 x64.
Соединяемся по SSH с сервером от рута:
login: root
root@128.199.37.177's password:
Linux prcy 3.2.0-4-686-pae #1 SMP Debian 3.2.54-2 i686
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
В первую очередь проверим обновления. Вводим по очереди это команды:
apt-get update
apt-get upgrade
Приступаем к установке панели управления VestaCP. Vesta – легкая, бесплатная панель от русских разработчиков с удобным и понятным интерфейсом. Не жрет ресурсы как ISP или Cpanel, имеет отдельный независимый пакет php и nginx (будет работать даже если вы накосячите где-то в конфигах) и имеет хорошую поддержку.
В первую очередь нужно удалить exim4, который идёт в комплекте с Debian 7.
aptitude purge ~iexim4
apt-get purge exim4 exim4-base exim4-config exim4-daemon-light
Если нет curl (который используется ниже), ставим его:
apt-get install curl
Ставим панель:
curl -O http://vestacp.com/pub/vst-install.sh
bash vst-install.sh
Когда сервер спросит:
Do you want to proceed? [y/n]):
Пишем y и энтер.
Указываем рабочий e-mail. Туда придёт пароль от панели.
Указываем хостнейм. Я указываю тот, что написан в квадратных скобках.
Do you want to proceed? [y/n]): y
Please enter valid email address: mr.devilstar@gmail.com
Please enter hostname [prcy]: prcy
Ждем. Установка с хорошим каналом и ssd дисками занимает минуты полторы-две:
=======================================================
-------------------------------
https://128.199.37.177:8083
username: admin
password: GsdH73Gppe
-------------------------------
Congratulations,
you have successfully installed Vesta Control Panel.
Сохраняем пароль, запоминаем адрес для входа в панель.
Заходим по предложенному адресу, удостоверяемся что панель работает:
Возвращаемся к ssh, смотрим какие версии php и mysql у нас установились:
root@prcy:~# php -v
PHP 5.4.34-0+deb7u1 (cli) (built: Oct 20 2014 09:46:02)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
root@prcy:~# mysql -v
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 62
Server version: 5.5.40-0+wheezy1 (Debian)
php 5.4.34, а бд – mysql 5.5.40.
Сейчас наша цель обновить php и заменить mysql на mariadb. Обновленный php позволит нам воспользоваться родным кешированием Zend OPcache, а mariadb жрет меньше памяти и работает быстрее (субъективно).
Открываем файл /etc/apt/sources.list в консоли, добавляем новые источники приложений:
nano /etc/apt/sources.list
Откроется файл. В самом конце добавляем четыре строки
deb http://packages.dotdeb.org wheezy all
deb-src http://packages.dotdeb.org wheezy all
deb http://packages.dotdeb.org wheezy-php55 all
deb-src http://packages.dotdeb.org wheezy-php55 all
Жмем CTRL+O и энтер. Закрываем файл по CTRL+X.
Скачиваем ключи:
wget http://www.dotdeb.org/dotdeb.gpg
Устанавливаем ключи:
apt-key add dotdeb.gpg
Обновляем список доступных к установке приложений в соответствии с изменениями выше:
apt-get update
Запускаем обновление приложений:
apt-get upgrade
Во время обновления сервер спросит:
*** my.cnf (Y/I/N/O/D/Z) [default=N] ?
Отвечаем N
Запускаем обновление самой системы:
apt-get dist-upgrade
Во время обновления может появиться это:
Жмем q
Проверяем какую версию php мы имеем теперь:
root@prcy:~# php -v
PHP 5.5.18-1~dotdeb.1 (cli) (built: Oct 22 2014 18:15:17)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend Technologies
Видим 5.5.x и родной кеш Zend OPcache.
Переходим к базам данных. Выполняем команды последовательно:
apt-get install python-software-properties
apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db
и ЛИБО
add-apt-repository 'deb http://mirror.mephi.ru/mariadb/repo/10.0/debian wheezy main'
ЛИБО (т.к. первый иногда тормозит из-за большой нагрузки)
add-apt-repository 'deb http://mirror.timeweb.ru/mariadb/repo/10.0/debian wheezy main'
Обновляем список приложений:
apt-get update
И тут, по идее, мы должны начать установку базы данных apt-get install mariadb-server , но получаем ошибку:
root@prcy:~# apt-get install mariadb-server
Reading package lists... Done
Building dependency tree
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:
The following packages have unmet dependencies:
mariadb-server : Depends: mariadb-server-10.1 (= 10.1.1+maria-1~wheezy) but it is not going to be installed
E: Unable to correct problems, you have held broken packages.
Нам мешает mysql, который поставил веста. Варварским способом избавимся от него (иногда эту команду нужно ввести дважды):
apt-get purge mysql* mariadb*
И запускаем установку базы:
apt-get install mariadb-server
Смотрим что у нас получилось:
root@prcy:~# service mysql status
[info] /usr/bin/mysqladmin Ver 9.1 Distrib 10.1.1-MariaDB, for debian-linux-gnu on i686
Отлично!
Открываем файл /usr/local/vesta/conf/mysql.conf и смотрим какой там у нас пароль на бд поставила веста:
nano /usr/local/vesta/conf/mysql.conf
Видим - PASSWORD='jbknjknkj34'. Запоминаем, может пригодиться при обновлениях.
Теперь пофиксим exim4. Дело в том, что вместе с mariadb ставится exim4-light, в то время как нам нужен exim4-heavy.
apt-get remove exim4-daemon-light
Ставим phpmyadmin для работы с базами данных:
apt-get install phpmyadmin
Проверяем:
http://128.199.37.177/phpmyadmin/
Работает J
Из под рута ставим права 777 на папку /var/lib/phpmyadmin/tmp
Тюним php.ini
nano /etc/php5/apache2/php.ini
Находим и меняем параметры на эти (или на какие вам захочется):
max_execution_time = 180
upload_max_filesize = 64M
post_max_size = 64M
Сохраняем CTRL+O, энтер, CTRL+X
Перезапускаем апач:
service apache2 restart
Тюним апач, что бы не иметь проблем с жором памяти:
nano /etc/apache2/apache2.conf
Находим там блок:
<IfModule mpm_prefork_module>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 200
MaxRequestsPerChild 4000
</IfModule>
И приводим его к этому виду (эти параметры идеально подходят для vps с 512mb памяти. если памяти больше – можно и нужно ставить значения выше):
<IfModule mpm_prefork_module>
StartServers 3
MinSpareServers 3
MaxSpareServers 9
ServerLimit 256
MaxClients 20
MaxRequestsPerChild 3000
</IfModule>
Сохраняем, перезапускаем апач:
service apache2 restart
С апачем закончили, тюним базу данных:
nano /etc/mysql/my.cnf
Находим и ставим следующие значения:
max_connections = 50
connect_timeout = 5
wait_timeout = 30
max_allowed_packet = 16M
thread_cache_size = 128
sort_buffer_size = 512K
bulk_insert_buffer_size = 16M
tmp_table_size = 16M
max_heap_table_size = 16M
myisam_recover = BACKUP
key_buffer_size = 8M
#open-files-limit = 2000
table_open_cache = 400
myisam_sort_buffer_size = 8M
concurrent_insert = 2
read_buffer_size = 512K
read_rnd_buffer_size = 512K
innodb_buffer_pool_size = 8M
innodb_log_buffer_size = 8M
innodb_file_per_table = 1
innodb_open_files = 400
innodb_io_capacity = 400
innodb_flush_method = O_DIRECT
Сохраняем, перезапускаем бд:
service mysql restart
Готово.
Тюним конфиг nginx. Мой nginx.conf решает следующие проблемы - в соответствии с рекомендациями Google Insights кеширует статику в браузере и сжимает всё что нужно сжимать.
nano /etc/nginx/nginx.conf
Заменяем этим:
# Server globals
user www-data;
worker_processes 2;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
# Worker config
events {
worker_connections 1024;
use epoll;
}
http {
# Main settings
sendfile on;
tcp_nopush on;
tcp_nodelay on;
client_header_timeout 1m;
client_body_timeout 1m;
client_header_buffer_size 2k;
client_body_buffer_size 256k;
client_max_body_size 100m;
large_client_header_buffers 4 8k;
send_timeout 30;
keepalive_timeout 60 60;
reset_timedout_connection on;
server_tokens off;
server_name_in_redirect off;
server_names_hash_max_size 512;
server_names_hash_bucket_size 512;
# Log format
log_format main '$remote_addr - $remote_user [$time_local] $request '
'"$status" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
log_format bytes '$body_bytes_sent';
#access_log /var/log/nginx/access.log main;
access_log off;
# Mime settings
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Compression
gzip on;
gzip_comp_level 9;
gzip_min_length 1000;
gzip_buffers 8 64k;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml;
gzip_proxied any;
# Proxy settings
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass_header Set-Cookie;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffers 32 4k;
# Cloudflare https://www.cloudflare.com/ips
set_real_ip_from 199.27.128.0/21;
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 104.16.0.0/12;
set_real_ip_from 172.64.0.0/13;
#set_real_ip_from 2400:cb00::/32;
#set_real_ip_from 2606:4700::/32;
#set_real_ip_from 2803:f800::/32;
#set_real_ip_from 2405:b500::/32;
#set_real_ip_from 2405:8100::/32;
real_ip_header CF-Connecting-IP;
# SSL PCI Compliance
ssl_session_cache shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
# Error pages
error_page 403 /error/403.html;
error_page 404 /error/404.html;
error_page 502 503 504 /error/50x.html;
# Cache
proxy_cache_path /var/cache/nginx levels=2 keys_zone=cache:10m inactive=60m max_size=512m;
proxy_cache_key "$host$request_uri $cookie_user";
proxy_temp_path /var/cache/nginx/temp;
proxy_ignore_headers Expires Cache-Control;
proxy_cache_use_stale error timeout invalid_header http_502;
proxy_cache_valid any 3d;
map $http_cookie $no_cache {
default 0;
~SESS 1;
~wordpress_logged_in 1;
}
# Wildcard include
include /etc/nginx/conf.d/*.conf;
server {
location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
expires max;
}
}
}
Приступаем к добавлению домена. Предполагается, что у вас стоит хороший днс, позволяющий управлять зоной (а вы умеете это делать). Допустим, у нас есть домен test.prcy. В управлении доменной зоной нам нужно задать для A записи IP вашего сервера. Допустим у сервера IP 128.199.37.177. Наши записи должны принять следующий вид:
Добавляем домен в панель управления сервером.
https://128.199.37.177:8083/list/web/ (вкладка web), жмем «добавить домен»
Выставляем параметры как указаны на скриншоте:
http://habrastorage.org/files/157/53b/0ab/15753b0abbf44ba38e0ae158708458c8.png
Почему я отключил поддержку почты? Потому что это лишняя и приличная нагрузка на сервер. В качестве почты для домена идеально подходит pdd.yandex.ru. Не поленитесь, настройте.
Создаем базу данных:
https://128.199.37.177:8083/list/db/ (вкладка DB), жмем «Добавить БД»
http://habrastorage.org/files/802/e8b/9f9/802e8b9f9ee543cbbeb2d07158f45058.png
Конектимся по фтп по данным, которые мы указывали когда добавляли домен.
Наш сайт, который будет открываться по домену test.prcy, должен будет лежать в папке public_html
Давайте удалим содержимое public_html и закачаем туда какой-нить тестовый архив (zip).
Пока архив закачивается, возвращаемся к SSH и отключаемся:
logout
Логинимся в SSH по новой, но уже не от root пользователя, а от admin (это принципиально важно). Пароль тот же что и от панели vesta.
Ставим утилиту, что бы распаковать наш архив.
sudo apt-get install unzip
Когда спросит пароль, вводим пароль от панели vesta.
Переходим в директорию, куда закинули архив:
cd web/test.prcy/public_html
Распаковываем архив:
unzip yoo_peak_demo_package_j33.zip
Проверяем:
http://habrastorage.org/files/292/bf6/7f3/292bf67f371c43fd93e18792ef205d09.png
Заканчиваем установку сайта и видим, что всё работает:
Сайт готов к использованию и выдержит приличную нагрузку (при конфигах, указанных выше, сайт держит нажатую F5 в течении 5 минут и спокойно открывается.
Вот таким нехитрым способом мы поставили и запустили сервер, настроили его и добавили для примера один сайт.
Не забываем, что вся работа с сайтами должна вестись от логина admin. А вся работа по настройке сервера от логина root. Иначе у вас возникнут проблемы с правами доступа и невозможностью записи файлов силами CMS.
Гайд писался параллельно с настройкой vps, каждая команда проверена и работает.
Именно этого гайда мне не хватало в свое время. Надеюсь кому-то это будет полезно.
bugfix #1. Если после рестарта сервера не стартует nginx:
из под рута открываем:
nano /etc/sysctl.conf
Вставляем в самый низ
net.ipv4.ip_nonlocal_bind = 1
Выполняем команду
sysctl -p /etc/sysctl.conf
Перезагружаем сервер
reboot
Главное наполняй сайт полезным контентом (к видео делай описания 500-1000 символов хотя бы).
Используй вордстат для выявления новых ключевых слов и для написания нового контента (про конкурентность не забудь, смотри выдачу, анализируй).
сделай описание всяких движений и т.д.
Внутреннюю перелинковку используй если получится т.е. из самой статьи ссылаться на другую новость или статью через ключевую фразу или слово.
а 3-й пункт вашей же ссылки??
Да и зачем приводить пример, коли написано как написано!!??
Подошел ты к продавцу купить хлеба, он тебе батон в пакет положил. Это не мой батон, мне нужен хлеб. Ок, хлеб завтра привезем, а батон можешь оставить себе.
Каждый из вас и сам ТС этот батон скушал бы с колбасой или маслом, а не подарил соседу или утилизировал=)
Обижаться в данном случае ТСу на себя, за неправильно выбранное слово, а заказчику раз уж так получилось, нужно понять ТСа, каждый совершает ошибки, может спешил человек.
Я бы оплатил в качестве компенсации половину стоимости. Мое мнение.