Ubuntu nginx + php fpm + ssl + mysql + letsencrypt

Ubuntu nginx + php fpm + ssl + mysql + letsencrypt

Исходные данные
Сервер: Ubuntu 16.04
Имя сервера: userver1604
Имя сайта: userver1604

Все действия будут выполнять от root чтобы постоянно не писать sudo

sudo -s

Обновим систему

apt update && apt full-upgrade -y

Установка nginx

apt install nginx -y

Проверим что получилось
http://userver1604/

ubuntu nginx

Ставим MySQL сервер

apt install mysql-server -y

Задаем пароль root
ubuntu mysql

Обезопасим нашу установку

mysql_secure_installation

Утилиту для валидации сложности паролей не включаем. Иначе могут быть проблемы при создании баз
Список ответов которые использую я:

Securing the MySQL server deployment.

Enter password for user root: 

VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?

Press y|Y for Yes, any other key for No: N
Using existing password for root.
Change the password for root ? ((Press y|Y for Yes, any other key for No) : N

 ... skipping.
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y
Success.

All done! 

Ставим PHP и модуль для работы php с MYSQL

apt install php-fpm php-mysql -y

Изменим тип работы с php-fpm. Это необходимо чтобы в дальнейшем избежать ошибок. При установке nextcloud после начального экрана проверки без этого параметра будет белый экран.

nano /etc/php/7.0/fpm/pool.d/www.conf
;listen = /run/php/php7.0-fpm.sock
listen = 127.0.0.1:9000

Перезапустим php-fpm чтобы изменить конфигурацию

service php7.0-fpm restart

Создаем хост
Для этого удаляем default конфигурацию из sites-enabled и создаем свою путем копирования default

cd /etc/nginx/sites-enabled/
rm default
cd /etc/nginx/sites-available/
cp default userver1604.conf

Добавляем созданную конфигурацию сайта в sites-enabled

ln -s /etc/nginx/sites-available/userver1604.conf /etc/nginx/sites-enabled/

Создаем папку сайта и файл index.php для проверки работы

mkdir /var/www/html/userver1604
nano /var/www/html/userver1604/index.php
<?php
phpinfo();
?>

Правим наш хост. Удаляем лишнее. Указываем понимание index.php. Порт php-fpm. Путь до папки с сайтом.

nano /etc/nginx/sites-enabled/userver1604.conf
server {
        listen 80;

        root /var/www/html/userver1604;

        index index.php index.html index.htm index.nginx-debian.html;

        server_name userver1604;

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

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass 127.0.0.1:9000;
        }

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

Проверяем конфигурацию

nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Если ошибок нет то перезапускаем nginx

service nginx restart

Проверяем работу PHP
http://userver1604/
ubuntu nginx php fpm

Конфигурация SSL

Создаем папку где будут лежать сертификаты для сайта. Для каждого сата может быть свой сертификат. Или можно использовать один глобальный.
Так как у нас локальный сервер и доверия к нему нет, то браузер будет нас предупреждать об этом, и надо будет добавить сайт в исключения.

Создаем папку сертификатов

mkdir /etc/nginx/ssl
cd /etc/nginx/ssl

Генерируем сертификат. На все вопросы отвечаем Enter

openssl req -new -x509 -days 9999 -nodes -out userver1604.pem -keyout userver1604.key

Добавим пути к нашим сертификатам. Заодно добавим пути для nginx error log и acess log

nano /etc/nginx/sites-enabled/userver1604.conf
server {
        listen 80;
        listen 443 ssl;

        ssl_certificate /etc/nginx/ssl/userver1604.pem;
        ssl_certificate_key /etc/nginx/ssl/userver1604.key;

        error_log        /var/www/html/userver1604.error.log;
        access_log       /var/www/html/userver1604.access.log;

        root /var/www/html/userver1604;

        index index.php index.html index.htm index.nginx-debian.html;

        server_name userver1604;

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

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass 127.0.0.1:9000;
        }

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

Проверяем

nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Перезапускаем nginx

service nginx restart

Идем на сайт и добавляем сертификат в списки исключений
https://userver1604/

Дополнительно - Подтвердить исключение безопасности
ubuntu nginx ssl
ubuntu nginx ssl

Let's Encrypt

Для получения бесплатного сертификата Let's Encrypt необходимо:
1) чтобы наш сервер имел доступ извне по портам 80 и 443
2) запись домена A или CNAME для поддомена указылвала на его внешний ип

Переходим на сайт
https://certbot.eff.org/

Выбираем Nginx on Ubuntu 16.04 (xenial) и получаем инструкцию по установке.

На момент написания статьи

sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install python-certbot-nginx

Ставим сертификат

sudo certbot --nginx

Необходимо указать рабочий email адрес
Будет так же предложен тип работы сайта. Я выбирал оба и HTTP и HTTPS

Скрипт сам увидит конфигурацию нашего сайта, и заменит путь к директивам SSL. Они станут иметь вид:

    ssl_certificate /etc/letsencrypt/live/САЙТ.ru/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/САЙТ.ru/privkey.pem; # managed by Certbot

Обновление сертификатов Let's Encrypt

Создадим скрипт автоматического обновления сертификатов
Обновление будет происходить раз в неделю
Для этого необходимо создать небольшой скрипт в cron.weekly

cd /etc/cron.weekly/
nano certboot
#!/bin/bash
certbot renew
chmod +x certboot

На этом установка закончена

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *