Привет, %USERNAME%!
Представим, что у тебя уже есть, например, VPS за 65 руб/месяц: одноядерник с 512 Мб оперативы и 10 Гб HDD. Есть письмо от хостера с данными root-доступа. Есть айпишник (IP), который будет указан в письме, и домен (DOMAIN). Наличие домена (DOMAIN) обязательно. Домен не забудь привязать к айпишнику сервера. И адрес электронной почты EMAIL. Будем использовать пользователя admin с sudo-правами.
Договоримся, что у тебя установлена *buntu на той машине, с которой все делаем.
Минимальные настройки нового сервераОбновляем сервер
ssh root@DOMAIN
apt update && apt dist-upgrade -y && apt autoremove -y
reboot
Устанавливаем Midnight Commander и архиваторы
ssh root@DOMAIN
apt install -y mc unzip unrar p7zip-full
Добавляем пользователя с правами sudo, настраиваем ssh-доступ на порт 1234, отключаем доступ для root по ssh, отключаем root
adduser --gecos 'Administrator' admin
gpasswd -a admin sudo
sed -i "s/Port 22/Port 1234/" /etc/ssh/sshd_config
sed -i "s/PermitRootLogin yes/PermitRootLogin no/" /etc/ssh/sshd_config
systemctl reload sshd
sudo passwd -l root
На домашнем компьютере создаем ключ и копируем на сервер
ssh-keygen -t rsa -b 4096
ssh-copy-id admin@DOMAIN -p 1234
Отключаем авторизацию по паролю, устанавливаем часовой пояс
ssh admin@DOMAIN -p 1234
sudo sed -i "s/#PasswordAuthentication yes/PasswordAuthentication no/" /etc/ssh/sshd_config
sudo systemctl reload sshd
sudo dpkg-reconfigure tzdata
LEMPNGINXУстанавливаем NGINX, сохраняем копию настроек по умолчанию, отключаем отображение версии сервера, включаем сжатие, добавляем пользователя в группу www-data (веб-сервер)
sudo apt install -y nginx
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
sudo sed -i "s/server_name _;/server_name DOMAIN;/" /etc/nginx/sites-available/default
sudo sed -i "s/# server_names_hash_bucket_size 64;/server_names_hash_bucket_size 64;/" /etc/nginx/nginx.conf
sudo sed -i "s/# server_tokens off;/server_tokens off;/" /etc/nginx/nginx.conf
sudo sed -i 's/# gzip/gzip/g' /etc/nginx/nginx.conf
sudo sed -i 's/gzip_comp_level 6;/gzip_comp_level 1;/' /etc/nginx/nginx.conf
sudo usermod -aG admin www-data
sudo systemctl reload nginx
Let's EncryptУстанавливаем letsencrypt, получаем сертификат
sudo apt install -y letsencrypt
sudo mkdir -p /var/www/html/.well-known/
sudo nano /etc/nginx/sites-available/default
Добавляем в 1ый блок server код посредством Shift+Ins, далее Ctrl+O, Enter, Ctrl+X
location ~ /.well-known {
allow all;
}
sudo systemctl restart nginx
Получаем сертификат
sudo letsencrypt certonly -a --webroot-path=/var/www/html/ -d DOMAIN --email EMAIL --agree-tos
Создаем ключ для SSL
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Прописываем созданные ключи в настройки NGINX
printf "ssl_certificate /etc/letsencrypt/live/DOMAIN/fullchain.pem;\nssl_certificate_key /etc/letsencrypt/live/DOMAIN/privkey.pem;" | sudo tee -a /etc/nginx/snippets/ssl-DOMAIN.conf
sudo nano /etc/nginx/snippets/ssl-params.conf
Тупо копируем и вставляем
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
Настраиваем NGINX для SSL
sudo nano /etc/nginx/sites-available/default
Удаляем все и вставляем
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name DOMAIN;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
include snippets/ssl-DOMAIN.conf;
include snippets/ssl-params.conf;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
location ~ /.well-known {
allow all;
}
}
Перезагружаем NGINX
sudo systemctl reload nginx
Пробуем зайти с помощью браузера на наш сайт
http://DOMAINТестируем на
SSL LABS наш сервер, получаем оценку A+ (на 17.04.2017).
Делаем автоматическое обновление сертификатов Let's Encrypt
sudo crontab -e
И прописываем
30 2 * * 1 /usr/bin/letsencrypt renew >> /var/log/letsencrypt-renew.log
35 2 * * 1 /bin/systemctl reload nginx
MySQLВ качестве системы управления базами данных MySQL используем MariaDB
sudo apt install -y mariadb-server
sudo systemctl start mysql
sudo mysql_secure_installation
sudo mysql -u root -p
create database бд;
create user 'пользователь для бд'@'localhost' identified by 'какой-то пароль';
grant all privileges on бд.* to 'пользователь для бд'@'localhost' identified by 'какой-то пароль';
flush privileges;
\q
PHP-FPMУстанавливаем большинство пакетов, которые понадобятся в будущем. Ограничиваем PHP.
sudo apt install -y php-fpm php-mysql php-curl php-gd php-mbstring php-mcrypt php-xml php-xmlrpc php-zip
sudo sed -i "s/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/" /etc/php/7.0/fpm/php.ini
sudo sed -i "s/memory_limit = .*/memory_limit = 128MB/" /etc/php/7.0/fpm/php.ini
sudo sed -i "s/upload_max_filesize = .*/upload_max_filesize = 10M/" /etc/php/7.0/fpm/php.ini
sudo sed -i "s/post_max_size = .*/post_max_size = 12M/" /etc/php/7.0/fpm/php.ini
sudo sed -i "s/allow_url_fopen = On/allow_url_fopen = Off/" /etc/php/7.0/fpm/php.ini
sudo nano /etc/nginx/sites-available/default
Копируем, удаляем все, что было в файле и вставляем в файл настроек нашего сервера
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name DOMAIN;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
include snippets/ssl-DOMAIN.conf;
include snippets/ssl-params.conf;
root /var/www/html;
index index.php index.html index.htm index.nginx-debian.html;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
fastcgi_cache_lock on;
fastcgi_cache_lock_timeout 6s;
}
location ~ /\.ht {
deny all;
}
location ~ /.well-known {
allow all;
}
}
sudo systemctl restart nginx php7.0-fpm
P.S.: CMS и чуть оптимизации добавлю позже, когда появится время.
P.P.S.: Если видишь опечатки или непонятные моменты, напиши в личные сообщения.