Upgrade Nginx 1.18 to Nginx 1.26 (Official Nginx Repository)

To upgrade Nginx 1.18 to Nginx 1.26 on Ubuntu 22.04 (Jammy Jellyfish), you need to install it from the official Nginx repository instead of the default Ubuntu repository (which contains outdated versions). Here’s the step-by-step guide:


Step 1: Remove Old Nginx Version

First, check your current installed Nginx version:

nginx -v

If it’s 1.18, remove it to prevent conflicts:

sudo apt remove nginx nginx-core nginx-common -y
sudo apt autoremove -y

Step 2: Add the Official Nginx Repository

Since the Ubuntu repository only provides older versions, add the official Nginx repository.

  1. Import the Nginx GPG key:
curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg > /dev/null
  1. Add the official Nginx repository:
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu jammy nginx" | sudo tee /etc/apt/sources.list.d/nginx.list

Step 3: Update Package List and Install Latest Nginx

sudo apt update
sudo apt install nginx -y

Step 4: Verify Nginx Installation

Check the installed version:

nginx -v

It should now show 1.27.0 or the latest stable version.


Step 5: Restart and Enable Nginx

sudo systemctl restart nginx
sudo systemctl enable nginx

(Optional) Step 6: Verify Nginx is Running

Check if Nginx is running:

sudo systemctl status nginx

Check if it’s listening on port 80:

sudo ss -tulnp | grep nginx

Done !

But if You saw some thing like

W: GPG error: http://nginx.org/packages/ubuntu jammy InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY ABF5BD827BD9BF62

It looks like the GPG key for the official Nginx repository is missing or not properly added. Let’s fix this step-by-step.


Step 1: Remove the Old Key (If Exists)

sudo rm -f /usr/share/keyrings/nginx-archive-keyring.gpg

Step 2: Import the Correct GPG Key

Now, add the correct Nginx GPG key:

curl -fsSL https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg > /dev/null

Verify that the key has been added:

gpg --show-keys /usr/share/keyrings/nginx-archive-keyring.gpg

It should display something like:

pub   rsa4096 2011-08-19 [SC]
      ABF5 BD82 7BD9 BF62

Step 3: Correct the Nginx Repository Configuration

Now, re-add the Nginx repository, ensuring it references the signed key correctly:

echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu jammy nginx" | sudo tee /etc/apt/sources.list.d/nginx.list

Step 4: Update and Install Nginx

Try updating your package list again:

sudo apt update

If no errors appear, proceed with installing Nginx:

sudo apt install nginx -y

Step 5: Verify the Installation

Check the installed Nginx version:

nginx -v

If it shows 1.27, the upgrade was successful. 🎉


Troubleshooting

If you still get a NO_PUBKEY error, try manually adding the key:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ABF5BD827BD9BF62

Then update again:

sudo apt update

That should fix the issue.

Seputar Reverse Proxy #1

Case #1: Header Host

Misalkan Anda memiliki server Nginx yang bertindak sebagai reverse proxy untuk server backend yang menjalankan aplikasi web di http://localhost:8080. Konfigurasi Nginx Anda mungkin terlihat seperti ini:

server {
  listen 80;
  server_name example.com;

  location / {
    proxy_pass http://localhost:8080;
    proxy_set_header Host $host; 
  }
}

Dalam hal ini, ketika klien meminta http://example.com, Nginx akan meneruskan permintaan ke http://localhost:8080, tetapi akan mengatur header Host dalam permintaan yang diteruskan ke example.com . Ini memastikan bahwa aplikasi web di server backend menerima hostname yang benar.

proxy_set_header Host $host; adalah direktif penting dalam konfigurasi reverse proxy Nginx. Ini memastikan bahwa server backend menerima hostname asli yang diminta oleh klien, yang penting untuk banyak aplikasi web dan konfigurasi server.

Hide X-Powered-By di Nginx

Terkadang kita perlu menyembunyikan identitas teknologi yang kita gunakan, misalnya identitas web server Nginx yang kita gunakan. Itu akan terlihat seperti di bawah ini:

Disini kita perlu menambahkan atau mengaktifkan pada konfigurasi bagian http di /etc/nginx.conf :

server_tokens off;

Dan juga tambahan library :

sudo apt-get install nginx-extras

setelah itu baru menambahkan kembali bagian http di /etc/nginx.conf konfigurasi di bawah ini:

more_clear_headers Server;

Setelah itu jangan lupa untuk me’reload atau pun restart nginx nya

sudo systemctl reload nginx

Sekarang menjadi seperti ini:

Upgrade Nginx versi 1.18.0 ke versi terbaru dari Mainline (1.27.0) di Ubuntu 22.04

Saat tulisan ini dibuat, Nginx yang digunakan masih versi 1.18 yang menjadi default versi Nginx di Ubuntu 22.04, kenyataannya sudah dianggap obsolete oleh teman-teman web security karena sudah rentan dari faktor keamanan. Untuk itu sangat disarankan untuk mengupgrade nya ke versi yang lebih tinggi. Bagi yang hanya akan upgrade ke versi 1.26, silahkan lihat di sini

Apa yang membedakan antara versi stable dan mainline ?

  • Stable (v 1.26): Versi yang telah teruji dengan baik dengan lebih sedikit pembaruan, cocok untuk lingkungan produksi.
  • Mainline (v1.27): Pembaruan yang lebih sering dengan fitur-fitur baru, direkomendasikan bagi pengguna yang memerlukan peningkatan terkini.

Saran: Jika Anda menjalankan server produksi, disarankan untuk tetap menggunakan 1.26.2 (Stabil), bukan 1.27 (Utama).

Berikut adalah langkah-langkah upgrade nya menggunakan terminal/console

Pertama kali sebaiknya kita lakukan backup terhadap Nginx yang sekarang ada:

sudo cp -r /etc/nginx /etc/nginx.backup

Lakukan langkah-langkah berikut ini:

sudo apt update && sudo apt upgrade -y

Kita cabut atau hilangkan Nginx yang ada

sudo systemctl stop nginx
sudo apt-get autoremove nginx*

Kemudian tambahkan repository mainline NGinx

sudo add-apt-repository ppa:ondrej/nginx-mainline -y
sudo apt update
sudo apt install nginx-core nginx-common nginx nginx-full -y

Kita cek/periksa Nginx versi Mainline nya, perintah di bawah akan memunculkan versi terakhir yang tersedia di server:

apt-cache policy nginx

Enable/aktifkan layanan Nginx

systemctl status nginx
sudo systemctl start nginx
sudo systemctl enable nginx

Berikut posisi setelah upgrade:

Semoga berhasil !

Pengamanan Situs dengan menggunakan headers pada server Nginx

Secure Nginx from Clickjacking with X-FRAME-OPTIONS

Clickjacking

https://owasp.org/www-community/attacks/Clickjacking

X-Frame Options

Header add_header X-Frame-Options “SAMEORIGIN”;

Reference: here

Header X-XSS-Protection

When this header is being sent along with a response and the website contains an XSS attack, the browser will see this XSS attack and stop it from loading. This protection knows 3 levels:

  • X-XSS-Protection: 0; Disables the filter entirely.
  • X-XSS-Protection: 1; Enables the filter but only sanitizes the malicious script
  • X-XSS-Protection: 1; mode=block Enables the filter and completely blocks the page

Example:

add_header X-XSS-Protection "1; mode=block";
atau
add_header X-XSS-Protection "1;";

Reference

https://youtu.be/pV_uX0jDAh4?si=W6gbBjvpvniVDSDB

X-XSS-Protection headers. Protection or vulnerability?

https://webdock.io/en/docs/how-guides/security-guides/how-to-configure-security-headers-in-nginx-and-apache

Nginx config tips

Membuat semua file txt, git dan md tidak dapat di akses user

Letakkan script ini dalam file config di bagian atas

location ~.(git|txt|md)$ {
deny all;
return 404;
}

Menyembunyikan versi nginx

Pada /etc/nginx/nginx.conf, tambahkan berikut ini:

server_tokens off;

Tambahan konfigurasi yang tidak standard di Nginx

apt-get install nginx-extras

Setelah itu kita bisa menambahkan kode berikut ini di nginx.conf

server_tokens off;
more_set_headers "Server: Molly Percocet";

Blok semua tipye file tapi tidak untuk file tertentu (misalnya dengan file yang di awali dengan  .well-known )

## Disable .htaccess and other hidden files
location ~ /\.(?!well-known).* {
    deny all;
    access_log off;
    log_not_found off;
}

Memperbesar ukuran upload file Apache2

File konfigurasi yang perlu di edit adalah php.ini yang letaknya bisa berbeda tergantung modul php yang digunakan, antara lain:

  • /etc/php/7.4/apache/php.ini
  • /etc/php/7.4/fpm/php.ini

Versi php dapat disesuaikan

Parameter yang perlu diatur adalah :

post_max_size = 100M
upload_max_filesize = 100M

Besar ukuran dapat diubah sesuai kebutuhan

Jangan lupa setelah itu, web server Apache perlu di restart

$ sudo service apache2 restart

Mod rewrite (part.1)

Mod Rewrite part.1

Mod_Rewrite memungkinkan Anda membuat URL khusus dan sederhana sesuai kebutuhan.

Tulisan ini akan membahas tentang bagaimana mengaktifkan Mod_Rewrite, Membuat dan Menggunakan halaman .htaccess yang diperlukan, dan menyiapkan penulisan ulang URL.

Before we begin generating the actual URL rewrites, we need to activate the apache mod_rewrite module that controls them.

sudo a2enmod rewrite

Perintah mengaktifkan modul atau—jika sudah diaktifkan, menampilkan kata-kata, “Module rewrite sudah diaktifkan”

Setelah modul diaktifkan, Anda dapat mengatur penulisan ulang URL dengan membuat file .htaccess di direktori situs web Anda.

File .htaccess adalah cara untuk mengonfigurasi detail situs web Anda tanpa perlu mengubah file konfigurasi server. Tanda titik yang meng’awali’ nama file akan membuat file ini tidak tampak secara default di dalam folder.

Selain itu, peletakan file .htaccess juga penting. Konfigurasi dalam file itu akan memengaruhi semua yang ada di direktori dan direktori di bawahnya.

Cara mengizinkan perubahan dalam file .htaccess

Untuk mengizinkan file .htaccess menimpa konfigurasi situs web standar, kita awali dengan dengan membuka file konfigurasi. Catatan: Anda memerlukan hak sudo untuk langkah ini.

sudo nano /etc/apache2/sites-available/default

Setelah berada di dalam file itu, temukan bagian berikut, dan ubah baris yang mengatakan AllowOverride dari None menjadi All. Bagian tersebut sekarang akan terlihat seperti ini:

<Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
 </Directory>

Setelah Anda menyimpan dan keluar dari file itu, restart apache. File .htaccess sekarang akan tersedia untuk semua situs Anda.

sudo service apache2 restart

Refference: Digital Ocean: How To Set Up Mod_Rewrite

Mencopot memcached dari Ubuntu

(Uninstall memcached from ubuntu)

Cara paling praktis adalah sebagai berikut, tapi cara ini hanya mencopot memcached nya saja, tapi mencopot juga dependency packages yang tidak diperlukan

$ sudo apt-get remove memcached 

Jika akan menghapus juga dependency packages terkait maka lakukan hal berikut ini

$ sudo apt-get purge memcached

atau sekalian dibersihkan, jika Anda akan reinstall kembali, lakukan ini

$ sudo apt-get purge --auto-remove memcached 
1 2