Перед началом работы.
Перед установкой я обычно захожу по ssh на сервер. Получаю права root на Ubuntu 20.04
sudo bash
На Debian 11 по умолчанию нет sudo, нужно либо поставить, либо использовать команду
su -
Потом проверяю и ставлю обновления
apt update
apt upgrade
Web сервер Apache в качестве Back-end
Установка web сервера Apache
Теперь можно приступать к установке Apache в системе Debian 11 / Ubuntu lts 20.04
apt install apache2 apache2-utils
После этого, если файрволл ufw включён, нужно разрешить доступ к 80 и 443 портам.
ufw allow 80
ufw allow 443
Сервис apache2 стартует сразу после установки. Можно проверить через браузер:
http://"ip адрес сервера", в моём случае http://192.168.48.92
Настройка web сервера Apache
Начинаем настройку с портов. Поскольку у нас Apache будет в роле back-end, убираю его с 80 порта, на 8080.
mcedit /etc/apache2/ports.conf
Listen 8080
Сохраняем и перегружаем службу
service apache2 restart
Проверяем поднялся ли Apache на новом порту
# netstat -tulnp | grep apache2
tcp6 0 0 :::8080 :::* LISTEN 764/apache2
Создаем в директории /var/www директорию blank с пустым index.hmtl
cd /var/www
mkdir blank
echo " " >> /var/www/blank/index.html
Заворачиваем в неё все дефольтные web запросы
mcedit /etc/apache2/sites-available/000-default.conf
<VirtualHost *:8080>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/blank
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Я предпочитаю следующую структуру web хостинга:
~/www/site1.local
~/log/
директория для содержимого сайта
директория для логов сайта
В директории пользователя надо создать 2 директории www и log, в моём случае это пользователь yuri
cd /home/yuri
mkdir www
mkdir www/test.hserv.su
mkdir log
Создаем виртуальный хостинг для сайта site1.local
mcedit /etc/apache2/sites-available/test.hserv.su.conf
<VirtualHost *:8080>
ServerAdmin web@localhost
ServerName test.hserv.su
ServerAlias www.test.hserv.su
DocumentRoot /home/yuri/www/test.hserv.su
ErrorLog /home/yuri/log/test.hserv.su_error.log
CustomLog /home/yuri/log/test.hserv.su_access.log combined
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /home/yuri/www/test.hserv.su/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
Включаем сайт в конфигурации
a2ensite test.hserv.su.conf
После этого нужно перегрузить Apache для применения изменений.
service apache2 restart
Если возникли какие-то ошибки — смотрим лог apache error_log.
cat /home/yuri/log/test.hserv.su_error.log
Если все в порядке, то проверим, нормально ли настроен наш виртуальный хост. Для этого создадим в папке /home/yuri/www/test.hserv.su/ файл index.html
mcedit /home/yuri/www/test.hserv.su/index.html
<h1>Welcome to test.hserv.su!</h1>
chown yuri. /home/yuri/www/test.hserv.su/index.html
Дальше на своем компьютере правим файл hosts, чтобы обратиться к нашему виртуальному хосту. Добавляем туда строчку:
192.168.48.92 test.hserv.su
где 192.168.48.92 IP адрес нашего веб сервера. Это нужно сделать только в том случае, если настраиваете web сервер где-то в локальной сети без реально существующего доменного имени.
Теперь в браузере набираем адрес http://test.hserv.su:8080. Если видим картинку:
значит все правильно настроили. Если какие-то ошибки, то идем смотреть лог ошибок конкретного виртуального хоста
cat /home/yuri/log/test.hserv.su_error.log
Web сервер Nginx в качестве Front-end
Установка web сервера Nginx
Теперь приступим к установке Nginx
apt install nginx
Настройка web сервера Nginx
Теперь приступим к настройке. Создадим конфиги Nginx для этих виртуальных хостов.
mcedit /etc/nginx/sites-available/test.hserv.su.conf
server {
listen 80;
server_name test.hserv.su www.test.hserv.su;
access_log /home/yuri/log/nginx-test-hserv-access.log combined buffer=64k;
error_log /home/yuri/log/nginx-test-hserv-error.log error;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico|woff)$ {
root /home/yuri/www/test.hserv.su;
access_log off;
expires max;
}
location = /robots.txt {
root /home/yuri/www/test.hserv.su;
allow all;
log_not_found off;
access_log off;
}
}
Применим наш конфиг в доступные сайты
ln -s /etc/nginx/sites-available/test.hserv.su.conf /etc/nginx/sites-enabled/test.hserv.su.conf
service nginx reload
Теперь в браузере набираем адрес http://test.hserv.su. Если видим картинку:
значит все правильно настроили.
Настройка Nginx SSL с помощью Let’s Encrypt
Дальнейшая настройка возможна, только для зарегистрированного домена и правильной настройки DNS.
Устанавливаем пакет certbot для получения бесплатного ssl сертификата от let’s encrypt.
apt install certbot python3-certbot-nginx
Certbot предоставляет широкий выбор способов получения сертификатов SSL с помощью плагинов: Плагин Nginx изменит конфигурацию Nginx и перезагрузит ее, когда это потребуется. Для использования этого плагина введите следующую команду:
certbot --nginx -d test.hserv.su
Первый раз certbot спросит у вас email, на который Let’s Encrypt будет присылать уведомления, когда сертификат будет заканчиваться. Let’s Encrypt предоставляет сертификаты на 90 дней.
Принимаем условия соглашения, решаем подписываться на рекламу или нет. После этого certbot проверит сайт на доступность по 80 порту. После проверки, certbot пропишет в конфигурацию nginx для нашего домена test.hserv.su SSL сертификаты и попытается сделать редирект с 80 порта на 443
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/test.hserv.su/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/test.hserv.su/privkey.pem
Your certificate will expire on 2022-01-12. To obtain a new or
tweaked version of this certificate in the future, simply run
certbot again with the "certonly" option. To non-interactively
renew *all* of your certificates, run "certbot renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
Пакет certbot выполняет это автоматически, добавляя таймер systemd, который будет запускаться два раза в день и автоматически продлевать все сертификаты, истекающиее менее, чем через 30 дней.
Запросить статус таймера с помощью команды systemctl:
systemctl status certbot.timer
● certbot.timer - Run certbot twice daily
Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled)
Active: active (waiting) since Thu 2021-10-14 16:18:32 MSK; 14min ago
Trigger: Fri 2021-10-15 04:35:52 MSK; 12h left
Triggers: ● certbot.service
Если ошибок нет, все нормально. Certbot будет продлевать ваши сертификаты, когда это потребуется, и перезагружать Nginx для активации изменений. Если процесс автоматического обновления когда-нибудь не выполнится, то Let’s Encrypt отправит сообщение на указанный вами адрес электронной почты с предупреждением о том, что срок действия сертификата подходит к концу.
Установка PHP
В базовом репозитории как Debian 11, так и Ubuntu 20.04 хранится актуальная версия php 7.4. Если у вас нет необходимости использовать что-то новее или старее, то можно остановиться на этой версии.
Устанавливаем php в Debian 11 или Ubuntu 20.04 , а так же некоторые популярные модули, которые могут пригодиться для того же phpmyadmin.
apt install php php-cli php-mysql php-json php-gd php-ldap php-odbc php-common php-opcache php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap php-zip
Выполним перезапуск Apache:
service apache2 restart
Создадим файл в директории виртуального хоста и проверим работу php:
mcedit /home/yuri/www/test.hserv.su/index.php
<?php phpinfo(); ?>
chown yuri. /home/yuri/www/test.hserv.su/index.php
Заходим по адресу http://test.hserv.su/index.php
Вы должны увидеть вывод информации о php. Если что-то не так, возникли какие-то ошибки, смотрите лог ошибок виртуального хоста, php ошибки будут тоже там.
Где лежит php.ini
После установки часто возникает вопрос, а где хранятся настройки php? В Debian системах уже относительно давно, файл php.ini разделили. Для Apache он расположен в папке /etc/php/7.4/apache2/, для cli он расположен в папке /etc/php/7.4/cli/. Там можно редактировать глобальные настройки для всех виртуальных хостов. Персональные настройки каждого сайта можно сделать отдельно в файле конфигурации виртуального хоста, который мы сделали раньше. Давайте добавим туда несколько полезных настроек:
mcedit /etc/apache2/sites-available/test.hserv.su.conf
Добавляем в самый конец, перед </VirtualHost>
php_admin_value date.timezone 'Europe/Moscow'
php_admin_value max_execution_time 120
php_admin_value max_input_time 120
php_admin_value post_max_size 200M
php_admin_value upload_max_filesize 50M
php_admin_value max_file_uploads 150
Для применения настроек нужно сделать перегрузить Apache.
service apache2 restart
Установка MySQL
Сейчас все большее распространение получает форк MySQL — MariaDB. Она имеет полную совместимость с MySQL. В последнее время, я предпочитаю использовать именно ее.
Устанавливаем mariadb в Debian 11 или Ubuntu 20.04
apt install mariadb-server
Запускаем скрипт начальной конфигурации mysql и задаем пароль для root. Все остальное можно оставить по-умолчанию.
mysql_secure_installation
Откроется серия диалогов, где нужно внести некоторые изменения в параметры безопасности установки MariaDB. Меняем пароль пользователя root для текущей базы данных, потом удаляем анонимных пользователей, отключаем возможность подключаться root удаленно, удаляем тестового пользователя и базу. все предложения мастера.
Файлы настроек mysql/mariadb в Debian лежат в директории /etc/mysql/. Для обычной работы достаточно настроек по-умолчанию. Но если вы решите изменить их, не забудьте перезапустить службу баз данных.
service mariadb restart
Установка phpmyadmin
Для того, чтобы установить phpmyadmin на наш web сервер, достаточно просто распаковать в директорию с виртуальным хостом исходники панели. Создаем структуру папок.
mkdir /home/yuri/www/test.hserv.su/pma
Идем на сайт https://www.phpmyadmin.net и копируем ссылку на последнюю версию панели. Затем загружаем ее через консоль
cd ~
wget https://files.phpmyadmin.net/phpMyAdmin/5.1.1/phpMyAdmin-5.1.1-all-languages.tar.gz
Распаковываем исходники в директорию виртуального хоста.
tar xvzf phpMyAdmin-5.1.1-all-languages.tar.gz
cp -R phpMyAdmin-5.1.1-all-languages/* /home/yuri/www/test.hserv.su/pma/
chown -R yuri. /home/yuri/www/test.hserv.su/pma/
Настройка phpmyadmin
Phpmyadmin готов к работе сразу после установки, дополнительные настройки не обазательны. Закрываем доступ к панели средствами Web сервера. Для использования панели необходимо будет не только знать имя учетной записи mysql, но и пользователя и пароль для доступа непосредственно к панели.
Будем использовать стандартное средство для ограничения доступа к каталогу с помощью .htaccees. Создадим такой файл в папке со скриптами phpmyadmin:
mcedit /home/yuri/www/test.hserv.su/pma/.htaccess
AuthName "Enter Password"
AuthType Basic
Require valid-user
AuthUserFile "/home/yuri/www/test.hserv.su/pma/.htpasswd"
Теперь создадим файл с авторизационными данными:
htpasswd -bc /home/yuri/www/test.hserv.su/pma/.htpasswd user password
Где user — имя пользователя, а password пароль.
Чтобы авторизация заработала, необходимо в файле конфигурации виртуального хостинга в разделе Directory добавить параметр AllowOverride перед </VirtualHost>
mcedit /etc/apache2/sites-available/test.hserv.su.conf
<Directory /home/yuri/www/test.hserv.su/pma/>
AddDefaultCharset UTF-8
Require all granted
AllowOverride All
</Directory>
Перезапускаем Apache.
service apache2 restart
Проверяем настройку. При обращении по адресу веб панели, должно выскочить окошко с авторизацией:
Дополнительная настройка web сервера
После установки и настройки необходимо сделать тонкую настройку.
Настройка времени ожидания Nginx
Когда Nginx работает перед Apache, он передает запрос в Apache и ждет по умолчанию 60 секунд, если за это время не пришел ответ от Apache, то Nginx выдаст ошибку 502. Чтобы этого не происходило рекомендую поднять таймоуты до 120 секунд. В секцию location после proxy_pass вставить:
mcedit /etc/nginx/sites-available/test.hserv.su.conf
location / {
proxy_pass http://127.0.0.1:8080;
proxy_read_timeout 120;
proxy_connect_timeout 120;
proxy_send_timeout 120;
}
Перегружаем Nginx для применения настроек
service nginx restart
К примеру, для виртуального хостинга популярного CMS движка WordPress, я ставлю 180 секунд, потому что во время обновления плагинов или самого движка WordPress Apache может очень долго не отвечать
proxy_connect_timeout 180;
proxy_send_timeout 180;
proxy_read_timeout 180;
Передача реального IP клиента в Apache
Когда Nginx работает перед Apache, то в логах Apache, в скриптах будет присутсвовать IP локального 127.0.0.1, что не несет никаких сведений о том, какой пользователь был на сайте. Перестают работать все сервисы, привязанные к IP пользователю на сайтах.
Чтобы убедиться в этом создадим файл ip.php
mcedit /home/yuri/www/test.hserv.su/ip.php
<?php
echo $_SERVER['REMOTE_ADDR']
?>
После этого переходим по адресу http://test.hserv.su/ip.php и видим:
КОНФИГУРИРОВАНИЕ NGINX
Чтобы это исправить идем в секцию location конфигурации Nginx после proxy_pass добавим:
mcedit /etc/nginx/sites-available/test.hserv.su.conf
location / {
proxy_pass http://127.0.0.1:8080;
proxy_read_timeout 120;
proxy_connect_timeout 120;
proxy_send_timeout 120;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
Перегружаем Nginx для применения настроек
service nginx restart
КОНФИГУРИРОВАНИЕ APACHE
Для того, чтобы Apache начал правильно воспринимать и обрабатывать реальный IP пользователя, воспользуемся идущим в стандартном пакете Apache модулем remoteip.
Вначале настроим работу модуля remoteip. Для этого создадим файл remoteip.conf:
mcedit /etc/apache2/conf-available/remoteip.conf
RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy 127.0.0.1
RemoteIPTrustedProxy 127.0.0.1
Теперь всё это нужно подключить модуль remoteip и перегружаем Apache:
a2enmod remoteip
a2enconf remoteip
service apache2 restart
Если все правильно увидим, свой IP адрес. Если вы настраиваете в локальной сети, то там будет ваш локальный IP как у меня на картинке:
SSL между Nginx и Apache
Некоторым скриптам необходимо знать через какую схему они работают, http, или https. Таким образом они формируют ссылки, а иногда принудительно перенаправляют клиентов куда нужно. Из-за не правильной настройки серверного ПО переадресация не может завершиться и браузер покажет нам ошибку ‘too many redirects‘.К примеру, это относится к популярному CMS движку WordPress.
КОНФИГУРИРОВАНИЕ NGINX
Чтобы это исправить идем в секцию location конфигурации Nginx после proxy_pass добавим:
mcedit /etc/nginx/sites-available/test.hserv.su.conf
location / {
proxy_pass http://127.0.0.1:8080;
proxy_read_timeout 120;
proxy_connect_timeout 120;
proxy_send_timeout 120;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
}
Перегружаем Nginx для применения настроек
service nginx restart
КОНФИГУРИРОВАНИЕ APACHE
Нам необходми модуль setenvif_module, который подключен стандартной установке Apache.
Добавляем в конфигурацию виртуального хостинга перед секцией </VirtualHost>
mcedit /etc/apache2/sites-available/test.hserv.su.conf
<IfModule setenvif_module>
SetEnvIf X-Forwarded-Proto https HTTPS=on
</IfModule>
Перегружаем Apache для применения настроек
service apache2 restart
Доступ к сайту по sftp
Если вы планируется передавать доступ к сайту другим людям, например для доступа к исходникам сайта, то на текущий момент лучше это делать по протоколу sftp.
Открываем конфиг ssh по пути /etc/ssh/sshd_config и комментируем там одну строку, добавляя далее несколько новых.
mcedit /etc/ssh/sshd_config
#Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
Match User yuri
ChrootDirectory /home/yuri
ForceCommand internal-sftp
Сохраняем и перезапускаем ssh.
service ssh restart
Настройка подключения sftp с ограничением доступа за пределами конкретной папки закончена.
Работа с сайтами разных пользователей на одном web сервере
Чтобы к файлам, загруженным через сайт, был доступ через ftp, можно запускать Apache от имени пользователя. Для этого используем модуль Apache mpm_itk. Поставим его.
apt install libapache2-mpm-itk
Добавляем в конфигурацию виртуального хостинга перед секцией </VirtualHost>
mcedit /etc/apache2/sites-available/test.hserv.su.conf
<IfModule mpm_itk_module>
AssignUserId yuri www-data
</IfModule>
Где yuri это имя пользователя, а www-data это группа, под которым будет запускаться Apache
Перегружаем Apache для применения настроек
service apache2 restart
Ротация логов виртуальных хостов
Насторим ротацию логов виртуального хостинга, еЕсли этого не сделать, то через какое-то, обычно продолжительное, время возникает проблема в связи с огромным размером лог файла или или заканчивается место, к примеру, на многих VDS с ssd дают обычно маленький диск.
Создадим файл конфигурации logrotate для нашего виртуального хостинга
mcedit /etc/logrotate.d/hosting
/home/yuri/log/*log {
size=2M
missingok
rotate 10
compress
delaycompress
notifempty
create 0640 yuri www-data
sharedscripts
postrotate
/bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
endscript
}
Ротация файлы логов происходит по достижению ими размера в 2Мб, сжимать после ротации и хранить 10 архивов с логом. Новые логи создаются сразу с соответствующими правами, чтобы у пользователя был доступ к ним.
Заключение
Тема настройки веб сервера обширна. В этой заметке я хотел показать типовую настройку чистого сервера для web хостинга, которую использую я. В конце предалгаю полный рабочий листинг кофиг файлов.
Apache
<VirtualHost *:8080>
ServerAdmin web@test.hserv.su
ServerName test.hserv.su
ServerAlias www.test.hserv.su
DocumentRoot /home/yuri/www/test.hserv.su
SetEnvIf X-Forwarded-Proto https HTTPS=on
ErrorLog /home/yuri/log/test.hserv.su_error.log
CustomLog /home/yuri/log/test.hserv.su_access.log combined
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /home/yuri/www/test.hserv.su/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
<Directory /home/yuri/www/test.hserv.su/pma/>
AddDefaultCharset UTF-8
Require all granted
AllowOverride All
</Directory>
#Запуск Apache под пользователем
<IfModule mpm_itk_module>
AssignUserId yuri www-data
</IfModule>
php_admin_value date.timezone 'Europe/Moscow'
php_admin_value max_execution_time 300
php_admin_value max_input_time 180
php_admin_value post_max_size 200M
php_admin_value upload_max_filesize 50M
php_admin_value max_file_uploads 150
</VirtualHost>
Nginx
server {
server_name test.hserv.su www.test.hserv.su;
access_log /home/yuri/log/nginx-test-hserv-access.log combined buffer=64k;
error_log /home/yuri/log/nginx-test-hserv-error.log error;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_connect_timeout 120;
proxy_send_timeout 120;
proxy_read_timeout 180;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
}
location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico|woff)$ {
root /home/yuri/www/test.hserv.su;
access_log off;
expires max;
}
location = /robots.txt {
root /home/yuri/www/test.hserv.su;
allow all;
log_not_found off;
access_log off;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/test.hserv.su/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/test.hserv.su/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = test.hserv.su) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name test.hserv.su www.test.hserv.su;
return 404; # managed by Certbot
}
Свежие комментарии