При проектах, требующих больших ресурсов или если вы решили освоить работу в командной строке и быть полноправным владельцем своего сервера для сайта, возникает необходимость полной настройки сервера. У хостера вы приобрели виртуальную машину с предустановленной операционной системой и собираетесь самостоятельно полностью настроить его как веб-сервер. О процессе установки Nginx, MySQL, PHP7.2-FPM, WordPress и бесплатного сертификата на него на операционной системе Ubuntu и пойдет речь в данной статье.
Установка Nginx на Ubuntu 18.04
Подключаемся консолью к нашему серверу с помощью Putty или аналогичной программы и выполняем следующие команды
sudo apt update sudo apt install nginx
команды для работы с Nginx
sudo systemctl stop nginx - остановка sudo systemctl start nginx - запуск sudo systemctl enable nginx - включение sudo systemctl disable nginx - выключение sudo systemctl restart nginx - рестарт sudo systemctl status nginx - состояние сервиса sudo nginx -t - тестирование конфигурации nginx (очень полезная команда после изменений конфигурации доменов)
Как только Nginx установлен проверим работает ли сервис через консоль и через броузер.
Проверка через консоль
sudo systemctl status nginx
Если установка прошла успешно видим следующий экран
nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2018-04-20 16:08:19 UTC; 3 days ago Docs: man:nginx(8) Main PID: 2369 (nginx) Tasks: 2 (limit: 1153) CGroup: /system.slice/nginx.service ├─2369 nginx: master process /usr/sbin/nginx -g daemon on; master_process on; └─2380 nginx: worker process
Проверим через броузер — для этого набираем http://IP_сервера
Итак если Nginx откликается, переходим к установке, настройке базы данных MySQL
Установка Mysql на Ubuntu
Выполняем команды:
sudo apt update sudo apt install mysql-server
После установки MySQL необходимо настроить безопасную конфигурацию работы с базой данных, так как по умолчанию при установке не запрашивалась информация о владельце (root) MySQL, который никак не связан с root Ubuntu
Также будет проведена настройка безопасного подключения к бд и удаление анонимных записей
sudo mysql_secure_installation
список конфигурационных вопросов
Enter current password for root (enter for none): Just press the Enter Set root password? [Y/n]: Y New password: Enter password Re-enter new password: Repeat password Remove anonymous users? [Y/n]: Y Disallow root login remotely? [Y/n]: Y Remove test database and access to it? [Y/n]: Y Reload privilege tables now? [Y/n]: Y
Далее проверим состояние Mysql и подключимся root для создания базы данных для WordPress
systemctl status mysql
при установленном и запущенном MySQL получим следующий вывод
mysql.service - MySQL Community Server Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: en Active: active (running) since Tue 2019-12-24 18:06:11 UTC; 1 day 1h ago Main PID: 27552 (mysqld) Tasks: 30 (limit: 4703) CGroup: /system.slice/mysql.service └─27552 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pi
Теперь подключаемся к MySQL от root для создания нового владельца базы данных WordPress и самой базы.
sudo mysql -u root -p
Набираем пароль root и создаем новую базу данных WPBASE
mysql> CREATE DATABASE WPBASE;
создаем пользователя WPUSER с паролем Q9x9VprW1a и назначаем ему все права на базу WPBASE
mysql> CREATE USER 'WPUSER'@'localhost' IDENTIFIED BY 'Q9x9VprW1a'; mysql> GRANT ALL PRIVILEGES ON WPBASE.* TO WPUSER@localhost IDENTIFIED BY 'Q9x9VprW1a';
Набираем EXIT для выхода из режима редактирования баз данных.
Установка PHP 7.2-FPM на Ubuntu 18.04
Итак, веб-сервер у нас установлен, база данных создана — далее для установки нам требуется установить PHP, PHP-FPM для обработки динамического контента.
sudo add-apt-repository universe sudo apt update sudo apt install php7.2-fpm php7.2-common php7.2-mysql php7.2-gmp php7.2-curl php7.2-intl php7.2-mbstring php7.2-xmlrpc php7.2-gd php7.2-xml php7.2-cli php7.2-zip
После установки PHP и PHP-FPM настраиваем основной конфигурационный файл php.ini со следующими параметрами
sudo nano /etc/php/7.2/fpm/php.ini file_uploads = On allow_url_fopen = On short_open_tag = On memory_limit = 256M cgi.fix_pathinfo = 0 upload_max_filesize = 100M max_execution_time = 360 date.timezone = Europe/Moscow
Далее необходимо перезапустить службу php-fpm
sudo service php7.2-fpm restart
Проверим работоспособность php-fpm, для этого создадим файл info.php с содержанием
sudo nano /var/www/html/info.php <?php phpinfo( ); ?>
Наберем в броузере http://ip_сервера/info.php и если все идет правильно видим следующий экран
Обязательно удаляем данный файл после успешной проверки
Скачивание и установка WordPress
В зависимости от версии WordPress (eng или ru) ссылки для скачивания дистрибутива будут разными.
Для ru версии https://ru.wordpress.org/latest-ru_RU.tar.gz
Для eng версии https://wordpress.org/latest.tar.gz
Скачаем во временный каталог и будем устанавливать на домен example.com
cd /tmp wget https://wordpress.org/latest.tar.gz tar -xvzf latest.tar.gz sudo mv wordpress /var/www/html/example.com
далее дадим корректные права на каталог example.com для nginx
sudo chown -R www-data:www-data /var/www/html/example.com/ sudo chmod -R 755 /var/www/html/example.com/
Настройка Nginx в Ubuntu 18.04
Приступим к настройке конфигурационного файла Nginx для нашего нового домена example.com. Создадим его.
sudo nano /etc/nginx/sites-available/example.com
В файле добавим базовые конфигурационные настройки.
server { listen 80; listen [::]:80; server_name example.com www.example.com; root /var/www/html/example.com; index index.php; access_log /var/log/nginx/example.com.access.log; error_log /var/log/nginx/example.com.error.log; client_max_body_size 100M; autoindex off; location / { try_files $uri $uri/ /index.php?$args; } location ~ .php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
При необходимости меняем имя домена, версию fpm и наименования для файлов логов.
Сохраняем файл и выходим. Далее необходимо создать символическую ссылку на данный конфигурационный файл
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
проверим конфигурацию и перезапустим nginx
sudo nginx -t sudo systemctl restart nginx
При обращении к нашему сайту example.com мы увидим первую страницу установки WordPress, но в нашем случае к установке пока не приступаем так как нам еще нужно получить и установить бесплатный сертификат Let’s Encrypt.
Установка сертификата Let’s Encrypt на сайте на веб-сервере Nginx
Сначала установим утилиту Certbot, позволяющую автоматически настроить https и в дальнейшем запрашивать обновление сертификата при истечении по расписанию (на данный момент сертификат Let’s Encrypt нужно перевыпускать каждые 3 месяца). Для установки запустим команду
sudo apt install certbot
После установки Certbot, создайте файл для Let’s Encrypt для валидации домена ${webroot-path}/.well-known/acme-challenge директории. Создадим директорию и дадим Nginx права на нее
sudo mkdir -p /var/lib/letsencrypt/.well-known sudo chgrp www-data /var/lib/letsencrypt sudo chmod g+s /var/lib/letsencrypt
Далее создаем файл с конфигурацией
sudo nano /etc/nginx/snippets/well-known
Копируем содержание в файл
location ^~ /.well-known/acme-challenge/ { allow all; root /var/lib/letsencrypt/; default_type "text/plain"; try_files $uri =404; }
Получение бесплатного сертификата и подключение к Nginx
Настраиваем конфигурационный файл домена в Nginx
sudo nano /etc/nginx/sites-available/example.com
Вносим изменения (отмечено красным)
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/html/example.com;
index index.php;
include snippets/well-known;
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
client_max_body_size 100M;
autoindex off;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Сохраняем файл и перезапускаем Nginx
Далее запустим команду получения сертификата
sudo certbot certonly --agree-tos --email admin@example.com --webroot -w /var/lib/letsencrypt/ -d example.com -d www.example.com
Красным отмечены изменения для вашего домена. Если все успешно видим сообщение
IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/example.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/example.com/privkey.pem Your cert will expire on 2019-08-18. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le
Подключаем сертификат. Сначала генерируем 2048 битный сертификат.
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Редактируем конфигурационный файл
sudo nano /etc/nginx/sites-available/example.com
server { listen 80; server_name www.example.com example.com; include snippets/well-known; return 301 https://$host$request_uri; } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name example.com www.example.com; root /var/www/html/example.com; index index.html; if ($host != "example.com") { return 301 https://example.com$request_uri; } include snippets/well-known; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem; ssl_dhparam /etc/ssl/certs/dhparam.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS'; ssl_prefer_server_ciphers on; ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 30s; access_log /var/log/nginx/example.com.access.log; error_log /var/log/nginx/example.com.error.log; client_max_body_size 100M; autoindex off; location / { try_files $uri $uri/ /index.php?$args; } location ~ .php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
Перезапускаем Nginx, при необходимости проверяя конфигурацию и делаем перевыпуск сертификата по расписанию в час ночи 1 числа каждого месяца.
sudo crontab -e
0 1 1 * * /usr/bin/certbot renew & > /dev/null
Установка WordPress
Обращаемся через веб к нашему сайту https://example.com и если все правильно видим первоначальную страницу установки.
Указываем нашу базу данных wpbase, пользователя wpuser и пароль соединения с базой данных.
Далее создаем первого пользователя (администратор) и пароль WordPress.
Если у вас остались вопросы — пишите в комментариях, с удовольствием проконсультируем по настройке подключения сертификатов, работе nginx и других специфических особенностях веб-серверов.