Saat mengembangkan aplikasi web, metode umum untuk memanggil aplikasi dari mesin lokal adalah melalui
http://localhost:x
port, yang pada dasarnya berarti bahwa kita diharuskan untuk mengekspos beberapa port untuk mengakses modul aplikasi yang berbeda. Pada artikel di bawah ini, kita akan membahas metode penggunaan Reverse Proxy untuk memanggil aplikasi dan manfaat menggunakannya.
Mengapa kita membutuhkan Reverse Proxy?
Alasan paling menonjol menggunakan Reverse Proxy adalah untuk menghindari perubahan port setiap kali Anda mencoba mengakses modul aplikasi yang berbeda melalui URL yang sama. Melalui Reverse Proxy kami dapat menjangkau Frontend, Backend atau layanan lainnya tanpa mengubah port melalui satu domain. Alasan penting lainnya menggunakan Reverse Proxy adalah untuk menutupi layanan di belakang proxy dan menghindari berurusan dengan masalah (Cross-Origin Resource Sharing) CORS.
# Without Reverse Proxy
# Domain Name: http://mydomain.com
# Mysql wordpress: http://mydomain.com:10088
# Angular app: http://mydomain.com:7787
# Backend: https://mydomain:9876
# With Reverse Proxy
# Domain Name: http://mydomain.com
# Mysql wordpress: http://mydomain.com/db
# Angular app: http://mydomain.com/ang
# Backend: https://mydomain/wp
Prasyarat
- Docker Compose di Linux
- iptables harus diaktifkan.
Perhatikan bahwa Docker menggunakan iptables untuk mengakses koneksi yang masuk.
Membangun docker-compose.yml
Untuk referensi artikel ini, mari kita buat server Wordpress-MySQL dengan Nginx dalam satu layanan. Mulailah dengan membuat wadah docker, bersama dengan mendefinisikan port, gambar dasar, nama wadah, dan nama layanan.
version: '2'
services:
whilefly_wp:
container_name: production_wp
image: nginx:latest
volumes:
- "/home/xx/Desktop/cust/xx/html:/var/www/html"
- "/home/xx/Desktop/cust/xx/Docker/logs:/logs"
- "/home/xx/Desktop/cust/xx/Docker/database:/docker-entrypoint-initdb.d"
- "xx_db_data:/var/lib/mysql"
user: root
restart: always
ports:
- "8081:80"
environment:
MYSQL_ROOT_PASSWORD: 'xxxxx'
MYSQL_DATABASE: 'production_db'
MYSQL_USER: 'production_admin'
MYSQL_PASSWORD: 'xxxxxx'
nginx:
image: nginx:latest
container_name: production_nginx
volumes:
- /home/xx/Desktop/cust/xx/Docker/nginx/reverse_proxy.conf:/etc/nginx/conf.d/default.conf
- /home/xx/Desktop/cust/xx/Docker/nginx/cert/star_xx_com.pem:/etc/nginx/cert/star_xx_com.pem
- /home/xx/Desktop/cust/xx/Docker/nginx/cert/star_xx_com.key:/etc/nginx/cert/star_xx_com.key
- /home/xx/Desktop/cust/xx/Docker/nginx/cert/star_xx_com.crt:/etc/nginx/cert/star_xx_com.crt
ports:
- 8080:8080
- 443:443
links:
- whilefly_wp
volumes:
xx_db_data:
Mari kita jelaskan pengaturannya secara bertahap.
1.
services
Perintah mendefinisikan layanan yang akan Anda bangun di Docker.
version: '2'
services:
running_wp:
nginx:
2. Seperti yang ditunjukkan di bawah ini,
running_wp
penggunaan layanan
nginx:latest
sebagai gambar dasar. Anda juga dapat menggunakan gambar kustom Anda sendiri untuk MySQL dan Wordpress. Selanjutnya adalah menetapkan nama kontainer, misalnya saat ini
production_wp
digunakan di bawah ini. Salin file lokal di bawah bagian volume ke direktori yang diberikan saat membangun gambar docker ini. Penting untuk menetapkan Port yang akan digunakan untuk aksesibilitas di dalam atau di luar aplikasi. Seperti yang ditunjukkan di bawah ini, kami telah memetakan
8081
tuan rumah untuk
80
port untuk kontainer.
version: '2'
services:
running_wp:
container_name: production_wp
image: boraozkan/nginx:latest
volumes:
- "/home/xx/Desktop/cust/xx/html:/var/www/html"
- "/home/xx/Desktop/cust/xx/Docker/logs:/logs"
- "/home/xx/Desktop/cust/xx/Docker/database:/docker-entrypoint-initdb.d"
- "xx_db_data:/var/lib/mysql"
user: root
restart: always
ports:
- "8081:80"
environment:
MYSQL_ROOT_PASSWORD: 'xxxxx'
MYSQL_DATABASE: 'production_db'
MYSQL_USER: 'production_admin'
MYSQL_PASSWORD: 'xxxxxx'
3. Tetapkan kredensial akses yang diperlukan dengan perintah.
environment
environment:
MYSQL_ROOT_PASSWORD: 'xxxxx'
MYSQL_DATABASE: 'production_db'
MYSQL_USER: 'production_admin'
MYSQL_PASSWORD: 'xxxxxx'
4. Tetapkan gambar dasar dan nama kontainer. Gambar dasar akan membuat Nginx pada menjalankan pertama. Anda juga dapat menambahkan file SSL terenkripsi melalui https://letsencrypt.org/, gratis.
version: '2'
nginx:
image: nginx:latest
container_name: production_nginx
volumes:
- /home/xx/Desktop/cust/xx/Docker/nginx/reverse_proxy.conf:/etc/nginx/conf.d/default.conf
- /home/xx/Desktop/cust/xx/Docker/nginx/cert/star_xx_com.pem:/etc/nginx/cert/star_xx_com.pem
- /home/xx/Desktop/cust/xx/Docker/nginx/cert/star_xx_com.key:/etc/nginx/cert/star_xx_com.key
- /home/xx/Desktop/cust/xx/Docker/nginx/cert/star_xx_com.crt:/etc/nginx/cert/star_xx_com.crt
ports:
- 8080:8080
- 443:443
links:
- running_wp
volumes:
xx_db_data:
5. Tambahkan file konfigurasi Nginx di bawah
conf.d
path - ini adalah direktori bawaan untuk deskripsi host virtual.
/home/xx/Desktop/cust/xx/Docker/nginx/reverse_proxy.conf:/etc/nginx/conf.d/default.conf
6. Seperti yang ditunjukkan di bawah ini ada dua bagian dari file konfigurasi ini. Yang pertama menunjukkan sisi server yang menentukan port mana yang akan didengarkan oleh Kontainer Nginx (
8080
dan
443
). Kedua, lalu lintas ke depan akan diarahkan ke pelabuhan
8081
- ini adalah pelabuhan kontainer produksi untuk dijangkau.
# re-route everything to production_wp
server {
listen 8080;
server_name production_wp;
error_page 497 http://$host:80$request_uri;
ssl on;
ssl_certificate /etc/nginx/cert/star_xx_com.crt;
ssl_certificate_key /etc/nginx/cert/star_xx_com.key;
location /wp {
proxy_pass http://localhost:8081/wp;
rewrite /wp(.*) /origin-d$1
proxy_pass http://localhost:8081;
proxy_redirect / /wp;
sub_filter 'href="/' 'href="/wp'
}
}
# wordpress container via production_wp
server {
listen 443;
server_name production_wp;
error_page 497 http://$host:80$request_uri;
7. Aktifkan HTTP yang aman dengan
ssl on
perintah.
ssl on;
ssl_certificate /etc/nginx/cert/star_xx_com.crt;
ssl_certificate_key /etc/nginx/cert/star_xx_com.key;
8. Untuk awalan header untuk koneksi proxy, kita dapat menggunakan
proxy_set_header
Arahan yang membantu dalam mendefinisikan ulang atau menambahkan bidang ke header permintaan yang diteruskan melalui server proxy.
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
9. Untuk Reverse Proxy seperti yang disebutkan di awal, kami akan memberikan jalur untuk wadah Wordpress di Nginx conf. Katakanlah itu menggunakan misalnya, http://localhost/wp ke http://localhost:8081 yang merupakan jalur asimetris.
location /wp {proxy_pass http://localhost:8081/wp;rewrite /wp(.*) /origin-d$1proxy_pass http://localhost:8081;proxy_redirect / /wp;sub_filter 'href="/' 'href="/wp'
}
10. Sekarang kita dapat memulai kontainer kita dengan perintah di bawah ini. Ingatlah untuk berada di jalur yang sama dengan
docker-compose.yaml
saat memulai kontainer.
docker-compose up -d
11. Perintah docker-compose up adalah bentuk singkatan dari docker-compose build dan docker-compose run.
#docker-compose up -d
Pulling nginx (nginx:latest)...
2.1: Pulling from nginx:latest
b8f262c62ec6: Pulling fs layer
a98660e7def6: Pulling fs layer
4d75689ceb37: Pulling fs layer
639eb0368afa: Waiting
99e337926e9c: Waiting
431d44b3ce98: Waiting
beb665ea0e0e: Pulling fs layer
c98a22d85c62: Waiting
bf70d116f1d7: Waiting
97f2d71621e0: Waiting
ea02a46a87c8: Waiting
78fff17c3a50: Waiting
12. Ketika selesai, kita harus memiliki dua kontainer yang dikerahkan, salah satunya tidak dapat kita akses secara langsung:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9c327bb01a85 nginx:latest "nginx -g 'daemon of…" 8 minutes ago Up 8 minutes 0.0.0.0:8080->8080/tcp, 0.0.0.0:443->443/tcp production_nginx
3823ce1f25d8 boraozkan/nginx:latest "/usr/bin/supervisord" 8 minutes ago Up 8 minutes 3306/tcp, 0.0.0.0:8081->80/tcp production_wp
13. Kami dapat memeriksa aplikasi kami (satu dengan Nginx dan yang lainnya dengan Apache). Arahkan ke http://localhost:8080, dan ini akan menekan Nginx Reverse Proxy yang pada gilirannya akan memuat aplikasi web Nginx:
14. Periksa juga dengan menavigasi ke http://localhost:8081 atau http://localhost/wp, melalui jalur asimetris Nginx Reverse Proxy dan aplikasi web Apache akan dimuat:
Pemecahan masalah
Setelah layanan aktif, coba sambungkan aplikasi web Anda ke tautan localhost. Jika tidak dijawab, periksa
iptables
tabel untuk kebenaran.
Secara default kontainer Docker dapat membuat koneksi ke dunia luar, tetapi dunia luar tidak dapat terhubung ke kontainer. Setiap koneksi keluar akan muncul berasal dari salah satu alamat IP mesin host sendiri berkat
iptables
aturan menyamarkan pada mesin host yang dibuat oleh server Docker saat dimulai:
$ sudo iptables -t nat -L -n
...
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0
Kesimpulan
Artikel ini bertujuan untuk menunjukkan bagaimana Anda dapat menggunakan Nginx dengan docker-compose dengan mudah. Itu juga menunjukkan pengaturan konfigurasi Reverse Proxy pada kontainer. Menggunakan ini akan memberi Anda fleksibilitas tambahan selama penerapan aplikasi web.
Sekian dan Terimakasih