Настройка Nginx + PHP-FPM и HTTPS от Let’s Encrypt на AWS EC2 с Ubuntu Server 16.04 LTS

в 16:04, , рубрики: AWS, Let's Encrypt, php, php-fpm, Ubuntu, Серверное администрирование

Порядок действий для установки PHP 7.1 и разворачивания проекта на PHP на созданном Amazon AWS EC2 instance. Основано на этой статье, с дополнениями отсюда и из других источников. Используется более новая версия PHP, добавлены инструкции по установке HTTPS, и пример настройки проекта на Laravel. Подразумевается, что инстанс используется в режиме разработки.

Сначала приведу код полностью. Это не bash-скрипт, а просто список команд, команды выполняются вручную по отдельности, при необходимости вводятся нужные данные.

общие настройки

# Instructions how to setup new AWS EC2 instance with Ubuntu Server 16.04 LTS and install PHP Laravel project and HTTPS
# This is not a bash script, you have to run and control all commands manually


sudo apt-get install nginx mysql-server
sudo mysql_secure_installation


sudo add-apt-repository ppa:ondrej/php && sudo apt-get update
sudo apt-get install php7.1 php7.1-cli php7.1-common php7.1-mysql php7.1-fpm php7.1-curl php7.1-gd php7.1-bz2 php7.1-mcrypt php7.1-json php7.1-tidy php7.1-mbstring php-redis php-memcached php7.1-zip php7.1-dom php7.1-gmp


# run after installation to create config directory from current user
sudo apt-get install mc
mc


sudo mcedit /etc/php/7.1/fpm/php.ini
# cgi.fix_pathinfo=0
sudo systemctl restart php7.1-fpm


sudo mcedit /etc/nginx/sites-available/default

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/html;
#!
    index index.php index.html index.htm index.nginx-debian.html;

    server_name _;

#!
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

#!
    location ~ .php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.1-fpm.sock;
    }
#!
    location ~ /.ht {
        deny all;
    }
}


sudo nginx -t
sudo systemctl reload nginx


echo "<?php phpinfo();" | sudo tee /var/www/html/info.php > /dev/null
# check http://11.22.33.44/info.php
sudo rm /var/www/html/info.php


sudo chown -R "$USER":www-data /var/www/
sudo find /var/www/ -type f -exec chmod 660 {} ; && sudo find /var/www/ -type d -exec chmod 2770 {} ;
sudo usermod -a -G www-data ubuntu




# https

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 mcedit /etc/nginx/sites-available/default
# server_name my.domain.name;
sudo systemctl reload nginx

sudo certbot --nginx

echo -e '#!/bin/shnncertbot renewn' | sudo tee /etc/cron.daily/certbot-renew > /dev/null
sudo chmod 0755 /etc/cron.daily/certbot-renew

sudo certbot renew --dry-run

настройки проекта

sudo apt-get install git
curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer

cd /var && rm -rf www/html

# set repository URL here
git clone ... www
cd www

git checkout dev
ln -s public html
composer install


sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache
sudo chmod -R 0777 storage/framework/cache


cp .env.example .env && php artisan key:generate
# set values in .env file - APP_NAME, DB_DATABASE, and other

Настройка системы

sudo apt-get install nginx mysql-server
sudo mysql_secure_installation

Nginx и MySQL
mysql_secure_installation задает несколько вопросов по настройке.

Would you like to setup VALIDATE PASSWORD plugin? n
Change the password for root? n
Remove anonymous users? y
Disallow root login remotely? y
Remove test database and access to it? y
Reload privilege tables now? y

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

sudo add-apt-repository ppa:ondrej/php && sudo apt-get update
sudo apt-get install php7.1 php7.1-cli php7.1-common php7.1-mysql php7.1-fpm php7.1-curl php7.1-gd php7.1-bz2 php7.1-mcrypt php7.1-json php7.1-tidy php7.1-mbstring php-redis php-memcached php7.1-zip php7.1-dom php7.1-gmp

PHP
PHP 7.1 и 7.2 пока нет в стандартных репозиториях.

sudo apt-get install mc
mc

Midnight Commander
Устанавливать необязательно, если вам больше нравится другой редактор и способ передвижения по файловой системе.
Не стоит после установки запускать в первый раз через sudo mc, так как файлы конфигурации создадутся от пользователя root, и при запуске от обычного пользователя будет ошибка доступа.

sudo mcedit /etc/php/7.1/fpm/php.ini
# cgi.fix_pathinfo=0
sudo systemctl restart php7.1-fpm

Найти настройку cgi.fix_pathinfo, раскомментировать и поставить 0. Это закрытие уязвимости, подробнее можно почитать здесь.

sudo mcedit /etc/nginx/sites-available/default

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/html;
#!
    index index.php index.html index.htm index.nginx-debian.html;

    server_name _;

#!
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

#!
    location ~ .php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.1-fpm.sock;
    }
#!
    location ~ /.ht {
        deny all;
    }
}

Восклицательными знаками отмечены места, где надо поменять.
index — добавить index.php
try_files — убрать =404, добавить /index.php?$query_string
location ~ .php$ — раскомментировать секцию, поменять название файла с сокетом
location ~ /.ht — раскомментировать секцию для файлов *.htaccess

sudo nginx -t
sudo systemctl reload nginx

Проверить правильность конфигурации, если все нормально, перезагрузить ее.

echo "<?php phpinfo();" | sudo tee /var/www/html/info.php > /dev/null
# check http://11.22.33.44/info.php
sudo rm /var/www/html/info.php

Создать тестовый файл, проверить работу PHP, потом удалить. Выполнять необязательно. 11.22.33.44 обозначает IP-адрес инстанса.

sudo chown -R "$USER":www-data /var/www/
sudo find /var/www/ -type f -exec chmod 660 {} ; && sudo find /var/www/ -type d -exec chmod 2770 {} ;
sudo usermod -a -G www-data ubuntu

Сейчас в веб-каталоге все создано от рута, надо изменить на обычного пользователя.
Nginx запускает PHP от пользователя www-data из группы www-data, SSH подключается с пользователем ubuntu. Надо добавить ubuntu в эту группу, иначе могут быть проблемы с доступом. Например, когда какая-то консольная команда создает папку, куда будет идти запись и при открытии сайта через веб.

Настройка HTTPS

Настройка HTTPS часто делается после настройки проекта, когда он уже есть и работает по HTTP. Но действия общие, от проекта не зависят, поэтому рассмотрим ее раньше.
Используются бесплатные сертификаты от Let's Encrypt.

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

Устанавливаем certbot, он обеспечивает настройку и обновление сертификатов.

sudo mcedit /etc/nginx/sites-available/default
# server_name my.domain.name;
sudo systemctl reload nginx

Прописываем доменное имя. Оно уже должно быть доступно и указывать на IP сервера. Для этого в настройках домена у регистратора нужно добавить DNS-запись типа A.

sudo certbot --nginx

Запускаем бота. Он автоматически определит домен по настройкам Nginx, но запросит подтверждение, а также задаст несколько других вопросов. Затем он устанавливает сертификат и обращается по доменному имени для проверки. Настройки Nginx для HTTPS он меняет сам.

echo -e '#!/bin/shnncertbot renewn' | sudo tee /etc/cron.daily/certbot-renew > /dev/null
sudo chmod 0755 /etc/cron.daily/certbot-renew

Обновление сертификата надо добавить в cron для ежедневного запуска.

sudo certbot renew --dry-run

Есть специальная команда для проверки, пройдет ли обновление без ошибок.

Настройка проекта

sudo apt-get install git
curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer

Git и Composer
Composer лучше не ставить через apt-get, там старая версия. На сайте Composer есть скрипт для более безопасной установки с проверкой хеша. Можно использовать его, или просто взять оттуда текущий хеш и проверить вручную.

cd /var && rm -rf www/html

# set repository URL here
git clone ... www
cd www

git checkout dev
ln -s public html
composer install

Клонируем проект и устанавливаем зависимости. Вставьте свой репозиторий и название ветки.
Nginx настроен на папку html, надо ее убрать и сделать симлинк на папку где в проекте находится index.php. В Laravel это папка public.

sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache
sudo chmod -R 0777 storage/framework/cache

Устанавливаем права на папки специально для Laravel. Подробнее здесь.

cp .env.example .env && php artisan key:generate

Создаем рабочий файл с настройками окружения.

Далее все как обычно — создаем, настраиваем, прописываем.

Автор: Михаил

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js