Соцсеть. VPS

Всем привет! Сегодня мы немного отвлечемся от кода и, пока готовится следующая статья, будем приобретать и настраивать VPS.

Мы, конечно, могли бы и обычный хостинг использовать, но вы, возможно, и так умеете с ним обращаться, а тут может хоть прокачаемся немного.

Сразу к делу!

Из провайдеров мне нравится DigitalOcean.

Кстати, если введёте код DROPLET10, получите 10$ на счет, чего вам хватит на 2 месяца (сервер с минимальной конфигурацией).

Сами сервера там называются дроплетами (то есть каплями, поскольку "digital ocean", игра слов и всё такое).

Шаг 1. Создание и настройка

Переходим на вкладку Droplets, где нам предлагают создать новый, поскольку в наличии других не имеем. Жмем "Create".

Нам необходимо выбрать дистрибутив и прочее, остановимся на последней Ubuntu (16.04 x64), тариф я выбрал самый дешевый, для начала хватит =)

Дата-центр выберите любой, я взял во Франкфурте.
Из галочек устанавливаем Private Networking (чтобы если мы потом возьмем еще сервер, они смогли между собой данные передавать; это бывает полезно, когда мы хотим вынести БД или статические файлы на отдельную машину, чтобы снизить нагрузку, да и много для чего, но до этого ещё дойдём), IPv6 (не критично).

Имя дроплета задаем какое нравится.

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

Нажимаем "Add your SSH keys" и видим окошко:

Теперь объясню, что такое пары ключей SSH. Они используются как надежный метод аутентификации (надежнее, чем пароли). Два ключа (открытый и закрытый, public и private соответственно) связаны друг с другом, причем приватный находится только у вас, и вы никому его не даете и не показываете, а публичный можете раздавать, куда душе угодно. Открытый ключ используется для шифрования данных и проверки электронной подписи, а закрытый - для генерации электронной подписи и расшифровки данных. Оба ключа математически связаны, и только закрытым ключом вы сможете расшифровать сообщение, зашифрованное открытым ключом.

Так вот нам эту пару необходимо сгенерировать, для чего скачаем PuTTY и PuTTYgen.

Запускаем PuTTYgen и нажимаем на Generate. Нам будет предложено поводить мышкой для рандома.

Из того, что получится, нам нужен ключ из верхнего поля (для authorized_keys, его мы и вставим в окошко на DigitalOcean; заодно сохраним куда-нибудь в файл на будущее), а также сохраним оба файла ключей.

Публичный сохраните с любым расширением (можно .txt), приватный - с .ppk

И заодно экспортните OpenSSH key, позже скажу зачем :)
Convertions > Export OpenSSH key

Вообще, можно для справки подглядывать в этот туториал:
https://www.digitalocean.com/community/tutorials/how-to-use-ssh-keys-with-putty-on-digitalocean-droplets-windows-users

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

Можно использовать и PuTTY, но мне больше по душе Bitvise SSH Client (он удобен и имеет кучу дополнительных фич)

Запускаем его. В поле Host вводим IP нашей машины, ssh порт по умолчанию 22, username пока что root. Переходим в keypair manager, чтобы указать созданный нами закрытый ключ. Жмем Import и выбираем тот, который мы создали с помощью "Export OpenSSH key", т.к. тот первый прога не хочет распознавать (хотя через PuTTY норм).

Затем в дропдауне Initial method выбираем слот 1 (т.к. мы задали только один ключ, а вообще их можно добавить сколько угодно) и кликаем на Login. Поскольку ключ используется впервые, то нам будет предложено сохранить его в БД. Против ничего не имеет, поэтому нажимаем Accept and Save. Далее должен открыться терминал.

Можете написать что-нибудь, например exit, и нажать Enter. Почувствовали себя хакером?)

Шаг 2. Настройка пользователя и аутентификации

Как видите, мы логинились как root (суперадминистратор), что не желательно делать на регулярной основе, т.к. полномочиями такого пользователя можно легко, пусть и случайно, что-то сломать. Поэтому мы создадим другого юзера, а логиниться под root'ом вообще запретим.

Для добавления используем команду adduser. Пример:

adduser vasiliy

(Если нужно сменить пароль существующему пользоателю, то можно такое вводить passwd vasiliy)

Там выскочит несколько вопросов, пароль задайте, остальные можно пропустить, нажимая Enter.
Но дело в том, что это обычный пользователь, а что если мы захотим (или нам потребуется) выполнить что-то с правами админа? Верно, добавим пользователя в группу sudo. В unix пользователи могут принадлежать к разным группам, у которых могут быть определенные права, так вот группа sudo дает возможность входящим в неё личностям творить чернуху от имени администратора.

usermod -aG sudo vasiliy

Впоследствии, чтобы выполнить что-то как админ, перед командой просто пишем sudo, например:

sudo delete all k chertyam

Попробуйте сами ;)

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

Переключимся, кстати, временно на свежесозданного юзера (замените vasiliy своим логином):

su - vasiliy

Далее создадим в домашней директории папку .ssh (~ обозначает домашнюю директорию, у каждого пользователя она своя):

mkdir ~/.ssh
chmod 700 ~/.ssh

Командой chmod мы поставили на папку такие права (700), что изменять ее может только создатель.

Теперь открываем (создаем) в папке .ssh файл с именем authorized_keys. Для этого воспользуемся редактором nano:

sudo nano ~/.ssh/authorized_keys

Копируем в буфер публичный ключ для authorized_keys (который мы вводили при создании дроплета), в окне терминала просто нажимаем правой кнопкой мыши и выбираем "Вставить".

Нажимаем CTRL-x, чтобы закрыть файл, и сохраняем изменения, подтверждая ENTER-ом имя файла. Ставим на файл другие права (чуть более жесткие):

chmod 600 ~/.ssh/authorized_keys

Чтобы вернуться к пользователю root, вводим:

exit

Для пущей безопасности нашего дроплета сделаем еще кое-какие махинации, в частности запретим логиниться root-ом, через пароль, по стандартному порту и т.п.

Убедитесь, что вы точно внесли запись о своем публичном ключе, а то придется всё заново делать, если вы сделаете следующие изменения и не сможете впоследствии подключиться.

Меняем конфигурацию SSH демона:

sudo nano /etc/ssh/sshd_config

Найдите строку с PasswordAuthentication, раскомментируйте её (удалив в начале #), измените значение на "no". Должно выглядеть так:

PasswordAuthentication no

Изменим стандартный порт для подключения.
Ищем строку Port 22, меняем на Port 2244 (можно свой другой указать).

Также установите следующие настройки:

PubkeyAuthentication yes
ChallengeResponseAuthentication no
PermitRootLogin no

Снова сохраняем и закрываем файл. Перезапускаем службу SSH:

sudo systemctl reload sshd

Ну всё, теперь, чтобы войти на сервер, вам нужно иметь ключ ;) И не забудьте в Bitvise SSH Client порт заменить на новый, а логин на созданный вами вместо root.

Шаг 3. Настроим файервол.

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

При установке многие приложения регистрируют свои профили в UFW, что позволяет файерволу управлять этими программами по имени. Одна из них - OpenSSH, как раз служит для того, чтобы мы могли подключаться к серверу по шифроманному ключу. Вы можете увидеть её в списке доступных приложений, введя следующую команду:

sudo ufw app list

Что выдаст на экран:

Available applications:
  OpenSSH

Но нам мало того, что она просто доступна, нам нужно её ещё и активировать (а то после включения файервола в следующий раз нас даже по ключу не пустит):

sudo ufw allow OpenSSH

Ну и теперь мы можем вкючить сам -великий китайский- файервол:

sudo ufw enable

Введите "y" и ENTER для продолжения. Проверим статус:

sudo ufw status

В итоге увидим:

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Между прочим, вы можете разрешить доступ к службе только с определенных IP, но пока не будем заморачиваться (да и нужно учитывать нюансы).

Ну и теперь то, ради чего мы вообще всё это дело затеяли.

Шаг 4. Устанавливаем Nginx.

Nginx (раньше я ломал язык, произнося "нгинкс", а потом выяснил, что это "энджин икс") это веб-сервер, как Apache, который обрабатывает и выдает пользователям запрошенные страницы. Он довольно шутстрый, легковесный и в целом имеет кучу плюсов (которые несложно нагуглить).

У Ubuntu есть стандартные репозитории пакетов, из которых можно ставить разнообразный софт. Это значит, что мы можем использовать команду apt-get для установки, не заморачиваясь, что конкретно откуда нужно качать

Поскольку мы сейчас (в данную сессию) используем apt впервые, то обновим наш локальный индекс пакетов:

sudo apt-get update

Если мы через некоторое время захотим ещё какую софтину поставить, то желательно обновить индекс снова. По завершении можно приступить к установке непосредственно Nginx.

sudo apt-get install nginx

На Ubuntu 16.04 Nginx запускается сразу после установки. Но у нас же есть firewall, и нужно разрешить к енджину подключения (для начала по 80 порту, стандартному http, в будущем еще и https разрешим, но до этого дойдем). Свой профиль Nginx в UFW установил, нам требуется всего лишь добавить разрешение для него.

sudo ufw allow 'Nginx HTTP'

И проверим:

sudo ufw status

Увидим следующее:

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
Nginx HTTP                 ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

Теперь перейдите в браузере на IP вашего сервера:
http://server_domain_or_IP
и вы должны увидеть приветствие "Welcome to Nginx".

Шаг 5. Устанавливаем MySQL

Тадам! Веб-сервер у нас есть, но без БД тоже никуда, так, че выбрать?.. Redis, MongoDb, Cassandra, CSV, TXT... надеюсь, вы поняли, что я шучу =) Начнем с MySQL.

sudo apt-get install mysql-server

Вас попросят указать root (главный) пароль для использования в MySQL (новый придумайте, не root от сервера). Установили, так легко, да-да =)

Правда ещё нужно провести небольшую настройку для безопасности. Запустим один скрипт:

sudo mysql_secure_installation

У вас спросят пароль от root аккаунта MySQL (который мы задали чуть выше), а также хотите ли вы настроить VALIDATE PASSWORD PLUGIN. Он проверяет, достаточно ли хороший пароль вы задаете. В принципе нам этот плагин не нужен, если вы и так ответственно подходите к выбору пароля (в необходимой степени сложный и длинный). Так что можно написать "no" и забить на него.

А вот для всего остального указываем "y" (типа как yes). Будут удалены анонимные пользователи и тестовые базы, отключится возможность подключаться удаленно (не с локального IP).

В общем, с БД пока разобрались, движемся дальше.

Шаг 6. Устанавливаем PHP7

Мы же не будем выдавать тупо статический html, так что нужно ставить PHP. У 7 версии улучшенная производительность по сравнению с предыдущими, и синтаксис теперь поддерживает множестно хороших и удобных фич.

Поскольку в Nginx не встроена обработка PHP как в некоторые другие веб-сервера, нам нужно установить php-fpm ("fastCGI process manager", интерфейс, через который сервер общается с php). А ещё поставим вспомогательный пакет php для "общения" с mysql:

sudo apt-get install php-fpm php-mysql

Теперь необходимо сделать небольшую настройку касательно (опять же) безопасности.

Откроем главный файл конфигов php-fpm (с привилегиями root-а):

sudo nano /etc/php/7.0/fpm/php.ini

Нам нужно найти параметр cgi.fix_pathinfo. Он будет закомментирован точкой с запятой (;) и по умолчанию будет задана "1".

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

Раскомментируем и выставим "0":

cgi.fix_pathinfo=0

Сохраните и закройте файл, и перезагрузите php:

sudo systemctl restart php7.0-fpm

Изменения применились =)

Шаг 7. Заставим Nginx работать с PHP

Так уж вышло, что он не знает, куда направлять запросы, поможем ему в этом на уровне серверных блоков (в конфиге nginx это что-то вроде виртуальных хостов apache, их может быть несколько под разные сайты). Откроем блок по умолчанию:

sudo nano /etc/nginx/sites-available/default

Если убрать комментарии, то выглядеть содержимое должно примерно так:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/html;
    index index.html index.htm index.nginx-debian.html;

    server_name _;

    location / {
        try_files $uri $uri/ =404;
    }
}

И сейчас нам нужно внести кое-какие коррективы в этот файл.

Первым делом добавим в список индексных файлов index.php на случай, чтобы по умолчанию открывался именно он, когда мы обращаемся к директории (т.е. если мы пишем http://localhost/folder и /folder это папка, то php будет искать index.php в первую очередь).

Также изменим директиву server_name так, чтобы она содержала наш домен или IP адрес.

Чтобы обрабатывать php-скрипты, нам всего-то нужно раскомментировать нужный кусок. Ищем location ~\.php$ и убираем комментарии перед include snippets/fastcgi-php.conf, а также весь блок с location ~ /\.ht
Эти файлы не используются Nginx-ом, но и пользователям их выдавать ни к чему.

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/html;
    index index.php index.html index.htm index.nginx-debian.html;

    server_name server_domain_or_IP;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }
}

Снова сохраняем и закрываем. Можем сразу и протестировать конфигурацию, всё ли в ней верно:

sudo nginx -t

Если выводятся какие ошибки, проверьте файл ещё раз. Если же всё хорошо, то перезагрузим Nginx, чтобы изменения вступили в силу:

sudo systemctl reload nginx

Финальный аккорд. Проверяем, всю связку, обработается произвольный php файл правильно.

Файлы вашего дефолтного сайта на nginx лежат в директории /var/www/html (в конфиге nginx это можно было видеть по директиве root /var/www/html;), создадим там файл info.php:

sudo nano /var/www/html/info.php

Пропишите там следующее:

<?php
phpinfo();

Сохраняем. Закрываем. Заходим на http://SERVER_DOMAIN_OR_IP/info.php
Само собой вместо SERVER_DOMAIN_OR_IP пишем свой IP или домен.

Если вы видите инфу о версии PHP, то молодцы :) Теперь просто удалим созданный файл:

sudo rm /var/www/html/info.php

Далее статьи, пожалуй, будут меньше по объему, но выходить станут чаще.

 Жду с нетерпением
ваших комментариев!
 

Подписаться на RSS

Вы можете нажать "подписаться", чтобы следить за моими новостями!
Так вы всегда будете в курсе появления новостей на сайте =)
О том, что такое RSS можно прочитать здесь.

Подписаться

Подписаться на Twitter

Я специально зарегистрировался в Твиттере, чтобы вы могли следить за обновлениями на сайте =)

Подписаться

Envato marketplace А эти люди занимаются прокатом карнавальных костюмов и масок в Минске. К слову, я им делал сайт.