CentOS / RHEL

Instalasi Nginx di CentOS / RHEL #

Ekosistem Enterprise Linux yang mencakup Red Hat Enterprise Linux (RHEL), CentOS Stream, Rocky Linux, dan AlmaLinux dikenal luas karena ketangguhan, keamanan, dan stabilitasnya untuk menjalankan aplikasi bisnis skala besar. Semua distribusi ini berbagi fondasi manajemen paket yang sama, menggunakan yum pada sistem warisan (seperti RHEL/CentOS 7) dan dnf pada sistem modern (RHEL 8/9, Rocky Linux, AlmaLinux).

Berbeda dari keluarga Debian/Ubuntu yang secara default menyertakan paket Nginx dalam repositori utamanya, di ekosistem RHEL kita harus mengambil langkah ekstra dengan menambahkan repositori pihak ketiga seperti EPEL (Extra Packages for Enterprise Linux) atau mengonfigurasi repositori resmi Nginx.org. Selain itu, fitur keamanan tingkat tinggi yang diaktifkan secara default pada RHEL—seperti SELinux dan Firewalld—memerlukan konfigurasi khusus agar Nginx dapat berfungsi dengan baik tanpa memicu error 403 Forbidden atau 502 Bad Gateway. Artikel ini memandu kita melalui proses instalasi yang aman dan komprehensif.

Memahami Sumber Paket: EPEL vs Repositori Resmi Nginx #

Sebelum kita memulai instalasi, kita harus mengevaluasi dua sumber utama paket Nginx untuk Enterprise Linux. Pilihan ini akan memengaruhi stabilitas dan fitur yang tersedia di server kita.

1. EPEL (Extra Packages for Enterprise Linux) #

EPEL adalah proyek repositori berbasis komunitas yang dikelola oleh Fedora Special Interest Group. Repositori ini menyediakan paket-paket perangkat lunak berkualitas tinggi tambahan yang tidak disertakan dalam repositori inti RHEL.

  • Kelebihan: Integrasi dependensi yang baik dengan distro Enterprise Linux, dipelihara oleh komunitas Fedora yang tepercaya, dan pembaruan keamanan disesuaikan dengan siklus hidup distribusi utama.
  • Kekurangan: Versi Nginx yang tersedia biasanya bukan rilis hulu terhangat. Ini adalah versi stabil yang telah diuji kompatibilitasnya untuk jangka panjang.

2. Repositori Resmi Nginx.org #

Repositori resmi dipelihara langsung oleh pengembang Nginx (F5). Ini adalah pilihan terbaik jika kita menginginkan kontrol penuh atas versi Nginx.

  • Kelebihan: Menyediakan versi Stable dan Mainline paling mutakhir secara instan, sangat konsisten di berbagai server, dan mendukung fitur protokol web paling baru.
  • Kekurangan: Membutuhkan langkah pembuatan berkas konfigurasi repositori secara manual di /etc/yum.repos.d/.

Metode 1: Instalasi Menggunakan Repositori EPEL #

Instalasi via EPEL adalah pilihan tercepat untuk server yang mengutamakan kemudahan operasional.

Pada CentOS Stream 8/9, Rocky Linux, dan AlmaLinux (Menggunakan DNF) #

Jalankan rangkaian perintah berikut untuk memasang EPEL terlebih dahulu, kemudian menginstal Nginx:

# Pasang repositori EPEL ke dalam sistem
sudo dnf install epel-release -y

# Perbarui indeks paket untuk menyertakan repositori baru
sudo dnf makecache

# Pasang paket Nginx
sudo dnf install nginx -y

Pada CentOS 7 dan RHEL 7 (Menggunakan YUM) #

Bagi kita yang mengelola sistem legacy berbasis versi 7, perintahnya menggunakan yum:

# Pasang repositori EPEL
sudo yum install epel-release -y

# Pasang Nginx
sudo yum install nginx -y

Setelah instalasi selesai, kita bisa memverifikasi versi yang didapatkan:

nginx -v
# Output bervariasi tergantung rilis distro, biasanya menampilkan versi stable distro

Metode 2: Instalasi Menggunakan Repositori Resmi Nginx.org #

Untuk mendapatkan versi stabil terbaru langsung dari hulu, kita harus mendaftarkan repositori resmi Nginx secara manual di folder konfigurasi manajer paket kita.

Langkah 1: Membuat Berkas Konfigurasi Repositori #

Kita harus membuat berkas baru dengan nama nginx.repo di dalam direktori /etc/yum.repos.d/:

sudo vi /etc/yum.repos.d/nginx.repo

Isi berkas tersebut dengan konfigurasi berikut. Jika kita menggunakan RHEL asli (bukan Rocky Linux, AlmaLinux, atau CentOS), ganti kata centos pada parameter baseurl menjadi rhel:

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[!NOTE] Parameter module_hotfixes=true sangat penting pada sistem berbasis RHEL 8 dan 9. Parameter ini memberi tahu dnf untuk mengizinkan paket Nginx dari luar menimpa modul stream bawaan OS yang mungkin memiliki nama paket yang sama.

Langkah 2: Mengeksekusi Instalasi #

Setelah berkas repositori disimpan, jalankan perintah instalasi menggunakan dnf atau yum:

# Untuk CentOS Stream / Rocky / AlmaLinux (modern):
sudo dnf makecache
sudo dnf install nginx -y

# Untuk RHEL / CentOS 7 (legacy):
sudo yum makecache
sudo yum install nginx -y

Jika kita ingin menggunakan versi Mainline (fitur terbaru), kita harus menonaktifkan repositori stable dan mengaktifkan repositori mainline terlebih dahulu:

# Menggunakan dnf-config-manager (butuh paket dnf-plugins-core)
sudo dnf install -y dnf-plugins-core
sudo dnf-config-manager --disable nginx-stable
sudo dnf-config-manager --enable nginx-mainline

# Jalankan update/install
sudo dnf install nginx -y

Memulai dan Mengaktifkan Layanan Nginx #

Berbeda dari sistem berbasis Debian/Ubuntu yang sering kali langsung menjalankan Nginx setelah proses instalasi selesai, pada ekosistem RHEL/CentOS, layanan baru akan dipasang dalam kondisi tidak aktif (inactive/dead) dan tidak otomatis berjalan setelah reboot.

Kita wajib mengaktifkan dan menjalankannya secara manual menggunakan systemd:

# Menjalankan service Nginx seketika
sudo systemctl start nginx

# Mengonfigurasi Nginx agar otomatis berjalan saat server melakukan booting
sudo systemctl enable nginx

# Memeriksa status keaktifan layanan
sudo systemctl status nginx
# Pastikan status menampilkan "active (running)"

Mengonfigurasi Firewall dengan Firewalld #

Keluarga Enterprise Linux menggunakan firewalld sebagai pengelola firewall bawaan, bukan UFW. Firewalld mengelola lalu lintas data berdasarkan zona (zones). Secara default, zona public aktif dan menutup semua port masuk kecuali port SSH (22).

Kita harus mengizinkan port HTTP (80) dan HTTPS (443) secara permanen di zona publik agar server web dapat diakses dari luar.

# Izinkan port 80 (HTTP) secara permanen
sudo firewall-cmd --permanent --add-service=http

# Izinkan port 443 (HTTPS) secara permanen
sudo firewall-cmd --permanent --add-service=https

# Terapkan konfigurasi baru dengan memuat ulang firewall
sudo firewall-cmd --reload

# Verifikasi bahwa layanan HTTP dan HTTPS sudah diizinkan
sudo firewall-cmd --list-services
# Output contoh: dhcpv6-client http https ssh

Jika kita ingin menguji Nginx pada port kustom (misalnya port 8080), gunakan perintah berikut untuk membuka port TCP spesifik:

sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload

SELinux: Memecahkan Masalah Error 403 dan 502 #

Security-Enhanced Linux (SELinux) adalah mekanisme keamanan tingkat kernel yang diaktifkan secara default pada CentOS/RHEL. SELinux membatasi apa saja yang boleh diakses oleh suatu proses berdasarkan kebijakan keamanan (policies) yang sangat ketat.

Bagi administrator sistem yang baru bermigrasi ke CentOS/RHEL, SELinux adalah penyebab utama error yang membingungkan. Dua skenario error yang paling sering ditemui adalah:

  1. Error 403 Forbidden: Terjadi ketika kita memindahkan direktori web root ke lokasi kustom (misal /home/user/web/), namun Nginx ditolak mengaksesnya oleh kernel meskipun izin file (chmod/chown) sudah benar.
  2. Error 502 Bad Gateway: Terjadi ketika kita mengonfigurasi Nginx sebagai reverse proxy ke aplikasi backend (seperti PHP-FPM di port 9000 atau Node.js di port 3000), namun koneksi soket jaringan ditolak oleh kernel.

Berikut adalah alur keputusan sistematis bagaimana SELinux mengevaluasi request akses dari proses Nginx:

flowchart TD
    Req["Nginx mengirim request akses resource"] --> Q_Type{"Jenis Resource?"}
    
    Q_Type -->|"File / Direktori (Web Root)"| Q_FileCtx{"Apakah file memiliki context <br> httpd_sys_content_t?"}
    Q_FileCtx -->|"Ya"| AllowFile["Akses File DIIZINKAN"]
    Q_FileCtx -->|"Tidak"| DenyFile["Akses File DITOLAK <br> -> HTTP 403 Forbidden"]
    
    Q_Type -->|"Soket Jaringan (Reverse Proxy)"| Q_Bool{"Apakah boolean <br> httpd_can_network_connect = 1?"}
    Q_Bool -->|"Ya"| AllowNet["Koneksi Proxy DIIZINKAN"]
    Q_Bool -->|"Tidak"| DenyNet["Koneksi Proxy DITOLAK <br> -> HTTP 502 Bad Gateway"]
    
    style AllowFile stroke:#388e3c,stroke-width:2px
    style AllowNet stroke:#388e3c,stroke-width:2px
    style DenyFile stroke:#d32f2f,stroke-width:2px
    style DenyNet stroke:#d32f2f,stroke-width:2px

1. Mengatasi 403 Forbidden (Konfigurasi Context Berkas) #

SELinux mengidentifikasi berkas berdasarkan label context keamanannya. Nginx (yang berjalan dalam domain proses httpd_t) hanya diizinkan membaca file yang memiliki label context keamanan web server, yaitu httpd_sys_content_t.

Jika kita menaruh berkas web di direktori kustom seperti /data/www/, direktori tersebut mungkin memiliki label context default seperti default_t atau user_home_t yang tidak boleh dibaca oleh Nginx.

Untuk memperbaikinya secara permanen, kita harus mengubah label context direktori tersebut:

# 1. Daftarkan pola direktori kustom ke kebijakan SELinux sebagai tipe konten web httpd_sys_content_t
sudo semanage fcontext -a -t httpd_sys_content_t "/data/www(/.*)?"

# 2. Terapkan perubahan label ke sistem file secara rekursif
sudo restorecon -R -v /data/www

Jika berkas web tersebut perlu ditulis oleh Nginx (misalnya folder upload media pada WordPress), kita harus memberikan label context writeable:

sudo semanage fcontext -a -t httpd_sys_rw_content_t "/data/www/uploads(/.*)?"
sudo restorecon -R -v /data/www/uploads

2. Mengatasi 502 Bad Gateway (Konfigurasi Boolean SELinux) #

Secara default, SELinux melarang proses web server (httpd_t) membuat koneksi jaringan keluar (outbound network connections) untuk meminimalkan risiko jika web server diretas. Namun, saat Nginx bertindak sebagai reverse proxy, ia wajib terhubung ke backend upstream via TCP/IP.

Kita harus mengizinkan fungsi ini dengan mengubah nilai variabel boolean SELinux httpd_can_network_connect menjadi aktif (1 atau on):

# Aktifkan izin koneksi network keluar secara permanen (-P flag)
sudo setsebool -P httpd_can_network_connect 1

Langkah ini akan langsung menyelesaikan masalah error 502 Bad Gateway yang disebabkan oleh pemblokiran kernel SELinux.

[!WARNING] Sangat tidak disarankan untuk mematikan SELinux dengan mengubah konfigurasinya menjadi disabled atau permissive (menggunakan setenforce 0) di server produksi. SELinux adalah salah satu sistem pertahanan terbaik yang mencegah peretas melakukan eskalasi hak akses jika web server kita disusupi. Mengonfigurasi SELinux dengan benar jauh lebih aman daripada mematikannya.

3. Menganalisis Log Audit SELinux dan Membuat Kebijakan Kustom (audit2allow) #

Ketika SELinux memblokir tindakan Nginx, pesan penolakan akan dicatat secara mendalam di berkas log audit sistem operasi kita, yang biasanya berlokasi di /var/log/audit/audit.log. Menghapus atau mengabaikan log ini bukanlah tindakan bijak. Sebaliknya, kita dapat menganalisis pesan kesalahan spesifik tersebut untuk memahami operasi sistem apa yang ditolak.

Pesan penolakan SELinux (dikenal sebagai pesan AVC - Access Vector Cache) biasanya memiliki struktur seperti berikut: type=AVC msg=audit(1686381234.567:123): avc: denied { name_connect } for pid=1234 comm="nginx" dest=8081 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:port_t:s0 tclass=tcp_socket permissive=0

Pesan di atas menunjukkan bahwa proses Nginx (dengan context httpd_t) ditolak ketika mencoba melakukan koneksi keluar (name_connect) ke port TCP 8081 (yang memiliki context default port_t).

Jika kita menjalankan aplikasi backend pada port non-standar yang tidak didefinisikan dalam kebijakan boolean SELinux bawaan, dan kita tidak ingin mengaktifkan boolean global yang terlalu longgar, kita bisa membuat modul kebijakan SELinux kustom.

Caranya adalah dengan menggunakan utilitas ausearch dan audit2allow:

# 1. Cari pesan penolakan AVC yang terkait dengan Nginx baru-baru ini
sudo ausearch -m AVC -ts recent | grep nginx

# 2. Buat draf modul kebijakan kustom (misal bernama 'my-nginx-port') dari log audit tersebut
sudo ausearch -c 'nginx' --raw | audit2allow -M my-nginx-port

# Perintah di atas akan menghasilkan dua berkas di direktori aktif kita:
# - my-nginx-port.te: Berkas teks Type Enforcement yang berisi aturan yang diusulkan
# - my-nginx-port.pp: Berkas biner modul kebijakan yang siap dipasang ke kernel

# 3. Tinjau berkas text .te sebelum dipasang untuk memastikan tidak ada celah keamanan baru
cat my-nginx-port.te

# 4. Pasang modul kebijakan biner tersebut ke kernel SELinux
sudo semodule -i my-nginx-port.pp

Dengan metode ini, kita memberikan izin khusus bagi Nginx untuk mengakses port spesifik tersebut tanpa mengurangi perlindungan SELinux pada aspek sistem operasi lainnya.


Hardening Keamanan Nginx dengan Systemd Sandboxing #

Pada distribusi Enterprise Linux modern yang menggunakan systemd, kita dapat menerapkan lapisan perlindungan keamanan tambahan langsung di level manajer proses sistem operasi. Teknik ini disebut systemd sandboxing, yang membatasi hak akses file dan interaksi perangkat keras yang dapat dilakukan oleh Nginx di level kernel.

Kita dapat membuat berkas override systemd khusus untuk Nginx tanpa merusak berkas konfigurasi bawaan paket distro:

# Buka editor override systemd untuk Nginx
sudo systemctl edit nginx

Systemctl akan membuka editor teks kosong. Kita dapat menyisipkan konfigurasi pengerasan keamanan (security hardening) berikut di dalam blok [Service]:

### Berkas override: /etc/systemd/system/nginx.service.d/override.conf
[Service]
# Batasi hak akses penulisan ke direktori sistem utama
ProtectSystem=strict

# Izinkan Nginx menulis HANYA ke direktori web, log, dan runtime cache yang diperlukan
ReadWritePaths=/var/log/nginx /var/cache/nginx /var/run /usr/share/nginx/html

# Amankan direktori home pengguna dari akses Nginx
ProtectHome=true

# Cegah Nginx membuat perangkat file khusus (seperti loopback atau raw devices)
PrivateDevices=true

# Batasi kemampuan kernel khusus yang boleh dijalankan Nginx
CapabilityBoundingSet=CAP_NET_BIND_SERVICE

Setelah kita menyimpan berkas override tersebut, systemd akan memuat ulang konfigurasinya secara otomatis. Langkah sandboxing ini memastikan bahwa jika proses worker Nginx berhasil disusupi oleh penyerang, ruang gerak penyerang akan dibatasi secara ketat di dalam sistem operasi kita—mereka tidak akan bisa membaca folder home milik user lain, memodifikasi berkas konfigurasi sistem di /etc/, atau membuat perangkat file berbahaya di /dev/.


Struktur Direktori Nginx pada CentOS/RHEL #

Setelah instalasi selesai, kita harus memperhatikan tata letak direktori Nginx pada CentOS/RHEL yang memiliki perbedaan kecil dibandingkan dengan Ubuntu:

  • /etc/nginx/: Direktori konfigurasi utama. File nginx.conf di CentOS/RHEL memuat folder konfigurasi /etc/nginx/conf.d/*.conf secara langsung. Struktur konvensi sites-available/ dan sites-enabled/ tidak digunakan secara bawaan di sini.
  • /usr/share/nginx/html/: Ini adalah direktori Document Root default di CentOS/RHEL, bukan /var/www/html/ seperti di Ubuntu/Debian. Jika kita tidak mengubah konfigurasi root, taruh file HTML kita di direktori ini.
  • /var/log/nginx/: Direktori untuk berkas log akses (access.log) dan log error (error.log).

Ringkasan #

  • Aktifkan EPEL atau buat berkas /etc/yum.repos.d/nginx.repo untuk menginstal Nginx di CentOS/RHEL.
  • Ingat untuk selalu menjalankan systemctl start nginx && systemctl enable nginx setelah instalasi selesai, karena Nginx tidak otomatis dijalankan seperti di Ubuntu.
  • Buka akses web di firewall menggunakan perintah firewall-cmd --permanent --add-service={http,https} lalu jalankan firewall-cmd --reload.
  • Selesaikan error 502 Bad Gateway akibat SELinux dengan menjalankan setsebool -P httpd_can_network_connect 1.
  • Selesaikan error 403 Forbidden pada direktori kustom dengan mengubah label context keamanan file ke httpd_sys_content_t menggunakan semanage fcontext dan restorecon.
  • Gunakan /usr/share/nginx/html sebagai lokasi default dokumen web statis di keluarga Enterprise Linux.

← Sebelumnya: Ubuntu / Debian   Berikutnya: Docker →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact