Bagaimana Nginx Reverse Proxy dengan Docker Compose

· 5 min read
Bagaimana Nginx Reverse Proxy dengan Docker Compose
Photo by Boitumelo / Unsplash

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:

gambar

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:

gambar

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