В этой записи я бы хотел вам показать, как можно установить и настроить безопасный сервер на Debian 7, который будет работать на связки Nginx + Apache2. Также мы установим PHP и настроим MySQL. В итоге у нас получится сервер, на котором будет размещен один сайт, и он будет корректно работать.
Нам необходим абсолютно чистый Linux сервер, на котором лишь установлен Debian 7. Авторизуемся через терминал с правами root и начинаем!
Настройка SSH
Важно помнить, что если посторонний человек получит доступ к SSH, а если еще и с правами root, то ваш сервер будет полностью в его власти. Этого мы допустить не можем, поэтому открываем файл настроек.
nano /etc/ssh/sshd_config
Находим следующую строчку (обычно она первая, если не учитывать комментарии):
Port 22
И меняем 22 (порт по умолчанию) на любой другой в диапазоне от 1024 до 65535.
Применяем настройки:
service ssh reload
Если это ваше первое подключение и вы не меняли пароль, то сделать это просто необходимо, для этого просто выполните следующую команду:
passwd
И после введите новый пароль и повторите новый пароль.
Репозитории
Для Debian я использую следующие репозитории:
deb http://security.debian.org/ wheezy/updates main deb http://nginx.org/packages/mainline/debian/ wheezy nginx deb-src http://nginx.org/packages/mainline/debian/ wheezy nginx deb http://repo.mysql.com/apt/debian/ wheezy mysql-5.6 deb-src http://repo.mysql.com/apt/debian/ wheezy mysql-5.6
Хранится такой список в /etc/apt/sources.list, однако последние 2 строчки лучше записать в /etc/apt/sources.list.d/mysql.list
Если вы будете использовать такие же репозитории, то нам необходимо выполнить еще следующие команды:
1. Для MySQL
wget http://repo.mysql.com/mysql-apt-config_0.2.1-1debian7_all.deb dpkg -i mysql-apt-config_0.2.1-1debian7_all.deb
2. Для Nginx
wget http://nginx.org/keys/nginx_signing.key apt-key add nginx_signing.key
После чего обновляем наш Linux сервер:
apt-get update apt-get upgrade apt-get dist-upgrade
Имя сервера
Теперь давайте настроим имя нашего сервера. Сделать это очень просто:
1. Выполняем следующую командy:
hostname site.com
Вместо «site.com» укажите ваш домен. Теперь отредактируем файл:
nano /etc/hostname
Там вы должны заменить написанное на ваш домен и затем выполнить следующую команду:
/etc/init.d/hostname.sh start
Настройка времени
Для настройки времени просто установите службу ntp:
apt-get install ntp
И теперь давайте настроим часовой пояс:
dpkg-reconfigure tzdata
Исходя из того, что я живу в России, я выбираю Europe/Moscow:
Локализация
В Debian вы можете выбрать несколько языков, которые будут поддерживать ваша система. Для этого воспользуемся командой:
dpkg-reconfigure locales
Там мы ищем en_US.UTF-8 UTF-8 и, скорее всего, уже будет стоять звездочка (это значит, что уже выбрано), но если не стоит, то нажмите пробел.
Затем ищем ru_RU.UTF-8 UTF-8 и жмем пробел.
Итого мы выбрали EN и RU с кодировкой UTF-8. Жмём enter и выбираем язык по умолчанию.
Почтовая система
Почти ни один сайт не обойдется без отправки сообщений на e-mail, поэтому было бы хорошо настроить данную службу. Лично я предпочитаю postfix, хоть есть и другие, например, exim4.
apt-get install postfix
Затем у вас появится окошко, где нужно будет настроить тип конфигурации почтового сервера, выбираем «Internet Site».
Имя почтового сервера = имени вашего сервера.
После того, как почтовый сервер успешно установится, его нужно будет настроить:
nano /etc/postfix/main.cf
1. Изначально inet_interfaces = all, но мы это изменяем и вместо «all» пишем 127.0.0.1. Иначе вас быстро завалит спамом.
2. Возможно, вы бы хотели отправлять какие-нибудь уведомления на почту вашего домена (к примеру на [email protected]), но это работать будет, только если в mydestination вы сотрёте имя вашего домена, иначе все эти сообщения будут сохраняться локально на вашем сервере.
В принципе, больше нам ничего не нужно, поэтому перезагружаем postfix для сохранения настроек:
service postfix restart
Если вы хотите получать отчеты и ошибки на ваш почтовый ящик, то настроим псевдонимы:
nano /etc/aliases
И прописываем такую строчку:
postmaster: root: root, [email protected]
Разумеется, почту меняем на свою. Применяем настройки:
newaliases
MySQL
Теперь приступим к установке базы данных. На момент написания статьи актуальна версия 5.7, поэтому именно её мы и установим. Учтите, что если вы не добавили репозиторий с mysql, то возможно вам будет недоступна данная версия MySQL.
apt-get install mysql-server-5.6 php5-mysql
В процессе установки вам будет предложено придумать пароль. Не используйте простые пароли!
И затем подтвердите введенный пароль. Рекомендую воспользоваться готовыми генераторами паролей.
Теперь настроим автоматическую авторизацию, чтобы вам не пришлось пользоваться длинной командой для подключения к базе данных через терминал:
nano /root/.my.cnf
И в кавычках впишите ваш пароль:
[client] password = ""
Теперь просто и легко можно подключиться к базе данных через терминал:
mysql
Теперь вам не нужно вводить каждый раз пароль.
Давайте обезопасим нашу базы данных:
mysql_secure_installation
Везде выбираем y, но когда у вас спросят сменить ли пароль — менять не нужно.
Теперь хорошо было бы добавить нового пользователя в нашу базу, чтобы не подключаться к БД от root:
CREATE user 'user'@'localhost' IDENTIFIED BY 'password';
Давайте создадим базу для нашего будущего сайта:
CREATE DATABASE `my_db`;
И выдадим полные права на данную базу нашему пользователю:
GRANT ALL ON `my_db`.* to 'user'@'localhost';
Либо выдадим ему абсолютно все права:
GRANT ALL PRIVILEGES ON * . * TO 'user'@'localhost';
И после обновим все привилегии:
FLUSH PRIVILEGES;
Вот и всё. Теперь у нас есть база данных и пользователь, который имеет доступ к одной базе данных, либо ко всем (смотря, что вы выбрали).
PHP
Перейдем к установке.
apt-get install php5-common libapache2-mod-php5 php5-cli
Собственно, после этого на ваш сервер успешно установится php.
Apache
Сразу же приступим к установке:
apt-get install apache2 apache2-mpm-itk
После установки остановим apache2, чтобы произвести настройку:
/etc/init.d/apache2 stop
1. Если вы не знакомы с модулем autoindex, то рекомендую отключить его:
a2dismod autoindex
2. Скорее всего вам пригодится mod_rewrite, поэтому давайте его включим:
a2enmod rewrite
3. Теперь хорошо бы заставить apache2 слушать 81 порт:
nano /etc/apache2/ports.conf
И приведите соответствующие строчки к следующему формату:
#NameVirtualHost *:80 Listen 81
Теперь установим mod-rpaf для корректного отображения IP адресов в логах, ведь все запросы проксирует nginx:
apt-get install libapache2-mod-rpaf
И теперь запустим наш apache2:
/etc/init.d/apache2 start
Nginx
Установим:
apt-get install nginx
После установки защитим конфигурацию и файлы журналов:
chmod 750 /etc/nginx /var/log/nginx chgrp adm /var/log/nginx
FTP
Куда же без FTP, поэтому давайте его сейчас и установим.
apt-get install proftpd
В окошке выбираем «standalone»:
Пользователи
Теперь, когда наш сервер почти настроен, мы можем добавить пользователя, через которого мы буедм подключаться к FTP:
adduser username
Вам будет необходимо ввести пароль прочую информацию.
Добавление сайта
Теперь, когда наш сервер уже настроен и готов к работе, мы можем добавить наш первый сайт. Так как у нас используется связка apache2 + nginx, то настраивать придется всё.
1. Для начала необходимо создать некоторые директории:
mkdir /home/user/www mkdir /home/user/tmp
*user — имя созданного пользователя. Данный пользователь будет являться владельцем сайта.
2. Теперь перейдем к настройке Apache2:
Переходим в директорию /etc/apache2/sites-available и создаем файл с вашим сайтом:
nano site.com
В этой же директории имеется default, где приводится пример, который работает, но я использую немного другую настройку. Какую использовать — дело ваше.
<VirtualHost 127.0.0.1:81> ServerName site.com AddDefaultCharset UTF-8 AssignUserID user user DirectoryIndex index.html index.php DocumentRoot /home/user/www/site.com ServerAdmin [email protected] ServerAlias www.site.com CustomLog /dev/null combined ErrorLog /dev/null <FilesMatch "\.ph(p[3-5]?|tml)$"> SetHandler application/x-httpd-php </FilesMatch> <FilesMatch "\.phps$"> SetHandler application/x-httpd-php-source </FilesMatch> php_admin_value sendmail_path "/usr/sbin/sendmail -t" php_admin_value upload_tmp_dir "/home/user/tmp" php_admin_value session.save_path "/home/user/tmp" php_admin_value open_basedir "/home/user/www/site.com:." </VirtualHost> <Directory /home/user/www/site.com> Options -ExecCGI php_admin_flag engine on </Directory>
*user — имя созданного пользователя (в слове «AssignUserID» заменять ничего не нужно). Данный пользователь будет являться владельцем сайта.
*site.com — домен вашего сайта
*127.0.0.1 — IP вашего сайта.
И давайте включим наш сайт.
a2ensite site.com
3. Теперь нужно настроить nginx. Процедура схожа с процедурой настройки сайта на apache2. Создаем файл настроек:
nano /etc/nginx/conf.d/site.com.conf
server { server_name site.com; charset UTF-8; disable_symlinks if_not_owner from=$root_path; index index.html index.php; root $root_path; set $root_path /home/user/www/site.com; access_log off ; error_log /dev/null crit; location / { location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi$ try_files $uri $uri/ @fallback; } location / { try_files /does_not_exists @fallback; } location ~ [^/]\.ph(p\d*|tml)$ { try_files /does_not_exists @fallback; } } location @fallback { proxy_pass http://127.0.0.1:81; proxy_redirect http://127.0.0.1:81 /; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; access_log off ; } ssi on; listen 127.0.0.1:80; }
*user — имя созданного пользователя.
*site.com — домен вашего сайта
*127.0.0.1 — IP вашего сайта.
Перезагружаем nginx и всё заработает:
/etc/init.d/nginx restart
Дополнительное ПО
Я уверен, что в будущем вам всё это пригодится. Я не буду расписывать что и зачем нужно, просто рекомендую к установке:
apt-get install sudo aptitude automysqlbackup curl php5-curl memcached php5-memcache php5-memcached git
Собственно это всё, что нужно для корректной работы сайта. Разумеется, настройки MySQL, Apache, Nginx вы можете регулировать под себя, под ваши задачи, но всё это делается после запуска вашего стартапа. Надеюсь вам было интересно читать 🙂