Tujuan
Tujuan kami adalah menyiapkan Apache httpd agar berfungsi sebagai proxy di depan wadah aplikasi Apache Tomcat.
Sistem Operasi dan Versi Perangkat Lunak
- Sistem operasi: Red Hat Enterprise Linux 7.5
- Perangkat Lunak: Apache httpd, Apache Tomcat
Persyaratan
Akses istimewa ke sistem
Kesulitan
MUDAH
Konvensi
- # – membutuhkan perintah linux yang diberikan untuk dieksekusi dengan hak akses root baik secara langsung sebagai pengguna root atau dengan menggunakan
sudo
perintah - $ – perintah linux yang diberikan untuk dieksekusi sebagai pengguna biasa yang tidak memiliki hak istimewa
Pengantar
Menggunakan Apache httpd sebagai proxy ke wadah aplikasi Apache Tomcat adalah pengaturan umum. Muncul dengan banyak kasus penggunaan, yang paling sepele adalah menyajikan konten statis dari httpd
, sambil menyediakan layanan yang mengimplementasikan logika bisnis berat dari aplikasi yang ditulis dalam Java yang berada di wadah Tomcat.
Dengan membuat proxy, kita dapat membuat semacam front-end ke lapisan aplikasi, di mana kita dapat memperkenalkan langkah-langkah keamanan di server web, menerapkan penyeimbangan beban, menggunakan pengalihan bersyarat, atau menggunakan fungsionalitas lain yang disediakan oleh server web. Dengan cara ini kami tidak perlu mengimplementasikan salah satu fitur ini di aplikasi kami, dan dapat memfokuskan kemampuannya ke layanan itu sendiri. Kami akan memiliki server web berfitur lengkap yang disajikan untuk pengguna, beberapa url diteruskan secara diam-diam ke wadah aplikasi yang mungkin tidak dapat diakses dengan sendirinya. Jawaban aplikasi diteruskan kembali ke klien yang tidak akan tahu bahwa mereka berbicara apa pun selain server web – yaitu, jika kita berhati-hati untuk tidak memaparkan informasi apa pun (seperti pesan kesalahan yang tidak ditangani) dari aplikasi yang dapat membuat mereka menebak ada lebih banyak informasi dari satu lapisan.
Kami akan menggunakan protokol AJP yang dapat digunakan antara server web dan wadah aplikasi berbasis Java untuk menyediakan kemampuan untuk menyeimbangkan beban antara beberapa server aplikasi – namun, untuk menyiapkan penyeimbang beban berada di luar cakupan tutorial ini.
Kami akan mengonfigurasi pengaturan kami di Red Hat Linux 7.5, tetapi server web Apache, modul AJP, dan wadah aplikasi Apache Tomcat tersedia di mana-mana, dan dengan demikian pengaturan ini portabel dengan sedikit penyesuaian seperti jalur sistem file atau nama layanan.
Menginstal perangkat lunak yang diperlukan
Pertama kita perlu menginstal layanan yang akan kita gunakan. Dalam penyiapan seimbang beban, server Tomcat dapat berada di mesin yang berbeda, dan sering kali, menyediakan kumpulan kontainer yang membangun layanan.
# yum install httpd tomcat tomcat-webapps
Kami menginstal tomcat-webapps
untuk tujuan pengujian, dalam paket ini adalah contoh aplikasi web yang disebarkan ke server Tomcat kami saat instalasi. Kami akan menggunakan aplikasi ini untuk menguji apakah penyiapan kami berfungsi sebagaimana mestinya.
Sekarang kita dapat mengaktifkan dan memulai server Tomcat kita:
# systemctl enable tomcat
# systemctl start tomcat
Dan server web kami:
# systemctl enable httpd
# systemctl start httpd
httpd
default instalasi berisi modul proxy yang kita butuhkan. Untuk memeriksa apakah benar, kita dapat menanyakan server web dengan apachectl
:
# apachectl -M | grep ajp
proxy_ajp_module (shared)
Catatan:1.x versi Apache menggunakan mod_jk
modul alih-alih proxy_ajp
.
konfigurasi httpd
Contoh aplikasi web yang disebarkan ke Tomcat diterbitkan setelah instalasi secara default di server-url:8080/examples
. Kami akan memproksi permintaan yang datang ke port 80 server (port http default) meminta sesuatu dari server-url/examples
untuk dilayani oleh examples
aplikasi web dikerahkan ke Tomcat. Permintaan yang datang ke URL lain di server akan dilayani oleh server web. Kami akan menyiapkan beberapa konten statis untuk menampilkan fungsi ini.
Dalam contoh kami server disebut ws.foobar.com
. Agar proxy berfungsi, buat file teks dengan editor favorit Anda di bawah direktori konfigurasi drop-in server web, yaitu /etc/httpd/conf.d
pada rasa Red Hat, dengan ekstensi .conf
. Pengaturan kami tidak membutuhkan Tomcat untuk dapat dijangkau secara langsung, jadi kami menggunakan localhost
sebagai host target di /etc/httpd/conf.d/example_proxy.conf
berkas:
<VirtualHost ws.foobar.com:80>
ServerName ws.foobar.com
ProxyRequests Off
ProxyPass /examples ajp://localhost:8009/examples
ProxyPassReverse /examples ajp://localhost:8009/examples
</VirtualHost>
Agar aman, kami dapat memverifikasi bahwa konfigurasi kami benar sebelum menerapkan dengan apachectl
:
# apachectl configtest
Syntax OK
Jika tes konfigurasi mengembalikan kesalahan seperti berikut:
Could not resolve host name ws.foobar.com -- ignoring!
Jika berarti ServerName
kami direktif tidak valid, karena tidak dapat diselesaikan oleh server web. Entah kita perlu mendaftarkannya di DNS (lokal atau global), atau memberikan baris di /etc/hosts
file yang berisi alamat IP publik host diikuti dengan nama yang kami berikan pada konfigurasi di atas. Jika file host sudah berisi IP dengan nama lain (mungkin nama host asli), kita dapat menambahkan nama server setelah nama host di baris yang sama, penyiapan akan berhasil.
Setelah pengujian berhasil, kita perlu menerapkan konfigurasi baru dengan memulai ulang server web:
# systemctl restart httpd
Konfigurasi Tomcat
Dengan penginstalan default, wadah Tomcat akan mendengarkan permintaan AJP pada semua antarmuka pada port 8009. Ini dapat diverifikasi di file konfigurasi utama:
# view /usr/share/tomcat/conf/server.xml
[..]
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
[..]
Jika kita tidak membutuhkan wadah Tomcat dan aplikasi di dalamnya untuk dapat dijangkau sendiri, kita dapat mengatur setiap konektor untuk mendengarkan hanya di localhost:
Connector address="127.0.0.1" port=..."
Untuk menerapkannya, kita dapat memulai ulang Tomcat dengan:
# systemctl restart tomcat
Di mesin lab kami tidak akan melakukan ini, karena kami perlu melihat bahwa kami disajikan konten yang sama di kedua port 80
dan 8080
.
Pengujian
Pengaturan proxy AJP minimal kami selesai, kami dapat mengujinya. Dari baris perintah kita dapat memanggil examples
aplikasi langsung pada port 8080
:
$ wget http://ws.foobar.com:8080/examples
--2018-09-13 11:00:58-- http://ws.foobar.com:8080/examples
Resolving ws.foobar.com (ws.foobar.com)... 10.104.1.165
Connecting to ws.foobar.com (ws.foobar.com)|10.104.1.165|:8080... connected.
HTTP request sent, awaiting response... 302 Found
Location: /examples/ [following]
--2018-09-13 11:00:58-- http://ws.foobar.com:8080/examples/
Reusing existing connection to ws.foobar.com:8080.
HTTP request sent, awaiting response... 200 OK
Length: 1253 (1.2K) [text/html]
Saving to: 'examples'
100%[=========================================================================================================================================================================>] 1,253 --.-K/s in 0s
2018-09-13 11:00:58 (102 MB/s) - 'examples' saved [1253/1253]
Dan lihat konten yang disediakan:
$ tail examples
<h3>Apache Tomcat Examples</H3>
<p></p>
<ul>
<li><a href="servlets">Servlets examples</a></li>
<li><a href="jsp">JSP Examples</a></li>
<li><a href="websocket/index.xhtml">WebSocket (JSR356) Examples</a></li>
<li><a href="websocket-deprecated">WebSocket Examples using the deprecated
Apache Tomcat proprietary API</a></li>
</ul>
</body></html>
Dan jika kami memanggil aplikasi yang sama melalui proxy AJP kami, kami juga harus mendapatkan jawaban, sementara tidak ada konten apa pun di root dokumen server web:
$ wget http://ws.foobar.com/examples
--2018-09-13 11:01:09-- http://ws.foobar.com/examples
Resolving ws.foobar.com (ws.foobar.com)... 10.104.1.165
Connecting to ws.foobar.com (ws.foobar.com)|10.104.1.165|:80... connected.
HTTP request sent, awaiting response... 302 Found
Location: /examples/ [following]
--2018-09-13 11:01:09-- http://ws.foobar.com/examples/
Reusing existing connection to ws.foobar.com:80.
HTTP request sent, awaiting response... 200 OK
Length: 1253 (1.2K) [text/html]
Saving to: 'examples.1'
100%[=========================================================================================================================================================================>] 1,253 --.-K/s in 0s
2018-09-13 11:01:09 (101 MB/s) - 'examples.1' saved [1253/1253]
Jika semua berhasil, kita akan mendapatkan jawaban dengan isi yang sama, karena jawaban akhir disediakan oleh aplikasi yang sama di dalam wadah:
$ tail examples.1
<h3>Apache Tomcat Examples</h3>
[...]
Kami juga dapat menguji pengaturan kami dengan browser. Kita perlu memanggil semua URL dengan nama server sebagai host (setidaknya yang diproksi). Untuk itu mesin yang menjalankan browser harus dapat menyelesaikan nama server, melalui DNS atau file host.
Di lingkungan lab kami, kami belum menonaktifkan mendengarkan Tomcat di antarmuka publik, jadi kami dapat melihat apa yang disediakan saat ditanya langsung di port 8080
:
Kita bisa mendapatkan konten yang sama melalui proxy AJP yang disediakan oleh server web pada port 80
:
Saat bertindak sebagai proxy, httpd
dapat menyajikan konten lainnya. Kami dapat membuat konten statis yang dapat dijangkau di beberapa URL lain di server yang sama:
# mkdir /var/www/html/static_content
# echo "<html><body>Static content</body></html>" > /var/www/html/static_content/static.html
Dengan mengarahkan browser kami ke sumber daya baru ini, kami diberikan konten statis baru.
Konten statis disediakan oleh httpdJika wadah Tomcat tidak dapat dijangkau, kami tidak akan tahu jawabannya datang di tempat lain selain server web. Karena kami hanya mem-proxy aplikasi tertentu, aplikasi ROOT default container tidak dapat dijangkau melalui proxy, sehingga tersembunyi dari segala sesuatu di luar server web.
Kesimpulan
Webserver Apache sangat dapat diperluas melalui modul, salah satunya adalah modul proxy AJP. Panduan di atas menggunakan satu mesin dan memaparkan satu aplikasi dengan proxy, tetapi server web yang sama dapat menyediakan satu entri ke banyak aplikasi, mungkin pada banyak host yang menjalankan wadah aplikasi, sambil menyediakan konten web lain juga.
Dikombinasikan dengan modul lain, seperti mod_security
, kami dapat menambahkan banyak fitur ke layanan kami tanpa perlu mengembangkannya di dalam aplikasi, atau jika perlu, mengalihkan proxy ke titik akhir lain dengan satu edisi file konfigurasi dan memuat ulang server web, melakukan migrasi atau pengenalan rilis baru aplikasi hitungan detik. Muat ulang yang sama dapat mengarahkan pengunjung ke halaman yang menjelaskan waktu henti yang direncanakan, sementara pemeliharaan dilakukan pada server aplikasi – kasus penggunaan proxy AJP hanya dibatasi oleh imajinasi staf TI.