Настройка виртуальных хостов Apache/Nginx
Содержание
- 1 Настройка виртуальных хостов Apache/Nginx
- 1.1 1. Подготовка системы
- 1.2 2. Настройка виртуальных хостов Apache =
- 1.3 3. Настройка виртуальных хостов Nginx =
- 1.4 4. Настройка PHP-FPM =
- 1.5 5. Настройка SSL сертификатов =
- 1.6 6. Настройка файрвола =
- 1.7 7. Управление виртуальными хостами =
- 1.8 8. Мониторинг виртуальных хостов =
- 1.9 9. Устранение неполадок =
- 1.10 10. Дополнительные настройки =
- 1.11 Заключение
Настройка виртуальных хостов Apache/Nginx
1. Подготовка системы
- Войдите в систему под учетной записью с правами root или пользователя с правами sudo.
- Убедитесь, что у вас есть доступ к серверу через SSH или консоль.
2. Настройка виртуальных хостов Apache =
Создание структуры директорий
1. Создайте директории для сайтов:
sudo mkdir -p /var/www/example.com/public_html
sudo mkdir -p /var/www/example.com/logs
sudo mkdir -p /var/www/test.com/public_html
sudo mkdir -p /var/www/test.com/logs
2. Установите права доступа:
sudo chown -R www-data:www-data /var/www/
sudo chmod -R 755 /var/www/
Создание виртуального хоста
1. Создайте файл конфигурации:
sudo nano /etc/apache2/sites-available/example.com.conf
2. Добавьте содержимое:
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/public_html
<Directory /var/www/example.com/public_html>
AllowOverride All
Require all granted
Options Indexes FollowSymLinks
</Directory>
ErrorLog /var/www/example.com/logs/error.log
CustomLog /var/www/example.com/logs/access.log combined
# Настройки безопасности
ServerTokens Prod
ServerSignature Off
</VirtualHost>
Создание SSL виртуального хоста
1. Создайте SSL конфигурацию:
sudo nano /etc/apache2/sites-available/example.com-ssl.conf
2. Добавьте содержимое:
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/public_html
SSLEngine on
SSLCertificateFile /etc/ssl/certs/example.com.crt
SSLCertificateKeyFile /etc/ssl/private/example.com.key
SSLCertificateChainFile /etc/ssl/certs/example.com.chain.crt
<Directory /var/www/example.com/public_html>
AllowOverride All
Require all granted
Options Indexes FollowSymLinks
</Directory>
ErrorLog /var/www/example.com/logs/ssl_error.log
CustomLog /var/www/example.com/logs/ssl_access.log combined
# Настройки безопасности
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
</VirtualHost>
Активация виртуальных хостов
1. Включите виртуальный хост:
sudo a2ensite example.com.conf
2. Включите SSL модуль:
sudo a2enmod ssl
3. Включите модуль headers:
sudo a2enmod headers
4. Перезапустите Apache:
sudo systemctl restart apache2
3. Настройка виртуальных хостов Nginx =
Создание структуры директорий
1. Создайте директории для сайтов:
sudo mkdir -p /var/www/example.com/html
sudo mkdir -p /var/www/example.com/logs
sudo mkdir -p /var/www/test.com/html
sudo mkdir -p /var/www/test.com/logs
2. Установите права доступа:
sudo chown -R www-data:www-data /var/www/
sudo chmod -R 755 /var/www/
Создание виртуального хоста
1. Создайте файл конфигурации:
sudo nano /etc/nginx/sites-available/example.com
2. Добавьте содержимое:
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com/html;
index index.html index.php;
# Логирование
access_log /var/www/example.com/logs/access.log;
error_log /var/www/example.com/logs/error.log;
# Основная конфигурация
location / {
try_files $uri $uri/ =404;
}
# Обработка PHP
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# Статические файлы
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# Скрытие версии Nginx
server_tokens off;
# Настройки безопасности
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
}
Создание SSL виртуального хоста
1. Создайте SSL конфигурацию:
sudo nano /etc/nginx/sites-available/example.com-ssl
2. Добавьте содержимое:
server {
listen 443 ssl http2;
server_name example.com www.example.com;
root /var/www/example.com/html;
index index.html index.php;
# SSL сертификаты
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
ssl_trusted_certificate /etc/ssl/certs/example.com.chain.crt;
# SSL настройки
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_stapling on;
ssl_stapling_verify on;
# Логирование
access_log /var/www/example.com/logs/ssl_access.log;
error_log /var/www/example.com/logs/ssl_error.log;
# Основная конфигурация
location / {
try_files $uri $uri/ =404;
}
# Обработка PHP
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# Статические файлы
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# Настройки безопасности
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
}
- Перенаправление с HTTP на HTTPS
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}
Активация виртуальных хостов
1. Создайте символическую ссылку:
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
2. Проверьте конфигурацию:
sudo nginx -t
3. Перезапустите Nginx:
sudo systemctl restart nginx
4. Настройка PHP-FPM =
Установка PHP-FPM
1. Установите PHP-FPM:
sudo apt install php-fpm php-mysql php-curl php-gd php-mbstring php-xml php-zip
2. Запустите PHP-FPM:
sudo systemctl start php8.1-fpm
sudo systemctl enable php8.1-fpm
Настройка пулов PHP-FPM
1. Создайте пул для сайта:
sudo nano /etc/php/8.1/fpm/pool.d/example.com.conf
2. Добавьте содержимое:
[example.com]
user = www-data
group = www-data
listen = /var/run/php/php8.1-fpm-example.com.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.max_requests = 1000
3. Перезапустите PHP-FPM:
sudo systemctl restart php8.1-fpm
5. Настройка SSL сертификатов =
Генерация самоподписанного сертификата
1. Создайте приватный ключ:
sudo openssl genrsa -out /etc/ssl/private/example.com.key 2048
2. Создайте запрос на сертификат:
sudo openssl req -new -key /etc/ssl/private/example.com.key -out /etc/ssl/certs/example.com.csr
3. Создайте самоподписанный сертификат:
sudo openssl x509 -req -days 365 -in /etc/ssl/certs/example.com.csr -signkey /etc/ssl/private/example.com.key -out /etc/ssl/certs/example.com.crt
Использование Let's Encrypt
1. Установите Certbot:
sudo apt install certbot python3-certbot-apache python3-certbot-nginx
2. Получите сертификат для Apache:
sudo certbot --apache -d example.com -d www.example.com
3. Получите сертификат для Nginx:
sudo certbot --nginx -d example.com -d www.example.com
6. Настройка файрвола =
Настройка UFW
1. Разрешите HTTP и HTTPS трафик:
sudo ufw allow 'Apache Full'
sudo ufw allow 'Nginx Full'
2. Проверьте статус:
sudo ufw status
Настройка iptables
1. Разрешите HTTP и HTTPS порты:
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
2. Сохраните правила:
sudo iptables-save > /etc/iptables/rules.v4
7. Управление виртуальными хостами =
Управление Apache
1. Включение сайта:
sudo a2ensite example.com.conf
2. Отключение сайта:
sudo a2dissite example.com.conf
3. Перезапуск Apache:
sudo systemctl restart apache2
4. Проверка конфигурации:
sudo apache2ctl configtest
Управление Nginx
1. Включение сайта:
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
2. Отключение сайта:
sudo rm /etc/nginx/sites-enabled/example.com
3. Перезапуск Nginx:
sudo systemctl restart nginx
4. Проверка конфигурации:
sudo nginx -t
8. Мониторинг виртуальных хостов =
Просмотр логов
1. Просмотрите логи Apache:
sudo tail -f /var/log/apache2/error.log
sudo tail -f /var/www/example.com/logs/access.log
2. Просмотрите логи Nginx:
sudo tail -f /var/log/nginx/error.log
sudo tail -f /var/www/example.com/logs/access.log
3. Просмотрите логи PHP-FPM:
sudo tail -f /var/log/php8.1-fpm.log
Создание скрипта мониторинга
1. Создайте скрипт мониторинга:
sudo nano /usr/local/bin/vhost-monitor.sh
2. Добавьте содержимое:
- !/bin/bash
echo "=== Virtual Hosts Monitoring ==="
echo "Date: $(date)"
echo ""
- Проверка Apache
if systemctl is-active --quiet apache2; then
echo "Apache is running"
echo "Apache sites:"
sudo apache2ctl -S | grep "namevhost"
else
echo "Apache is not running"
fi
- Проверка Nginx
if systemctl is-active --quiet nginx; then
echo "Nginx is running"
echo "Nginx sites:"
sudo nginx -T | grep "server_name"
else
echo "Nginx is not running"
fi
- Проверка PHP-FPM
if systemctl is-active --quiet php8.1-fpm; then
echo "PHP-FPM is running"
else
echo "PHP-FPM is not running"
fi
- Проверка SSL сертификатов
echo "SSL Certificates:"
for cert in /etc/ssl/certs/*.crt; do
if [ -f "$cert" ]; then
echo "$(basename $cert): $(openssl x509 -enddate -noout -in $cert | cut -d= -f2)"
fi
done
3. Сделайте скрипт исполняемым:
sudo chmod +x /usr/local/bin/vhost-monitor.sh
9. Устранение неполадок =
Частые проблемы
1. Сайт не загружается:
- Проверьте конфигурацию:
sudo apache2ctl configtest
илиsudo nginx -t
- Проверьте права доступа:
ls -la /var/www/
- Проверьте файрвол:
sudo ufw status
2. SSL не работает:
- Проверьте сертификаты:
openssl x509 -in /path/to/cert.crt -text -noout
- Проверьте конфигурацию SSL
- Проверьте порты:
sudo netstat -tlnp | grep :443
3. PHP не работает:
- Проверьте PHP-FPM:
sudo systemctl status php8.1-fpm
- Проверьте конфигурацию PHP
- Проверьте права доступа к файлам
Диагностика
1. Проверьте статус служб:
sudo systemctl status apache2
sudo systemctl status nginx
sudo systemctl status php8.1-fpm
2. Проверьте конфигурацию:
sudo apache2ctl configtest
sudo nginx -t
3. Проверьте подключения:
sudo netstat -tlnp | grep -E ':(80|443)'
4. Проверьте права доступа:
ls -la /var/www/
ls -la /etc/apache2/sites-enabled/
ls -la /etc/nginx/sites-enabled/
10. Дополнительные настройки =
Настройка кэширования
1. Для Apache добавьте в конфигурацию:
- Кэширование
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/ico "access plus 1 month"
</IfModule>
2. Для Nginx добавьте в конфигурацию:
- Кэширование
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
Настройка сжатия
1. Для Apache включите модуль сжатия:
sudo a2enmod deflate
2. Добавьте в конфигурацию:
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
</IfModule>
3. Для Nginx добавьте в конфигурацию:
- Сжатие
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json;
Заключение
Виртуальные хосты Apache и Nginx успешно настроены! Теперь вы можете размещать множественные сайты на одном сервере.
Для размещения ваших сайтов на надежном хостинге рекомендуем воспользоваться услугами [ARK-HOSTER.RU](https://ark-hoster.ru):
- [Выделенные серверы](https://ark-hoster.ru/dedicated/) - для высоконагруженных сайтов
- [VPS/VDS серверы](https://ark-hoster.ru/vpsgame/) - для небольших и средних проектов
Наши специалисты помогут с настройкой виртуальных хостов и оптимизацией производительности ваших сайтов!