Предметом данной темы стала просьба по организации размещения нескольких небольших веб проектов в сети. Сайты, по сути, на стандартных движках, например 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, то сервер работоспособен. Можно загружать проекты.