Konfigurasi Nginx sebagai reverse proxy untuk Apache

By | August 29, 2018

Panduan cara konfigurasi Nginx selaku reverse proxy bagi Apache di Linux, tested!. Di panduan ini menggunakan Linux Ubuntu 18.04, tetapi dapat digunakan di distro Linux lainnya, misal Debian dan CentOS. Karena ada dasarnya konfigurasinya sama, hanya berbeda di letak direktori konfigurasi virtual host dan dokumen webroot saja.

Selaku contoh, jikalau tradisi Nginx di Ubuntu virtual hostnya di /etc/nginx/sites-available dan /etc/sites-enabled, karenanya di CentOS berada di /etc/nginx/conf.d. Jadi gampang saja, tinggal disesuaikan.

Install Apache, MariaDB dan PHP

Di langkah awal kita akan menginstall Apache, MariaDB, dan PHP serta modul-modulnya, salah satunya yaitu 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 bagi MySQL dan menghapus database yang tak perlu

mysql_secure_installation

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

nano /etc/apache2/ports.conf

Sesuaikan portnya seperti berikut port 8080 bagi HTTP dan 8443 akan digunakan bagi 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 pun link simbolisnya

unlink /etc/apache2/sites-enabled/*

Bikin konfigurasi virtual host baru, perhatikan portnya 8080

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

Isi dengan tema 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, jikalau kelak mau gunakan HTTPS (kini tak, 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 petunjuk a2ensite (singkatan bagi: apache2 enable site)

a2ensite idnetter.com

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

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

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

RPAFproxy_ips 127.0.0.1 1.2.3.4 ::1

Seandainya Sahabat ingin mengaktifkan modul mod_rewrite Apache, yang biasanya bagi mempercantik URL supaya permalinknya lebih search engine friendly (SEF), eksekusi petunjuk a2enmod kepanjangannya apache2 enable module.

a2enmod rewrite

Ok, hingga disini Apache telah kita setup selaku web server yang bekerja di “balik layar”. Kemudian restart service Apache agar konfigurasi yang baru saja kita modifikasi dapat digunakan kini.

systemctl restart apache2

Izinkan layanan Apache dan MariaDB otomatis berjalan dikala aplikasi di-restart.

systemctl enable apache2
systemctl enable mariadb

Bikin file informasi.php di pada folder webroot /var/www/html bagi menjalankan uji coba

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

Sekarang ini coba, buka browser bagi memastikan Apache kini telah berjalan di port 8080, akses http://ip-server:8080/informasi.php.

Uji coba ini bertujuan, jikalau server tak dapat diakses, kita dapat dengan gampang mencari kesalahan di konfigurasi Apache sebelum melanjutkan ke langkah berikutnya.

Install Nginx

Install Nginx seperti biasanya

apt install -y nginx

Konfigurasi Nginx selaku reverse proxy

Ubah konfigurasi global Nginx, kita akan mengaktifkan module gzip dan menambahkan beberapa baris bagi pengaturan proxy cache jikalau 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, kini kita punya konfigurasi Nginx yang sempurna, Gzip aktif, SSL chippers, proxy cache jikalau hendak diaktifkan via vhost. Berikutnya merancang konfigurasi server block.

Bagus Apache dan Ngix mesti 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;}
}

Bikin 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 di 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 berikutnya 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.

Panduan lain bagi mengoptimalkan dan menyempurnakan web server Sahabat

Selamat mencoba kawan.


Sumber https://idnetter.com