November 3, 2021

Стартовая настройка Ubuntu 18 / Ubuntu 20 LTS

Тут коротко что нужно последовательно дергать, чтобы установить LAMP на Ubuntu 18 LTS / Ubuntu 20 LTS

Общее

Заходим на сервер, включаем:

sudo -i

Обновить:

apt update

Ставим вспомогательные программы:

apt install -y mc htop iotop curl git unzip net-tools

Установка Apache:

apt install apache2 -y
apt install libapache2-mpm-itk -y
a2enmod rewrite
systemctl restart apache2

Теперь создаем хост:

cd /etc/apache2/sites-available/
touch hostname.conf
nano hostname.conf

hostname - может быть любым именем

Пример конфига виртуального хоста для http:

<VirtualHost *:80> 
    ServerName site.ru 
    ServerAlias www.site.ru 
    DocumentRoot /home/site/www/public 
    AssignUserId site site 
    <Directory /home/site/www/public > 
        Options FollowSymLinks 
        AllowOverride All 
        Require all granted 
    </Directory>
</VirtualHost>

Пример конфига для https:

<VirtualHost *:80>
        ServerName      site.ru
        ServerAlias     www.site.ru site.ru
        DocumentRoot    /home/site/www/public
        AssignUserId    site site
        <Directory /home/site/www/public >
                        Options FollowSymLinks
                        AllowOverride All
                        Require all granted
        </Directory>
        RewriteEngine on
        RewriteCond %{SERVER_NAME} =site.ru [OR]
        RewriteCond %{SERVER_NAME} =www.site.ru
        RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
<IfModule mod_ssl.c>
    <VirtualHost *:443>
        ServerName      site.ru
        ServerAlias     www.site.ru site.ru
        DocumentRoot    /home/site/www/public
        AssignUserId    site site
        <Directory /home/site/www/public >
            Options FollowSymLinks
            AllowOverride All
            Require all granted
        </Directory>
        SSLCertificateFile /etc/letsencrypt/live/site.ru/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/site.ru/privkey.pem
        SSLEngine on
        SSLProtocol             all -SSLv2 -SSLv3
        SSLCipherSuite          ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES2$
        SSLHonorCipherOrder     on
        SSLCompression          off
        SSLOptions +StrictRequire
        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" vhost_combined
        LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost_common
    </VirtualHost>
</IfModule>

/home/site/www/public - это путь до корневой директории сайта. В этом примере - такое подходит для Laravel, например

site.ru - имя сайта, какого он уровня - не важно

site - это имя пользователя, apache будет работать в его папке из под него (это ОЧЕНЬ удобно, кто так не делает - обрекает себя на бесконечные страдания и решение вопросов в доступами к файлам через предоставление прав 777 на папки)

/etc/letsencrypt/live/site.ru/fullchain.pem и /etc/letsencrypt/live/site.ru/privkey.pem - путь до файлов с сертификатами.

Также в файл /etc/apache2/apache2.conf нужно добавить ServerName localhost:

nano /etc/apache2/apache2.conf
ServerName localhost

проверить что настройки верные:

apache2ctl configtest

применяем настройки, просим apache применить их:

a2ensite sites.conf
systemctl reload apache2

SSL для Apache2

Если нужно сделать домен с самоподписным сертификатом, то сертификат можно выпустить вот так:

openssl req -new -x509 -days 10000 -nodes -out cert.pem -keyout cert.key -subj "/C=RU/ST=MSK/L=MSK/O=Alfmaster/OU=Alfmaster/CN=site.ru/CN=www.site.ru"

После этого в Apache2 можно вписать вот такой конфиг:

<VirtualHost *:443>
        ServerName site.ru
        ServerAlias www.site.ru
        DocumentRoot /home/site/www/public
        AssignUserId site site
        <Directory /home/site/www/public >
                Options FollowSymLinks
                AllowOverride All
                Require all granted
        </Directory>
        SSLEngine on
        SSLCertificateFile cert/site.ru/cert.pem
        SSLCertificateKeyFile cert/site.ru/cert.key
</VirtualHost>

cert/site.ru/cert.pem - это адрес относительно папки апача (/etc/apache2/)

MySQL

apt install mysql-server

После этого делаем так, чтобы было удобно пользоваться паролем

 mysql
 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '{PASSWORD}';
 FLUSH PRIVILEGES;
 exit

где password = root пароль

Далее настройка безопасности

mysql_secure_installation

на все вопросы отвечаем "Y", на второй вопрос про пароль: 2 (MEDIUM: 8+ символов, включая буквы разных регистров, цифры, спецсимволы),

Файл конфигурации для разного количества RAM:

nano /etc/mysql/mysql.conf.d/mysqld.cnf 

Можно выбрать один из готовых конфигов.

MySQL5.7: 8GB_RAM: https://alfmaster.ru/conf/mysql57_8gb.conf
MySQL5.7: 16GB_RAM: https://alfmaster.ru/conf/mysql57_16gb.conf
MySQL5.7: 32GB_RAM: https://alfmaster.ru/conf/mysql57_32gb.conf

MySQL8: 4GB_RAM: https://alfmaster.ru/conf/mysql8_4gb.conf
MySQL8: 8GB_RAM: https://alfmaster.ru/conf/mysql8_8gb.conf
MySQL8: 16GB_RAM: https://alfmaster.ru/conf/mysql8_16gb.conf
MySQL8: 32GB_RAM: https://alfmaster.ru/conf/mysql8_32gb.conf
MySQL8: 64GB_RAM: https://alfmaster.ru/conf/mysql8_64gb.conf

service mysql stop
service mysql start

Важно: При этих настройках MySQL "зажрет" почти всё свободную память на VM (но при этом хорошо будет работать на нагрузках). Если базы у вас небольшие - возьмите самый маленьких конфиг (на 4Gb)

Восстановить пароль от root, если потерял:

nano /etc/mysql/mysql.conf.d/mysqld.cnf 
добавить после [mysqld]:
skip-grant-tables
После этого: 
mysql
update user set authentication_string=PASSWORD('root_password') where user='root' and host='localhost';
flush privileges;
exit;

Теперь пользователя надо создавать вот так:

CREATE database {DBNAME};
CREATE USER '{USER}'@'localhost' IDENTIFIED BY '{PASSWORD}';
GRANT ALL PRIVILEGES ON {DBNAME}.* TO '{USER}'@'localhost';
FLUSH PRIVILEGES;
\q

Проверить какие доступы есть для пользователя:

SELECT host FROM mysql.user WHERE User = '{USER}';

PHP

apt install -y php libapache2-mod-php php-mysql php-bcmath php-bz2 php-cli php-common php-curl php-gd php-imap php-json php-mail php-mbstring php-redis php-soap php-xml php-zip

После установки настраиваем параметры в php.ini:

nano /etc/php/*.*/apache2/php.ini
_
для php7.4: /etc/php/7.4/apache2/php.ini
для php8.0: /etc/php/8.0/apache2/php.ini
для php8.1: /etc/php/8.1/apache2/php.ini

Заменяем, чтобы было вот так (ну или как вам там надо):

memory_limit = 512M
post_max_size = 128M
upload_max_filesize = 128M
max_execution_time = 120
max_input_time = 120

Потом:

nano /etc/apache2/mods-enabled/dir.conf

Переставить во второй строчке index.php на первое место

systemctl restart apache2

Composer

Делаем это под root (sudo)

cd ~
curl -sS https://getcomposer.org/installer -o composer-setup.php
php composer-setup.php --install-dir=/usr/local/bin --filename=composer