GNU/Linux >> Belajar Linux >  >> Linux

Menggunakan Docker untuk Mengatur Nginx Reverse Proxy Dengan Auto SSL Generation

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 termasuk on-failure dan unless-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 kecuali icc disetel ke true 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 dan vhost 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.


Linux
  1. Reverse Proxy dengan Nginx:Panduan Pengaturan Langkah-demi-Langkah

  2. Mengatur Nginx sebagai Proxy Terbalik di Ubuntu 20.04 - Panduan langkah demi langkah?

  3. Cara Mengatur Beberapa SSL pada Satu IP Dengan Nginx

  1. Cara Menginstal Odoo 11 di Ubuntu 16.04 dengan Nginx sebagai Proxy Terbalik

  2. Cara Menginstal Odoo 10 di Ubuntu 16.04 dengan Nginx sebagai Proxy Terbalik

  3. Instal WordPress dengan Docker Compose, Nginx, Apache dengan SSL

  1. Cara Mengatur Proksi Terbalik Nginx

  2. Panduan untuk menjalankan proxy Terbalik untuk HTTP(S), SSH, dan MySQL/MariaDB menggunakan NGINX

  3. Nginx membalikkan proxy tanpa penghentian SSL