GNU/Linux >> Belajar Linux >  >> Linux

Melayani beberapa domain dengan menggunakan virtual host

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. Perlu Listen 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

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 untuk vh2.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
    

Linux
  1. Cara Menambahkan Banyak Host di phpMyAdmin

  2. Mesin Virtual Multipass dengan menggunakan Ansible

  3. Bagaimana Cara Mengganti Nama Banyak File Menggunakan Find?

  1. Ssh – Scp Melalui Banyak Host?

  2. Siapkan host virtual di CentOS

  3. Beberapa pustaka glibc pada satu host

  1. Bagaimana cara meng-host beberapa domain?

  2. Cara mengatur subdomain atau meng-host beberapa domain menggunakan nginx di server linux

  3. Menggunakan SNI untuk meng-host beberapa sertifikat SSL di Apache