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 man@idnetter.com
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 man@idnetter.com
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.
permisi om, tuk konfigurasi nginx pada port 80 dan 443 apakah dalam satu file konfigurasi?
/etc/nginx/sites-available/idnetter.com.conf
Bebas mas, plih mana yg mudah saja, konfigurasi vhost dimulai dari blok
server
Jangan lupa test sebelum reload
nginx -t
Terimakasih mas tutorialnya, jelas
Mas, tapi waktu udh selesai ikutin tutorial sampai akhir..waktu buka http://alamat_ip/info.php
Kok malah ngedownload .php nya ya?