NGINX 301 Permanent Redirect

Nginx-logo_fhsccb

Redirect dari non-www ke www domain:

server {
servername example.org;
rewrite ^ http://www.example.org$requesturi? permanent; }

Redirect dari satu domain ke domain lainnya (external):

server {
servername old.com www.old.com; rewrite ^ http://www.new.net$requesturi? permanent; }

Perhatikan di situ ada $request_uri? – yang artinya bahwa user akan tetap mendapatkan struktur URL yang diminta pada domain baru. Misal user meminta old.com/haha/ maka secara otomatis NGINX akan me-redirect ke www.new.com/haha/. Hal ini akan sangat berguna apabila anda pindah alamat domain, namun masih ingin mempertahankan trafik / score SEO dari domain yang lama.

CPU Stress Test Menggunakan Script MD5SUM

Kalau ingin melakukan stress test terhadap CPU dengan menggunakan tool yang kecil, script bash ini mungkin bisa dicoba. Pada dasarnya script ini menggunakan md5sum, tool sederhana yang hampir dimiliki oleh Linux, termasuk versi kecil seperti Busybox atau Linux Router. Pertama, buat dulu sebuah file dengan ukuran yang “cukup”

dd if=/dev/urandom of=testfile count=20 bs=1024k

Kedua, buat sebuah file / script yang isinya seperti di bawah (beri nama terserah anda, misal stress.cpu)

#!/bin/sh
i=0 while [ 1 ] do md5sum testfile i=expr $i + 1 echo "Iteration: $i" done

Save dan beri permission untuk di-execute

chmod 755 stress.cpu

Lalu jalankan script tersebut dengan cara

./stress.cpu

Referensi saya dapet dari sini

Merubah Timezone CentOS / Red Hat

Untuk mengetahui waktu dan timezone di server:

[root@lifebit ~] date 
Sun Feb 19 21:42:06 CST 2012

Dari contoh di atas terlihat bahwa server menggunakan timezone CST, atau Central Standard Time (GMT -6). Untuk merubah timezone menjadi Indonesia / Jakarta (GMT +7), execute perintah ini:

[root@lifebit ~] ln -s /usr/share/zoneinfo/Asia/Jakarta /etc/localtime

Kalau kita lihat sekarang, waktu di server udah menggunakan timezone lokal Jakarta:

[root@lifebit ~] date Mon Feb 20 10:49:31 WIT 2012

Instalasi OpenVPN Pada Debian & Ubuntu

Instalasi OpenVPN ini dikerjakan pada mesin Debian. Harusnya juga bisa untuk turunan Debian lainnya seperti Ubuntu, Mint, dll. Tujuan saya menggunakan OpenVPN biasanya untuk tunneling aja, menggunakan IP address luar, mem-bypass restriksi oleh ISP, dll. Fitur enkripsi dan login menggunakan certificate akan saya disable supaya koneksi semakin ringan dan stabil, lalu sebagai gantinya proses login nanti akan menggunakan username & password. Enkripsi cuma akan menambah overhead di trafik. Cek dulu TUN / TAP sudah enabled apa belum;

root@starscream:~# cat /dev/net/tun 
cat: /dev/net/tun: File descriptor in bad state

Kalau outputnya seperti di atas, berarti TUN / TAP sudah enabled. Jadi kita bisa lanjut ke proses instalasi.

apt-get install openvpn pam-devel

Pada beberapa instalasi Debian terbaru, mungkin akan muncul error seperti ini:

E: Unable to locate package pam-devel

Kalau kasusnya seperti itu, paket pam-devel ngga perlu diinstall. Copy contoh file konfigurasi yang udah ada ke /etc/openvpn untuk selanjutnya kita edit;

cp -R /usr/share/doc/openvpn/examples/easy-rsa/ /etc/openvpn/
chmod -R 755 /etc/openvpn/
cd /etc/openvpn/easy-rsa/2.0/

Lalu kita edit file vars (optional). Biasanya saya edit jadi seperti ini;

vi vars
# Increase this to 2048 if you 
# are paranoid. This will slow 
# down TLS negotiation performance 
# as well as the one-time DH parms 
# generation process. 
export KEYSIZE=384 
# In how many days should the root CA key expire? 
export CAEXPIRE=3650 
# In how many days should certificates expire? 
export KEYEXPIRE=3650 
# These are the default values for fields 
# which will be placed in the certificate. 
# Don't leave any of these fields blank. 
export KEYCOUNTRY="ID" 
export KEYPROVINCE="JKT" 
export KEYCITY="Jakarta" 
export KEYORG="ariw.net" 
export KEYEMAIL="scylla@ariw.net" 
export KEYCN=vpn.ariw.net 
export KEYNAME=ariw.net 
export KEYOU=ariw.net 
export PKCS11MODULEPATH=changeme 
export PKCS11PIN=666666

setelah di-edit dan save, lalu;

source ./vars
./vars
./clean-all
./build-ca
Generating a 384 bit RSA private key.
++++++++++++++++++ ................++++++++++++++++++ 
writing new private key to 'ca.key' 
----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- 
Country Name (2 letter code) [ID]: 
State or Province Name (full name) [JKT]: 
Locality Name (eg, city) [Jakarta]: 
Organization Name (eg, company) [ariw.net]: 
Organizational Unit Name (eg, section) [ariw.net]: 
Common Name (eg, your name or your server's hostname) [vpn.ariw.net]: 
Name [ariw.net]: 
Email Address [scylla@ariw.net]:
./build-key-server vpn.ariw.net

Perhatikan ketika execute perintah build-key-server di atas, value nya harus sama dengan Common Name, atau KEY_CN yaitu vpn.ariw.net

Generating a 384 bit RSA private key ............++++++++++++++++++ ..++++++++++++++++++ 
writing new private key to 'vpn.ariw.net.key' ----- 
You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- 
Country Name (2 letter code) [ID]: 
State or Province Name (full name) [JKT]: 
Locality Name (eg, city) [Jakarta]: 
Organization Name (eg, company) [ariw.net]: 
Organizational Unit Name (eg, section) [ariw.net]: 
Common Name (eg, your name or your server's hostname) [vpn.ariw.net]: 
Name [ariw.net]: 
Email Address [scylla@ariw.net]: 
Please enter the following 'extra' attributes to be sent with your certificate request 
A challenge password []: 
An optional company name []: 
Using configuration from /etc/openvpn/easy-rsa/2.0/openssl-1.0.0.cnf 
Check that the request matches the signature Signature ok 
The Subject's Distinguished Name is as follows 
countryName :PRINTABLE:'ID' 
stateOrProvinceName :PRINTABLE:'JKT' 
localityName :PRINTABLE:'Jakarta' 
organizationName :PRINTABLE:'ariw.net' 
organizationalUnitName:PRINTABLE:'ariw.net' 
commonName :PRINTABLE:'vpn.ariw.net' 
name :PRINTABLE:'ariw.net' 
emailAddress :IA5STRING:'scylla@ariw.net' 
Certificate is to be certified until Jan 4 06:27:10 2022 GMT (3650 days) 
Sign the certificate? [y/n]:y 
1 out of 1 certificate requests certified, commit? [y/n]:y 
Write out database with 1 new entries Data Base Updated
./build-dh

Selanjutnya kita buat file konfigurasi server;

cd /etc/openvpn
vi udp53.conf

Pada konfigurasi server saya isinya kurang lebih seperti ini;

port 53 
proto udp 
dev tun 
ca easy-rsa/2.0/keys/ca.crt 
cert easy-rsa/2.0/keys/vpn.ariw.net.crt 
key easy-rsa/2.0/keys/vpn.ariw.net.key 
dh easy-rsa/2.0/keys/dh384.pem 
plugin /usr/lib/openvpn/openvpn-auth-pam.so /etc/pam.d/login 
client-cert-not-required 
username-as-common-name 
server 10.53.0.0 255.255.255.0 
ifconfig-pool-persist ipp.txt 
push "redirect-gateway def1" 
push "dhcp-option DNS 8.8.4.4" 
push "dhcp-option DNS 208.67.220.220" 
keepalive 2 30 
comp-lzo 
cipher none 
persist-key 
persist-tun 
status udp53.log 
verb 3

Setelah di-edit dan save, restart service openvpn;

/etc/init.d/openvpn restart

Sampai sini service OpenVPN udah start dan client bisa login, tapi belum bisa melakukan koneksi ke internet karena belum diforward. Untuk itu edit file /etc/rc.local;

vi /etc/rc.local

dan tambahkan script ini;

echo 1 > /proc/sys/net/ipv4/ip_forward 
iptables -F 
iptables -X 
iptables -t nat -F iptables -t nat -A POSTROUTING -s 10.53.0.0/24 -j SNAT --to 209.141.55.165

10.53.0.0/24 adalah alamat jaringan local VPN yang saya masukkan di konfigurasi udp53.conf tadi, sedangkan 209.141.55.165 adalah IP public server saya. Setelah di-edit dan save, lalu;

sh /etc/rc.local

Langkah selanjutnya kita buat user untuk login ke VPN;

useradd -m -s /bin/false scylla

Konfigurasi di sisi server udah selesai, sekarang lakukan konfigurasi client. Karena aplikasi client untuk konek ke OpenVPN server ada beberapa macam (OpenVPN, Viscosity, dll) dan beda platform (Linux, Windows, Mac OSX) maka saya cuma akan menampilkan konfigurasinya secara general aja. Gimana cara install, konfigurasinya di mana, dll, cari dan coba2 sendiri ya. Atau bisa juga ditanyakan di kolom komentar di bawah.

## Contoh konfigurasi OpenVPN client (*.ovpn) ## 
client 
dev tun 
proto udp #protocol 
remote 209.141.55.165 53 #IP address server dan port 
resolv-retry infinite 
route-method exe 
nobind 
persist-key 
persist-tun 
ca ca.crt #file ini yang kita download dari server, dan diletakkan di folder yang sama. 
auth-user-pass 
comp-lzo 
cipher none #disable enkripsi 
verb 3

Di sisi client, yang kita butuhkan cuma file ca.crt yang ada di server tadi, jadi jangan lupa untuk dicopy / download dulu ke client.

Replikasi Database MySQL Dengan SSL Pada Debian Squeeze

Kali ini saya akan menjelaskan bagaimana melakukan replikasi database MySQL dari satu server (master) ke server lainnya (slave) dan menggunakan enkripsi SSL, sehingga sulit bagi hacker untuk sniff data ketika proses replikasi berlangsung.

Dengan melakukan replikasi kita bisa memiliki database slave yang datanya sama persis dengan database master. Semua updates yang dilakukan di sisi master akan “langsung” ter-replikasi ke slave. Perlu diingat bahwa skema seperti ini bukan untuk backup, karena apabila kita melakukan perintah DELETE pada master maka perintah tersebut juga akan tereksekusi di slave. Tapi skema seperti ini dapat berguna apabila misalnya terjadi hardware failure pada salah satu server sehingga bisa langsung switch over. Atau untuk meningkatkan performa aplikasi web, semua proses write / update dilakukan di server master, dan proses read / select dilakukan di server slave.

Tutorial ini akan menunjukkan bagaimana cara mereplikasi database koole dari server server1.ariw.net (master, IP 192.168.1.1) ke server server2.ariw.net (slave, IP 192.168.1.2). Kedua server menggunakan distro Linux Debian Squeeze. Database koole sudah terisi dengan data pada server master, dan pada server slave belum terisi apa-apa.

MySQL Replication
Install MySQL Server pada server1 dan server2 maka install dengan cara berikut;
(server1 & server2)

apt-get install mysql-server mysql-client

kita akan diminta untuk memasukkan password baru root MySQL, bukan password root linux!

New password for the MySQL "root" user:
Repeat password for the MySQL "root" user:

jika sudah terinstall lalu kita login ke MySQL (server1 dan server2) untuk mengecek apakah SSL support sudah diaktifkan atau belum;

mysql -u root -p

lalu execute perintah ini pada prompt SQL;

show variables like '%ssl%';

jika hasilnya seperti di bawah ini;

+---------------+----------+ | Variablename | Value | +---------------+----------+ | haveopenssl | DISABLED | | havessl | DISABLED | | sslca | | | sslcapath | | | sslcert | | | sslcipher | | | sslkey | | +---------------+----------+ 7 rows in set (0.07 sec)

itu berarti MySQL server sudah terinstall dengan dukungan SSL. Selanjutnya kita tinggal mengaktifkannya aja. Keluar dulu dari prompt SQL;

quit;

dan buka file file /etc/mysql/my.cnf;

vi /etc/mysql/my.cnf

pada bagian Security Features uncomment atau tambahkan line baru dengan kata “ssl”

# Security Features
## Read the manual, too, if you want chroot!
# chroot = /var/lib/mysql/
## For generating SSL certificates I recommend the OpenSSL GUI "tinyca". ssl
# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem

lalu restart mysql;

/etc/init.d/mysql restart

cek lagi apakah SSL sudah diaktifkan atau belum;

mysql -u root -p
show variables like '%ssl%';

outputnya harus seperti ini;

+---------------+----------+ | Variablename | Value | +---------------+----------+ | haveopenssl | YES | | havessl | YES | | sslca | | | sslcapath | | | sslcert | | | sslcipher | | | sslkey | | +---------------+----------+ 7 rows in set (0.07 sec)

ketik;

quit;

untuk keluar dari SQL prompt..

Mengkonfigurasi Master
Agar proses replikasi dapat berfungsi, kita harus mengkonfigurasi service MySQL untuk listen pada semua interface (server1). Untuk itu beri tanda # pada baris bind-address = 127.0.0.1 di /etc/mysql/my.cnf: (server1)

vi /etc/mysql/my.cnf
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address           = 127.0.0.1

restart MySQL;

/etc/init.d/mysql restart

Sekarang kita akan membuat CA, server, dan client certificates yang akan dibutuhkan untuk proses enkripsi SSL. Sebagai contoh saya akan membuat certificates tersebut di direktori /etc/mysql/newcerts;

mkdir /etc/mysql/newcerts
cd /etc/mysql/newcerts

pastikan openssl sudah terinstall;

apt-get install openssl

buat CA certificate;

openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes 1000 -key ca-key.pem > ca-cert.pem

buat server certificate;

openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem > server-req.pem
openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem

buat client certificate;

openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem > client-req.pem
openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem

sehingga isi dari folder /etc/mysql/newcerts terlihat seperti ini;

root@server1:/etc/mysql/newcerts# ls -l
total 32 -rw-r--r-- 1 root root 1346 Dec 17 16:17
ca-cert.pem -rw-r--r-- 1 root root 1675 Dec 17 16:17
ca-key.pem -rw-r--r-- 1 root root 1099 Dec 17 16:17
client-cert.pem -rw-r--r-- 1 root root 1679 Dec 17 16:17
client-key.pem -rw-r--r-- 1 root root  956 Dec 17 16:17
client-req.pem -rw-r--r-- 1 root root 1099 Dec 17 16:17
server-cert.pem -rw-r--r-- 1 root root 1675 Dec 17 16:17
server-key.pem -rw-r--r-- 1 root root  956 Dec 17 16:17
server-req.pem root@server1:/etc/mysql/newcerts#

Penting! Pastikan COMMON NAME ketika membuat CA certificate dan Server certificate harus berbeda. Misal common name CA certificate adalah ca.ariw.net dan common name untuk server certificate adalah ariw.net. sekarang kita harus mentransfer ca-cert.pem, client-cert.pem, dan client-key.pem ke slave (server2), tapi sebelumnya kita buat dulu direktori /etc/mysql/newcerts di server2; (server2):

mkdir /etc/mysql/newcerts

kembali ke server1, kita bisa transfer file-file tersebut di atas tadi dengan cara; (server1):

scp /etc/mysql/newcerts/ca-cert.pem root@192.168.1.2:/etc/mysql/newcerts
scp /etc/mysql/newcerts/client-cert.pem root@192.168.1.2:/etc/mysql/newcerts
scp /etc/mysql/newcerts/client-key.pem root@192.168.1.2:/etc/mysql/newcerts

lalu, buka /etc/msql/my.cnf;

vi /etc/mysql/my.cnf

edit pada bagian * Security Features; hilangkan tanda pagar pada ssl-ca, ssl-cert, dan ssl-key dan isi dengan nilai yang sesuai;

# Security Features #
# Read the manual, too, if you want chroot!
# chroot = /var/lib/mysql/ #
# For generating SSL certificates I recommend the OpenSSL GUI "tinyca". ssl
ssl-ca=/etc/mysql/newcerts/ca-cert.pem
ssl-cert=/etc/mysql/newcerts/server-cert.pem
ssl-key=/etc/mysql/newcerts/server-key.pem

restart MySQL;

/etc/init.d/mysql restart

Sekarang kita buat user MySQL yang akan digunakan oleh server2 untuk mengakses database pada server1, misal slave_user;

mysql -u root -p

pada MySQL prompt, execute perintah ini;

GRANT REPLICATION SLAVE ON . TO 'slaveuser'@'%' IDENTIFIED BY 'slavepassword'; FLUSH PRIVILEGES;
quit;

Kita harus memberitau MySQL agar membuat log untuk database koole (yang akan direplikasi). Nantinya log inilah yang akan digunakan oleh slave untuk melihat apa yang sudah berubah dari database master. Edit file /etc/mysql/my.cnf seperti ini;

vi /etc/mysql/my.cnf
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about other settings you may need to change.
server-id             = 1
logbin                = /var/log/mysql/mysql-bin.log
expirelogsdays        = 10
maxbinlogsize         = 100M
binlogdo_db           = koole

restart MySQL;

/etc/init.d/mysql restart

Langkah berikutnya kita akan mengunci (lock) database koole di server1, mengetahui master status server1, dan membuat SQL dump database koole (yang akan kita import ke server2), lalu unlock database koole agar bisa digunakan lagi;

mysql -u root -p

pada prompt MySQL execute command ini;

USE koole;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

perintah terakhir akan menampilkan output seperti ini. Catat hasilnya!

+---------------+----------+--------------+------------------+ | File          | Position | Binlogdodb | Binlogignoredb | +---------------+----------+--------------+------------------+ | mysql-bin.006 | 183      | koole     |                  | +---------------+----------+--------------+------------------+ 1 row in set (0.00 sec)

Sekarang jangan keluar dulu dari prompt MySQL, karena kalau keluar database akan otomatis unlock. Buka satu lagi prompt bash / Linux di server1;

cd /tmp
mysqldump - u root -ppasswordrootmysql --opt koole > snapshot.sql
scp snapshot.sql root@192.168.1.2:/tmp

Kalau proses transfer sudah selesai kita boleh close prompt Linux, kemudian unlock dan keluar dari database koole; (server1):

UNLOCK TABLES;
quit;

Konfigurasi Slave
Di server slave kita buat database koole;

mysql -u root -p Enter password:
CREATE DATABASE koole;
quit;

lalu import mysql dump dari server master yang tadi sudah dibuat (snapshot.sql)

mysql -u root -p koole < /tmp/snapshot.sql

Penting: ngga ada spasi antara -p dan koole

Sekarang kita kasitau server slave bahwa dia adalah slave, masternya adalah 192.168.1.1, dan database yang harus dimonitor di master adalah koole. Untuk itu tambahkan / edit baris berikut di /etc/mysql/my.cnf;

server-id=2
master-host=192.168.1.1
master-user=slaveuser
master-password=slavepassword
master-connect-retry=60
replicate-do-db=koole

restart MySQL;

/etc/init.d/mysql restart

Langkah berikutnya;

mysql -u root -p Enter password:
SLAVE STOP;

masih di sql prompt yang sama;

CHANGE MASTER TO MASTERHOST='192.168.1.100', MASTERUSER='slaveuser', MASTERPASSWORD='slavepassword', MASTERLOGFILE='mysql-bin.006', MASTERLOG_POS=183;

MASTERHOST adalah ip address atau hostname server master (dalam contoh ini 192.168.1.1). MASTERUSER adalah user yang diberikan akses untuk melakukan replikasi di database master. MASTERPASSWORD adalah password user replikasi di server master. MASTERLOGFILE adalah file log yang terlihat ketika kita mengetikkan perintah SHOW MASTER STATUS; di server master tadi. MASTERLOG_POS adalah posisi terakhir MySQL ketika kita mengetikkan perintah SHOW MASTER STATUS; di server master. Langkah terakhir adalah start slave, masih di prompt sql server slave;

START SLAVE;
quit;

Selesai! Sekarang coba tes lakukan update di server master dan lihat apakah ada perubahan di server slave 😉