Skip to content

Nginx


Created @December 11, 2024 1:13 AM Created by Thank to Gravita Hat | Gravatar sub Server HTTP dan Reverse Proxy Open Source

Pendahuluan

Nginx (diucapkan "engine-x") adalah server web yang sangat populer dan juga berfungsi sebagai reverse proxy, load balancer, dan HTTP cache. Berikut adalah ringkasan sejarah Nginx:

1. Awal Mula (2002)

Nginx dikembangkan oleh Igor Sysoev, seorang insinyur perangkat lunak asal Rusia, pada tahun 2002. Sysoev mulai mengembangkan Nginx untuk mengatasi masalah yang dihadapi oleh server web yang ada pada saat itu, terutama dalam hal menangani banyak koneksi secara bersamaan. Dia ingin menciptakan server yang dapat menangani ribuan koneksi secara efisien, terutama untuk situs web dengan lalu lintas tinggi.

2. Rilis Pertama (2004)

Versi pertama Nginx dirilis pada tahun 2004. Sejak saat itu, Nginx mulai mendapatkan perhatian dari komunitas pengembang dan administrator sistem karena kemampuannya untuk menangani beban tinggi dengan penggunaan sumber daya yang rendah.

3. Popularitas Meningkat (2000-an)

Selama pertengahan hingga akhir 2000-an, Nginx mulai digunakan oleh banyak situs web besar, termasuk WordPress.com, Netflix, dan GitHub. Keunggulan Nginx dalam hal performa dan skalabilitas membuatnya menjadi pilihan populer di kalangan penyedia layanan hosting dan perusahaan teknologi.

4. Rilis Versi Stabil (2011)

Pada tahun 2011, Nginx mencapai tonggak penting dengan rilis versi stabil 1.0.0. Versi ini membawa banyak fitur baru dan perbaikan, serta meningkatkan stabilitas dan keamanan.

5. Nginx, Inc. (2011)

Igor Sysoev mendirikan Nginx, Inc. pada tahun 2011 untuk mendukung pengembangan dan distribusi Nginx. Perusahaan ini juga mulai menawarkan layanan dukungan komersial dan produk tambahan, seperti Nginx Plus, yang merupakan versi komersial dari Nginx dengan fitur tambahan seperti manajemen dan pemantauan.

6. Pertumbuhan dan Adopsi (2010-an)

Nginx terus tumbuh dalam popularitas dan menjadi salah satu server web paling banyak digunakan di dunia. Pada tahun 2019, Nginx dilaporkan digunakan oleh lebih dari 30% situs web di seluruh dunia, menjadikannya salah satu server web terpopuler, bersaing dengan Apache.

7. Akuisisi oleh F5 Networks (2019)

Pada tahun 2019, F5 Networks mengakuisisi Nginx, Inc. Akuisisi ini bertujuan untuk memperluas portofolio F5 dalam hal solusi aplikasi dan keamanan.

8. Fokus pada Cloud dan Microservices (2020-an)

Dengan meningkatnya adopsi arsitektur microservices dan cloud-native, Nginx terus beradaptasi dengan menambahkan fitur-fitur baru yang mendukung pengembangan aplikasi modern, termasuk dukungan untuk Kubernetes dan layanan berbasis kontainer.

Berikut adalah penjelasan lengkap untuk Pendahuluan Nginx, termasuk teori dan langkah praktis disertai kode.

Apa itu Nginx?

Nginx adalah server HTTP dan reverse proxy open-source yang sangat populer, dirancang untuk menangani koneksi secara asinkron dan efisien. Dengan kemampuannya yang unggul dalam mengelola banyak koneksi secara bersamaan, Nginx sering digunakan sebagai server web untuk melayani file statis atau aplikasi web, memberikan performa tinggi dan respons yang cepat. Selain itu, Nginx berfungsi sebagai reverse proxy, yang berarti dapat meneruskan permintaan dari klien ke backend seperti aplikasi Node.js, Django, atau PHP, sehingga memudahkan pengelolaan dan pengembangan aplikasi. Nginx juga berperan sebagai load balancer, membagi lalu lintas ke beberapa server backend untuk meningkatkan skalabilitas dan keandalan sistem, menjadikannya pilihan utama bagi banyak perusahaan dan pengembang dalam membangun infrastruktur web yang efisien dan handal.

Nginx adalah server HTTP dan reverse proxy open-source yang sangat populer. Dibuat untuk menangani koneksi secara asinkron dan efisien, Nginx digunakan sebagai:

  • Server web: Melayani file statis atau aplikasi web.
  • Reverse proxy: Meneruskan permintaan ke backend seperti aplikasi Node.js, Django, atau PHP.
  • Load balancer: Membagi lalu lintas ke beberapa server backend untuk skalabilitas.

Perbedaan antara Nginx dan Apache

Berikut adalah tabel yang membandingkan perbedaan antara Nginx dan Apache berdasarkan fitur-fitur yang disebutkan:

FiturNginxApache
ArsitekturEvent-driven, asinkronProcess/thread-based
Kinerja untuk file statisSangat cepatRelatif lebih lambat
ModulModul statis atau dinamisModul dinamis
KonfigurasiBerbasis blok (server, dll.)Berbasis direktori (.htaccess)
Konsumsi resourceLebih hemat memoriLebih banyak memori

Tabel ini memberikan gambaran yang jelas mengenai perbedaan utama antara Nginx dan Apache berdasarkan berbagai fitur penting, seperti arsitektur, kinerja, dan penggunaan sumber daya.

Kegunaan Utama Nginx

  1. Server Web: Hosting file statis atau dinamis. Nginx dapat berfungsi sebagai server web, yang berarti ia dapat menyimpan dan mengirimkan file-file seperti gambar, halaman HTML, dan file lainnya ke pengguna yang mengakses situs web. Ini seperti toko yang menyimpan barang dan memberikan barang tersebut kepada pelanggan yang datang.
  1. Reverse Proxy: Meneruskan permintaan ke aplikasi backend. Nginx juga bisa bertindak sebagai "perantara" antara pengguna dan aplikasi yang lebih kompleks. Ketika seseorang mengakses situs web, Nginx menerima permintaan tersebut dan meneruskannya ke aplikasi backend (seperti server yang menjalankan logika bisnis). Ini membantu mengelola lalu lintas dan meningkatkan keamanan.
  1. Load Balancer: Mendukung metode round-robin, least connections, dll.
    Nginx dapat membagi beban kerja di antara beberapa server. Misalnya, jika ada banyak pengunjung ke situs web, Nginx dapat mendistribusikan permintaan ke beberapa server agar tidak ada satu server pun yang terlalu terbebani. Ini seperti membagi tugas di antara beberapa karyawan di sebuah toko agar semua pelanggan dilayani dengan cepat.

  2. Caching: Menyimpan konten untuk meningkatkan kecepatan. Nginx dapat menyimpan salinan konten yang sering diakses, sehingga ketika pengguna meminta konten yang sama lagi, Nginx dapat memberikannya lebih cepat tanpa harus mengambilnya dari server lain. Ini seperti menyimpan barang-barang yang sering dibeli di depan toko agar pelanggan bisa mendapatkannya dengan cepat.

  1. HTTPS: Mendukung TLS/SSL untuk komunikasi aman. Nginx mendukung protokol HTTPS, yang membuat komunikasi antara pengguna dan situs web menjadi lebih aman. Dengan menggunakan TLS/SSL, data yang dikirimkan akan dienkripsi, sehingga tidak bisa dibaca oleh pihak yang tidak berwenang. Ini seperti mengunci pintu toko agar hanya pelanggan yang berhak yang bisa masuk.

Instalasi Nginx

1. Instalasi Nginx di Ubuntu

  1. Update sistem:

    sudo apt update && sudo apt upgrade -y
  1. Instal Nginx:

    sudo apt install nginx -y
  1. Mulai dan aktifkan layanan Nginx:

    sudo systemctl start nginx
    sudo systemctl enable nginx
  1. Cek status Nginx:

    sudo systemctl status nginx

2. Instalasi Nginx di CentOS

  1. Update sistem:

    sudo yum update -y
  1. Instal Nginx (dari repositori EPEL):

    sudo yum install epel-release -y
    sudo yum install nginx -y
  1. Mulai dan aktifkan layanan Nginx:

    sudo systemctl start nginx
    sudo systemctl enable nginx
  1. Cek status Nginx:

    sudo systemctl status nginx

3. Instalasi Nginx di Windows WSL

  1. Pastikan Anda memiliki WSL dan Ubuntu terinstal di Windows.
    Jalankan WSL, lalu:\

    sudo apt update && sudo apt upgrade -y
    sudo apt install nginx -y
    sudo service nginx start
  1. Akses Nginx melalui browser:
    • Gunakan URL http://localhost.

4. Instalasi Nginx di Docker

Untuk menginstal Nginx menggunakan Docker, Anda dapat mengikuti langkah-langkah umum berikut:

  1. Pastikan Docker Terinstal: Pastikan Docker sudah terpasang di sistem Anda. Anda dapat memeriksa dengan menjalankan perintah docker --version.
  1. * Tarik Gambar Nginx**: Unduh gambar Nginx dari Docker Hub dengan perintah berikut:

    docker pull nginx:stable-alpine
  1. Jalankan Kontainer Nginx: Setelah gambar berhasil diunduh, jalankan kontainer Nginx dengan perintah:

    docker run --name docker-nginx -p 80:80 nginx:stable-alpine
  1. Periksa Kontainer yang Berjalan: Pastikan kontainer Nginx berjalan dengan perintah:

    docker ps
  1. Akses Nginx: Buka browser dan akses http://localhost. Anda seharusnya melihat halaman default Nginx.
  1. Pengaturan Tambahan (Opsional): Jika Anda ingin menambahkan pengaturan khusus, Anda bisa membuat file konfigurasi dan mengaitkannya dengan kontainer saat menjalankannya.

Memverifikasi Instalasi

  1. Cek versi Nginx:

    nginx -v

    Output:

    nginx version: nginx/1.x.x
  1. Akses halaman default Nginx:
    • Buka browser dan akses http://<IP_SERVER> atau http://localhost.
  1. Tes konfigurasi:

    sudo nginx -t

    Output:

    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful

Struktur Direktori Utama Nginx

  • /etc/nginx/: Direktori konfigurasi utama.

    • nginx.conf: File konfigurasi utama.
    • sites-available/: Konfigurasi server blok (opsional di beberapa distro).
    • sites-enabled/: Simbolik link ke file di sites-available/.
  • /var/www/html/: Direktori untuk file web default.
  • /var/log/nginx/: Log akses dan error.

Contoh tampilan nginx.conf default:

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
    worker_connections 768;
}

http {
    server {
        listen 80;
        server_name localhost;

        root /var/www/html;
        index index.html;

        location / {
            try_files $uri $uri/ =404;
        }
    }
}

Jika instalasi berhasil, halaman default Nginx akan terlihat di browser:

"Welcome to nginx!"

Struktur File Konfigurasi

  1. File Utama (nginx.conf):

    • Lokasi: /etc/nginx/nginx.conf.
    • File ini adalah file konfigurasi utama yang digunakan Nginx saat dijalankan.
    • Terdiri dari beberapa blok utama:

      • events: Mengatur koneksi.
      • http: Konfigurasi HTTP (server, caching, dll).
      • server: Konfigurasi server individu.
      • location: Menangani URL tertentu pada server.
  1. Direktori Konfigurasi Tambahan:

    • /etc/nginx/sites-available/:

      • Tempat untuk menyimpan konfigurasi server blok.
      • Tidak otomatis aktif, perlu di-link ke sites-enabled.
    • /etc/nginx/sites-enabled/:
      • Berisi symbolic link dari file di sites-available.
    • /etc/nginx/conf.d/:
      • Direktori tambahan untuk file konfigurasi modul spesifik.

Contoh Struktur Konfigurasi Default:

/etc/nginx/
├── nginx.conf
├── conf.d/
│   └── default.conf
├── sites-available/
│   └── example.com
├── sites-enabled/
│   └── example.com -> ../sites-available/example.com
├── logs/
│   ├── access.log
│   └── error.log

Blok http:

Digunakan untuk konfigurasi HTTP global.\

Contoh:

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    server {
        listen 80;
        server_name localhost;
    }
}

Blok http adalah bagian penting dari konfigurasi Nginx yang mengatur pengaturan untuk server HTTP. Berikut adalah beberapa direktif yang umum digunakan dalam blok http, beserta penjelasan dan contoh penggunaannya:

1. include

  • Deskripsi: Mengizinkan Anda untuk menyertakan file konfigurasi lain.
  • Contoh:

    include /etc/nginx/conf.d/*.conf;

2. default_type

  • Deskripsi: Menentukan tipe MIME default untuk file yang tidak memiliki tipe yang ditentukan.
  • Contoh:

    default_type application/octet-stream;

3. log_format

  • Deskripsi: Menentukan format log untuk akses.
  • Contoh:

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';

4. access_log dan error_log

  • Deskripsi: Menentukan lokasi file log untuk akses dan kesalahan.
  • Contoh:

    access_log /var/log/nginx/access.log main;
    error_log /var/log/nginx/error.log warn;

5. sendfile

  • Deskripsi: Mengaktifkan penggunaan sendfile() untuk mengirim file.
  • Contoh:

    sendfile on;

6. tcp_nopush dan tcp_nodelay

  • Deskripsi: Mengatur pengaturan TCP untuk meningkatkan kinerja.
  • Contoh:

    tcp_nopush on;
    tcp_nodelay on;

7. keepalive_timeout

  • Deskripsi: Mengatur waktu tunggu untuk koneksi keep-alive.
  • Contoh:

    keepalive_timeout 65;

8. gzip

  • Deskripsi: Mengaktifkan kompresi gzip untuk mengurangi ukuran respons.
  • Contoh:

    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

9. client_max_body_size

  • Deskripsi: Mengatur ukuran maksimum untuk tubuh permintaan dari klien.
  • Contoh:

    client_max_body_size 10M;

10. server

  • Deskripsi: Blok server digunakan untuk mendefinisikan server virtual.
  • Contoh:

    server {
        listen 80;
        server_name example.com www.example.com;
    
        location / {
            root /var/www/html;
            index index.html index.htm;
        }
    }

11. location

  • Deskripsi: Blok location digunakan untuk menentukan bagaimana Nginx menangani permintaan untuk URL tertentu.
  • Contoh:

    location /images/ {
        root /var/www/html;
    }

12. proxy_pass

  • Deskripsi: Digunakan untuk meneruskan permintaan ke server backend (misalnya, aplikasi web).
  • Contoh:

    location /api/ {
        proxy_pass http://localhost:3000;
    }

13. error_page

  • Deskripsi: Menentukan halaman yang akan ditampilkan untuk kode status HTTP tertentu.
  • Contoh:

    error_page 404 /404.html;

14. ssl

  • Deskripsi: Mengatur pengaturan SSL untuk HTTPS.
  • Contoh:

    server {
        listen 443 ssl;
        ssl_certificate /etc/ssl/certs/example.com.crt;
        ssl_certificate_key /etc/ssl/private/example.com.key;
    }

15. limit_req

  • Deskripsi: Mengatur pembatasan laju permintaan untuk mencegah serangan DDoS.
  • Contoh:

    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    location / {
        limit_req zone=one burst=5;
    }

16 . add_header

  • Deskripsi: Menambahkan header HTTP ke respons.
  • Contoh:

    add_header X-Content-Type-Options nosniff;

17. try_files

  • Deskripsi: Mencoba untuk melayani file tertentu sebelum meneruskan permintaan ke lokasi lain.
  • Contoh:

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

18. rewrite

  • Deskripsi: Mengubah URL permintaan menggunakan ekspresi reguler.
  • Contoh:

    rewrite ^/oldpath/(.*)$ /newpath/$1 permanent;

19. set

  • Deskripsi: Mengatur variabel untuk digunakan dalam konfigurasi.
  • Contoh:

    set $my_var "value";

20. return

  • Deskripsi: Mengembalikan kode status HTTP dan/atau konten.
  • Contoh:

    location /oldpage {
        return 301 /newpage;
    }

Contoh Blok http Lengkap

Berikut adalah contoh konfigurasi blok http yang lebih lengkap dengan beberapa pengaturan di atas:

1http {
2    include       mime.types;
3    default_type  application/octet-stream;
4
5    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
6                      '$status $body_bytes_sent "$http_referer" '
7                      '"$http_user_agent" "$http_x_forwarded_for"';
8
9    access_log  /var/log/nginx/access.log  main;
10    error_log   /var/log/nginx/error.log warn;
11
12    sendfile        on;
13    tcp_nopush      on;
14    tcp_nodelay     on;
15    keepalive_timeout  65;
16
17    gzip  on;
18    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
19
20    client_max_body_size 10M;
21
22    server {
23        listen 80;
24        server_name example.com www.example.com;
25
26        location / {
27            root /var/www/html;
28            index index.html index.htm;
29            try_files $uri $uri/ /index.php?$query_string;
30        }
31
32        location /api/ {
33            proxy_pass http://localhost:3000;
34        }
35
36        error_page 404 /404.html;
37
38        add_header X-Content-Type-Options nosniff;
39    }
40
41    server {
42        listen 443 ssl;
43        server_name secure.example.com;
44
45        ssl_certificate /etc/ssl/certs/secure.example.com.crt;
46        ssl_certificate_key /etc/ssl/private/secure.example.com.key;
47
48        location / {
49            root /var/www/secure;
50            index index.html index.htm;
51        }
52    }
53}

Dengan konfigurasi ini, Anda dapat mengelola berbagai aspek dari server HTTP Nginx, termasuk pengaturan untuk server virtual, pengelolaan permintaan, dan pengaturan keamanan.

Blok server:

Mewakili konfigurasi server individu (server blok).\

Contoh:

``` {#15809095-dc41-8001-81ca-e75a4543c2f4 .code}
server {
    listen 80;
    server_name example.com www.example.com;

    root /var/www/example;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}
```

Blok location:

Mengatur respon Nginx terhadap URL spesifik.

Contoh:

``` {#15809095-dc41-80ce-b960-d40aa21907ff .code}
location /images/ {
    root /var/www/assets;
}

location /api/ {
    proxy_pass http://127.0.0.1:8000;
}
```

Konfigurasi Dasar

1. Menyediakan Halaman Web Statis

  1. Buat folder untuk file statis:

    sudo mkdir -p /var/www/mysite
    echo "<h1>Welcome to MySite!</h1>" | sudo tee /var/www/mysite/index.html
  1. Buat server blok di sites-available:

    Isi:\

    sudo nano /etc/nginx/sites-available/mysite
    server {
        listen 80;
        server_name mysite.com www.mysite.com;
    
        root /var/www/mysite;
        index index.html;
    
        location / {
            try_files $uri $uri/ =404;
        }
    }
  1. Aktifkan konfigurasi:

    sudo ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/
  1. Tes dan reload Nginx:

    sudo nginx -t
    sudo systemctl reload nginx

2. Mengatur Root Direktori Dokumen

  • Direktori root ditentukan dalam blok server atau location dengan direktif root.
    Contoh:\

    server {
        root /var/www/html;
        index index.html index.htm;
    }

3. Memahami Port dan Server Name

  • Port:

    • Nginx mendengarkan port tertentu menggunakan direktif listen.
    • Default: listen 80; untuk HTTP, listen 443; untuk HTTPS.
  • Server Name:

    • Mengidentifikasi domain yang dilayani Nginx dengan server_name.
    • Contoh:

      server_name example.com www.example.com;

Tes dan Reload

1. Mengecek Konfigurasi dengan nginx -t

Sebelum menerapkan konfigurasi, selalu tes terlebih dahulu:

sudo nginx -t
  • Output sukses:

    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
  • Jika ada kesalahan, periksa file yang disebutkan dalam error log.

2. Reload Nginx Tanpa Menghentikan Server

Setelah mengubah konfigurasi, reload untuk menerapkan perubahan:

sudo systemctl reload nginx
  • Reload tidak memutus koneksi aktif, berbeda dengan restart (systemctl restart nginx).

Hasil

  • Setelah langkah-langkah di atas, Anda dapat membuka browser dan mengakses http://<IP_SERVER> atau http://mysite.com untuk melihat halaman web statis yang Anda konfigurasi.

Berikut adalah penjelasan detail dan praktis tentang file utamanginx.conf yang digunakan oleh Nginx untuk konfigurasi server. Nginx mengandalkan file ini untuk mengatur cara server bekerja, bagaimana menangani permintaan HTTP, dan pengaturan koneksi serta pemrosesan lainnya.


1. Lokasi dan Fungsi File Utama nginx.conf

File utama konfigurasi Nginx terletak di:

/etc/nginx/nginx.conf

File ini berfungsi untuk menentukan bagaimana Nginx beroperasi saat dijalankan. File ini bisa diubah untuk menyesuaikan berbagai aspek dari Nginx seperti pengaturan koneksi, pengaturan server, server blok, URL routing, caching, dan lainnya.


2. Blok-Konfigurasi dalam nginx.conf

File nginx.conf terdiri dari beberapa blok konfigurasi utama yang dapat diatur:

A. Blok events

Blok events digunakan untuk mengonfigurasi aspek-aspek yang terkait dengan koneksi dan pengelolaan sumber daya sistem. Blok events adalah bagian di dalam nginx.conf yang digunakan untuk mengatur bagaimana Nginx menangani koneksi dari pengguna. Ini berfokus pada pengelolaan sumber daya sistem dan pengaturan yang berkaitan dengan koneksi.

  1. worker_connections:

    • Ini adalah pengaturan yang menentukan berapa banyak koneksi yang dapat ditangani oleh setiap "worker process" (proses pekerja) Nginx. Semakin banyak koneksi yang bisa ditangani, semakin banyak pengguna yang dapat dilayani secara bersamaan. Misalnya, jika Anda mengatur worker_connections ke 1024, maka setiap proses pekerja dapat menangani hingga 1024 koneksi sekaligus.
    • Jika Anda memiliki banyak pengguna yang mengakses situs web Anda secara bersamaan, Anda perlu memastikan bahwa Nginx dapat menangani semua permintaan tersebut. Dengan mengatur worker_connections ke nilai yang lebih tinggi, Anda memungkinkan setiap proses pekerja untuk melayani lebih banyak koneksi sekaligus.
    • Contoh:

      Jika Anda mengatur worker_connections ke 1024, itu berarti setiap proses pekerja dapat menangani hingga 1024 koneksi aktif pada saat yang sama. Jika Anda memiliki 4 proses pekerja, maka total koneksi yang dapat ditangani oleh Nginx adalah 4 x 1024 = 4096 koneksi.

      Nilai ini harus disesuaikan dengan kapasitas server Anda dan jumlah pengguna yang diharapkan. Jika terlalu tinggi, bisa menyebabkan penggunaan sumber daya yang berlebihan, sedangkan jika terlalu rendah, bisa menyebabkan pengguna tidak dapat terlayani dengan baik.

  1. use:

    • Anda juga bisa menentukan metode yang digunakan untuk menangani koneksi. Misalnya, Anda bisa memilih untuk menggunakan metode epoll (yang efisien untuk sistem Linux) atau metode lain yang sesuai dengan sistem operasi yang Anda gunakan. Ini membantu Nginx bekerja lebih baik dengan sumber daya yang ada.
    • Memilih metode yang tepat dapat meningkatkan kinerja Nginx, terutama saat menangani banyak koneksi. Dengan menggunakan metode yang sesuai dengan sistem operasi, Nginx dapat memanfaatkan sumber daya sistem dengan lebih baik.
    • Metode yang umum digunakan:

      • epoll: Metode ini sangat efisien untuk sistem operasi Linux. Ia memungkinkan Nginx untuk menangani banyak koneksi secara bersamaan dengan cara yang lebih efisien dibandingkan metode lain.
      • kqueue: Metode ini digunakan pada sistem operasi BSD (seperti FreeBSD).
      • select dan poll: Metode ini lebih umum dan dapat digunakan di berbagai sistem operasi, tetapi tidak seefisien epoll atau kqueue dalam menangani banyak koneksi.
  1. multi_accept:

    • Pengaturan ini memungkinkan Nginx untuk menerima beberapa koneksi sekaligus dalam satu waktu. Jika diaktifkan, Nginx dapat lebih cepat dalam menangani banyak permintaan yang datang secara bersamaan.
    • Dengan mengaktifkan multi_accept, Nginx dapat lebih cepat dalam menangani banyak permintaan yang datang secara bersamaan. Ini sangat berguna dalam situasi di mana banyak pengguna mencoba mengakses situs web pada saat yang sama, seperti saat peluncuran produk atau promosi besar.
    • Contoh: Jika multi_accept diatur ke on, dan ada 10 koneksi baru yang datang pada saat yang sama, Nginx dapat menerima semua 10 koneksi tersebut dalam satu siklus, bukan satu per satu. Ini mengurangi waktu yang dibutuhkan untuk memproses setiap koneksi dan meningkatkan responsivitas server.

Contoh konfigurasi:

events {
    worker_connections 1024;  # Setiap worker dapat menangani hingga 1024 koneksi
    use epoll;                # Menggunakan metode epoll untuk menangani koneksi
    multi_accept on;          # Mengizinkan penerimaan beberapa koneksi sekaligus
}

Penjelasan Setiap Baris

  1. events { ... }
    • Ini adalah blok events yang digunakan untuk mengonfigurasi pengaturan yang berkaitan dengan koneksi dan pengelolaan sumber daya di Nginx. Semua pengaturan yang ada di dalam kurung kurawal {} ini akan mempengaruhi bagaimana Nginx menangani koneksi dari pengguna.
  1. worker_connections 1024;

    • Apa itu?: Baris ini mengatur jumlah maksimum koneksi yang dapat ditangani oleh setiap proses pekerja (worker process) Nginx.
    • Penjelasan: Dengan mengatur worker_connections ke 1024, Anda memberi tahu Nginx bahwa setiap proses pekerja dapat menangani hingga 1024 koneksi aktif secara bersamaan. Ini berarti jika Anda memiliki beberapa proses pekerja, total koneksi yang dapat ditangani oleh Nginx adalah hasil kali dari jumlah proses pekerja dan nilai ini. Misalnya, jika Anda memiliki 4 proses pekerja, maka total koneksi yang dapat ditangani adalah 4 x 1024 = 4096 koneksi.
  1. use epoll;

    • Apa itu?: Baris ini menentukan metode yang digunakan oleh Nginx untuk menangani koneksi.
    • Penjelasan: Dengan menggunakan epoll, Nginx akan memanfaatkan metode yang efisien untuk menangani banyak koneksi secara bersamaan, khususnya pada sistem operasi Linux. epoll dirancang untuk menangani banyak koneksi dengan lebih baik dibandingkan metode lain seperti select atau poll, sehingga dapat meningkatkan kinerja Nginx saat ada banyak pengguna yang mengakses situs web secara bersamaan.
  1. multi_accept on;

    • Apa itu?: Baris ini mengatur apakah Nginx dapat menerima beberapa koneksi baru dalam satu waktu.
    • Penjelasan: Dengan mengatur multi_accept ke on, Anda mengizinkan Nginx untuk menerima lebih dari satu koneksi baru dalam satu siklus. Ini berarti jika ada beberapa permintaan koneksi yang datang secara bersamaan, Nginx dapat menerima semuanya sekaligus, bukan satu per satu. Ini membantu meningkatkan kecepatan dan efisiensi dalam menangani banyak permintaan, terutama saat ada lonjakan lalu lintas.

B. Blok http

Blok http adalah blok yang digunakan untuk mengonfigurasi pengaturan HTTP secara keseluruhan seperti server, lokasi file statis, pengaturan caching, SSL, dan lain-lain.

Contoh konfigurasi:

http {
    include       mime.types;
    default_type  application/octet-stream;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }
    }
}

Penjelasan:

  • include mime.types: Mengimpor file tipe MIME, yang digunakan untuk menentukan tipe konten file yang akan disajikan oleh Nginx.
  • default_type: Menentukan tipe MIME default jika tidak ditemukan tipe untuk file tertentu.
  • server: Di dalam blok http, kita dapat menentukan beberapa blok server yang akan menangani konfigurasi untuk server yang berbeda.

C. Blok server

Blok server digunakan untuk mendefinisikan konfigurasi untuk server web tertentu, seperti server virtual (hostname, port, dan lainnya). Di dalam blok server, Anda bisa menambahkan konfigurasi untuk menangani alamat IP, port, dan host yang berbeda.

Contoh konfigurasi:

server {
    listen       80;
    server_name  example.com;

    location / {
        root   /var/www/example;
        index  index.html index.htm;
    }
}

Penjelasan:

  • listen 80: Nginx akan mendengarkan pada port 80 (HTTP).
  • server_name: Nama domain yang ditangani oleh server ini. Misalnya, example.com.
  • location /: Menentukan lokasi root direktori untuk file yang disajikan ketika permintaan datang ke root URL (/).
  • root /var/www/example: Lokasi direktori web untuk menyajikan file.
  • index index.html index.htm: Menentukan file index yang akan dilayani oleh Nginx jika tidak ada file lain yang diminta.

D. Blok location

Blok location digunakan untuk menangani URL tertentu pada server. Ini memungkinkan Anda untuk menentukan pengaturan lebih rinci berdasarkan pola URL. Blok ini digunakan untuk menangani permintaan spesifik berdasarkan path.

Contoh konfigurasi:

server {
    listen 80;
    server_name example.com;

    location /images/ {
        root /var/www/example;
        try_files $uri $uri/ =404;
    }

    location /api/ {
        proxy_pass http://127.0.0.1:8000;
    }
}

Penjelasan:

  • location /images/: Blok ini menangani semua permintaan yang diawali dengan /images/. Misalnya, jika pengguna meminta http://example.com/images/logo.png, maka file logo.png akan dicari di /var/www/example/images/.
  • location /api/: Blok ini menangani permintaan yang diawali dengan /api/. Misalnya, permintaan ke http://example.com/api/ akan diteruskan ke aplikasi lain (seperti server backend) melalui proxy_pass.
    • proxy_pass http://127.0.0.1:8000: Artinya, permintaan tersebut diteruskan ke aplikasi backend yang berjalan di localhost pada port 8000.

E. Blok http lebih lanjut (Pengaturan Caching, SSL, dll)

Di dalam blok http, Anda bisa menambahkan banyak pengaturan lanjutan seperti caching, pengaturan header HTTP, atau pengaturan SSL.

Contoh konfigurasi caching:

http {
    include       mime.types;
    default_type  application/octet-stream;

    server {
        listen 80;
        server_name example.com;

        location / {
            root /var/www/example;
            try_files $uri $uri/ /index.html;
        }

        location ~* \.(jpg|jpeg|png|gif|css|js)$ {
            expires 30d;
            access_log off;
        }
    }
}

Penjelasan:

  • location ~* \.(jpg|jpeg|png|gif|css|js)$: Menangani permintaan untuk file gambar dan file statis lainnya (CSS, JS).
  • expires 30d: Mengatur agar file yang diminta disimpan di cache browser selama 30 hari.
  • access_log off: Mematikan pencatatan akses untuk file statis tersebut untuk mengurangi beban pada server.

3. Mengedit dan Memverifikasi Konfigurasi

Setelah Anda mengedit file nginx.conf, Anda perlu memverifikasi konfigurasi dan memuat ulang Nginx agar perubahan dapat diterapkan:

  1. Memverifikasi Konfigurasi:
    Gunakan perintah ini untuk memeriksa apakah ada kesalahan dalam konfigurasi:\

    sudo nginx -t
  1. Muat Ulang Nginx:
    Jika tidak ada kesalahan, muat ulang konfigurasi agar perubahan diterapkan tanpa menghentikan layanan Nginx:\

    sudo systemctl reload nginx

Kesimpulan

File nginx.conf adalah file konfigurasi utama Nginx yang digunakan untuk mengonfigurasi berbagai aspek dari server web, mulai dari pengaturan koneksi hingga cara menangani permintaan HTTP, SSL, dan caching. Dengan memahami blok-blok utama dalam nginx.conf, seperti events, http, server, dan location, Anda dapat mengonfigurasi server Nginx sesuai dengan kebutuhan aplikasi Anda.

  1. Konfigurasi Server Web {#15809095-dc41-806d-af41-cd7155348d85} =========================

Berikut adalah penjelasan lengkap dan praktis untuk Konfigurasi Server Web dengan Nginx:


1. Hosting Website

A. Konfigurasi Virtual Hosts (Server Blocks)

Virtual hosts memungkinkan Nginx melayani beberapa domain pada satu server fisik dengan konfigurasi berbeda.

  1. Buat direktori untuk website:

    sudo mkdir -p /var/www/example.com
    echo "<h1>Welcome to example.com</h1>" | sudo tee /var/www/example.com/index.html
  1. Buat file konfigurasi server blok:

    sudo nano /etc/nginx/sites-available/example.com

    Isi file:

    server {
        listen 80;
        server_name example.com www.example.com;
    
        root /var/www/example.com;
        index index.html;
    
        location / {
            try_files $uri $uri/ =404;
        }
    }
  1. Aktifkan konfigurasi dengan symbolic link:

    sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
  1. Nonaktifkan konfigurasi (jika diperlukan):

    sudo rm /etc/nginx/sites-enabled/example.com
  1. Tes dan reload Nginx:

    sudo nginx -t
    sudo systemctl reload nginx
  1. Uji domain:

    • Arahkan domain Anda ke IP server melalui DNS.
    • Akses http://example.com untuk memverifikasi.

2. Konfigurasi SSL

A. Memasang Let's Encrypt dengan Certbot

  1. Instal Certbot dan plugin Nginx:

    • Ubuntu:

      sudo apt update
      sudo apt install certbot python3-certbot-nginx -y
    • CentOS/AlmaLinux:

      sudo yum install epel-release -y
      sudo yum install certbot python3-certbot-nginx -y
  1. Dapatkan sertifikat SSL:

    sudo certbot --nginx -d example.com -d www.example.com
    • Ikuti panduan interaktif untuk mengatur SSL.
    • Certbot otomatis mengubah file konfigurasi Nginx Anda untuk menggunakan HTTPS.
  1. Perbarui sertifikat otomatis (opsional):
    • Tambahkan ke crontab:

      Tambahkan baris:\

      sudo crontab -e
      0 0 * * * certbot renew --quiet

B. Mengaktifkan Pengalihan Otomatis dari HTTP ke HTTPS

Edit file konfigurasi example.com:

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name example.com www.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    root /var/www/example.com;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

Reload Nginx:

sudo nginx -t
sudo systemctl reload nginx

Akses http://example.com, yang akan dialihkan ke https://example.com.


3. Caching

A. Menyimpan Cache Statis

  1. Tambahkan konfigurasi caching di dalam blok server:

    location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|otf|eot|html)$ {
        expires 30d;
        add_header Cache-Control "public";
    }
  1. Penjelasan:

    • expires 30d;: Memberitahu browser untuk menyimpan file selama 30 hari.
    • add_header Cache-Control "public";: Mengizinkan semua pengguna mengakses cache.
  1. Reload konfigurasi:

    sudo nginx -t
    sudo systemctl reload nginx
  1. Uji caching:

    • Buka alat developer browser (F12).
    • Akses tab Network, pastikan file memiliki header Cache-Control.

B. Mengatur Header Caching (Cache-Control, Expires)

  1. Cache halaman statis dengan proxy_cache:
    Tambahkan konfigurasi caching di blok
    http:

    proxy_cache_path /etc/nginx/cache keys_zone=cache_zone:10m max_size=10g;

    Di dalam blok server atau location:

    location / {
        proxy_cache cache_zone;
        proxy_pass http://127.0.0.1:8000; # Aplikasi backend
        add_header X-Cache-Status $upstream_cache_status;
        expires 1h;
        add_header Cache-Control "public";
    }
  1. Penjelasan:

    • proxy_cache_path: Direktori penyimpanan cache dengan ukuran maksimum.
    • X-Cache-Status: Menunjukkan status cache (HIT/MISS).
    • expires 1h;: Konten disimpan dalam cache selama 1 jam.
  1. Tes caching:
    Akses URL yang sesuai dan periksa header di browser atau gunakan
    curl:

    curl -I http://example.com

    Hasil akan menunjukkan header X-Cache-Status.


Hasil Akhir

  • Anda sekarang memiliki:

    1. Virtual host untuk melayani domain tertentu.
    1. HTTPS aktif dengan Let's Encrypt.
    1. Caching untuk konten statis dan backend.
  • Akses domain Anda di browser untuk memverifikasi semua konfigurasi berjalan dengan baik.
  1. Konfigurasi Reverse Proxy dengan Nginx {#15809095-dc41-8037-bbcd-da6d98916a66} =========================================

Berikut adalah panduan lengkap dan praktis untuk Konfigurasi Reverse Proxy dengan Nginx, termasuk implementasi dan contoh penggunaan.


1. Dasar Reverse Proxy

A. Konfigurasi Nginx Sebagai Reverse Proxy

Reverse Proxy bertindak sebagai perantara antara klien dan server backend (seperti Django, Node.js, atau PHP). Nginx menerima permintaan klien dan meneruskannya ke server aplikasi backend.

Reverse Proxy adalah sebuah konsep dalam jaringan komputer di mana sebuah server bertindak sebagai perantara (proxy) untuk menangani permintaan yang datang ke server lainnya. Istilah "reverse" merujuk pada arah aliran lalu lintas yang berlawanan dengan proxy biasa, di mana proxy biasa biasanya mengarahkan klien ke server yang lebih banyak atau berbeda.

Analogi yang Masuk Akal

Bayangkan sebuah restoran dengan banyak dapur yang masing-masing menyajikan menu spesial. Ketika seorang pengunjung datang ke restoran tersebut, mereka tidak langsung menuju dapur. Sebaliknya, ada seorang pelayan (yang bertindak sebagai "reverse proxy") yang menerima pesanan dari pengunjung.

  • Pelayan (Reverse Proxy): Pelayan ini menerima pesanan dari pengunjung, kemudian memutuskan ke dapur mana pesanan tersebut harus dikirim berdasarkan menu yang diminta. Jika pengunjung meminta makanan dari dapur A, pelayan akan mengarahkannya ke dapur A. Jika menu lain, pelayan akan mengarahkannya ke dapur B.
  • Dapur (Server Backend): Dapur-dapur ini bertanggung jawab untuk menyiapkan makanan, tetapi pengunjung tidak langsung berinteraksi dengan dapur tersebut. Mereka hanya berinteraksi dengan pelayan.

Dengan cara ini, pengunjung tidak perlu tahu dapur mana yang sedang menyiapkan makanan mereka, dan pelayan dapat melakukan beberapa hal di balik layar seperti mendistribusikan pesanan secara adil ke dapur atau menyembunyikan kompleksitas dari pengunjung.

Mengapa Ada Istilah "Reverse Proxy"?

Istilah "reverse" digunakan untuk membedakan dari proxy biasa. Pada proxy biasa, yang sering digunakan dalam konteks klien dan server, klien mengirimkan permintaan ke proxy yang kemudian meneruskannya ke server yang sesuai. Jadi, proxy di sini bertindak atas nama klien.

Namun, pada reverse proxy, arahannya terbalik. Server yang melayani permintaan tidak langsung melayani klien, melainkan permintaan klien diteruskan terlebih dahulu ke reverse proxy yang kemudian meneruskannya ke server yang sesuai di belakangnya.


Bagaimana Reverse Proxy Bekerja?

  1. Menerima Permintaan dari Klien:
    Reverse proxy pertama kali menerima permintaan dari pengguna atau klien (seperti permintaan HTTP atau HTTPS).\
  1. Menentukan Tujuan Permintaan:
    Reverse proxy kemudian memutuskan ke server mana permintaan tersebut akan diteruskan. Ini bisa berdasarkan banyak faktor seperti load balancing, jenis konten yang diminta, atau faktor lainnya.\
  1. Meneruskan Permintaan ke Server Backend:
    Setelah menentukan tujuan, reverse proxy akan mengarahkan permintaan ke server yang sesuai di belakangnya (misalnya, server A, server B, dll).\
  1. Menerima Respons dari Server Backend:
    Server yang menerima permintaan akan memprosesnya dan mengirimkan respons kembali ke reverse proxy.\
  1. Meneruskan Respons ke Klien:
    Reverse proxy kemudian mengirimkan respons yang diterima dari server backend kembali ke klien.\

Fungsi dan Kegunaan Reverse Proxy

  1. Load Balancing:
    Reverse proxy sering digunakan untuk mendistribusikan permintaan dari klien ke beberapa server backend yang dapat mengelola beban secara merata. Ini membantu mengoptimalkan penggunaan sumber daya dan meningkatkan performa situs web atau aplikasi.\
  1. Keamanan:
    Reverse proxy dapat menyembunyikan detail tentang server backend. Misalnya, klien hanya berinteraksi dengan reverse proxy dan tidak mengetahui alamat atau jenis server yang sebenarnya melayani permintaan. Ini dapat mengurangi risiko serangan langsung ke server backend.\
  1. SSL Termination:
    Reverse proxy bisa mengelola enkripsi SSL/TLS (HTTPS) dengan cara mengakhiri koneksi SSL di tingkat proxy, yang meringankan beban enkripsi pada server backend.\
  1. Caching:
    Reverse proxy dapat menyimpan salinan data yang diminta oleh klien dalam cache untuk mempercepat respons di masa depan tanpa harus memproses ulang permintaan yang sama oleh server backend.\
  1. Penyembunyian Kompleksitas Infrastruktur:
    Dengan menggunakan reverse proxy, klien tidak perlu mengetahui tentang banyak server yang terlibat. Ini memberikan keuntungan dalam hal penyembunyian kompleksitas dan mengelola perubahan infrastruktur tanpa mempengaruhi klien.\

Contoh Penggunaan Reverse Proxy

  1. Nginx sebagai Reverse Proxy:
    Nginx adalah salah satu aplikasi yang banyak digunakan sebagai reverse proxy. Misalnya, Nginx dapat menerima permintaan dari pengguna dan mendistribusikan permintaan tersebut ke beberapa server web backend (seperti aplikasi Django, Node.js, atau PHP).\

    Berikut adalah contoh konfigurasi reverse proxy menggunakan Nginx:

    server {
        listen 80;
        server_name example.com;
    
        location / {
            proxy_pass http://127.0.0.1:8000; # Arahkan permintaan ke server backend
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
  1. Load Balancer dengan Reverse Proxy:
    Jika aplikasi Anda dihosting di beberapa server, reverse proxy dapat digunakan untuk mendistribusikan permintaan ke server yang berbeda, membantu dalam
    load balancing.

    upstream backend_servers {
        server 127.0.0.1:8001;
        server 127.0.0.1:8002;
    }
    
    server {
        listen 80;
        server_name example.com;
    
        location / {
            proxy_pass http://backend_servers;  # Balancing ke beberapa backend
        }
    }

Kesimpulan

Reverse proxy adalah konsep yang sangat penting dalam arsitektur jaringan modern, terutama untuk menangani beban lalu lintas yang tinggi, meningkatkan keamanan, dan menyembunyikan detail server backend dari klien. Dengan cara kerja yang mirip pelayan di restoran, reverse proxy memastikan bahwa klien tidak perlu tahu server mana yang menangani permintaan mereka, yang memberikan fleksibilitas, keamanan, dan manajemen lalu lintas yang lebih baik.

1. Menyiapkan Aplikasi Backend (Contoh: Django)

  1. Jalankan aplikasi Django di port tertentu (misalnya, 127.0.0.1:8000):

    python manage.py runserver 127.0.0.1:8000
  1. Konfigurasi Nginx untuk meneruskan permintaan ke backend:
    Buat file konfigurasi di
    /etc/nginx/sites-available/reverse-proxy:

    server {
        listen 80;
        server_name example.com;
    
        location / {
            proxy_pass http://127.0.0.1:8000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
  1. Aktifkan konfigurasi:

    sudo ln -s /etc/nginx/sites-available/reverse-proxy /etc/nginx/sites-enabled/
    sudo nginx -t
    sudo systemctl reload nginx
  1. Uji koneksi:

    Buka browser dan akses http://example.com.

    Hasilnya, Nginx akan meneruskan permintaan ke aplikasi Django di 127.0.0.1:8000.

2. Reverse Proxy untuk Aplikasi Node.js

  1. Jalankan aplikasi Node.js di port tertentu (misalnya, 127.0.0.1:3000):

    node app.js
  1. Tambahkan konfigurasi di Nginx:

    server {
        listen 80;
        server_name node.example.com;
    
        location / {
            proxy_pass http://127.0.0.1:3000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
  1. Reload Nginx dan uji koneksi.

2. Load Balancing

Load Balancing adalah teknik membagi lalu lintas antara beberapa server backend untuk meningkatkan performa dan keandalan.

A. Metode Load Balancing

  1. Round-Robin (Default):

    Permintaan dibagi rata ke setiap server backend.

    upstream backend {
        server 127.0.0.1:8001;
        server 127.0.0.1:8002;
        server 127.0.0.1:8003;
    }
  1. Least Connections:

    Permintaan diarahkan ke server dengan jumlah koneksi aktif paling sedikit.

    upstream backend {
        least_conn;
        server 127.0.0.1:8001;
        server 127.0.0.1:8002;
        server 127.0.0.1:8003;
    }
  1. IP Hash:

    Permintaan dari klien yang sama selalu diarahkan ke server yang sama.

    upstream backend {
        ip_hash;
        server 127.0.0.1:8001;
        server 127.0.0.1:8002;
        server 127.0.0.1:8003;
    }

B. Contoh Penggunaan Load Balancer

  1. Menyiapkan Server Backend:
    • Jalankan 3 instance aplikasi pada port berbeda (misalnya, 8001, 8002, 8003).
  1. Konfigurasi Load Balancer di Nginx:

    upstream backend {
        least_conn; # Pilih metode balancing
        server 127.0.0.1:8001;
        server 127.0.0.1:8002;
        server 127.0.0.1:8003;
    }
    
    server {
        listen 80;
        server_name example.com;
    
        location / {
            proxy_pass http://backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
  1. Tes dan Reload Nginx:

    sudo nginx -t
    sudo systemctl reload nginx
  1. Uji Balancing:
    Akses
    http://example.com dari beberapa browser atau gunakan alat seperti curl:

    curl -I http://example.com

    Perhatikan distribusi permintaan pada log setiap server backend.


Hasil Akhir

  1. Reverse Proxy: Nginx meneruskan permintaan dari klien ke aplikasi backend seperti Django, Node.js, atau PHP.
  1. Load Balancer: Permintaan secara efisien dibagi ke beberapa backend menggunakan metode balancing yang sesuai (round-robin, least connections, IP hash).
  1. Pengujian: Pastikan semua pengaturan bekerja dengan mengamati distribusi permintaan ke server backend.

  2. Logging dan Monitoring pada Nginx {#15809095-dc41-80aa-8a63-c1d25f657f56} ====================================

Berikut adalah panduan praktis untuk Logging dan Monitoring pada Nginx, mencakup pengaturan log, analisis log, dan monitoring menggunakan berbagai alat.


1. Log

A. Menyesuaikan Log Akses dan Log Error

  1. Lokasi Default Log:

    • Akses log: /var/log/nginx/access.log
    • Error log: /var/log/nginx/error.log
  1. Menyesuaikan Format Log Akses:
    Edit file
    nginx.conf:

    http {
        log_format custom_format '$remote_addr - $remote_user [$time_local] '
                                 '"$request" $status $body_bytes_sent '
                                 '"$http_referer" "$http_user_agent"';
    
        access_log /var/log/nginx/custom_access.log custom_format;
    }
  1. Menyesuaikan Level Log Error:
    Edit file konfigurasi
    nginx.conf atau file server block:

    error_log /var/log/nginx/custom_error.log warn;
    • Level Log:

      • debug: Untuk debug rinci (hanya saat troubleshooting).
      • info: Informasi umum.
      • warn: Peringatan.
      • error: Hanya kesalahan kritis.
  1. Reload Nginx:

    sudo nginx -t
    sudo systemctl reload nginx
  1. Uji Hasil Log:

    • Buat permintaan HTTP untuk mengisi log:

      curl http://localhost
    • Lihat isi log:

      tail -f /var/log/nginx/custom_access.log
      tail -f /var/log/nginx/custom_error.log

B. Menganalisis Log dengan GoAccess

  1. Instal GoAccess:

    • Ubuntu:

      sudo apt update
      sudo apt install goaccess -y
    • CentOS:

      sudo yum install epel-release -y
      sudo yum install goaccess -y
  1. Analisis Log Akses:
    Jalankan perintah:\

    goaccess /var/log/nginx/access.log -o report.html --log-format=COMBINED
    • Hasilnya berupa file HTML (report.html) yang dapat dibuka di browser.
  1. Live Monitoring dengan GoAccess:
    Jalankan GoAccess dalam mode real-time:\

    goaccess /var/log/nginx/access.log --log-format=COMBINED --real-time-html -o /var/www/html/report.html

    Akses laporan di http://<server-ip>/report.html.


2. Monitoring

A. Menggunakan Modul Status Nginx

  1. Aktifkan Modul Status:
    Edit file konfigurasi Nginx (
    nginx.conf atau server block):

    server {
        listen 8080;
        server_name localhost;
    
        location /nginx_status {
            stub_status;
            allow 127.0.0.1;  # Hanya izinkan akses lokal
            deny all;
        }
    }
  1. Reload Nginx:

    sudo nginx -t
    sudo systemctl reload nginx
  1. Akses Status:
    Jalankan perintah:\

    curl http://127.0.0.1:8080/nginx_status

    Output:

    Active connections: 2
    server accepts handled requests
     100 100 200
    Reading: 0 Writing: 1 Waiting: 1

B. Integrasi dengan Prometheus dan Grafana

  1. Instal Exporter Nginx untuk Prometheus:

    • Unduh Nginx Exporter:

      wget https://github.com/nginxinc/nginx-prometheus-exporter/releases/download/v0.11.0/nginx-prometheus-exporter-0.11.0-linux-amd64.tar.gz
    • Ekstrak dan jalankan:

      tar -xvzf nginx-prometheus-exporter-*.tar.gz
      ./nginx-prometheus-exporter -nginx.scrape-uri http://127.0.0.1:8080/nginx_status
  1. Konfigurasi Prometheus:
    Tambahkan target di file
    prometheus.yml:

    scrape_configs:
      - job_name: 'nginx'
        static_configs:
          - targets: ['localhost:9113']
  1. Instal Grafana dan Tambahkan Dashboard:

    • Tambahkan Prometheus sebagai data source.

Hasil Akhir

  1. Log: Anda dapat memonitor dan menyesuaikan log akses dan error Nginx sesuai kebutuhan, serta menganalisisnya dengan GoAccess.
  1. Monitoring: Status real-time Nginx dapat diakses dengan modul stub_status atau divisualisasikan melalui Prometheus dan Grafana untuk pengawasan yang lebih lengkap.

  2. Lanjutan Nginx {#15809095-dc41-8086-aa36-f345f7013407} =================

Berikut adalah penjelasan lengkap dan praktis untuk fitur lanjutan pada Nginx, meliputi FastCGI, WebSocket, HTTP/2, gRPC, serta pengaturan file upload dan download.


1. FastCGI dan PHP

A. Menghubungkan Nginx dengan PHP menggunakan FastCGI

  1. Instal PHP dan FastCGI Process Manager (FPM):

    • Ubuntu:

      sudo apt update
      sudo apt install php-fpm -y
    • CentOS:

      sudo yum install php-fpm -y
  1. Konfigurasi Nginx untuk PHP:
    Buat file konfigurasi:\

    server {
        listen 80;
        server_name example.com;
    
        root /var/www/html;
        index index.php index.html;
    
        location / {
            try_files $uri $uri/ =404;
        }
    
        location ~ \.php$ {
            include fastcgi_params;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
    }
  1. Restart PHP-FPM dan Reload Nginx:

    sudo systemctl restart php-fpm
    sudo nginx -t
    sudo systemctl reload nginx
  1. Uji PHP:
    Buat file
    /var/www/html/info.php:

    <?php
    phpinfo();
    ?>

    Akses http://example.com/info.php untuk memastikan PHP bekerja dengan baik.


B. Konfigurasi FastCGI Caching

  1. Aktifkan Cache Directory:

    sudo mkdir /var/cache/nginx/fastcgi_cache
    sudo chown -R www-data:www-data /var/cache/nginx/fastcgi_cache
  1. Tambahkan Konfigurasi Cache di Nginx:
    Tambahkan di blok
    http:

    fastcgi_cache_path /var/cache/nginx/fastcgi_cache levels=1:2 keys_zone=FASTCGI_CACHE:10m inactive=60m;
    fastcgi_cache_key "$scheme$request_method$host$request_uri";

    Di blok location ~ \.php$:

    fastcgi_cache FASTCGI_CACHE;
    fastcgi_cache_valid 200 60m;
    fastcgi_cache_bypass $http_cache_control;
    add_header X-FastCGI-Cache $upstream_cache_status;
  1. Reload Nginx:

    sudo nginx -t
    sudo systemctl reload nginx
  1. Uji Cache:
    Periksa header respons:\

    curl -I http://example.com/info.php

2. WebSocket

  1. Konfigurasi WebSocket di Nginx:
    Tambahkan di blok
    server:

    location /ws/ {
        proxy_pass http://127.0.0.1:8080; # Backend WebSocket
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }
  1. Reload Nginx:

    sudo nginx -t
    sudo systemctl reload nginx
  1. Uji WebSocket:
    Jalankan backend WebSocket di
    127.0.0.1:8080 dan gunakan alat seperti wscat untuk menguji:

    wscat -c ws://example.com/ws/

3. HTTP/2 dan gRPC

A. Mengaktifkan HTTP/2

  1. Aktifkan Modul HTTP/2 di Nginx:
    Tambahkan
    http2 di blok listen:

    server {
        listen 443 ssl http2;
        server_name example.com;
    
        ssl_certificate /path/to/cert.pem;
        ssl_certificate_key /path/to/key.pem;
    
        root /var/www/html;
    }
  1. Reload Nginx:

    sudo nginx -t
    sudo systemctl reload nginx
  1. Verifikasi HTTP/2:
    Gunakan
    curl:

    curl -I --http2 https://example.com

B. Dasar Penggunaan gRPC

  1. Konfigurasi Nginx sebagai Proxy gRPC:
    Tambahkan di blok
    server:

    server {
        listen 80 http2;
        server_name grpc.example.com;
    
        location / {
            grpc_pass grpc://127.0.0.1:50051;
            error_page 502 = /error502grpc;
        }
    
        location = /error502grpc {
            internal;
            default_type application/grpc;
            add_header grpc-status 14;
            return 204;
        }
    }
  1. Reload Nginx:

    sudo nginx -t
    sudo systemctl reload nginx
  1. Uji gRPC:
    Jalankan server gRPC di
    127.0.0.1:50051 dan gunakan alat pengujian seperti grpcurl.

4. File Upload dan Download

A. Membatasi Ukuran File Upload

  1. Tambahkan Konfigurasi di Nginx:
    Di dalam blok
    http atau server:

    client_max_body_size 10M;
  1. Reload Nginx:

    sudo nginx -t
    sudo systemctl reload nginx
  1. Uji:
    Coba unggah file lebih besar dari 10MB. Anda akan menerima error
    413 Request Entity Too Large.

B. Mengatur Rate Limiting untuk Download File

  1. Aktifkan Modul Limit Rate:
    Tambahkan di blok
    http:

    limit_rate_after 1m;
    limit_rate 50k;
  1. Tambahkan di blok server atau location:

    location /files/ {
        root /var/www/html;
        limit_rate 50k; # Batas 50 KB/s
    }
  1. Reload Nginx:

    sudo nginx -t
    sudo systemctl reload nginx
  1. Uji Rate Limiting:
    Unduh file besar dan perhatikan kecepatan unduhan:\

    curl -O http://example.com/files/largefile.zip

Hasil Akhir

  1. FastCGI: PHP dapat dijalankan dengan caching untuk performa lebih baik.
  1. WebSocket: Mendukung komunikasi real-time.
  1. HTTP/2 & gRPC: Menyediakan protokol modern untuk pengiriman data lebih cepat.
  1. File Upload & Download: Ukuran file dapat dibatasi, dan kecepatan unduhan dapat dikontrol.

  2. Studi Kasus Nginx {#15809095-dc41-80ab-857a-d65271e05925} ====================

Berikut adalah panduan detail untuk menyelesaikan studi kasus Nginx meliputi proyek praktis dan troubleshooting umum.


1. Proyek Praktis

A. Deploy Aplikasi Django dengan Nginx sebagai Reverse Proxy

  1. Instalasi Gunicorn:
    Instal Gunicorn di lingkungan aplikasi Django:\

    pip install gunicorn
  1. Jalankan Gunicorn untuk Django:
    Di direktori proyek Django, jalankan:\

    gunicorn --workers 3 --bind 127.0.0.1:8000 myproject.wsgi
    • myproject adalah nama aplikasi utama Django.
  1. Konfigurasi Nginx sebagai Reverse Proxy:
    Buat file
    /etc/nginx/sites-available/django:

    server {
        listen 80;
        server_name example.com;
    
        location / {
            proxy_pass http://127.0.0.1:8000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }

    Aktifkan konfigurasi:

    sudo ln -s /etc/nginx/sites-available/django /etc/nginx/sites-enabled/
    sudo nginx -t
    sudo systemctl reload nginx
  1. Tes Deployment:
    Akses
    http://example.com untuk memastikan Django berjalan melalui Nginx.

B. Load Balancer untuk Beberapa Instance Node.js

  1. Jalankan Beberapa Server Node.js:
    Contoh:
    app.js

    const http = require('http');
    const port = process.argv[2] || 3000;
    
    const server = http.createServer((req, res) => {
        res.end(`Server running on port ${port}`);
    });
    
    server.listen(port, () => {
        console.log(`Server started on port ${port}`);
    });

    Jalankan dengan port berbeda:

    node app.js 3001 &
    node app.js 3002 &
    node app.js 3003 &
  1. Konfigurasi Nginx sebagai Load Balancer:
    Tambahkan di
    /etc/nginx/sites-available/loadbalancer:

    upstream node_backend {
        server 127.0.0.1:3001;
        server 127.0.0.1:3002;
        server 127.0.0.1:3003;
    }
    
    server {
        listen 80;
        server_name example.com;
    
        location / {
            proxy_pass http://node_backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }

    Aktifkan konfigurasi:

    sudo ln -s /etc/nginx/sites-available/loadbalancer /etc/nginx/sites-enabled/
    sudo nginx -t
    sudo systemctl reload nginx
  1. Tes Load Balancer:
    Akses
    http://example.com dan lihat bahwa request dialihkan ke server Node.js secara bergantian.

C. Hosting Website Statis dengan HTTPS

  1. Struktur Direktori Website:
    Tempatkan file HTML di
    /var/www/html/website.
  1. Konfigurasi Nginx untuk Website Statis:
    Tambahkan di
    /etc/nginx/sites-available/website:

    server {
        listen 80;
        server_name example.com;
    
        root /var/www/html/website;
        index index.html;
    
        location / {
            try_files $uri $uri/ =404;
        }
    }

    Aktifkan konfigurasi:

    sudo ln -s /etc/nginx/sites-available/website /etc/nginx/sites-enabled/
    sudo nginx -t
    sudo systemctl reload nginx
  1. Pasang HTTPS dengan Let's Encrypt:
    Instal Certbot:\

    sudo apt install certbot python3-certbot-nginx -y

    Dapatkan sertifikat:

    sudo certbot --nginx -d example.com
  1. Tes HTTPS:
    Akses
    https://example.com dan pastikan sertifikat aktif.

2. Troubleshooting Umum

A. Error 404/403

  1. Periksa Root Direktori:
    Pastikan direktori root yang diatur di konfigurasi Nginx benar dan file ada.\

    ls -l /var/www/html
  1. Periksa Izin File:
    Pastikan Nginx memiliki akses ke file:\

    sudo chown -R www-data:www-data /var/www/html
  1. Cek Konfigurasi Nginx:

    sudo nginx -t
    sudo systemctl reload nginx

B. Debugging Error Log Nginx

  1. Lokasi Log:

    • Error log: /var/log/nginx/error.log
    • Akses log: /var/log/nginx/access.log
  1. Tingkatkan Level Debug:
    Tambahkan di
    nginx.conf:

    error_log /var/log/nginx/error.log debug;
  1. Reload Nginx dan Lihat Log:

    sudo nginx -t
    sudo systemctl reload nginx
    tail -f /var/log/nginx/error.log

C. Mengatasi Masalah Timeout

  1. Periksa Timeout di Nginx:
    Tambahkan di konfigurasi
    http atau server:

    proxy_connect_timeout 60s;
    proxy_send_timeout 60s;
    proxy_read_timeout 60s;
  1. Periksa Backend:
    Pastikan backend aplikasi (Django, Node.js) berfungsi dengan benar.\
  1. Tes dengan Curl:

    curl -I http://example.com

Hasil Akhir

  1. Proyek Praktis:

    • Aplikasi Django berjalan melalui Nginx.
    • Load balancer berhasil mendistribusikan request ke backend Node.js.
    • Website statis berjalan dengan HTTPS.
  1. Troubleshooting:

    • Error umum dapat diidentifikasi melalui log.
    • Masalah timeout dapat diatasi dengan pengaturan yang tepat.

Thank you to @ Gravita Hat | Gravatar

[]

PT. Blueink ArtTech Labs