Cara Mengonfigurasi Virtual Hosts di Nginx pada Ubuntu
Mengonfigurasi virtual host di Nginx adalah salah satu teknik paling powerful untuk hosting multiple websites di single server, masing-masing dengan domain name, root directory, dan independent configuration sendiri. Nginx menangani ini melalui server blocks — flexible, lightweight configuration units yang mendefinisikan bagaimana web server merespons requests untuk setiap domain.
Baik Anda mengelola personal portfolio, menjalankan client websites, atau scaling multi-tenant application, guide ini menyediakan complete, production-ready walkthrough untuk setting up Nginx virtual hosts di Ubuntu. Kami akan cover directory structure, server block configuration, enabling sites, SSL/HTTPS setup, dan troubleshooting — everything yang Anda butuhkan untuk go dari zero ke fully functional multi-site Nginx server.
> Mencari reliable Ubuntu server untuk follow along? VPS Hosting plans AlexHost memberikan Anda full root access, SSD storage, dan instant deployment — perfect untuk exact use case ini.
Prerequisites
Sebelum Anda mulai, pastikan kondisi berikut terpenuhi:
Nginx Installed di Server Anda
Jika Nginx belum terinstall, jalankan commands berikut di Ubuntu server Anda:
sudo apt update
sudo apt install nginxVerify installation dan check bahwa service sedang running:
sudo systemctl status nginxAnda seharusnya melihat active (running) di output. Jika tidak, start secara manual:
sudo systemctl start nginx
sudo systemctl enable nginxDomain Names Pointed ke Server Anda
Setiap virtual host memerlukan domain name yang resolve ke server's public IP address Anda. Anda perlu membuat A records di DNS settings Anda pointing ke server's IP.
> Butuh domain? Register milik Anda melalui AlexHost Domain Registration dan manage DNS records langsung dari control panel Anda.
Untuk local testing purposes, Anda dapat bypass DNS entirely dengan editing /etc/hosts file Anda (covered di Step 7).
Required Permissions
Anda memerlukan sudo privileges di Ubuntu server Anda untuk create directories, edit configuration files, dan manage Nginx service.
Step 1: Set Up Directories untuk Setiap Website
Setiap website yang di-host di server Anda seharusnya memiliki isolated directory sendiri untuk store web files. Separation ini keeps projects Anda organized dan prevents configuration conflicts.
Di guide ini, kami akan configure dua example domains: example1.com dan example2.com. Replace ini dengan actual domain names Anda throughout.
Create Web Root Directories
sudo mkdir -p /var/www/example1.com/html
sudo mkdir -p /var/www/example2.com/htmlFlag -p creates semua intermediate directories sesuai kebutuhan.
Assign Correct Ownership
Grant ownership dari directories ini ke www-data, system user yang Nginx jalankan:
sudo chown -R www-data:www-data /var/www/example1.com/html
sudo chown -R www-data:www-data /var/www/example2.com/htmlIni memastikan Nginx memiliki necessary read permissions untuk serve files dari directories ini.
Set Directory Permissions
sudo chmod -R 755 /var/wwwPermission 755 berarti owner memiliki full read/write/execute access, sementara groups dan other users memiliki read dan execute access — appropriate untuk publicly served web content.
Step 2: Create Sample HTML Content
Untuk verify bahwa setiap virtual host bekerja dengan benar, create simple index.html file untuk setiap site.
Untuk example1.com
echo "<h1>Welcome to Example1.com!</h1>" | sudo tee /var/www/example1.com/html/index.htmlUntuk example2.com
echo "<h1>Welcome to Example2.com!</h1>" | sudo tee /var/www/example2.com/html/index.htmlPlaceholder pages ini akan confirm bahwa Nginx routing requests ke correct document root untuk setiap domain.
Step 3: Create Virtual Host Configuration Files
Nginx stores site configuration files di /etc/nginx/sites-available/. Setiap file mendefinisikan server block — Nginx equivalent dari Apache virtual host. Enabled sites kemudian di-symlink ke /etc/nginx/sites-enabled/.
Configuration untuk example1.com
Create new configuration file:
sudo nano /etc/nginx/sites-available/example1.comAdd server block berikut:
server {
listen 80;
listen [::]:80;
server_name example1.com www.example1.com;
root /var/www/example1.com/html;
index index.html index.htm;
access_log /var/log/nginx/example1.com.access.log;
error_log /var/log/nginx/example1.com.error.log;
location / {
try_files $uri $uri/ =404;
}
}Save dan close file (Ctrl+X, kemudian Y, kemudian Enter).
Configuration untuk example2.com
Create second configuration file:
sudo nano /etc/nginx/sites-available/example2.comAdd server block berikut:
server {
listen 80;
listen [::]:80;
server_name example2.com www.example2.com;
root /var/www/example2.com/html;
index index.html index.htm;
access_log /var/log/nginx/example2.com.access.log;
error_log /var/log/nginx/example2.com.error.log;
location / {
try_files $uri $uri/ =404;
}
}Key Directives Explained
| Directive | Purpose |
|---|---|
listen 80 | Listens untuk incoming HTTP connections di port 80 |
listen [::]:80 | Enables IPv6 support di port 80 |
server_name | Defines domain names mana yang block ini handle |
root | Sets document root — di mana website files disimpan |
index | Specifies default file untuk serve ketika directory di-request |
try_files | Attempts untuk serve requested file; returns 404 jika tidak ditemukan |
access_log / error_log | Separate log files per site untuk easier debugging |
Step 4: Enable Virtual Hosts
Nginx mengaktifkan sites dengan membuat symbolic links dari sites-available ke sites-enabled. Design ini memungkinkan Anda untuk prepare configurations tanpa immediately mengaktifkannya.
sudo ln -s /etc/nginx/sites-available/example1.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/example2.com /etc/nginx/sites-enabled/Remove Default Site (Optional tapi Recommended)
Jika Anda ingin prevent Nginx's default placeholder page dari interfering, disable:
sudo rm /etc/nginx/sites-enabled/defaultAnda dapat selalu re-enable nanti dengan recreating symlink.
Step 5: Test Nginx Configuration
Sebelum restart Nginx, selalu validate configuration files Anda untuk syntax errors. Misconfigured file dapat bring down semua sites di server.
sudo nginx -tSuccessful test returns:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successfulJika Anda melihat errors, Nginx akan indicate file dan line number di mana problem terjadi. Review relevant configuration file dan correct typos atau missing semicolons sebelum proceed.
Step 6: Restart Nginx untuk Apply Changes
Setelah configuration test passes, reload atau restart Nginx untuk apply changes Anda:
sudo systemctl restart nginxAlternatively, gunakan reload untuk graceful restart yang tidak interrupt active connections:
sudo systemctl reload nginxStep 7: Access Websites Anda
Jika DNS Sudah Dikonfigurasi
Jika domain names Anda sudah pointing ke server's IP address Anda via DNS A records, simply open browser dan navigate ke:
http://example1.comhttp://example2.com
Anda seharusnya melihat respective "Welcome" messages yang Anda create di Step 2.
Untuk Local Testing (Tanpa DNS)
Jika Anda testing locally atau DNS belum propagated, Anda dapat simulate domain resolution dengan editing local machine's /etc/hosts file (di Linux/macOS) atau C:WindowsSystem32driversetchosts (di Windows).
Open file dengan elevated privileges:
sudo nano /etc/hostsAdd lines berikut, replacing YOUR_SERVER_IP dengan actual server IP Anda:
YOUR_SERVER_IP example1.com www.example1.com
YOUR_SERVER_IP example2.com www.example2.comSave file dan test di browser Anda. Remember untuk remove entries ini setelah real DNS records Anda live.
Step 8: Enable HTTPS dengan Let's Encrypt (Recommended)
Running websites di plain HTTP tidak lagi acceptable untuk production environments. HTTPS encrypts traffic antara server Anda dan visitors, improves SEO rankings, dan required untuk modern browser features. Let's Encrypt menyediakan free, automatically renewable SSL/TLS certificates.
> Prefer premium SSL solution? AlexHost menawarkan trusted SSL Certificates untuk businesses yang memerlukan extended validation atau wildcard coverage.
Install Certbot
sudo apt install certbot python3-certbot-nginxObtain dan Install SSL Certificates
Run Certbot untuk setiap domain. Plugin --nginx automatically memodifikasi Nginx configuration Anda untuk enable HTTPS:
sudo certbot --nginx -d example1.com -d www.example1.comsudo certbot --nginx -d example2.com -d www.example2.comFollow interactive prompts. Certbot akan:
- Verify domain ownership via HTTP challenge
- Obtain signed certificate dari Let's Encrypt
- Automatically update Nginx server block Anda untuk listen di port 443
- Configure HTTP-to-HTTPS redirection
Verify Auto-Renewal
Let's Encrypt certificates expire setiap 90 hari. Certbot installs systemd timer untuk handle renewals automatically. Test dengan:
sudo certbot renew --dry-runJika dry run completes tanpa errors, certificates Anda akan renew automatically tanpa manual intervention apapun.
What Your Updated Server Block Will Look Like
Setelah Certbot runs, configuration Anda akan automatically updated ke something seperti ini:
server {
listen 443 ssl;
server_name example1.com www.example1.com;
root /var/www/example1.com/html;
index index.html;
ssl_certificate /etc/letsencrypt/live/example1.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example1.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
try_files $uri $uri/ =404;
}
}
server {
listen 80;
server_name example1.com www.example1.com;
return 301 https://$host$request_uri;
}Troubleshooting Common Issues
Bahkan dengan careful configuration, issues dapat arise. Berikut adalah most common problems dan cara untuk resolve:
502 Bad Gateway
Ini typically berarti Nginx tidak dapat communicate dengan backend service (e.g., PHP-FPM atau Node.js app). Verify upstream service sedang running dan bahwa socket/port di configuration Anda correct.
403 Forbidden
Usually permissions issue. Check bahwa www-data owns web root dan bahwa file permissions set correctly:
sudo chown -R www-data:www-data /var/www/example1.com
sudo chmod -R 755 /var/www/example1.com404 Not Found
Verify bahwa root directive di server block Anda points ke correct directory dan bahwa index.html exists di path tersebut.
Wrong Site Loading
Jika visiting example1.com loads example2.com's content, check bahwa:
- Setiap
server_namedirective unique dan correct - Symlinks di
sites-enabledvalid:ls -la /etc/nginx/sites-enabled/ - Default site disabled jika conflicts
Nginx Fails to Start Setelah Config Change
Selalu run sudo nginx -t sebelum restart. Review error output carefully — ini akan point ke exact file dan line yang causing issue.
Checking Logs
Per-site logs (configured di Step 3) adalah best debugging resource Anda:
sudo tail -f /var/log/nginx/example1.com.error.log
sudo tail -f /var/log/nginx/example1.com.access.logAdvanced Considerations
Hosting PHP Applications
Jika sites Anda run PHP (e.g., WordPress, Laravel), Anda perlu install PHP-FPM dan add fastcgi_pass directive ke server block Anda:
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}Using Control Panel
Managing Nginx virtual hosts manually via command line powerful tapi time-consuming di scale. Jika Anda prefer graphical interface, consider AlexHost's VPS dengan cPanel atau explore full range dari VPS Control Panels untuk find right fit untuk workflow Anda.
Scaling Beyond Single VPS
Saat traffic Anda grows, single VPS mungkin tidak sufficient. Untuk high-traffic, resource-intensive workloads, consider upgrading ke Dedicated Servers untuk guaranteed resources, full hardware isolation, dan maximum performance.
Conclusion
Anda telah successfully configure Nginx virtual hosts di Ubuntu, enabling server Anda untuk host multiple independent websites simultaneously. Berikut adalah summary dari apa yang accomplished:
- Created isolated web root directories untuk setiap domain dengan correct ownership dan permissions
- Wrote clean, production-ready server block configurations dengan separate access dan error logs
- Enabled virtual hosts menggunakan Nginx's symlink-based
sites-available/sites-enabledpattern - Validated dan reloaded Nginx configuration securely
- Secured setiap site dengan HTTPS menggunakan free Let's Encrypt certificates via Certbot
Setup ini efficient, scalable, dan follows Nginx best practices. Baik Anda hosting dua sites atau twenty, same pattern applies — simply repeat process untuk setiap additional domain.
Untuk best results, pair configuration ini dengan fast, reliable hosting environment. VPS Hosting plans AlexHost dioptimalkan untuk Linux workloads, come dengan full root access, dan backed oleh 24/7 technical support — giving Anda ideal foundation untuk running Nginx di production.
on All Hosting Services
