Apa itu reverse proxy? Apa kelebihannya?
Apa itu proxy terbalik? Reverse proxy adalah jenis server yang berada di depan banyak server lain, dan meneruskan permintaan klien ke server yang sesuai. Respon dari server kemudian juga diterima dan diteruskan oleh server proxy ke klien.
Mengapa Anda menggunakan pengaturan seperti itu? Ada beberapa alasan bagus untuk itu. Penyiapan ini dapat digunakan untuk menyiapkan penyeimbang beban, caching, atau untuk perlindungan dari serangan.
Saya tidak akan membahas detailnya di sini. Sebagai gantinya, saya akan menunjukkan kepada Anda bagaimana Anda dapat memanfaatkan konsep proxy terbalik untuk menyiapkan beberapa layanan di server yang sama.
Ambil gambar yang sama seperti yang Anda lihat di atas. Yang dapat Anda lakukan adalah menjalankan server Ngnix dalam wadah buruh pelabuhan dalam mode proxy terbalik. Layanan web lain juga dapat dijalankan dalam wadahnya masing-masing.
Kontainer Nginx akan dikonfigurasi sedemikian rupa sehingga tahu layanan web mana yang berjalan di kontainer mana.
Ini adalah cara yang baik untuk menghemat biaya hosting setiap layanan di server yang berbeda. Anda dapat menjalankan beberapa layanan di server Linux yang sama berkat server proxy terbalik.
Menyiapkan Nginx sebagai proxy terbalik untuk menerapkan beberapa layanan di server yang sama menggunakan Docker
Mari saya tunjukkan cara mengonfigurasi penyiapan yang disebutkan di atas.
Dengan langkah-langkah ini, Anda dapat menginstal beberapa wadah aplikasi berbasis web yang berjalan di bawah Nginx dengan setiap wadah mandiri yang sesuai dengan domain atau subdomainnya masing-masing.
Pertama, mari kita lihat apa yang Anda butuhkan untuk mengikuti tutorial ini.
Prasyarat
Anda akan membutuhkan pengetahuan berikut untuk memulai tutorial ini dengan mudah. Meskipun demikian, Anda juga bisa bertahan tanpa mereka.
- Sistem/server Linux. Anda dapat dengan mudah menerapkan server Linux dalam hitungan menit menggunakan layanan cloud Linode.
- Keakraban dengan perintah dan terminal Linux.
- Pengetahuan dasar tentang Docker.
- Anda harus menginstal Docker dan Docker Compose di server Linux Anda. Silakan baca panduan kami tentang menginstal Docker dan Docker Compose di CentOS.
- Anda juga harus memiliki domain (agar Anda dapat menyiapkan layanan di sub-domain).
Saya telah menggunakan domain.com sebagai contoh nama domain dalam tutorial. Pastikan Anda mengubahnya sesuai dengan domain atau subdomain Anda sendiri.
Selain hal di atas, pastikan juga hal-hal berikut:
Ubah data DNS domain Anda
Di panel data A/AAAA atau CNAME penyedia nama domain Anda, pastikan domain dan subdomain (termasuk www) mengarah ke alamat IP server Anda.
Ini adalah contoh untuk referensi Anda:
Nama Inang | Alamat IP | TTL |
---|---|---|
domain.com | 172.105.50.178 | Bawaan |
* | 172.105.50.178 | Bawaan |
sub0.domain.com | 172.105.50.178 | Bawaan |
sub1.domain.com | 172.105.50.178 | Bawaan |
Tukar ruang
Untuk memastikan semua aplikasi container Anda nyaman dan tidak pernah kehabisan memori setelah Anda menerapkannya, Anda harus memiliki ruang swap yang diperlukan di sistem Anda.
Anda selalu dapat menyesuaikan swap sesuai dengan RAM yang tersedia di sistem Anda. Anda dapat memutuskan ruang swap berdasarkan bundel wadah aplikasi di server tunggal dan memperkirakan penggunaan RAM kumulatifnya.
Langkah 1:Siapkan wadah proxy terbalik Nginx
Mulailah dengan mengatur proxy terbalik nginx Anda. Buat direktori bernama "reverse-proxy" dan alihkan ke direktori tersebut:
mkdir reverse-proxy && cd reverse-proxy
Buat file bernama docker-compose.yml
, buka di editor teks berbasis terminal favorit Anda seperti Vim atau Nano.
Untuk proxy terbalik nginx, saya akan menggunakan gambar jwilder/nginx-proxy. Salin dan tempel berikut ini di file docker-compose.yml:
version: "3.7"
services:
reverse-proxy:
image: "jwilder/nginx-proxy:latest"
container_name: "reverse-proxy"
volumes:
- "html:/usr/share/nginx/html"
- "dhparam:/etc/nginx/dhparam"
- "vhost:/etc/nginx/vhost.d"
- "certs:/etc/nginx/certs"
- "/run/docker.sock:/tmp/docker.sock:ro"
restart: "always"
networks:
- "net"
ports:
- "80:80"
- "443:443"
Sekarang mari kita lihat bagian-bagian penting dari file penulisan:
- Anda telah mendeklarasikan empat volume, html, dhparam, vhost dan certs. Itu adalah data persisten yang pasti ingin Anda simpan bahkan setelah penampungnya mati.
html
&vhost
volume akan menjadi sangat penting dalam penyebaran kontainer Let's Encrypt berikutnya. Mereka dirancang untuk bekerja sama. - Docker socker dipasang hanya-baca di dalam container. Yang ini diperlukan untuk wadah proxy terbalik untuk menghasilkan file konfigurasi nginx, mendeteksi wadah lain dengan variabel lingkungan tertentu.
- Kebijakan restart Docker disetel ke
always
. Opsi lain termasukon-failure
danunless-stopped
. Dalam hal ini, selalu tampak lebih tepat. - Port 80 dan 443 terikat ke host untuk http dan https masing-masing.
- Akhirnya, ia menggunakan jaringan yang berbeda, bukan jaringan jembatan default.
Menggunakan jaringan yang ditentukan pengguna sangat penting. Ini akan membantu dalam mengisolasi semua wadah yang akan diproksi, bersama dengan memungkinkan wadah proxy terbalik untuk meneruskan klien ke wadah yang diinginkan/dimaksudkan dan juga membiarkan wadah berkomunikasi satu sama lain (Yang tidak mungkin dengan jaringan jembatan default kecualiicc
disetel ketrue
untuk daemon).
Perlu diingat bahwa YML sangat rewel tentang tab dan indentasi.
Langkah 2:Siapkan penampung untuk pembuatan sertifikat SSL otomatis
Untuk ini, Anda dapat menggunakan jrcs/letsencrypt-nginx-proxy-companion container image.
Pada docker-compose.yml
yang sama file yang Anda gunakan sebelumnya, tambahkan baris berikut:
letsencrypt:
image: "jrcs/letsencrypt-nginx-proxy-companion:latest"
container_name: "letsencrypt-helper"
volumes:
- "html:/usr/share/nginx/html"
- "dhparam:/etc/nginx/dhparam"
- "vhost:/etc/nginx/vhost.d"
- "certs:/etc/nginx/certs"
- "/run/docker.sock:/var/run/docker.sock:ro"
environment:
NGINX_PROXY_CONTAINER: "reverse-proxy"
DEFAULT_EMAIL: "[email protected]"
restart: "always"
depends_on:
- "reverse-proxy"
networks:
- "net"
Dalam definisi layanan ini:
- Anda menggunakan volume yang sama persis seperti yang Anda gunakan untuk container reverse-proxy.
html
danvhost
berbagi volume diperlukan agar Tantangan ACME dari letsencrypt menjadi sukses. Wadah ini akan menghasilkan sertifikat di dalam/etc/nginx/certs
, dalam wadah. Inilah sebabnya mengapa Anda membagikan volume ini dengan wadah proxy terbalik Anda.dhparam
volume akan berisi file dhparam. Soket dipasang untuk mendeteksi wadah lain dengan variabel lingkungan tertentu. - Di sini Anda telah mendefinisikan dua variabel lingkungan.
NGINX_PROXY_CONTAINER
variabel menunjuk ke wadah proxy terbalik. Setel ke nama wadah.DEFAULT_EMAIL
adalah email yang akan digunakan saat membuat sertifikat untuk setiap domain/subdomain. depends_on
opsi disetel sehingga layanan ini menunggu proxy terbalik untuk memulai terlebih dahulu, baru kemudian, ini akan dimulai.- Akhirnya, wadah ini juga berbagi jaringan yang sama. Ini diperlukan agar kedua wadah dapat berkomunikasi.
Langkah 3:Selesaikan file penulisan buruh pelabuhan
Setelah definisi layanan selesai, lengkapi file docker-compose dengan baris berikut:
volumes:
certs:
html:
vhost:
dhparam:
networks:
net:
external: true
Jaringan net
disetel ke eksternal karena kontainer yang diproksi juga harus menggunakan jaringan ini. Dan jika kita meninggalkan jaringan untuk dibuatkan oleh docker-comspose
, nama jaringan akan tergantung pada direktori saat ini. Ini akan membuat jaringan bernama aneh.
Selain itu, wadah lain harus mengatur jaringan itu menjadi eksternal, jika tidak, file penulisan itu juga harus berada di direktori yang sama ini, tidak ada yang ideal.
Oleh karena itu, buat jaringan menggunakan
docker network create net
Berikut ini adalah keseluruhan isi dari docker-compose.yml
berkas.
version: "3.7"
services:
reverse-proxy:
image: "jwilder/nginx-proxy:latest"
container_name: "reverse-proxy"
volumes:
- "html:/usr/share/nginx/html"
- "dhparam:/etc/nginx/dhparam"
- "vhost:/etc/nginx/vhost.d"
- "certs:/etc/nginx/certs"
- "/run/docker.sock:/tmp/docker.sock:ro"
restart: "always"
networks:
- "net"
ports:
- "80:80"
- "443:443"
letsencrypt:
image: "jrcs/letsencrypt-nginx-proxy-companion:latest"
container_name: "letsencrypt-helper"
volumes:
- "html:/usr/share/nginx/html"
- "dhparam:/etc/nginx/dhparam"
- "vhost:/etc/nginx/vhost.d"
- "certs:/etc/nginx/certs"
- "/run/docker.sock:/var/run/docker.sock:ro"
environment:
NGINX_PROXY_CONTAINER: "reverse-proxy"
DEFAULT_EMAIL: "[email protected]"
restart: "always"
depends_on:
- "reverse-proxy"
networks:
- "net"
volumes:
certs:
html:
vhost:
dhparam:
networks:
net:
external: true
Terakhir, Anda dapat menerapkan dua wadah ini (Ngnix dan Let's Encrypt) menggunakan perintah berikut:
docker-compose up -d
Langkah 4:Verifikasi bahwa proxy terbalik Ngnix berfungsi
Wadah yang akan melayani frontend perlu mendefinisikan dua variabel lingkungan.
VIRTUAL_HOST
:untuk menghasilkan konfigurasi proxy terbalik
LETSENCRYPT_HOST
:untuk membuat sertifikat yang diperlukan
Pastikan Anda memiliki nilai yang benar untuk kedua variabel ini. Anda dapat menjalankan gambar nginx-dummy dengan proxy terbalik seperti ini:
docker run --rm --name nginx-dummy -e VIRTUAL_HOST=sub.domain.com -e LETSENCRYPT_HOST=sub.domain.com -e VIRTUAL_PORT=80 --network net -d nginx:latest
Sekarang jika Anda pergi ke sub-domain yang digunakan pada perintah sebelumnya, Anda akan melihat pesan dari server Ngnix.
Setelah Anda berhasil mengujinya, Anda dapat menghentikan container buruh pelabuhan yang sedang berjalan:
docker stop nginx-dummy
Anda juga dapat menghentikan proxy terbalik Ngnix jika Anda tidak akan menggunakannya:
docker-compose down
Langkah 5:Jalankan penampung layanan lain dengan proxy terbalik
Proses menyiapkan container lain agar dapat diproksi SANGAT sederhana.
Saya akan menunjukkannya dengan dua contoh penerapan Nextcloud sebentar lagi. Biarkan saya memberi tahu Anda apa yang Anda lakukan di sini.
Jangan ikat ke port mana pun
Kontainer dapat meninggalkan port yang melayani frontend. Wadah proxy terbalik akan secara otomatis mendeteksi itu.
(OPTIONAL) Tentukan VIRTUAL_PORT
Jika wadah proxy terbalik gagal mendeteksi port, Anda dapat menentukan variabel lingkungan lain bernama VIRTUAL_PORT
dengan port yang melayani frontend atau layanan apa pun yang Anda inginkan untuk mendapatkan proxy, seperti "80" atau "7765".
Setel Let's Encrypt email khusus ke container
Anda dapat mengganti DEFAULT_EMAIL
variabel dan setel alamat email tertentu untuk domain/subdomain sertifikat penampung/layanan web tertentu, dengan menyetel id email ke variabel lingkungan LETSENCRYPT_EMAIL
. Ini bekerja pada basis per-kontainer.
Sekarang setelah Anda mengetahui semua hal itu, izinkan saya menunjukkan kepada Anda perintah yang menerapkan instance Nextcloud yang akan diproksi menggunakan wadah proxy nginx, dan akan mengaktifkan TLS(SSL/HTTPS).
Ini BUKAN penyebaran IDEAL. Perintah berikut hanya digunakan untuk tujuan demonstratif.
docker run --name nextcloud --network net -e VIRTUAL_HOST="sub0.domain.com" -e LETSENCRYPT_HOST="sub0.domain.com" -d nextcloud:19.0.2
Dalam contoh, Anda menggunakan jaringan yang sama dengan wadah proxy terbalik, mendefinisikan dua variabel lingkungan, dengan subdomain yang sesuai (Setel sesuai milik Anda). Setelah beberapa menit, Anda akan melihat Nextcloud berjalan di sub0.domain.com. Buka di browser untuk memverifikasi.
Anda dapat menerapkan instance Nextcloud lain seperti ini, pada subdomain yang berbeda, seperti berikut ini:
docker run --name anothernextcloud --network net -e VIRTUAL_HOST="sub1.domain.com" -e LETSENCRYPT_HOST="sub1.domain.com" -d nextcloud:19.0.2
Sekarang Anda akan melihat instance Nextcloud yang berbeda berjalan pada subdomain yang berbeda di server yang sama.
Dengan metode ini, Anda dapat menerapkan aplikasi web yang berbeda pada server yang sama yang disajikan di bawah subdomain yang berbeda, yang cukup berguna.
Ikuti bersama
Sekarang setelah Anda menyiapkan ini, Anda dapat melanjutkan dan menggunakannya dalam penerapan yang sebenarnya dengan contoh berikut:
- Instal Homeserver Matrix Synapse Menggunakan Docker
- Instal Beberapa Wadah Wacana di Server yang Sama
Untuk lebih banyak artikel seperti ini, berlangganan buletin kami, atau pertimbangkan untuk menjadi anggota. Untuk pertanyaan apa pun, jangan ragu untuk berkomentar di bawah.