Настраиваем свой собственный VDS на Linux с нуля
UPD: статья актуализирована от 02.2025.
Причина: FirstVDS поднял цены х2 на тарифы по виртуализации OpenVZ, тем самым мотивировав переезжать на сервера с KVM по старым ценам.
Бывает, что настает такой момент, когда мы начинаем понимать, что нам не хватает ограничений, наложенных виртуальным хостингом, и, наконец, собравшись духом, мы приобретаем выделенных виртуальный сервер на Linux, на котором, хм, кроме ssh-доступа на данный момент нет ничего. В этой статье я ничего не расскажу нового или сверхестественного, я ее просто помечу для себя, чтобы быстро настраивать очередной сервер, на случай переезда.
Что ж, смелее, приступим. Речь пойдет про выделенный сервер на основе Ubuntu 24.04 LTS
Чем будем редактировать
Многие инвалиды пользуются нано, но я таки советую использовать vim, тк не буду скрывать, что в нем настолько удобно работать, в том числе и создавать сайты прямо там, на удаленном сервере, не держа никаких локальных копий. Он может поначалу показаться сложным, но потом вы просто жить без него не сможете. Ставим:
$ apt install vim
UPD: кажется на Ubuntu 24.04 vim
был уже предустановлен, это радует.
Чтобы выйти из вима, напишите :q
. Ура! У вас получилось) Чтобы начать пользоваться - загуглите что нибудь на тему "vim basics" и я думаю уже через 10 минут вы запросто сможете начать править конфиги на лету.
Чуть правее мне припомнилась довольно забавная шутка про emacs.
Меняем ssh-порт сервера по умолчанию
Немножко повышает безопасность вашего сервера от взлома злоумышленника. Но пока он не просканирует открытые порты на нем. Тем не менее я не оставляю 22 порт по умолчанию, чтобы лишний раз туда не долбились нежданные гости.
$ vim /etc/ssh/sshd_config
Меняем параметр Port вместо 22 на любой свой перезапускаем
$ service ssh restart
Теперь можно подключиться к серверу, используя дополнительный параметр -p
$ ssh root@yourserver -p
YOUR_CUSTOM_PORT
Также, чтобы потом не вводить постоянно порт при подключении, нужно поправить конфиг ssh на локальной машине
$ vim ~/.ssh/config
Этого файла может и не быть у вас, даже папки .ssh, но тем не менее туда нужно написать
Host
YourServerIp
PortYourSSHPort
Делаем авторизацию на сервер без ввода пароля по RSA ключу
Постоянно вводить пароль надоедает. Можно сгенерировать ключ на своей машине и заходить туда без ввода пароля. Для этого на своей машине делаем
$ ssh-keygen
Соглашаемся со всем, если машиной пользуетесь не только вы, то рекомендуется ввести какой-нибудь пароль, который будет запрашиваться при попытке использования ключа. Затем копируем ваш паблик кей на сервер
$ ssh-copy-id root@
yourserver
В последний раз вводим пароль от сервера, после этого можно подключится как обычно:
ssh root@
yourserver
Выключаем SSH-авторизацию по паролю (рекомендуется)
Чтобы исключить возможность взлома вашего сервера путем подбора паролей рекомендуется вообще отключить авторизацию на SSH по паролю. Перед этим желательно настроить авторизацию по Publickey к серверу с нескольких запасных машин на случай поломки/кражи вашего текущего девайса. Также хостинг как правило умеет по запросу сбросить SSH пароль на вашем сервере.
$ vim /etc/ssh/sshd_config
Находим строчку PasswordAuthentication
и меняем с yes на no. Ребутаем тачку
$ service ssh restart
Устанавливаем Apache2 и PHP8
Ставим веб сервер вместе с PHP.
$ apt install apache2 libapache2-mod-php php php-curl php-gd
После установки убедимся, что все работает
$ cd /var/www/html/
$ rm index.html
$ vim index.php
В открывшемся новом файле напишем
<!--?php phpinfo(); ?-->
Сохраняем файл в виме, нажав :x
. Теперь можно открыть браузер и написать айпишник вашего сервера. На нем вы увидите информацию о php :)
Устанавливаем MySQL
$ apt install mysql-server mysql-client php-mysql
После установки подключимся к свежеустановленному серверу. При этом пароль рута не задан, нужно нажать Enter при запросе пароля.
mysql -uroot -p
Кажется было бы неплохо поменять пароль от рут пользователя MySQL сервера. Подключившись к MySQL серверу, напишем:
ALTER USER 'root'@'localhost' IDENTIFIED BY '
MyNewPass
';
Также имеет смысл создать отдельного пользователя, который будет непосредственно задан в конфиге вашего будущего вебсайта
CREATE USER '
user
'@'localhost' IDENTIFIED BY 'password
';GRANT ALL PRIVILEGES ON *.* TO '
user
'@'localhost';
Перенос баз данных со старого сервера
Если необходимо импортировать базы данных с предыдущего хостинга, необходимо сделать на нем дамп. Возможно что у вас данные хранились на старом MySQL-сервере с более не поддеживающимся движком MyISAM, однако в новых MySQL по умолчанию используется InnoDB. Здесь очень важно сдампить только необходимые ваши базы данных, чтобы случайно не прихватить с собой системные таблицы mysql и так далее.
$ mysqldump -uroot -p --databases DATABASE1 DATABASE2 | gzip > databases.sql.gz
Затем можно напрямую скачать файл со старого хотсинга на новый через wget или scp. После этого для импорта необходимо написать уже на новом сервере
$ gunzip < databases.sql.gz | mysql -uroot -p
Кстати, если на предыдущем хостинге mysql сервер доступен извне, то mysqldump можно выполнять сразу на новом сервере, всего лишь указав удаленный адрес сервера, используя параметр --host="remoteIp"
Отправка почты с сервера для сайтов
Обычно большинство php скриптов отправляют почту, испозуя простую функцию mail
. В свою очередь php использует утилиту sendmail. Но мы не собираемся устанавливать свой почтовый сервер, это не выгодно по ресурсам, будем использовать яндекс-почту к примеру для отправки писем. Для этого установим:
$ apt install sendmail ssmtp
Подредактируем конфиг /etc/ssmtp/ssmtp.conf
root=postmaster # The place where the mail goes. The actual machine name is required no # MX records are consulted. Commonly mailhosts are named mail.domain.com mailhub=smtp.yandex.ru:465 # Where will the mail seem to come from? #rewriteDomain= # The full hostname hostname=example.com # Are users allowed to set their own From: address? # YES - Allow the user to specify their own From: address # NO - Use the system generated From: address FromLineOverride=YES UseTLS=YES AuthUser=email AuthPass=password
Если желаете, чтобы почта отправлялась от имени вашего домена, то для этого вам необходимо зарегистрировать свой домен и прикрутить к нему почтовый ящик на pdd.yandex.ru, тк яндекс не разрешает отправлять почту с несуществующих адресов.
Настраиваем виртуальные хосты в apache
Все сайты, как правило, хранятся по папочкам с точным названием домена в директории /var/www/
. Положим, у нас есть домен test.ru, а все файлы от сайта хранятся в папке /var/www/test.ru
. Убедимся, что у файлов и папок правильные аттрибуты для чтения и записи для пользователя www-data
, иначе apache не сможет их прочитать и отдать. А если у вас будет какое-нибудь кеширование / аплоад, то и записать ничего не сможет.
$ cd /var/www/
$ chown -R www-data:www-data .
Cоздадим для него виртуальный хост в настройках apache:
$ vim /etc/apache2/sites-available/default.conf
В новом файле напишем конфиг:
<VirtualHost *:80>
ServerAdmin admin@test.ru
ServerName test.ru
ServerAlias www.test.ru
DocumentRoot /var/www/test.ru/
ErrorLog ${APACHE_LOG_DIR}/test.error.log
CustomLog ${APACHE_LOG_DIR}/test.access.log combined<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /var/www/test.ru/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
</VirtualHost>
Сохраним файл и расскажем apache про новый сайт (если он еще не был включен):
$ a2ensite test.ru
$ service apache2 restart
Возможно еще понадобится включить модуль rewrite, если в вашем сайте используются ЧПУ вида http://mysite.com/pages/view/article_id, чтобы apache не пытался ходить по вложенным папкам и искать там файл article_id.
$ a2enmod rewrite
$ systemctl restart apache2
Кофигурация домена на DNS сервере
На DNS сервере необходимо прописать информацию о том, как резолвить ваш хост, какой IP ответить. У меня бесплатный DNS-сервера от регистратора домена Reg.ru, поэтому конфиг домена выглядит примерно так:
Тип записи | Поддомен | Значение |
---|---|---|
A | @ | server ip address |
A | www | server ip address |
Все, после того, как вы пропишите IP-адрес вашего сервера для вашего домена у DNS-сервера, то можно смело через 24 часа вбивать название вашего домена в адресную строку - и вуаля, сайт работает! По такой же аналогии настраиваются и остальные домены. Кстати, в качестве бесплатного днс-хостинга можно использовать бесплатную версию админки Яндекс 360 (бывший pdd.yandex.ru), а также прикрутить на домен яндекс-почту, чтобы вам могли письма отправлять прямо на адрес домена типа admin@test.ru.
Разруливаем статику и динамику с помощью nginx
При большой посещаемости на ваши домены имеет смысл распределить нагрузку для разного отдаваемого контента. Поговаривают, что статические файлы (картинки, скрипты, архивчики и тд) nginx отдает очень резво, по сравнению с apache, и при этом не отжирает так много памяти. А если запрашивается динамический контент, например скрипт, то он перенаправляет свой запрос к apache и работает как прокси-сервер.
Что ж, ставим nginx
$ apt install nginx
В итоге nginx будет слушать 80ый порт, тогда апач стоит повесить на какой-нибудь другой, например 8080. Поправим это в конфиге:
$ vim /etc/apache2/ports.conf
Заменяем параметры портов на свои:
NameVirtualHost *:8080
Listen 8080
Теперь настраиваем конфиг nginx
server {
listen 80 default; # этот конфиг - умолчательный для 80 порта
server_name _; # хитрый ключик, обозначающий, что этот конфиг применим для любого сайтаset $sathost $host; # В sathost будет лежать имя сайта. Так же должна называться директрия с сайтом
# убираем www
if ( $host ~ ^(www\.)?(.+)$ ) {
set $sathost $2;
}if (!-d /var/www/sites/$sathost) { # если не нашли директорию с именем запрошенного сайта
location / { # правила ниже применяются для любых запросов
set $sathost default-site-foler;
}
root /var/www/sites/$sathost; # конень сайта определяем автоматически
index index.php index.html index.htm; # в каком порядке искать индексные файлыproxy_pass http://serverIp:88;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;proxy_connect_timeout 120;
proxy_send_timeout 120;
proxy_read_timeout 180;
}location ~ \.(png|jpg|exe|deb|js|css)$ { # static
expires 1d;
break;
}location ~ /\.ht { # в файлах, начинающихся на «.ht» могут лежать пароли или оставшиеся настройки от Апача - отдавать это ни к чему.
deny all;
}
}
После правки этого конфига не забудьте поменять в настройках каждого сайта в /etc/apache2/sites-available
порт на 8080 в ноде VirtualHost
Все, теперь можно перезапустить nginx и apache и проверить работу ваших сайтов.
# service apache2 restart
# service nginx restart
Вроде бы это все из базовой настройки сервера. Казалось бы, ничего сложного и нет. Конфигурация называется LAMP и расшифровывается как Linux + Apache + MySQL + PHP