Kebanyakan orang melayani lebih dari satu domain di server cloud mereka. Apakah Anda melayani domain yang berbeda atau subdomain yang berbeda dari domain yang sama, prosedurnya sama. Artikel ini menjelaskan cara membuat host virtual untuk melayani beberapa domain dan cara memecahkan masalah dengan konfigurasi host virtual berbasis nama Apache.
Membuat host virtual untuk beberapa domain
Saat browser mengirimkan permintaan ke alamat IP server Anda untuk menanyakan konten nama domain Anda (misalnya, https://yourexampledomain.com
), server web Anda menyajikan representasi HTTP dari situs Anda. Jika server hanya melayani satu situs web, server tersebut menyajikan HTML di /var/www/html
. Anda direktori, dimulai dengan index.html
. Tetapi memiliki server unik untuk setiap situs web yang ingin Anda layani membutuhkan biaya yang mahal dan penggunaan sumber daya yang tidak efisien.
Host virtual berbasis nama memungkinkan Anda menyajikan konten untuk beberapa situs web dari satu server.
Salah satu baris pertama dalam file konfigurasi virtual host menentukan nama domain yang terkait dengan virtual host. Berikut ini adalah contoh konfigurasi virtual host untuk Apache, melayani domain1.com
:
<VirtualHost \*:80>
ServerName domain1.com
ServerAlias www.domain1.com
</VirtualHost>
Contoh berikut menunjukkan konfigurasi host virtual untuk NGINX:
server {
server_name www.domain1.com;
rewrite ^/(.\*) https://domain1.com/$1 permanent;
Setiap konfigurasi dimulai sedikit berbeda, tetapi prinsip yang sama berlaku:host virtual tertentu merespons kueri untuk domain1.com
dan www.domain1.com
.
Untuk menyajikan konten yang berbeda untuk domain yang berbeda, Anda menambahkan host virtual lain.
Misalnya, Anda memiliki subdomain bernama blog.domain1.com yang melayani blog.
Pertama, Anda membuat folder di folder public_html Anda dengan file yang relevan untuk blog (misalnya, instalasi WordPress).
Kemudian Anda membuat virtual host dengan server_name
atau ServerName
ditetapkan sebagai blog.domain1.com
dan konfigurasikan agar mengarah ke file dan folder blog di public_html
folder.
Untuk informasi lebih lanjut tentang host virtual, gunakan dokumen Apache Name-base Virtual Hosts
Pemecahan masalah
Bagian ini menunjukkan cara memecahkan masalah dengan konfigurasi host virtual berbasis nama Apache. Ini memberikan perintah yang berguna untuk menguji konfigurasi host virtual Anda, menjelaskan cara menginterpretasikan outputnya, dan menjelaskan bagaimana perintah tersebut membantu memperbaiki masalah konfigurasi host virtual yang umum.
Mulai ulang Apache
Sebelum Anda dapat mendiagnosis masalah, pastikan Anda telah memulai ulang Apache sejak terakhir kali Anda membuat perubahan pada file konfigurasi Apache:
-
Untuk distribusi Red Hat gunakan:
sudo /usr/sbin/httpd -k restart
-
Untuk distribusi Debian gunakan:
sudo /usr/sbin/apache2 -k restart
Jika Apache memberi Anda peringatan atau pesan kesalahan, catat untuk nanti. Langkah Anda selanjutnya adalah mendapatkan informasi tentang konfigurasi virtual host.
Dapatkan laporan konfigurasi
Jalankan -S
perintah di server web untuk memeriksa konfigurasi host virtual Anda
-
Untuk distribusi turunan Red Hat gunakan:
sudo /usr/sbin/httpd -S
-
Untuk distribusi turunan Debian gunakan:
sudo /usr/sbin/apache2 -S
Output menunjukkan pengaturan virtual host dari file konfigurasi. Contoh berikut menunjukkan laporan konfigurasi untuk server yang dikonfigurasi dengan dua host virtual berbasis nama:vh1.example.com dan vh2.example.com. Garis bernomor dijelaskan mengikuti contoh.
VirtualHost configuration:
wildcard NameVirtualHosts and \_default\_ servers:
[1] \*:80 is a NameVirtualHost
[2] default server vh1.example.com (/etc/httpd/conf/custom/virtualhost.conf:3)
[3] port 80 namevhost vh1.example.com (/etc/httpd/conf/custom/virtualhost.conf:3)
[4] port 80 namevhost vh2.example.com (/etc/httpd/conf/custom/virtualhost.conf:8)
[5] Syntax OK
-
Baris [1] melaporkan bahwa server web mendengarkan pada port default 80 untuk semua alamat IP yang didengarkan Apache, dan hosting virtual berbasis nama itu diaktifkan. * adalah karakter pengganti yang menentukan semua alamat IP.
-
Baris [2] melaporkan host virtual default bahwa server web ServerAlias untuk setiap permintaan yang tidak meminta nama host tertentu. Ini juga menunjukkan jalur ke file konfigurasi dan nomor baris tempat konfigurasi ini disetel.
-
Baris [3] melaporkan port dan nama konfigurasi host virtual pertama yang ditemukan, file tempat konfigurasinya, dan nomor baris tempat konfigurasinya dimulai.
-
Baris [4] melaporkan port dan nama konfigurasi host virtual kedua yang ditemukan, file tempat konfigurasinya, dan nomor baris tempat konfigurasinya dimulai.
-
Baris [5] melaporkan apakah sintaks konfigurasi sudah benar, meskipun itu tidak berarti situs Anda berfungsi
Output berikut dihasilkan dengan mengikuti konfigurasi file host virtual:
NameVirtualHost \*:80 Turns on name-based host resolution and binds the virtual server to IP addresses and ports as in [1] above. The \* is a wildcard specifying all IP addresses.
<VirtualHost \*:80> Configures the first and default virtual host in [2] & [3] above. It is the default because it is the first virtual host whose IP and port matches those in the NameVirtualHost directive before it.
ServerName vh1.example.com
DocumentRoot /var/www/vhosts/vh1
</VirtualHost>
<VirtualHost \*:80> Configures the second virtual host in [4] above.
ServerName vh2.example.com
DocumentRoot /var/www/vhosts/vh2
</VirtualHost>
Sekarang setelah Anda melihat tampilan konfigurasi host virtual dasar dan cara memetakan ke laporan konfigurasi Apache sendiri, Anda dapat menggunakan laporan tersebut untuk melihat masalah konfigurasi umum. Bagian berikut menjelaskan beberapa masalah ini dan memberikan panduan tentang cara memperbaikinya.
Host tidak disiapkan sebagai host virtual berbasis nama
Jika menjalankan httpd -S
melaporkan peringatan berikut:
[Wed May 18 15:24:51 2011] [warn] \_default\_ VirtualHost overlap on port 80, the first has precedence
VirtualHost configuration:
wildcard NameVirtualHosts and \_default\_ servers:
\*:80 vh1.example.com (/etc/httpd/conf/custom/virtualhost.conf:3)
\*:80 vh2.example.com (/etc/httpd/conf/custom/virtualhost.conf:8)
Syntax OK
Peringatan ini menunjukkan bahwa beberapa host virtual mencoba menggunakan "soket" yang sama tanpa disetel sebagai host virtual berbasis nama. Kesalahan ini sering terjadi ketika host virtual Apache pertama kali dibuat karena default NameVirtualHost
direktif dikomentari dengan simbol hash. Simbol itu memerintahkan Apache untuk mengabaikan arahan tersebut.
Untuk memperbaiki masalah ini di file konfigurasi Apache default, verifikasi bahwa NameVirtualHost *:80
arahan tidak dikomentari. Jika Anda bekerja dengan file konfigurasi Apache minimal, tambahkan NameVirtualHost *:80
arahan di atas konfigurasi host virtual individual.
Contoh berikut menunjukkan arahan komentar yang menyebabkan kesalahan:
#NameVirtualHost \*:80
<VirtualHost \*:80>
ServerName vh1.example.com
DocumentRoot /var/www/vhosts/vh1
</VirtualHost>
<VirtualHost \*:80>
ServerName vh2.example.com
DocumentRoot /var/www/vhosts/vh2
</VirtualHost>
Elemen hilang dari arahan VirtualHost
Jika menjalankan httpd -S
melaporkan pesan kesalahan berikut:
Syntax error on line 8 of /etc/httpd/conf/custom/virtualhost.conf:
<VirtualHost> directive requires additional arguments
Pesan ini berarti bahwa VirtualHost
host virtual direktif tidak memiliki elemen yang diperlukan. VirtualHost
direktif adalah baris pertama dari setiap konfigurasi host virtual individu. Dalam hal ini, kesalahan ada pada baris 8 dari file konfigurasi /etc/httpd/conf/custom/virtualhost.conf
.
Berikut adalah konfigurasi Apache yang menghasilkan kesalahan di atas:
NameVirtualHost \*:80
<VirtualHost \*:80>
ServerName vh1.example.com
DocumentRoot /var/www/vhosts/vh1
</VirtualHost>
<VirtualHost>
ServerName vh2.example.com
DocumentRoot /var/www/vhosts/vh2
</VirtualHost>
Perhatikan bahwa VirtualHost
kedua direktif tidak memiliki alamat IP atau port yang ditentukan, yang merupakan penyebab kesalahan.
Berikut ini adalah versi koreksi dari contoh sebelumnya, dengan tambahan \*:80
ke arahan virtual host. Seperti biasa, \*
adalah wildcard yang menentukan semua alamat IP.
NameVirtualHost \*:80
<VirtualHost \*:80>
ServerName vh1.example.com
DocumentRoot /var/www/vhosts/vh1
</VirtualHost>
<VirtualHost \*:80>
ServerName vh2.example.com
DocumentRoot /var/www/vhosts/vh2
</VirtualHost>
Nomor port tidak cocok
Jika menjalankan httpd -S
, menunjukkan bahwa host virtual tercantum di atas is a NameVirtualHost
baris:
VirtualHost configuration:
wildcard NameVirtualHosts and \_default\_ servers:
\*:800 vh2.example.com (/etc/httpd/conf/custom/virtualhost.conf:8)
\*:80 is a NameVirtualHost
default server vh1.example.com (/etc/httpd/conf/custom/virtualhost.conf:3)
port 80 namevhost vh1.example.com (/etc/httpd/conf/custom/virtualhost.conf:3)
Syntax OK
Dalam contoh ini, pengujian konfigurasi melaporkan vh2.example.com
konfigurasi sebelum melaporkan NameVirtualHost
konfigurasi. Anda mungkin melihat kesalahan ini jika alamat atau port VirtualHost IP tidak cocok dengan alamat IP atau port dari NameVirtualHost
server web pengarahan. Dalam contoh ini, laporan menunjukkan bahwa vh2.example.com
menggunakan port 800 daripada port 80. Nomor port salah ketik saat vh2.example.com
port mendengarkan host virtual telah dikonfigurasi. Akibatnya, Apache memperlakukan vh2.example.com
sebagai host virtual berbasis port yang terpisah.
httpd -S
perintah tes tidak memperingatkan Anda tentang masalah ini karena diperbolehkan untuk mengonfigurasi host virtual untuk menggunakan port apa pun, seperti 800, tanpa menjadi bagian dari konfigurasi host virtual berbasis nama di server yang sama.
Jika Anda mengalami kesalahan ini, Anda mungkin akan melihat konten dari host virtual default (vh1.example.com
dalam contoh ini) saat Anda mencoba melihat situs di browser web Anda.
Untuk membantu Anda memetakan output sebelumnya ke file konfigurasinya, berikut ini adalah konfigurasi virtual host yang membuat kesalahan ini:
NameVirtualHost \*:80
<VirtualHost \*:80>
ServerName vh1.example.com
DocumentRoot /var/www/vhosts/vh1
</VirtualHost>
<VirtualHost \*:800>
ServerName vh2.example.com
DocumentRoot /var/www/vhosts/vh2
</VirtualHost>
Direktori root dokumen tidak ada
Jika menjalankan httpd -S
melaporkan kesalahan berikut:
Warning: DocumentRoot [/etc/httpd/var/www/vhosts/vh2] does not exist
Kesalahan ini menunjukkan bahwa direktori yang ditentukan berisi file situs web untuk vh2.example.com
host virtual tidak ada, atau Apache tidak dapat mengaksesnya. Kesalahan serupa dapat muncul untuk salah satu jalur file yang ditentukan dalam konfigurasi host virtual, seperti jalur ke file log host virtual.
Untuk memperbaiki kesalahan ini, pastikan Anda membuat direktori. Jika Anda memang membuatnya, pastikan tidak ada kesalahan di DocumentRoot
pengarahan. Kesalahan umum adalah menghilangkan garis miring awal (/). Meninggalkan garis miring menginstruksikan Apache untuk membaca jalur—DocumentRoot
path dalam kasus ini—sebagai path relatif, yaitu sebagai path relatif ke ServerRoot
konfigurasi Apache utama jalan.
Contoh berikut menunjukkan hanya salah satu cara di mana kesalahan ini dibuat. Jalur untuk DocumentRoot
direktif di host virtual pertama dimulai dengan garis miring tetapi yang kedua tidak.
ServerRoot /etc/httpd
NameVirtualHost \*:80
<VirtualHost \*:80>
ServerName vh1.example.com
DocumentRoot /var/www/vhosts/vh1
</VirtualHost>
<VirtualHost \*:80>
ServerName vh2.example.com
DocumentRoot var/www/vhosts/vh2
</VirtualHost>
Menggunakan cURL untuk menguji situs Anda
Setelah Anda memeriksa file konfigurasi virtual host dan httpd -S
perintah melaporkan tidak ada masalah, coba akses situs Anda dengan menggunakan cURL:
curl -I www.example.com
Outputnya akan terlihat seperti ini:
HTTP/1.1 200 OK
Date: Sat, 07 May 2011 15:09:50 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Mon, 25 Apr 2011 11:07:43 GMT
ETag: "2c32e-77-4a1bc37723dc0"
Accept-Ranges: bytes
Content-Length: 119
Content-Type: text/html; charset=UTF-8
Baris pertama menunjukkan kode status. Anda ingin melihat 200 OK
, seperti yang ditunjukkan pada contoh. Jika itu yang Anda lihat, uji server web dengan browser Anda, tetapi pertimbangkan bahwa browser Anda mungkin menampilkan halaman yang di-cache.
Jika Anda tidak melihat 200 OK
, Anda mungkin melihat salah satu pesan umum berikut:
-
curl: (6) Couldn't resolve host vh1.example.com
Jika cURL melaporkan bahwa ia tidak dapat menemukan host, verifikasi bahwa ada catatan A untuk domain yang menunjuk ke alamat IP yang benar untuk server Anda. Anda dapat menggunakan penggalian untuk melakukan ini:
dig vh1.example.com
-
curl: (7) couldn't connect to host
Verifikasi bahwa file konfigurasi Apache Anda menyertakan
Listen
yang diperlukan arahan dan bahwa mereka tidak dikomentari. PerluListen 80
setidaknya.Cara lain untuk memverifikasi ini adalah dengan memeriksa log kesalahan. Log kesalahan default ada di
/var/log/httpd/error_log
pada sistem Red Hat dan/var/log/apache2/error_log
pada sistem Debian. Jika tidak ada port yang ditentukan untuk mendengarkan Apache, pesan tidak ada soket pendengar yang tersedia, penonaktifan mengikuti upaya Apache untuk memulai ulang.[notice] SIGHUP received. Attempting to restart no listening sockets available, shutting down Unable to open logs
-
HTTP/1.1 403 Forbidden
Respons ini menunjukkan bahwa izin yang mengizinkan akses Apache ke halaman yang Anda minta tidak benar. Mungkin izin direktori salah, atau mungkin halaman itu sendiri.
Anda mungkin juga melihat respons 403 dalam situasi berikut:
- The `DocumentRoot` contains no index file—-typically named `index.html` or `index.php`. Note that the file name is case sensitive.
- The virtual host doesn't contain a `DirectoryIndex` directive specifying the default index file.
Log kesalahan Apache biasanya menunjukkan direktori atau file mana yang memiliki izin yang tidak diatur dengan benar. Host virtual individu mungkin menulis kesalahan ke log mereka sendiri jika dikonfigurasi, jadi periksa juga log ini.
Jangan berkecil hati dengan jumlah data dalam file log server yang sibuk. Sebagai gantinya, gunakan perintah tail untuk secara selektif melihat sepuluh baris log terbaru saja. Misalnya:
tail /var/log/apache2/error\_log
Anda dapat melihat entri baru saat ditambahkan ke log kesalahan, atau log apa pun, saat Anda menguji server jika Anda menginstruksikan tail
perintah untuk "mengikuti" log. Misalnya:
tail -f /var/log/httpd/error\_log
Kesalahan umum terkait izin
Berikut adalah contoh beberapa kesalahan konfigurasi terkait izin umum yang dapat muncul di log Apache:
-
Entri log berikut menunjukkan bahwa izin pada
index.html
file untukvh2.example.com
menolak akses ke Apache.[error] [client 203.0.113.96] (13)Permission denied: access to /index.html denied
-
Entri log berikut menunjukkan bahwa izin pada
/var/www/vhosts/vh2
direktori memblokir permintaan baca Apache.[error] [client 203.0.113.96] (13)Permission denied: file permissions deny server access: /var/www/vhosts/vh2/index.html
-
Entri log berikut menunjukkan bahwa Apache tidak memiliki izin eksekusi atau baca pada salah satu direktori di atas
DocumentRoot
.[error] [client 203.0.113.96] (13)Permission denied: access to / denied