Home > Server > Setting Wordpress MU di Nginx

Setting Wordpress MU di Nginx

March 27th, 2008

Habis coba test kecil-kecilan benchmark Apache dengan Nginx, ketahuan kalo diakses dengan jumlah konkurensi yang gede (lupa berapa spesifiknya), Nginx masih kuat merespon daripada Apache. Apache cenderung mereset koneksi jika udah kebanyakan request. Ini juga gak tau, emang bener gak settingan apache-nya… hehehe….

OK… Sekarang coba install Nginx. Sebenarnya udah dicoba sama temanku bagian sysnet, tapi waktu itu belum berani dimasukkan ke live, karena ada beberapa feature yang takutnya tidak didukung penuh oleh Nginx. Setelah dipikir2, sepertinya sih gak ada. Soalnya webserver dalam hal ini gak begitu banyak berperan di aplikasi WordpressMU, yang berperan banyak dari sisi PHP-nya. Cuman yang perlu diperhatikan itu fasilitas rewrite. Apache dengan Nginx punya cara penanganan yang berbeda dalam setting konfigurasi, maka dari itu penulis coba-coba belajar cara setting di Nginx.

Setelah tiga hari utak-atik rewrite di Nginx, akhirnya ketemu juga logika cara mainnya :D . Bingung sih baca manualnya di website Nginx, gak begitu jelas. Akhirnya coba-coba sendiri deh. Ada sih konfigurasi dapat dari googling, tapi masih ada masalah.

Nih hasil utak-atik konfigurasinya….

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
worker_processes 32;
daemon  off;
pid /var/run/nginx.pid;
events  {
                use epoll;
                worker_connections 1024;
                multi_accept on;
                epoll_events 512;
                accept_mutex_delay 10ms;
        }
http {
        include /opt/nginx/conf/mime.types;
        default_type  application/octet-stream;
        log_format main '$remote_addr - $remote_user [$time_local] '
                  '"$request" $status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';
        sendfile on;
        tcp_nopush        on;
        tcp_nodelay       on;
        gzip            on;
        gzip_http_version 1.0;
        gzip_comp_level 2;
        gzip_proxied any;
        gzip_types      text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        server {
                listen       80;
                server_name  blog.com *.blog.com;
                access_log /var/log/nginx/access.fifo main;
                error_log /var/log/nginx/error.fifo info;
                client_max_body_size 20M;

                #-------- uploaded file -------------
                location ~ /files/ {
                        root /data/wpmu;
                        rewrite ^.*/files/(.*) /wp-content/blogs.php?file=$1 break; # get upload file
                        fastcgi_pass   127.0.0.1:8888;
                        fastcgi_index  index.php;
                        fastcgi_param  SCRIPT_FILENAME /data/wpmu/$fastcgi_script_name;
                        include        /opt/nginx/conf/fastcgi_params;
                }

                location ~* (/wp-content/avatars|/wp-content/cache/supercache/.+.html) {
                        root /data/wpmu;
                        expires 1h;
                        break;
                }

                location ~* ^.+.(html|jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|swf)$ {
                        root /data/wpmu;
                        expires 30d;
                        break;
                }

                location / {
                        root   /data/wpmu;
                        index  index.php index.html index.htm;

                        #------- cache it, but do not supercache --------------
                        set $exist 0;
                        set $match 2;

                        if (-e $request_filename) {
                                set $exist 1;
                        }
                        # custom scripts, apart from wordpressmu
                        if ($uri ~ "^.*/(blogdir.php|blogstardir.php|blogcat.php|result.php|blognew.php).*$") {
                                set $match 1;
                        }

                        if ($match = $exist) {
                                break;
                        }

                        #------- supercache --------------
                        set $olduri $uri;
                        set $nosc 0;

                        rewrite ^ /wp-content/cache/supercache/$http_host/$uri/index.html;

                        if ($query_string ~ ".*s=.*") {
                                set $nosc 1;
                        }

                        if ($http_cookie ~ "^.*(comment_author_|wordpressuser|wp-postpass_).*$" ) {
                                set $nosc 1;
                        }

                        if (!-e $request_filename) {
                                set $nosc 1;
                        }

                        if ($nosc = 0) {
                                rewrite ^(.*) $1 last;
                        }

                        #------------------------------------
                        rewrite ^ $olduri;

                        if (-d $request_filename) {
                                rewrite ^(.*[^/])$ $1/ permanent;
                        }

                        if (!-e $request_filename) {
                                #permalink
                                rewrite ^ /index.php break;
                        }
                        break;

                        fastcgi_pass   127.0.0.1:8888;
                        fastcgi_index  index.php;
                        fastcgi_param  SCRIPT_FILENAME /data/wpmu/$fastcgi_script_name;
                        include        /opt/nginx/conf/fastcgi_params;
                }
        }
}

Di rewrite module ada rule “if”. Rule ini gak bisa di nested :( . Jadi masukin alurnya jadi bingung, sedikit akal-akalan. Intinya dalam rewrite itu, selama gak ada rule “break” atau “last ” diakhir line dalam satu directive location, maka pencarian akan dilanjutkan ke rule rewrite yang lain (masih dalam satu directive location). Jika sudah gak ketemu yang match, baru dilanjutkan di directive location lain. Variabel $uri akan berubah-ubah sesuai dengan hasil rule rewrite yang match. Sedangkan $request_uri merupakan original $uri ditambah dengan argumen.

Jika ada rule “last”, maka rewrite akan berhenti mencari rule rewrite selanjutnya di directive location-nya dia, dan mencari di directive location lain sampai ketemu match. Jika ingin benar-benar berhenti dan tidak akan melanjutkan mencari di directive location lain, maka pakai rule “break”.

Buat Wordpress MU sendiri, yang bikin pusing ini rule buat supercache. Tapi akhirnya berhasil, walaupun banyak akal-akalannya (liat sendiri aja). Ehmmm… belum cek keseluruhan… jadi 90% lah keberhasilannya ….hehehehe……..

Jika ada yang tahu cara efisiennya, kasih tau ya….

Updated: Ternyata yang lama masih kacau konfigurasinya… ketauan baru diproduction… hihihi.. sial

admin Server

  1. No comments yet.
  1. No trackbacks yet.