Hướng dẫn cấu hình Virtual Hosts (vhost) Apache – chạy nhiều website/domain trên 1 IP, 1 server. Dùng cho shared hosting hoặc môi trường dev local.
Mục tiêu
Tạo 2 virtual host trên local: calvin.dev và hobbes.dev, trỏ tới thư mục riêng biệt.
Bước 1: Cài Apache
# sudo apt update
# sudo apt install apache2
Kiểm tra: https://localhost → trang mặc định Apache.
Bước 2: Tạo cấu hình Virtual Host
Tạo file /etc/apache2/sites-available/vhosts.conf:
ServerName calvin.dev
ServerAlias www.calvin.dev
DocumentRoot /var/www/calvin.dev
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
ErrorLog ${APACHE_LOG_DIR}/calvin.dev_error.log
CustomLog ${APACHE_LOG_DIR}/calvin.dev_access.log combined
ServerName hobbes.dev
ServerAlias www.hobbes.dev
DocumentRoot /var/www/hobbes.dev
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
ErrorLog ${APACHE_LOG_DIR}/hobbes.dev_error.log
CustomLog ${APACHE_LOG_DIR}/hobbes.dev_access.log combined
AllowOverride All: Cho phép .htaccess (cần cho WordPress, Laravel...).Require all granted: Apache 2.4+ (cũ:Order allow,deny / Allow from all).- Log riêng cho mỗi site – dễ debug.
Bước 3: Tạo thư mục gốc (DocumentRoot)
# sudo mkdir -p /var/www/calvin.dev /var/www/hobbes.dev
# sudo chown -R www-data:www-data /var/www/calvin.dev /var/www/hobbes.dev
# sudo chmod -R 755 /var/www/calvin.dev /var/www/hobbes.dev
Bước 4: Cập nhật /etc/hosts (Chỉ cho local dev)
127.0.0.1 calvin.dev www.calvin.dev
127.0.0.1 hobbes.dev www.hobbes.dev
Trên production: Cấu hình DNS A record trỏ về IP server.
Bước 5: Kích hoạt site và reload Apache
# sudo a2ensite vhosts.conf
# sudo systemctl reload apache2
a2ensite: Tạo symlinksites-available → sites-enabled.a2dissite: Vô hiệu hóa site.
Bước 6: Tạo file test
# echo "Hi I'm Calvin" | sudo tee /var/www/calvin.dev/index.html
# echo "Hi I'm Hobbes" | sudo tee /var/www/hobbes.dev/index.html
Bước 7: Test
https://calvin.dev→ "Hi I'm Calvin"https://hobbes.dev→ "Hi I'm Hobbes"
Mở rộng: Virtual Host HTTPS (SSL/TLS)
ServerName calvin.dev
DocumentRoot /var/www/calvin.dev
SSLEngine on
SSLCertificateFile /etc/ssl/certs/calvin.dev.crt
SSLCertificateKeyFile /etc/ssl/private/calvin.dev.key
# ... config SSL hiện đại (Mozilla SSL Generator)
Dùng Let's Encrypt (Certbot) tự động cấp/renew cert miễn phí:
# sudo apt install certbot python3-certbot-apache
# sudo certbot --apache -d calvin.dev -d www.calvin.dev
Khắc phục sự cố thường gặp
403 Forbidden: Kiểm traRequire all granted, quyền thư mục (www-data), SELinux/AppArmor.500 Internal Server: XemErrorLogcủa vhost.- Không load được:
sudo apache2ctl configtestkiểm tra cú pháp. - Port 80 bị chiếm:
ss -tlnp | grep :80.