Полноценный веб сервер для мини проектов на базе недорогого VDS сервера (CentOS Nginx+PHP-FPM+MySQL)

Предметом данной темы стала просьба по организации размещения нескольких небольших веб проектов в сети. Сайты, по сути, на стандартных движках, например Joomla, WordPress и т.д.

Одним из пожеланий было самостоятельное управление сервером и свой IP, по сути выделенный сервер.

После недолгих оценок необходимых мощностей под сервер, выбор пал на VDS у разных провайдеров стоимостью до 100р в месяц.

В итоге имеем сервер с характеристиками:
CPU — 1xXeon 2GHz
RAM — 512Mb
HDD — 7Gb SSD

Установлена ОС — CentOS 7

Задача: поднять полноценный веб сервер на базе недорогого VDS сервера.

Подключение репозитория

yum install epel-release
yum -y install yum-utils

Настройки файрвола

Проверим статус:

systemctl status firewalld

Если необходимо включим:

systemctl is-enabled firewalld
systemctl start firewalld
systemctl enable firewalld

Настройка доступа через SSH на нестандартный порт:

nano /etc/ssh/sshd_config

port 11022

Откроем новый порт на файрволе:

firewall-cmd --permanent --add-port=11022/tcp

и можно удалить правило для ssh:

firewall-cmd --zone=public --list-services
firewall-cmd --permanent --zone=public --remove-service=ssh

перечитаем правила:

firewall-cmd --reload

Создадим swap

Поскольку памяти у нас скажем не очень много, нам понадобится раздел подкачки. Плюсом является то, что диск у нас на SSD носителе.

Проверим наличие swap:

swapon -s

Если ничего нет в ответе, то и swap не создан. Убедимся в нулевых значениях файла подкачки:

free -m
или 
через утилиту top/htop

Определим размер файла исходя из потребностей памяти. Основным потребителем будем СУБД. Создаем файл подкачки размером 1Гб:

dd if=/dev/zero of=/swapfile bs=1M count=1024
mkswap /swapfile
swapon /swapfile

Задаем права на файл и проверяем результат:

chmod 600 /swapfile
ls -alh /swapfile

Автоматическое монтирование swap:

nano /etc/fstab

/swapfile swap swap sw 0 0

Настройки файрвола для веб сервера

Зададим правила для http и https:

firewall-cmd --permanent --zone=public --add-service=http --add-service=https
или 
firewall-cmd --permanent --add-port=80/tcp --add-port=443/tcp

firewall-cmd --reload

Проверим:

firewall-cmd --zone=public --list-services
или
firewall-cmd --zone=public --list-ports
или все вместе
firewall-cmd --list-all

Установка MYSQL (MariaDB)

Почему-то в репозиториях CentOS 7 версия MariaDB оказалось старой 5.5. Подключим родной репозиторий для установки новой версии:

yum  -y update
tee /etc/yum.repos.d/MariaDB.repo<<EOF 
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.4/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
EOF
yum makecache fast

Установим MariaDB

yum -y install MariaDB-server MariaDB-client

Проверим установленную версию:

rpm -qi MariaDB-server
или 
mysql -V

Запуск mariadb:

systemctl enable mariadb.service
systemctl start mariadb.service
systemctl status mariadb.service

Первичная настройка MariaDB:

mysql_secure_installation

Настройки MariaDB для небольшого сервера — https://gist.github.com/liverbool/9055209

Оптимизация настроек через Mysqltuner. Mysqltuner — это скрипт на perl, который анализирует статистику работы Mysql и выдает свои рекомендации по оптимизации настроек. К строкам помеченным символами [!!] и секции Recommendations особое внимание.

Установим скрипт Mysqltuner:

yum -y install mysqltuner

Запуск:

mysqltuner --user root --pass rootpassword

Установка NGINX

yum -y install nginx

Проверка версии и запуск:

nginx -v

systemctl start nginx
systemctl enable nginx
systemctl status nginx

Настройка:

cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf_backup
nano /etc/nginx/nginx.conf

include /etc/nginx/sites-enabled/*.conf;

Проверка синтаксиса конфигурации и перезапуск:

nginx -t
systemctl restart nginx

Можно зайти по IP адресу. Веб сервер должен работать.

Папки и настройки для сайтов:

mkdir -p /var/www/site.ru/{www,log}

chown -R nginx:nginx /var/www/site.ru/www
chmod -R 755 /var/www
touch /var/www/site.ru/www/index.html
echo 'My site.ru is working!' > /var/www/site.ru/www/index.html
mkdir /etc/nginx/{sites-available,sites-enabled}
nano /etc/nginx/sites-available/site.ru.conf

server {
    listen 80;
    server_name site.ru www.site.ru;
 
    set $root_path '/var/www/site.ru/www';
    root $root_path;
    index index.html;
 
    location / {
        try_files $uri $uri/ $uri.html $uri.php$is_args$query_string;
    }
 
    error_page 500 502 503 504 /50x.html;
    error_page 404 /404.php;
    
    location = /50x.html {root /usr/share/nginx/html;}
    #location = /404.php  {root $root_path;}
       
    error_log  /var/www/site.ru/log/nginx-error.log error;
}
ln -s /etc/nginx/sites-available/site.ru.conf /etc/nginx/sites-enabled/site.ru.conf
systemctl restart nginx

Сайт с доменным именем site.ru / www.site.ru должен быть доступен при всех необходимых настройках на стороне DNS сервера.

Аналогично создаются другие необходимые настройки для остальных сайтов.

Установка PHP

Для установки новых версий PHP подключаем необходимые репозитории:

yum -y install https://rpms.remirepo.net/enterprise/remi-release-7.rpm

Включаем репозитории для CentOS 7 PHP-7.4:

yum-config-manager --enable remi-php74

Ставим PHP и расширения. Некоторые расширения необходимы для корректной работы Joomla:

yum -y install php php-mysql php-fpm php-fpm-nginx php-mbstring php-cli php-simplexml

Запускаем:

systemctl start php-fpm
systemctl enable php-fpm

Проверяем:

php -v

Настройки запуска php-fpm под nginx:

nano /etc/php-fpm.d/www.conf

user = nginx
group = nginx
listen = /run/php-fpm/www.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
systemctl restart php-fpm
systemctl status php-fpm

Создаем проверочный файл работы php:

echo '<?php phpinfo(); ?>' > /var/www/site.ru/www/test.php

Изменяем конфигурацию сайта под Nginx для корректной работы с php. Данная конфигурация является рекомендуемой для Joomla.

nano /etc/nginx/sites-available/site.ru.conf

server {
    server_name site.ru www.site.ru;

    access_log	/var/www/site.ru/log/nginx_access.log main;
    error_log	/var/www/site.ru/log/nginx_error.log;
    root	/var/www/site.ru/www;

    client_max_body_size	20M;
    gzip			on;
    gzip_comp_level		1;
    gzip_disable		"msie6";
    gzip_types			text/plain text/css text/javascript application/javascript application/x-javascript;
    gzip_vary			on;
    keepalive_timeout		6;
    server_tokens		off;

    location / {
        try_files  $uri $uri/ /index.php;
        index      index.php index.html index.htm;

    error_page 500 502 503 504 /50x.html;
    error_page 404 /404.php;

        location ~ \.php$ {
            try_files               $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            include                 /etc/nginx/fastcgi_params;
            fastcgi_pass            unix:/run/php-fpm/www.sock;
            fastcgi_index           index.php;
            fastcgi_param SCRIPT_FILENAME /var/www/site.ru/www$fastcgi_script_name;
        }

        location ~* \.(css|gif|ico|jpg|jpeg|js|pdf|png)$ {
	    expires		2M;
	    access_log	off;
		}
    }
}

Проверяем доступность тестовой страницы test.php. Если страница доступна и открылась PHP INFO, то сервер работоспособен. Можно загружать проекты.

Top