В тази статия ще покажа как да инсталирате LAMP (Linux, Apache, MariaDB, PHP-FPM) сървър на Debian 12 (bookworm). Също така ще направя едни от най-важните и основни неща за да защитим нашия сървър. Идеята на статията е да бъде кратка и систематизирана. Предвидена е за средно напреднали и напреднали с Linux-а.
Обновяване на repository и софтуерните пакети:
apt update apt dist-upgrade
Инсталиране на помощни пакети, ако не са инсталирани преди това:
apt install sudo sudo apt install htop mc curl net-tools rsyslog
Препоръчително е добавим админ user-a към Sudoers. Това става със следната команда:
usermod -aG sudo YOUR_USER
След като приключи инсталирането на помощните пакети вече може да започнем със инсталацията на Apache2.
Инсталиране на Apache2:
sudo apt install apache2 apache2-utils
Също така може да отворим следния адрес: http://IP-то-на-сървъра. Трябва да видим страницата по подразбиране на Apache.
Активираме най-използваните модули за Apache2:
sudo a2enmod rewrite ssl headers http2 vhost_alias setenvif
Препоръчително е да спрем 'directory listing' и да позволим 'AllowOverride'. Отваряме конфиг файла:
nano /etc/apache2/apache2.conf
Намираме <Directory /var/www/> и го променяме на:
<Directory /var/www/> Options -Indexes +FollowSymLinks AllowOverride All Require all granted </Directory>
За да приложим промените рестартираме Apache2:
systemctl restart apache2
С това приключи инсталирането на Apache2.
Инсталиране на MariaDB (MySQL server)
Изпълняваме следната команда:
sudo apt install mariadb-server mariadb-client
След като завърши инсталацията ще изпълним скрипта за secure installation:
sudo mysql_secure_installation
Следваме стъпките на скрипта:
- слагаме парола на root акаунта;
- премахваме анонимния акаунт;
- Забраняваме remote логина с root акаунта;
- премахваме test базата;
Сега ще създадем акаунт с пълни права за MariaDB. Първо трябва да се свържем с MariaDB:
mysql -u root -p
Въвеждаме root паролата.
След което изпълняваме следните заявки за да създадем нов потребител с пълни права:
CREATE USER 'user'@'%' IDENTIFIED BY 'userpass'; GRANT ALL ON *.* TO 'user'@'%' WITH GRANT OPTION;
Следва сега да редактираме основните настройки на ресурсите на MariaDB. Създаваме файл /etc/mysql/mariadb.conf.d/80-tuning.cnf:
nano /etc/mysql/mariadb.conf.d/80-tuning.cnf
След това поставяме настройките в новия файл:
[mysqld] bind-address = 0.0.0.0 performance_schema=ON log_error = /var/log/mysql/error.log slow-query-log = 1 slow-query-log-file = /var/log/mysql/slow-queries.log long_query_time = 10 # Skip binary log files skip-log-bin # Skip reverse DNS lookup of clients skip-name-resolve # https://mariadb.com/kb/en/server-system-variables/#max_connections max_connections = 500 #InnoDB # https://mariadb.com/kb/en/innodb-system-variables/#innodb_buffer_pool_size innodb_buffer_pool_size = 4G # https://mariadb.com/kb/en/innodb-system-variables/#innodb_io_capacity innodb_io_capacity = 4000 innodb_io_capacity_max = 8000 # https://mariadb.com/kb/en/innodb-system-variables/#innodb_log_file_size innodb_log_file_size = 1G
Трябва да въведете следните настройки според ресурсите на вашия сървър:
max_connections - според ресурсите на сървъра и типа бази в него
innodb_buffer_pool_size - не повече от 50% от общата RAM
innodb_io_capacity - според типа дискове на сървъра (HDD, SSD, NVMe).
Създаваме папката за log файловете и променяме собственика на mysql user-a:
mkdir /var/log/mysql chown mysql /var/log/mysql
Рестартираме MariaDB за да приложим промените:
sudo systemctl restart mysql
Инсталиране на PHP 8.1:
Добавяне на SURY repository:
apt-get -y install lsb-release ca-certificates curl curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
Обновяване на repository:
sudo apt update
Инсталиране на PHP 8.1:
sudo apt install php8.1
С това инсталацията на PHP 8 е готова. Обаче много от WEB приложенията се нуждаят от допълнителни разширения. С тази команда ще инсталираме едни от най-известните PHP extentions:
sudo apt install php8.1-{fpm,mysql,intl,apcu,zip,dev,curl,cli,imagick,mbstring,gd,bcmath,redis,memcached,xml,soap}
Следва сега да редактираме основните настройки на ресурсите на PHP. Създаваме файл /etc/php/80-tuning.ini:
nano /etc/php/80-tuning.ini
След това поставяме настройките в новия файл:
; Maximum amount of memory a script may consume ; http://php.net/memory-limit memory_limit = 512M ; Maximum execution time of each script, in seconds ; http://php.net/max-execution-time ; Note: This directive is hardcoded to 0 for the CLI SAPI max_execution_time = 60 ; Maximum size of POST data that PHP will accept. ; Its value may be 0 to disable the limit. It is ignored if POST data reading ; is disabled through enable_post_data_reading. ; http://php.net/post-max-size post_max_size = 512M ; Maximum allowed size for uploaded files. ; http://php.net/upload-max-filesize upload_max_filesize = 512M html_errors = Off
Сега трябва да добавим symlinks на новия файл в папките с конфигурационни файлове на PHP:
ln -s /etc/php/80-tuning.ini /etc/php/8.1/fpm/conf.d/80-tuning.ini ln -s /etc/php/80-tuning.ini /etc/php/8.1/cli/conf.d/80-tuning.ini
Активиране на Apache Fast CGI и PHP-FPM:
a2enmod proxy_fcgi a2enconf php8.1-fpm
Рестартираме Apache2 и PHP-FPM за да приложим всички промени:
sudo systemctl restart apache2 php8.1-fpm
Инсталиране на по-стари версии на PHP <= 7.x:
Инсталиране на PHP 7.4 с най-известните PHP extention:
sudo apt install php7.4 php7.4-{fpm,mysql,apcu,zip,dev,curl,cli,imagick,geoip,mbstring,gd,bcmath,json,redis,memcached,xml} ln -s /etc/php/80-tuning.ini /etc/php/7.4/fpm/conf.d/80-tuning.ini ln -s /etc/php/80-tuning.ini /etc/php/7.4/cli/conf.d/80-tuning.ini
Настройки по сигурността:
Следа една кратка и важна стъпка - настройките по сигурността. Има доста неща които може да се правят свързани със сигурността. Тук ще посоча най-общите от тях.
Инсталиране на firewall (ufw), ако не е инсталиран:
sudo apt install ufw ufw allow ssh ufw allow http ufw allow https ufw allow mysql ufw enable
Инсталиране на fail2ban:
apt install fail2ban
Сега трябва да активираме някои Action Jails:
Отваряме или създаваме jail.local файла:
nano /etc/fail2ban/jail.local
Поставяме следните редова:
[sshd] enabled = true [mysqld-auth] enabled = true logpath = /var/log/mysql/error.log
По този начин активираме автоматичното блокиране на поредни неуспешни опити за вход в SSH и MySQL сървъра от едно и също IP.
Настройки за автоматично рестартиране на MySQL и PHP-FPM:
В определни случаи се слючва линукса да премахне (kill-не) процесите на MySQL или PHP-FPM. В този случай приложението ще спре да работи. За да избегнем това systemd има възможност автоматично да рестартира процесите. За да настроим това ще трябва да редактираме config файловете на процесите със следната команда:
systemctl edit mysql
добавете след този ред: ### Anything between here and the comment below will become the new contents of the file
[Service] Restart=on-failure
Сега добавим същите редове и за PHP-FPM:
systemctl edit php8.1-fpm
добавете след този ред: ### Anything between here and the comment below will become the new contents of the file
[Service] Restart=on-failure
След като запазите промените ще трябва да приложите промените като изпълните следната команда:
systemctl daemon-reload
С това завършихме основните настройки на сървъра!