Предлагаю статью, в которой собрано все во едино по настройке выделенного сервера с нуля без панели со всем необходимым. Оставлю это здесь в качестве шпаргалки.
Панели управления — достаточно удобны, но за удобство иногда приходиться платить производительностью, а ещё иногда и это не бесплатная услуга. К тому же в последнее время наблюдается тенденция снижения цен на VDS, к примеру на RUVDS цена стартует от 130 рублей за сервер.
Связка nginx + apache рекомендуется устанавливать на серверы с 1 Гб оперативной памяти, ввиду того, что apache достаточно прожорливый. На меньших объёмах сайт может тормозить ввиду нехватки именно этого ОЗУ.
1. Подготовка и программы для работы с VPS
Собственно давайте приступим. После заказа VPS вы получаете к нему доступ по ssh, рекомендую использовать программу WinSCP — это удобный файловый менеджер, знаменитая PuTTY уже в него встроена. Рекомендую сразу сохранить данные подключения сервера.
С самого начала нам именно PuTTY и понадобится.
В появившееся окно вводим пароль и подключаемся к серверу. Теперь в это окно мы будем водить команды.
2. Установка lAMP
lAmp — это сокращение от «Linux Apache MySQL PHP». То есть это базовые службы веб-сервера. Раньше lAMP можно было установить одной командой типа «apt-get install phpmyadmin» и далее по зависимостям всё само устанавливалось и настраивалось как надо. Но с появлением php 8 версии это стало немного не актуально ввиду того, что не все сайты работают с php 8. Лично мне была нужна php 7 версии. Перед началом обязательно проверяем наличие обновлений:
apt-get update apt-get upgrade
Далее устанавливаем lAMP:
apt-get install apache2 apt-get install php7.4 apt-get install mariadb-server
Mariadb — это альтернативный сервер базы данных от привычной всем MySQL, полностью с ним совместимый. Дело в том, что MySQL — это детище ORACLE, имеет закрытый код и условно-бесплатную лицензию на использование, плюс были какие-то разборки в результате чего теперь лучше использовать Mariadb. К тому же по заверению разработчиков Mariadb более оптимизирована и имеет 25% превосходство с MySQL по скорости работы.
Теперь можно установить и phpMyAdmin:
apt-get install phpmyadmin
В процессе установки появится табличка, с каким сервером будет использоваться phpMyAdmin — выбрать Apache, по завершении установки будет предложено создать базу данных для phpMyAdmin — разрешите ему такое действие, если ему так хочется. К тому же после этого станут доступны дополнительные функции в phpMyAdmin, которые будут полезны в будущем.
через WinSCP заходим в директорию «/var/www/html», это директория, для веб-сайта по умолчанию. нажимаем правой кнопкой мыши — «новый — файл» и создаём файл «phpinfo.php», в открывшимся окне редактора пишем
<?php phpinfo(); ?>
, сохраняем (WinSCP автоматически передаст обновлённый файл на сервер). Проверяем работоспособность:
http://ваш_IP_адрес/phpinfo.php
3. Настройка root-доступа Mariadb для phpMyAdmin
Сервер базы данных изначально не знает пароль root от сервера да и вообще, они могут быть совершенно разные. Лично мне было удобно, чтобы пароли везде были одинаковые. Для изменения пароля для root в Mariadb переходим в PuTTY, пишем
mysql
в появившейся строке вводим:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'ваш_пароль'; FLUSH PRIVILEGES; quit;
Всё, пароль для root в базе данных установлен. В дальнейшем подключиться к монитору можно будет командой:
mysql -pваш_пароль
Заметьте, что пароль вводиться вплотную после «-p» без пробелов. Теперь пробуем подключиться к phpMyAdmin:
http://ваш_IP_адрес/phpmyadmin
Теперь через интерфейс можно создавать новых пользователей и наделять их привилегиями.
4. Установка nginx перед Apache
Такая связка призвана разгрузить Apache от отправки статических файлов и сохранить работоспособность файлов «.htaccess». Считается, что Apache имеет проблемы с буферизацией и очень плохо справляется со статикой, расходуя огромное количество ресурсов. Для этого был специально создан nginx. Для начала отредактируем файл конфигурации Apache. Переходим в директорию «/etc/apache2/sites-available» открываем «000-default.conf» в самом начале заменяем:
<VirtualHost *:80>
на
<VirtualHost *:8080>
Или любой другой порт, отличный от «80». Восьмидесятый порт — это порт по умолчанию для протокола «http», его теперь будет использовать nginx.
Кстати, попутно рекомендую отредактировать файл «apache2.conf» в директории «/etc/apache2», найти секцию:
<Directory /var/www/> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory>
и заменить в ней «AllowOverride None» на «AllowOverride All». Без этого изменения Apache не будет обрабатывать файлы .htaccess!
Сохраняем изменения и в PuTTY вводим
systemctl restart apache2
Пробуем наши изменения, открываем в обозревателе:
http://ваш_IP_адрес:8080
Работает, замечательно. Переходим обратно в PuTTY, устанавливаем nginx:
apt-get install nginx
После установки пробуем перейти
http://ваш_IP_адрес
Видим другую начальную страницу. Значит nginx работает. Однако попытка вызвать «http://ваш_IP_адрес/phpmyadmin» или «http://ваш_IP_адрес/phpinfo.php» оканчивается неудачей. Содержимой файлов просто выводится в обозревателе. Теперь осталось настроить обработку php файлов через Apache, все статические файлы оставим для nginx. Переходим в директорию «/etc/nginx/sites-available» и открываем для редактирования файл «default». Вписываем в него содержимое:
# Default server configuration # server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; # Add index.php to the list if you are using PHP index index.html index.htm index.nginx-debian.html index.php; server_name _; location / { location ~ [^/]\.ph(p\d*|tml)$ { try_files /does_not_exists @apache; } location ~* ^.+\.(jpe?g|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf)$ { expires max; try_files $uri $uri/ @apache; } location /phpmyadmin { try_files $uri $uri/ @apache; } location / { try_files /does_not_exists @apache; } } location ~ /\.ht { deny all; } location @apache { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Port $server_port; proxy_pass http://127.0.0.1:8000; } }
Отдельно хочется отметить секцию «@apache». Все необходимые заголовки должны быть отправлены ДО команды «proxy_pass». Кроме этого, адрес должен быть указан именно «127.0.0.1», а не «localhost». Это необходимо для корректной работы модуля «remoteip» у Apache, чтобы корректно определять удалённый IP-адрес пользователя.
Сохраняем изменения, перезагружаем nginx
systemctl restart nginx
Проверяем наши адреса:
http://ваш_IP_адрес/phpmyadmin http://ваш_IP_адрес/phpinfo.php
Теперь всё должно заработать.
Подключим модуль «remoteip». Нам необходимо перейти в директорию «/etc/apache2/mods-available» и создать файл «remoteip.conf» со следующим содержимым:
RemoteIPHeader X-Forwarded-For RemoteIPTrustedProxy 127.0.0.1
Сохраним конфигурацию, теперь в PuTTY вводим:
a2enmod remoteip systemctl restart apache2
Теперь Apache сможет получать корректный внешний адрес от nginx.
5. Создание виртуальных хостов
Виртуальный хост — это так называемый «сайт», то есть подключённое доменное имя к серверу. Создадим виртуальный хост «example.ru». Нам будет необходимо создать директорию для файлов сайта, базу данных для сайта и 2 файла конфигурации. Начнём.
Создадим файл конфигурации для nginx, переходим в директорию «/etc/nginx/sites-available», создадим файл «example.ru»:
server { root /var/www/example.ru; # Add index.php to the list if you are using PHP index index.html index.htm index.php; server_name example.ru www.example.ru; location / { location ~ [^/]\.ph(p\d*|tml)$ { try_files /does_not_exists @apache; } location ~* ^.+\.(jpe?g|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf)$ { expires max; try_files $uri $uri/ @apache; } location / { try_files /does_not_exists @apache; } } location ~ /\.ht { deny all; } location @apache { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Port $server_port; proxy_pass http://127.0.0.1:8000; } }
Важно! Оставьте пустую строку в конце файла конфигурации.
Создадим файл конфигурации для Apache, переходим в директорию «/etc/apache2/sites-available», создаём файл «example.ru.conf»:
<VirtualHost *:8080> ServerName example.ru ServerAlias www.example.ru SetEnvIf X-Forwarded-Proto https HTTPS=on ServerAdmin admin@example.ru DocumentRoot /var/www/example.ru ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
Теперь осталось только создать директорию для сайта «/var/www/example.ru». В неё можно загрузить «index.html» с любым содержимым или наш «phpinfo.php»
Включаем сайты и перезагружаем серверы:
ln -s /etc/nginx/sites-available/example.ru /etc/nginx/sites-enabled/ a2ensite example.ru systemctl restart nginx systemctl restart apache2
Пробуем наш сайт в обозревателе:
http://example.ru http://example.ru/phpinfo.php
6. Установка сертификата от Let’s Encrypt
Достаточно простая процедура, для этого есть специальное приложение, которое нужно будет скачать и установить. Для начала нам нужно установить «snapd», так как сам серт-бот работает через него:
apt install snapd snap install core snap refresh core snap install --classic certbot ln -s /snap/bin/certbot /usr/bin/certbot
Теперь можно запускать приложение для получения сертификатов командой
certbot --nginx
Останется выбрать только домены для получения сертификата. Важно! мы прописывали наш «example.ru» и с «www», но по сути — это один домен. При получении сертификата нужно будет указать через запятую оба, к примеру: 1,2. К слову приложение само получит и установит сертификат, внесёт все необходимые изменения в файлы конфигурации nginx и создаст задачу в планировщике для автоматического обновления сертификата.
7. Настройка sendmail для отправки почты
Для отправки почты через php проще всего использовать «sendmail», для начала установим его:
apt-get install sendmail
Проверим, работает ли он:
/usr/sbin/sendmail -q
Если ошибок нет, переходим в настройки php, переходим в директорию «/etc/php/7.4/apache2», находим файл «php.ini», выполним поиск «sendmail_path». Заменяем строку на
sendmail_path = /usr/sbin/sendmail -t -i
Сохраняем и перезапускаем Apache:
systemctl restart apache2
Для проверки в каталоге «/var/www/html» создадим файл «mail.php» с содержимым:
<?php $to = "ВАШ_EMAIL_АДРЕС"; $subject = "This is a test HTML email"; $message = " <html> <head> <title>This is a test HTML email</title> </head> <body> <p>Test email. Please ignore.</p> </body> </html> "; // It is mandatory to set the content-type when sending HTML email $headers = "MIME-Version: 1.0" . "\r\n"; $headers .= "Content-type:text/html;charset=UTF-8" . "\r\n"; // More headers. From is required, rest other headers are optional $headers .= 'From: <info@example.com>' . "\r\n"; $headers .= 'Cc: sales@example.com' . "\r\n"; if (mail($to,$subject,$message,$headers)) { echo 'Mail Sent'; } else { echo 'Error Sending Email'; } ?>
Сохраняем, пробуем обратиться к файлу
http://ваш_IP_адрес/mail.php
В ответ получаем «Mail Sent», проверяем почтовый ящик. Некоторые почтовые серверы могут отправить такое письмо в спам.