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