Настройка виртуальных хостов Apache/Nginx

Материал из ARK-HOSTER.RU | Документация хостинга
Версия от 10:36, 15 октября 2025; Admin (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Содержание

Настройка виртуальных хостов 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;
}
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";
}
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_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_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;
}
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;
}
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. Добавьте содержимое:

echo "=== Virtual Hosts Monitoring ==="
echo "Date: $(date)"
echo ""
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
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
if systemctl is-active --quiet php8.1-fpm; then
echo "PHP-FPM is running"
else
echo "PHP-FPM is not running"
fi
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):

Наши специалисты помогут с настройкой виртуальных хостов и оптимизацией производительности ваших сайтов!