Apache2 mod_proxy_balancer with Active Pasife Setup

<Proxy balancer://mycluster>
       Order deny,allow
       Allow from all

       BalancerMember http://192.168.10.7:8080 route=node1 retry=30
       BalancerMember http://192.168.10.8:8080 route=node2 status=+H retry=0
</Proxy>


ProxyPass / balancer://mycluster/ lbmethod=byrequests stickysession=JSESSIONID|jsessionid

ProxyPreserveHost On
ProxyPassReverse /  http://192.168.10.7:8080/
ProxyPassReverse /  http://192.168.10.8:8080/

Dengan setup di atas server node 1 akan menerima semua request, dan server 2 akan take over ketika node 1 sudah tidak bisa melayani. Jika node1 hidup makan semua request akan dilayani oleh node1. Apache juga akan melakukan pengecekan setiap 30 detik apakah node1 masih hidup atau mati dan melakukan switch ke node 1 jika node1 hidup, serta switch ke node2 jika node1 mati. ;)

Replace All URL Link WordPress Setelah Migrasi

Beberapa hari kemarin bantu-bantu beberapa project migrasi yang menggunakan wordpress. Export & Import saja tidak cukup apalagi export dari localhost, hum dijamin banyak url yang nyangkut. hehe

Berikut ini salah satu solusi yang saya gunakan untuk mereplace all link ke domain baru.

UPDATE wp_posts SET post_content = REPLACE(post_content,'www.domain.com/wp-content/uploads','www.domain.com/images');

Command Pertama Setelah Install MySQL di Docker

Menginstall MySQL di docker hasilnya akan sedikit berbeda jika dibandingkan dengan menginstall langsung di OS (Linux) biasa. Biasanya kalau kita menginstall MySQL di docker kita tidak akan menemukan file service, sehingga mengharuskan kita untuk menjalankan service secara manual.

1. Config

sudo mysql_install_db –user=mysql –basedir=/usr/ –ldata=/var/lib/mysql/

2. Runing

sudo mysqld_safe &

AngularJS vs SEO

Sudah lama sebenarnya menyelesaikan masalah  ini baru sempat untuk menulis hari ini. Intinya adalah ketika robot index berkunjung ke website kita,  nginx meredirect ke server Panthomjs. Panthomjs akan me-render secara sempurna html dan memberikan ke robot index.

Configuration di nginx  nginx.conf:

location / {
  try_files $uri @prerender;
}

location @prerender {
 set $prerender 0;
 if ($http_user_agent ~* "baiduspider|twitterbot|facebookexternalhit|rogerbot|linkedinbot|embedly|quora link preview|showyoubot|outbrain|pinterest|slackbot|vkShare|W3C_Validator") {
  set $prerender 1;
 }
 if ($args ~ "_escaped_fragment_") {
  set $prerender 1;
 }
 if ($http_user_agent ~ "Prerender") {
  set $prerender 0;
 }
 if ($uri ~ "\.(js|css|xml|less|png|jpg|jpeg|gif|pdf|doc|txt|ico|rss|zip|mp3|rar|exe|wmv|doc|avi|ppt|mpg|mpeg|tif|wav|mov|psd|ai|xls|mp4|m4a|swf|dat|dmg|iso|flv|m4v|torrent|ttf|woff)") {
  set $prerender 0;
 }
 if ($prerender = 1) {
  set $prerender "127.0.0.1:8888";
  proxy_pass http://$prerender$request_uri;
 }
 if ($prerender = 0) {
  rewrite .* /index.html break;
 }
}

 

Script phantomjs render.js :

var system = require('system');

if (system.args.length < 3) {
    console.log("Missing arguments.");
    phantom.exit();
}

var server = require('webserver').create();
var port = parseInt(system.args[1]);
var urlPrefix = system.args[2];

var parse_qs = function(s) {
    var queryString = {};
    var a = document.createElement("a");
    a.href = s;
    a.search.replace(
        new RegExp("([^?=&]+)(=([^&]*))?", "g"),
        function($0, $1, $2, $3) { queryString[$1] = $3; }
    );
    return queryString;
};

var renderHtml = function(url, cb) {
    var page = require('webpage').create();
    page.settings.loadImages = false;
    page.settings.localToRemoteUrlAccessEnabled = true;
    page.onCallback = function() {
        cb(page.content);
        page.close();
    };
//    page.onConsoleMessage = function(msg, lineNum, sourceId) {
//        console.log('CONSOLE: ' + msg + ' (from line #' + lineNum + ' in "' + sourceId + '")');
//    };
    page.onInitialized = function() {
       page.evaluate(function() {
            setTimeout(function() {
                window.callPhantom();
            }, 10000);
        });
    };
    page.open(url);
};

server.listen(port, function (request, response) {
    var route = parse_qs(request.url)._escaped_fragment_;
    var url = urlPrefix
      + request.url.slice(1, request.url.indexOf('?'))
      + '#!' + decodeURIComponent(route);
    renderHtml(url, function(html) {
        response.statusCode = 200;
        response.write(html);
        response.close();
    });
});

console.log('Listening on ' + port + '...');
console.log('Press Ctrl+C to stop.');


Web Accelerator using Squid Proxy

Humm sudah lama gak update blog huehue :D. Banyak catatan di evernote yang sebenarnya menarik dibahas dalam blog ini, minimal sebagai catatan pribadi kalau sewaktu-waktu dibutuhkan kembali.

Web Accelerator sudah pasti tahukan dari frase katanya ya untuk meningkatkan performa dan kecepatan suatu web. Saya akan membahas bagaimana cara settingnya saja di Squid Proxy. Lebih jauh dari setup configurationnya anda harus memahami website anda apakah website anda itu bertipe transaksional atau banyak ke reporting yang datanya tidak terlalu sering berubah-ubah, karena dua hal ini sangat mempengaruhi bagaimana kita me-setup squid configuration kita. Dan Configuration yang harus kita lakukan adalah sebagai berikut : Continue reading

Simple JBOSS EAP services script

Code Bash Script untuk menjalankan dan mematikan services JBoss Eap, lupa dulu referensinya dari mana dan sudah saya rubah disesuaikan dengan server centos saya.

#!/bin/sh
processName="jboss-eap";
echoName="jboss services process";
processDetails="ps -ef | grep $processName";
totalRunningProcess=$(eval  $processDetails | wc -l);
usage="Usage : $0 start | stop";
processStartCommand="nohup /home/mamat/jboss-eap-6.1/bin/standalone.sh -b 0.0.0.0 > /dev/null 2>&1 &";
commandToGetProcessPids="eval $processDetails | tr -s ' ' | cut -d ' ' -f 2";
if [ $# -lt 1 ]
then
  echo $usage;
fi
case "$1" in
"stop" )
 if [ $totalRunningProcess -eq "1" ]
 then
  echo "$echoName is not running....";

 else
  echo "stopping $echoName....";
  processToKill=$($commandToGetProcessPids);
  processToKillPidsArray=$(echo $processToKill);
  set -- $processToKillPidsArray;
  kill -9 $1 $2;
  echo "$echoName stopped....";
 fi
;;
"start" )
 if [ $totalRunningProcess -gt "2" ]
 then
  echo "$echoName is already running....";
 else
  echo "starting $echoName....";
  eval $processStartCommand;
 fi
    ;;
*)
 echo $usage;

Cara Mudah Merubah Timezone di Linux

Biasanya jam yang ada di Server sudah tepat, hanya timezone saja yang berbeda. DanCara Mudah Merubah Timezone di Linux, adalah sebagai berikut:

[root@7cc56ce93112 ~]# mv /etc/localtime /etc/localtime.bak
[root@7cc56ce93112 ~]# ln -s /usr/share/zoneinfo/Asia/Jakarta /etc/localtime
[root@7cc56ce93112 ~]# date
Tue May 19 19:11:37 WIB 2015

 

Docker, Menambahkan Port Forwarding pada Iptables

Terkadang saat kita menjalankan container docker, kita tidak menyertakan port yang akan dibuka. Solusi tanpa harus melakuan stop dan start ulang container adalah dengan menambahkan routing ip forwarding pada iptables (kebetulan saya menggunakan linux).

Berikut ini adalah contoh cara menambahkan port forwarding di iptables

iptables -t nat -A  DOCKER -p tcp --dport 8080 -j DNAT --to-destination 172.17.0.2:8080
iptables -t nat -A  DOCKER -p tcp --dport 8081 -j DNAT --to-destination 172.17.0.3:8080

Tampilan dari iptables

 

[mamat@docker01 ~]$ sudo iptables -t nat -A  DOCKER -p tcp --dport 8080 -j DNAT --to-destination 172.17.0.2:8080
[mamat@docker01 ~]$ sudo iptables -t nat -A  DOCKER -p tcp --dport 8081 -j DNAT --to-destination 172.17.0.3:8080
[mamat@docker01 ~]$ sudo iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  anywhere             anywhere             ADDRTYPE match dst-type LOCAL
...
...
Chain DOCKER (2 references)
target     prot opt source               destination
DNAT       tcp  --  anywhere             anywhere             tcp dpt:webcache to:172.17.0.2:8080
DNAT       tcp  --  anywhere             anywhere             tcp dpt:tproxy to:172.17.0.3:8080