Краткая шпаргалка по Linux для новых пользователей хостинга: от логина на сервер до настройки веб-сервера.

Администрирование 20 мин. на чтение

Неопытному пользователю, которому по тем или иным причинам впервые пришлось арендовать виртуальный сервер или выделенный сервер, навигация и работа в среде Linux могут показаться сложными. Тем не менее, с помощью этого краткого руководства по Linux для размещения пользователей вы получите представление, общее понимание и примеры, необходимые для уверенного управления вашим сервером. В этом руководстве мы постараемся осветить все аспекты, которые будут вам полезны при первом знакомстве с вашим сервером — от входа на сервер по SSH, до первоначальной настройки веб-сервера. Давайте погрузимся!

 

Раздел 1: Вход на свой сервер через SSH и основные команды Linux.

1.1 Краткое описание протокола SSH

SSH, сокращение от Secure Shell, представляет собой криптографический сетевой протокол, который позволяет безопасно подключаться к удаленному серверу через незащищенную сеть. Он обеспечивает зашифрованное соединение и позволяет удаленно выполнять команды на сервере. Чтобы установить SSH-соединение, вам потребуется IP-адрес вашего сервера, ваше имя пользователя и номер порта SSH. Например, чтобы войти на сервер с IP-адресом «123.456.789.0», используя имя пользователя «admin» и порт SSH по умолчанию 22, вы должны использовать команду:

ssh [email protected] -p 22

 


1.2 Генерация SSH ключей

Ключи SSH обеспечивают более безопасный и удобный способ аутентификации при входе на сервер. Чтобы сгенерировать пару ключей SSH, вы можете использовать команду ssh-keygen. Например, чтобы сгенерировать пару ключей RSA с настройками по умолчанию, вы должны запустить:

ssh-keygen -t rsa

Эта команда сгенерирует закрытый ключ (id_rsa) и открытый ключ (id_rsa.pub). Открытый ключ необходимо поместить в файл ~/.ssh/authorized_keys на сервере.

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

Вход на сервер по ключу осуществляется следующей командой:

ssh [email protected] -i ~/.ssh/id_rsa

где параметр «-i» указывает на расположение вашего закрытого ключа на вашем компьютере.

Подробнее обо всех возможностях SSH вы можете узнать ЗДЕСЬ.

 

1.3 Основные команды Linux

После входа на Ваш сервер через SSH вы можете использовать различные команды для навигации по каталогам, списка файлов, передачи файлов и управления разрешениями. Вот несколько примеров:

pwd - отображение текущего (рабочего) каталога.

[user@testhost ~]$ pwd
/home/user

 

date - Отображение текущей даты и времени системы.

[user@testhost ~]$ date
Mon Dec 16 13:37:07 UTC 2019
[user@testhost ~]$ date +%s
1576503430

 

w - Эта команда показывает, кто вошел в систему. Кроме того, на экране также отображается время безотказной работы и LA (средняя загрузка).

[user@testhost ~]$ w
 05:47:17 up 377 days, 17:57,  1 user,  load average: 0,00, 0,01, 0,05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
user     pts/0    32.175.94.241    05:47    2.00s  0.01s  0.00s w

 

ls - Отображает содержимое каталога. Если не передать путь, то будет отображаться содержимое текущего каталога.

[user@testhost ~]$ pwd
/home/user
[user@testhost ~]$ ls
qqq
[user@testhost ~]$ ls /home/user
qqq
[user@testhost ~]$ ls /
bin  boot  cgroup  dev  etc  home  lib  lib64  local  lost+found  media  mnt  opt  proc  root  run  sbin  selinux  srv  swap  sys  tmp  usr  var

 

Удобнее всего использовать опции -l (формат длинного списка - вывод в столбец с дополнительной информацией о файлах), -t (сортировка по времени модификации файла/директории) и -r (обратная сортировка - в сочетании с -t, самые «свежие» файлы будут внизу):

[user@testhost ~]$ ls -ltr /
total 4194416
drwxr-xr-x    2 root root       4096 Jan  6  2012 srv
drwxr-xr-x    2 root root       4096 Jan  6  2012 selinux
drwxr-xr-x    2 root root       4096 Jan  6  2012 mnt
drwxr-xr-x    2 root root       4096 Jan  6  2012 media
drwx------    2 root root      16384 Oct  1  2017 lost+found
drwxr-xr-x    2 root root       4096 Oct  1  2017 local
drwxr-xr-x   13 root root       4096 Oct  1  2017 usr
drwxr-xr-x   11 root root       4096 Apr 10  2018 cgroup
drwxr-xr-x    4 root root       4096 Apr 10  2018 run
-rw-------    1 root root 4294967296 Sep 10  2018 swap
dr-xr-xr-x   10 root root       4096 Dec 13  2018 lib
drwxr-xr-x    6 root root       4096 Mar  7  2019 opt
drwxr-xr-x   20 root root       4096 Mar 19  2019 var
dr-xr-xr-x   10 root root      12288 Apr  9  2019 lib64
dr-xr-xr-x    2 root root       4096 Apr  9  2019 bin
dr-xr-xr-x    4 root root       4096 Apr  9  2019 boot
dr-xr-xr-x    2 root root      12288 Apr  9  2019 sbin
dr-xr-xr-x 3229 root root          0 Jul  2 10:19 proc
drwxr-xr-x   34 root root       4096 Oct 28 13:27 home
drwxr-xr-x   93 root root       4096 Oct 30 16:00 etc
dr-xr-x---   11 root root       4096 Nov  1 13:02 root
dr-xr-xr-x   13 root root          0 Nov 13 20:28 sys
drwxr-xr-x   16 root root       2740 Nov 26 08:55 dev
drwxrwxrwt    3 root root       4096 Nov 26 08:57 tmp

 

В Linux есть 2 специальных имени каталога: "." И "..". Первый означает текущий каталог, второй — родительский каталог. Их удобно использовать в различных командах, в частности, ls:

[user@testhost home]$ pwd
/home
[user@testhost home]$ ls ..
bin  boot  cgroup  dev  etc  home  lib  lib64  local  lost+found  media  mnt  opt  proc  root  run  sbin  selinux  srv  swap  sys  tmp  usr  var
[user@testhost home]$ ls ../home/user/
qqq

 

Также есть полезная опция для отображения скрытых файлов (начинающихся с «.») — -a:

[user@testhost ~]$ ls -a
.  ..  1  .bash_history  .bash_logout  .bash_profile  .bashrc  .lesshst  man_signal  man_signal_error_log  .mongorc.js  .ssh  temp  test  .viminfo

 

А еще можно использовать опцию -h - вывод в удобочитаемом формате (обратите внимание на размеры файлов):

[user@testhost ~]$ ls -ltrh
total 16K
-rwxrwx--x 1 user user   31 Nov 26 11:09 temp
-rw-rw-r-- 1 user user 6.0K Dec  3 16:02 1
drwxrwxr-x 2 user user 4.0K Dec  4 10:39 test


cd - Изменить текущий каталог.

[user@testhost ~]$ pwd
/home/user
[user@testhost ~]$ cd /home/
[user@testhost home]$ pwd
/home

 

Если вы не передадите имя каталога в качестве аргумента, будет использоваться переменная окружения $HOME, то есть домашний каталог. Также может быть удобно использовать `~`, специальный символ, обозначающий $HOME:

[user@testhost etc]$ pwd
/etc
[user@testhost etc]$ cd ~/test/
[user@testhost test]$ pwd
/home/user/test

 

mkdir - Создать директорию.

[user@testhost ~]$ mkdir test
[user@testhost ~]$ ls -ltr
total 38184
-rw-rw-r-- 1 user user 39091284 Nov 22 14:14 qqq
drwxrwxr-x 2 user user     4096 Nov 26 10:29 test

 

Иногда вам нужно создать определенную структуру каталогов: например, каталог внутри несуществующего каталога. Чтобы не вводить mkdir несколько раз подряд, можно использовать опцию -p — она позволяет создать все недостающие каталоги в иерархии. Также с этой опцией mkdir не будет возвращать ошибку, если каталог существует.

[user@testhost ~]$ ls
qqq  test
[user@testhost ~]$ mkdir test2/subtest
mkdir: cannot create directory ‘test2/subtest’: No such file or directory
[user@testhost ~]$ mkdir -p test2/subtest
[user@testhost ~]$ ls
qqq  test  test2
[user@testhost ~]$ ls test2/
subtest
[user@testhost ~]$ mkdir test2/subtest
mkdir: cannot create directory ‘test2/subtest’: File exists
[user@testhost ~]$ mkdir -p test2/subtest
[user@testhost ~]$ ls test2/
subtest


rm - Удалить файл.

[user@testhost ~]$ ls
qqq  test  test2
[user@testhost ~]$ rm qqq
[user@testhost ~]$ ls
test  test2

 

Опция -r позволяет рекурсивно удалять каталоги со всем их содержимым, опция -f позволяет игнорировать ошибки при удалении (например, о несуществующем файле). Эти опции позволяют, грубо говоря, гарантированно удалить всю иерархию файлов и каталогов (если у пользователя есть на это права), поэтому пользоваться ими нужно с осторожностью (классический пример анекдота — «rm -rf/», при определенных обстоятельствах он удалит вам если не всю систему, то массу файлов, важных для ее работоспособности).

[user@testhost ~]$ ls
test  test2
[user@testhost ~]$ ls -ltr test2/
total 4
-rw-rw-r-- 1 user user    0 Nov 26 10:40 temp
drwxrwxr-x 2 user user 4096 Nov 26 10:40 temp_dir
[user@testhost ~]$ rm -rf test2
[user@testhost ~]$ ls
test


cp - Скопировать файл или директорию.

[user@testhost ~]$ ls
temp  test
[user@testhost ~]$ cp temp temp_clone
[user@testhost ~]$ ls
temp  temp_clone  test

Эта команда также имеет параметры -r и -f, которые можно использовать для обеспечения копирования иерархии каталогов и папок в другое место.

 

mv - Удалить или переименовать файл или директорию.

[user@testhost ~]$ ls -ltr
total 4
drwxrwxr-x 2 user user 4096 Nov 26 10:29 test
-rw-rw-r-- 1 user user    0 Nov 26 10:45 temp
-rw-rw-r-- 1 user user    0 Nov 26 10:46 temp_clone
[user@testhost ~]$ ls test
[user@testhost ~]$ mv test test_renamed
[user@testhost ~]$ mv temp_clone test_renamed/
[user@testhost ~]$ ls
temp  test_renamed
[user@testhost ~]$ ls test_renamed/
temp_clone


cat - Вывести содержимое файла или файлов в консоль.

[user@testhost ~]$ cat temp
Content of a file.
Lalalala...

Также следует обратить внимание на команду head (печатать первые n строк или байтов файла) и tail (об этом позже).

 

tail - Вывести последние n строк или байтов файла.

[user@testhost ~]$ tail -1 temp
Lalalala...

Опция -f очень полезна — она позволяет отображать новые данные в файле в режиме реального времени.

 

less - Иногда текстовый файл слишком большой и его неудобно выводить командой cat. Потом его можно открыть командой less: файл будет отображаться частями, доступна навигация по этим частям, поиск и прочий простой функционал.

[user@testhost ~]$ less temp

 

Также может быть удобно использовать less с пайплайном (pipe):

[user@testhost ~]$ grep "ERROR" /tmp/some.log | less


ps - Показать список процессов.

[user@testhost ~]$ ps
    PID TTY          TIME CMD
 761020 pts/2    00:00:00 bash
 809720 pts/2    00:00:00 ps

 

Удобно использовать опцию BSD "aux" для вывода всех процессов в системе (поскольку процессов может быть много, мы выводим только первые 5 из них с помощью конвейера (pipe) и команды head):

[user@testhost ~]$ ps aux | head -5
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.0  19692  2600 ?        Ss   Jul02   0:10 /sbin/init
root           2  0.0  0.0      0     0 ?        S    Jul02   0:03 [kthreadd]
root           4  0.0  0.0      0     0 ?        I<   Jul02   0:00 [kworker/0:0H]
root           6  0.0  0.0      0     0 ?        I<   Jul02   0:00 [mm_percpu_wq]

 

Многие также используют опцию BSD "axjf", которая позволяет вам распечатать дерево процессов (я удалил часть вывода здесь для демонстрационных целей):

[user@testhost ~]$ ps axjf
   PPID     PID    PGID     SID TTY        TPGID STAT   UID   TIME COMMAND
      0       2       0       0 ?             -1 S        0   0:03 [kthreadd]
      2       4       0       0 ?             -1 I<       0   0:00  \_ [kworker/0:0H]
      2       6       0       0 ?             -1 I<       0   0:00  \_ [mm_percpu_wq]
      2       7       0       0 ?             -1 S        0   4:08  \_ [ksoftirqd/0]
...
...
...
      1    4293    4293    4293 tty6        4293 Ss+      0   0:00 /sbin/mingetty /dev/tty6
      1  532967  532964  532964 ?             -1 Sl     495   0:00 /opt/td-agent/embedded/bin/ruby /usr/sbin/td-agent --log /var/log/td-agent/td-agent.log --use-v1-config --group td-agent --daemon /var/run/td-agent/td-agent.pid
 532967  532970  532964  532964 ?             -1 Sl     495 803:06  \_ /opt/td-agent/embedded/bin/ruby /usr/sbin/td-agent --log /var/log/td-agent/td-agent.log --use-v1-config --group td-agent --daemon /var/run/td-agent/td-agent.pid
      1  537162  533357  532322 ?             -1 Sl       0 5067:43 /usr/bin/dockerd --default-ulimit nofile=262144:262144 --dns=172.17.0.1
 537162  537177  537177  537177 ?             -1 Ssl      0 4649:28  \_ docker-containerd --config /var/run/docker/containerd/containerd.toml
 537177  537579  537579  537177 ?             -1 Sl       0   4:48  |   \_ docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/0ee89b20deb3cf08648cd92e1f3e3c661ccffef7a0971
 537579  537642  537642  537642 ?             -1 Ss    1000  32:11  |   |   \_ /usr/bin/python /usr/bin/supervisord -c /etc/supervisord/api.conf
 537642  539764  539764  537642 ?             -1 S     1000   0:00  |   |       \_ sh -c echo "READY"; while read -r line; do echo "$line"; supervisorctl shutdown; done
 537642  539767  539767  537642 ?             -1 S     1000   5:09  |   |       \_ php-fpm: master process (/etc/php73/php-fpm.conf)
 539767  783097  539767  537642 ?             -1 S     1000   0:00  |   |       |   \_ php-fpm: pool test
 539767  783131  539767  537642 ?             -1 S     1000   0:00  |   |       |   \_ php-fpm: pool test
 539767  783185  539767  537642 ?             -1 S     1000   0:00  |   |       |   \_ php-fpm: pool test
...
...
...

 

У этой команды много разных опций, так что если вы активно ей пользуетесь, то рекомендую ознакомиться с документацией. В большинстве случаев достаточно просто знать «ps aux».


kill - Отправить сигнал процессу. По умолчанию отправляется сигнал SIGTERM, который завершает процесс.

[user@testhost ~]$ ps ux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
531      1027147  0.0  0.0 119956  4260 ?        S    14:51   0:00 sshd: user@pts/1
531      1027149  0.0  0.0 115408  3396 pts/1    Ss   14:51   0:00 -bash
531      1027170  0.0  0.0 119956  4136 ?        R    14:51   0:00 sshd: user@pts/2
531      1027180  0.0  0.0 115408  3564 pts/2    Ss   14:51   0:00 -bash
531      1033727  0.0  0.0 107960   708 pts/1    S+   15:17   0:00 sleep 300
531      1033752  0.0  0.0 117264  2604 pts/2    R+   15:17   0:00 ps ux
[user@testhost ~]$ kill 1033727
[user@testhost ~]$ ps ux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
531      1027147  0.0  0.0 119956  4260 ?        S    14:51   0:00 sshd: user@pts/1
531      1027149  0.0  0.0 115408  3396 pts/1    Ss+  14:51   0:00 -bash
531      1027170  0.0  0.0 119956  4136 ?        R    14:51   0:00 sshd: user@pts/2
531      1027180  0.0  0.0 115408  3564 pts/2    Ss   14:51   0:00 -bash
531      1033808  0.0  0.0 117268  2492 pts/2    R+   15:17   0:00 ps ux

 

Поскольку у процесса могут быть обработчики сигналов, kill не всегда приводит к ожидаемому результату немедленного завершения процесса. Чтобы наверняка «убить» процесс, вам нужно послать процессу сигнал SIGKILL. Однако это может привести к потере данных (например, если процесс перед завершением должен сохранить некоторую информацию на диск), поэтому вам нужно использовать эту команду осторожно. Номер сигнала SIGKILL — 9, поэтому короткая версия команды выглядит так:

[user@testhost ~]$ ps ux | grep sleep
531      1034930  0.0  0.0 107960   636 pts/1    S+   15:21   0:00 sleep 300
531      1034953  0.0  0.0 110516  2104 pts/2    S+   15:21   0:00 grep --color=auto sleep
[user@testhost ~]$ kill -9 1034930
[user@testhost ~]$ ps ux | grep sleep
531      1035004  0.0  0.0 110516  2092 pts/2    S+   15:22   0:00 grep --color=auto sleep

 

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

 

ping - Отправляет пакет ECHO_REQUEST хосту ICMP.

[user@testhost ~]$ ping google.com
PING google.com (172.217.15.78) 56(84) bytes of data.
64 bytes from iad23s63-in-f14.1e100.net (172.217.15.78): icmp_seq=1 ttl=47 time=1.85 ms
64 bytes from iad23s63-in-f14.1e100.net (172.217.15.78): icmp_seq=2 ttl=47 time=1.48 ms
64 bytes from iad23s63-in-f14.1e100.net (172.217.15.78): icmp_seq=3 ttl=47 time=1.45 ms
64 bytes from iad23s63-in-f14.1e100.net (172.217.15.78): icmp_seq=4 ttl=47 time=1.46 ms
64 bytes from iad23s63-in-f14.1e100.net (172.217.15.78): icmp_seq=5 ttl=47 time=1.45 ms
^C
--- google.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4006ms
rtt min/avg/max/mdev = 1.453/1.541/1.850/0.156 ms

 

По умолчанию ping работает до тех пор, пока не будет остановлен вручную. Поэтому может пригодиться опция -c — количество пакетов, после отправки которых пинг завершится сам по себе. Другая опция, которую я иногда использую, это -i, интервал между отправкой пакетов.

[user@testhost ~]$ ping -c 3 -i 5 google.com
PING google.com (172.217.5.238) 56(84) bytes of data.
64 bytes from iad30s07-in-f238.1e100.net (172.217.5.238): icmp_seq=1 ttl=47 time=1.55 ms
64 bytes from iad30s07-in-f14.1e100.net (172.217.5.238): icmp_seq=2 ttl=47 time=1.17 ms
64 bytes from iad30s07-in-f14.1e100.net (172.217.5.238): icmp_seq=3 ttl=47 time=1.16 ms

--- google.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 10006ms
rtt min/avg/max/mdev = 1.162/1.295/1.551/0.181 ms

 

 

Раздел 2: Защита Вашего сервера


2.1 Обновление системы

Регулярное обновление программного обеспечения вашего сервера имеет решающее значение для безопасности и стабильности. В системе Linux вы можете использовать менеджеры пакетов, такие как apt или yum, для обновления системы. Например, чтобы обновить систему с помощью apt, запустите:

sudo apt update
sudo apt upgrade

 

2.2 Установка брандмауэра

Брандмауэр — жизненно важная мера безопасности, которая защищает ваш сервер от несанкционированного доступа и злонамеренной активности. В Linux одним из популярных решений для брандмауэра является iptables. Для установки и настройки iptables используйте следующие команды:

sudo apt install iptables
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -j DROP

Приведенные выше команды разрешают входящие соединения SSH (порт 22) и отбрасывают весь остальной входящий трафик.
Очень часто вместе с ipset используется Iptables, который позволяет указать список IP-адресов, с которых будет разрешен или запрещен доступ к вашему серверу.

Узнать больше об IPTABLES
 

 

2.3 Включение Fail2Ban

Fail2Ban — полезный инструмент для предотвращения брутфорс атак или атак простым перебором, путем автоматической блокировки IP-адресов, которые неоднократно не проходят аутентификацию. Чтобы установить Fail2Ban в Ubuntu, запустите:

sudo apt install fail2ban

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

Узнать больше о Fail2ban

 

 

Раздел 3: Настройка веб-сервера

3.1 Установка веб-сервера Apache

Apache — это широко используемое программное обеспечение веб-сервера в Linux. Чтобы установить Apache на Ubuntu, запустите:

sudo apt update
sudo apt install apache2

 

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

 

3.2 Настройка виртуальных хостов

Виртуальные хосты позволяют размещать несколько веб-сайтов на одном сервере. Чтобы настроить виртуальный хост, создайте новый файл конфигурации в каталоге /etc/apache2/sites-available/. Например, чтобы создать виртуальный хост для «example.com», создайте файл с именем example.com.conf и настройте его соответствующим образом. Затем включите виртуальный хост с помощью команды a2ensite и перезапустите Apache.

Подробнее о веб-сервере Apache - здесь.

 

3.3 Установка PHP

PHP — это серверный язык сценариев, обычно используемый для динамического веб-контента. Чтобы установить PHP в Ubuntu, запустите:

sudo apt update
sudo apt install php libapache2-mod-php

 

После установки Apache автоматически распознает и обрабатывает файлы PHP.

 

 

На этом обзорная статья заканчивается. Надеемся, что она поможет вам хотя бы начать разбираться в настройке сервера и в дальнейшем вы углубите свои знания, станете настоящим специалистом по администрированию серверов на Linux и настроите не один сайт для себя или своих клиентов.

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

June 19, 2023, 2:02 p.m.