Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: [HOWTO] LEMP: Ubuntu 16.04, NGINX, Let's Encrypt, PHP-FPM, MySQL + CMS  (Прочитано 930 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн toxicon

  • Автор темы
  • Новичок
  • *
  • Сообщений: 46
  • Все вопросы в Telegram
    • Просмотр профиля
Привет, %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

LEMP

NGINX

Устанавливаем 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.: Если видишь опечатки или непонятные моменты, напиши в личные сообщения.
« Последнее редактирование: 17 Апреля 2017, 23:46:35 от toxicon »
Samsung 530U3C-A08RU >> HP Pavilion 14-al104ur
Xubuntu 17.04
Играю в Wakfu и Ingress.

 

Страница сгенерирована за 0.02 секунд. Запросов: 22.