Konfigurasi Nginx sebagai reverse proxy untuk Apache

Panduan cara konfigurasi Nginx sebagai reverse proxy untuk Apache pada Linux, tested!. Pada tutorial ini menggunakan Linux Ubuntu 18.04, tetapi dapat diterapkan pada distro Linux lainnya, misal Debian dan CentOS. Karena ada dasarnya konfigurasinya sama, hanya berbeda pada letak direktori konfigurasi virtual host dan dokumen webroot saja.

Sebagai contoh, jika tradisi Nginx pada Ubuntu virtual hostnya pada /etc/nginx/sites-available dan /etc/sites-enabled, maka di CentOS berada di /etc/nginx/conf.d. Jadi mudah saja, tinggal disesuaikan.

Install Apache, MariaDB dan PHP

Pada langkah awal kita akan menginstall Apache, MariaDB, dan PHP serta modul-modulnya, salah satunya adalah mod_rpaf

apt install -y apache2 mariadb-server php libapache2-mod-php libapache2-mod-rpaf php-fpm php-mysql php-cli php-gd php-ldap php-odbc php-pdo php-pear php-mbstring php-xml php-xmlrpc php-snmp php-soap

Tingkatkan sekuriti MariaDB dengan cara setup akun root untuk MySQL dan menghapus database yang tidak perlu

mysql_secure_installation

Langkah selanjutnya, mengubah port Apache ke 8080 (HTTP) dan 8443 (HTTPS) yang akan digunakan sebagai backend dari Nginx. Jadi Nginx yang akan menghandle trafik HTTP dan HTTPS pada port standar 80 dan 443.

nano /etc/apache2/ports.conf

Sesuaikan portnya seperti berikut port 8080 untuk HTTP dan 8443 akan digunakan untuk koneksi HTTPS

Listen 8080

<IfModule ssl_module>
   Listen 8443
</IfModule>

<IfModule mod_gnutls.c>
   Listen 8443
</IfModule>

Hapus contoh konfigurasi virtual host bawaan Apache

rm -f /etc/apache2/sites-available/*.conf

Hapus juga link simbolisnya

unlink /etc/apache2/sites-enabled/*

Buat konfigurasi virtual host baru, perhatikan portnya 8080

nano /etc/apache2/sites-available/idnetter.com.conf

Isi dengan template berikut

<VirtualHost *:8080>

    ServerName idnetter.com
    ServerAlias www.idnetter.com
    ServerAdmin [email protected]
    DocumentRoot /var/www/html

    <Directory "/var/www/html">
        Options FollowSymLinks
        AllowOverride All
    </Directory>

    LogLevel warn
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

Ini contoh konfigurasi SSL, jika kelak mau pakai HTTPS (sekarang tidak, karena SSLnya belum disetup)

<VirtualHost GANTI-IP-SERVER:8443>

    ServerName idnetter.com
    ServerAlias www.idnetter.com
    ServerAdmin [email protected]
    DocumentRoot /var/www/html

    CustomLog /var/log/apache2/idnetter.com.bytes bytes
    CustomLog /var/log/apache2/idnetter.com.log combined
    ErrorLog /var/log/apache2/idnetter.com.error.log

    <Directory /var/www/html>
        AllowOverride All
        SSLRequireSSL
        Options +Includes -Indexes +ExecCGI
    </Directory>

    SSLEngine on
    SSLVerifyClient none
    SSLCertificateFile /etc/letsencrypt/live/idnetter.com/certificate.crt
    SSLCertificateKeyFile /etc/letsencrypt/live/idnetter.com/certificate.key
    SSLCertificateChainFile /etc/letsencrypt/live/idnetter.com/certificate.ca

</VirtualHost>

Simpan kemudian aktifkan virtual host yang baru dengan perintah a2ensite (singkatan untuk: apache2 enable site)

a2ensite idnetter.com

Satu lagi, tambahkan IP server ke dalam konfigurasi modul Apache rpaf, agar kita dapat mengetahui real IP klien yang mengakses server.

nano /etc/apache2/mods-available/rpaf.conf

Pada baris berikut, tambahkan IP server (ganti, 1.2.3.4)

RPAFproxy_ips 127.0.0.1 1.2.3.4 ::1

Jika Anda ingin mengaktifkan modul mod_rewrite Apache, yang biasanya untuk mempercantik URL supaya permalinknya lebih search engine friendly (SEF), eksekusi perintah a2enmod kepanjangannya apache2 enable module.

a2enmod rewrite

Ok, sampai disini Apache sudah kita setup sebagai web server yang bekerja di “balik layar”. Kemudian restart service Apache agar konfigurasi yang baru saja kita edit dapat diterapkan sekarang.

systemctl restart apache2

Izinkan layanan Apache dan MariaDB otomatis berjalan saat sistem di-restart.

systemctl enable apache2
systemctl enable mariadb

Buat file info.php di dalam folder webroot /var/www/html untuk melakukan uji coba

echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php

Sekarang coba, buka browser untuk memastikan Apache sekarang sudah berjalan pada port 8080, akses http://ip-server:8080/info.php.

Uji coba ini bertujuan, jika server tidak bisa diakses, kita dapat dengan mudah mencari kesalahan pada konfigurasi Apache sebelum melanjutkan ke langkah selanjutnya.

Install Nginx

Install Nginx seperti biasanya

apt install -y nginx

Konfigurasi Nginx sebagai reverse proxy

Ubah konfigurasi global Nginx, kita akan mengaktifkan module gzip dan menambahkan beberapa baris untuk pengaturan proxy cache jika dibutuhkan.

cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf_bak && nano /etc/nginx/nginx.conf

Paste kode berikut

user www-data;
worker_processes auto;
worker_rlimit_nofile    65535;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
	worker_connections  1024;
	use                 epoll;
	multi_accept        on;
}

http {
    # Basic Settings
    sendfile                        on;
    tcp_nopush                      on;
    tcp_nodelay                     on;
    client_header_timeout           60s;
    client_body_timeout             60s;
    client_header_buffer_size       2k;
    client_body_buffer_size         256k;
    client_max_body_size            256m;
    large_client_header_buffers     4 8k;
    send_timeout                    60s;
    keepalive_timeout               30s;
    reset_timedout_connection       on;
    server_tokens                   off;
    server_name_in_redirect         off;
    server_names_hash_max_size      512;
    server_names_hash_bucket_size   512;

    # Mime type
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    # Logging Settings
    log_format  main    '$remote_addr - $remote_user [$time_local] $request'
        '"$status" $body_bytes_sent "$http_referer"'
        '"$http_user_agent" "$http_x_forwarded_for"';
    log_format  bytes   '$body_bytes_sent';
    error_log /var/log/nginx/error.log;
    access_log off;
    # access_log /var/log/nginx/access.log;

    # Compression
    gzip                on;
    gzip_static         on;
    gzip_vary           on;
    gzip_comp_level     6;
    gzip_min_length     1024;
    gzip_buffers        16 8k;
    gzip_types          text/plain text/css text/javascript text/js text/xml application/json application/javascript application/x-javascript application/xml application/xml+rss application/x-font-ttf image/svg+xml font/opentype;
    gzip_proxied        any;
    gzip_disable        "MSIE [1-6]\.";

    # Proxy settings
    proxy_redirect      off;
    proxy_set_header    Host            $host;
    proxy_set_header    X-Real-IP       $remote_addr;
    proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass_header   Set-Cookie;
    proxy_buffers       32 4k;
    proxy_connect_timeout   30s;
    proxy_send_timeout  90s;
    proxy_read_timeout  90s;
	
    # Cache settings
    proxy_cache_path /var/cache/nginx levels=2 keys_zone=cache:10m inactive=60m max_size=1024m;
    proxy_cache_key "$host$request_uri $cookie_user";
    proxy_temp_path  /var/cache/nginx/temp;
    proxy_ignore_headers Expires Cache-Control;
    proxy_cache_use_stale error timeout invalid_header http_502;
    proxy_cache_valid any 1d;

    # Cache bypass
    map $http_cookie $no_cache {
        default 0;
        ~SESS 1;
        ~wordpress_logged_in 1;
    }

    # File cache settings
    open_file_cache          max=10000 inactive=30s;
    open_file_cache_valid    60s;
    open_file_cache_min_uses 2;
    open_file_cache_errors   off;
	
    # SSL PCI Compliance
    ssl_session_cache   shared:SSL:10m;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers        "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";

    # Virtual Host Configs

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

Oke, sekarang kita punya konfigurasi Nginx yang sempurna, Gzip aktif, SSL chippers, proxy cache jika hendak diaktifkan via vhost. Berikutnya membuat konfigurasi server block.

Baik Apache dan Ngix harus disetup virtual hostnya dengan path web root yang sama pula.

nano /etc/nginx/sites-available/idnetter.com.conf

isi dengan konfigurasi berikut

server {
    listen      80;
    server_name idnetter.com www.idnetter.com;
    error_log  /var/log/apache2/error.log error;

    location / {
        proxy_pass      http://GANTI_IP_SERVER:8080;

        proxy_cache cache;
        proxy_cache_valid 15m;
        proxy_cache_valid 404 1m;
        proxy_no_cache $no_cache;
        proxy_cache_bypass $no_cache;
        proxy_cache_bypass $cookie_session $http_x_update;

        location ~* ^.+\.(jpg|jpeg|gif|png|ico|svg|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|odt|ods|odp|odf|tar|wav|bmp|rtf|js|mp3|avi|mpeg|flv|html|htm)$ {
            proxy_cache    off;
            root           /var/www/html;
            access_log     /var/log/apache2/idnetter.com.log combined;
            access_log     /var/log/apache2/idnetter.com.bytes bytes;
            expires        max;
            try_files      $uri @fallback;
        }
    }

    location @fallback {
        proxy_pass      http://GANTI_IP_SERVER:8080;
    }

    location ~ /\.ht    {return 404;}
    location ~ /\.svn/  {return 404;}
    location ~ /\.git/  {return 404;}
    location ~ /\.hg/   {return 404;}
    location ~ /\.bzr/  {return 404;}
}

Buat link simbolis idnetter.com.conf ke /etc/nginx/sites-enabled/

ln -s /etc/nginx/sites-available/idnetter.com.conf /etc/nginx/sites-enabled/

Ini saya sertakan contoh, konfigurasi SSL Nginx reverse proxy, selain port, perbedaannya hanya pada 3 baris yang semuanya diawali dengan ssl*

server {
    listen      GANTI-IP-SERVER:443;
    server_name idnetter.com www.idnetter.com;
    error_log  /var/log/apache2/error.log error;

    ssl         on;
    ssl_certificate      /etc/letsencrypt/live/idnetter.com/certificate.pem;
    ssl_certificate_key  /etc/letsencrypt/live/idnetter.com/certificate.key;

    location / {
        proxy_pass      http://GANTI_IP_SERVER:8433;

        proxy_cache cache;
        proxy_cache_valid 15m;
        proxy_cache_valid 404 1m;
        proxy_no_cache $no_cache;
        proxy_cache_bypass $no_cache;
        proxy_cache_bypass $cookie_session $http_x_update;

        location ~* ^.+\.(jpg|jpeg|gif|png|ico|svg|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|odt|ods|odp|odf|tar|wav|bmp|rtf|js|mp3|avi|mpeg|flv|html|htm)$ {
            proxy_cache    off;
            root           /var/www/html;
            access_log     /var/log/apache2/idnetter.com.log combined;
            access_log     /var/log/apache2/idnetter.com.bytes bytes;
            expires        max;
            try_files      $uri @fallback;
        }
    }

    location @fallback {
        proxy_pass      http://GANTI_IP_SERVER:8433;
    }

    location ~ /\.ht    {return 404;}
    location ~ /\.svn/  {return 404;}
    location ~ /\.git/  {return 404;}
    location ~ /\.hg/   {return 404;}
    location ~ /\.bzr/  {return 404;}
}

Oke selanjutnya kita uji coba coba akses menggunakan curl

curl -I idnetter.com

hasilnya nanti ada informasi Server: nginx, seperti dibawah ini

Server: nginx/1.14.0 (Ubuntu)
Date: Tue, 28 Aug 2018 15:35:44 GMT
Content-Type: text/html
Content-Length: 194
Connection: keep-alive

Ok, selesai.

Tutorial lain untuk mengoptimalkan dan menyempurnakan web server Anda

Selamat mencoba kawan.

4 thoughts on “Konfigurasi Nginx sebagai reverse proxy untuk Apache

  1. aang

    permisi om, tuk konfigurasi nginx pada port 80 dan 443 apakah dalam satu file konfigurasi?
    /etc/nginx/sites-available/idnetter.com.conf

    1. Omar

      Bebas mas, plih mana yg mudah saja, konfigurasi vhost dimulai dari blok server
      Jangan lupa test sebelum reload nginx -t

  2. Raka

    Terimakasih mas tutorialnya, jelas

  3. Raka

    Mas, tapi waktu udh selesai ikutin tutorial sampai akhir..waktu buka http://alamat_ip/info.php

    Kok malah ngedownload .php nya ya?

Add a comment