Jul 02

Recently i am working with nginx and apache on wpmu. I am trying to test and bencmark both web server. Yes i have browse and heard that nginx is more fastest than apache but i also having difficulties with the nginx mod rewrite setting to wpmu supercache on the other side there were no problem with apache mod rewrite but i have a lot memory and resource when i use apache. Okay then when i stumble on this article http://tech.nocr.at/tech/how-to-speed-up-wordpress-with-nginx-and-wp-super-cache/ it will be a great idea if i can apply the article on the wpmu, i already have wpmu , wp supercache , nginx and apache. The main idea with that article is to split the static and dynamic content process, nginx will process the static content and the apache will process the dynamic content.

System requirement:

– Centos 5.3

– Apache ( httpd-2.2.8 )

– Nginx (nginx-0.6.36-1.el5)

– wp super cache plugin Version: 0.9.4.3

Okay let’s start the changes

1.  I assume you have installed apache and wpmu first of all we need to changes the apache(httpd) port firstwe can changes it on the httpd.conf at /etc/httpd/conf/httpd.conf

# vi /etc/httpd/conf/httpd.conf
Listen 80
Listen 8080

2. Next we are going to turn KeepAlives off on Apache since Nginx will be dealing with all of the actual browser connections. This will ensure that all of the child processes in Apache die quickly and don’t hang around chewing up memory. Find the KeepAlive entry in your /etc/httpd/conf/httpd.conf file and set it to off

# vi /etc/httpd/conf/httpd.conf
KeepAlive Off

3. You need to changes your virtual directory to match the nginx config. Here is my config

# vi /etc/httpd/conf/httpd.conf

NameVirtualHost localhost:8080
ServerName *.blog.myblog.org
< VirtualHost localhost:8080>
DocumentRoot /blog.myblog.org/public_html/
< Directory "/blog.myblog.org/public_html" >
AllowOverride All
Options All
Order allow,deny
Allow from all
< / Directory>
ErrorLog logs/blog.myblog.org-error_log
CustomLog logs/blog.myblog.org-access_log combined
< / VirtualHost>
< VirtualHost localhost:8080 >
ServerName myotherweb.com
DocumentRoot /myotherweb.com/public_html/
< Directory "/myotherweb.com/public_html" >
AllowOverride All
Options All
Order allow,deny
Allow from all
< / Directory >
ErrorLog logs/myotherweb.com-error_log
CustomLog logs/myotherweb.com-access_log common
< / VirtualHost>

5. You neew to reload your httpd service
# /etc/init.d/httpd reload

6.  Okay we will set the nginx , if you did not have nginx yet on centos you can insstall it from EPEL repository you can refer to here http://www.cyberciti.biz/faq/rhel-fedora-install-configure-nginx-php5/

Okay we will set the nginx.conf on /etc/nginx/nginx.conf
# vi /etc/nginx/nginx.conf

#user nginx;
user apache;
worker_processes 10;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/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"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
gzip on;
server {
listen 80;
server_name blog.myblog.org *.blog.myblog.org;
# Main location
location / {
proxy_pass http://127.0.0.1:8080/;
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;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
location ~ wp-login.php$ {
root /blog.myblog.org/public_html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index wp-login.php;
fastcgi_param SCRIPT_FILENAME /blog.myblog.org/public_html$fastcgi_script_name;
include fastcgi_params;
}
# Static files location
location ~*^.+^.+^.+.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$ {
root /blog.myblog.org/public_html;
# if the requested file exists, return it immediately
if (-f $request_filename) {
break;
}
set $supercache_file '';
set $supercache_uri $request_uri;
if ($request_method = POST) {
set $supercache_uri '';
}
# Using pretty permalinks, so bypass the cache for any query string
if ($query_string) {
set $supercache_uri '';
}
if ($http_cookie ~* "comment_author_|wordpress|wp-postpass_" ) {
set $supercache_uri '';
}
# if we haven't bypassed the cache, specify our supercache file
if ($supercache_uri ~ ^(.+)$) {
set $supercache_file /wp-content/cache/supercache/$http_host/$1index.html;
}
# only rewrite to the supercache file if it actually exists
if (-f $document_root$supercache_file) {
rewrite ^(.*)$ $supercache_file break;
}
# all other requests go to WordPress
if (!-e $request_filename) {
rewrite . /index.php last;
}
}
# Static files location
location ~*^.+^.+^.+ (jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$ {
root /myotherweb.com/public_html;
}

}
}

you can remove the wp-login.php because i set my wp-login.php to be process with the nginx php_cgi ( i use ldap and ldap session will refer to blog.myblog.org:8080 and i need blog.myblog.org port 80 )

location ~ wp-login.php$ {
root /blog.myblog.org/public_html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index wp-login.php;
fastcgi_param SCRIPT_FILENAME /blog.myblog.org/public_html$fastcgi_script_name;
include fastcgi_params;
}

7. And the final steps is to start your nginx
# /etc/init.d/nginx start
and in my case since i process the wp-login.php on nginx i need to turm on the spawn-fcgi /php_cgi
# /etc/init.d/php_cgi start

8. And that’s it you can start test your sites http://blog.myblog.org

May 26

I have been recommend by my friend to use nginx for my wpmu server and compare it with the wpmu apache server, hmm an interesting idea, but since there is no server that available i need to wait until i get my hands on the available remain server. Okay the question know what is nginx actually , and do i need to use Ubuntu as the OS, since i see alot of big domain using freebsd and nginx so why not if i am trying Freebsd, if you want anotehr review about nginx and another web server click here

What is nginx ?

a lightweight web server/reverse proxy and e-mail (IMAP/POP3) proxy, licensed under a BSD-like license

okay i will try to install nginx from FreeBSD ports

1. Go to nginx Freebsd port and start the installation

# cd /usr/ports/www/nginx

# make clean install

You will see a choice of module component, you can choose what ever you want. Here is my choice:

HTTP_MODULE
HTTP_REWRITE_MODULE
HTTP_SSL_MODULE
HTTP_STATUS_MODULE

2. Install php from the Freebsd ports

# cd /usr/ports/lang/php5
# make clean install

you will see another php module that you can pick for the php installation, i choose this module:
CLI
CGI
SUHOSIN
IPV6
FASTCGI
PATHINFO

3. Installing php-fpm

php-fpm – is a patch for php4/5 to greatly improve FastCGI SAPI usage in production, click here for more reference about php-fpm advantage/ features

#wget http://php-fpm.anight.org/downloads/freebsd-port/php-5.2.6-fpm-0.5.9.tar.gz

extract  move it to ports directory and delete the sourcecode

# tar xvzf php5-fpm.5.2.6.tar.gz –-directory=/usr/ports/lang && rm php5-fpm.5.2.6.tar.gz

move to php5-fpm ports directory and installed
# cd /usr/ports/lang/php5-fpm/ && make install

Again you will see list of module , and i choose:

CLI
SUHOSIN
PATHINFO

4. We need to configuring and update the nginx and php-fpm on rc.conf

# ee /etc/rc.conf

Scroll down and add :

nginx_enable=”YES”
php_fpm_enable=”YES”

5. We also need to configure nginx.conf on /usr/local/etc/nginx/nginx.conf and edit the root directory path and add php component

# ee /usr/local/etc/nginx/nginx.conf

location / {
root /usr/local/www/data;
index index.php index.html index.htm;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/www/data$fastcgi_script_name;
include fastcgi_params;
}

i use /usr/local/www/data as my root directory that is why you need to set fastcgi_param SCRIPT_FILENAME to /usr/local/www/data$fastcgi_script_name if not you will found this error when you access your php file:

“No input file specified.”

6. We need to edit php-fpm.conf to specify the user and group for php-fpm

#ee /usr/local/etc/php-fpm.conf

Find these lines :

<!– <value name=”user”>nobody</value> –>
<!– <value name=”group”>nobody</value> –>

change nobody into www

<value name=”user”>www</value>

<value name=”group”>www</value>

7. Now you need tostart the nginx and php-fpm service

# /usr/local/etc/rc.d/php-fpm start
# /usr/local/etc/rc.d/nginx start

8. NOw  you just need to test your nginx and php-fpm by going to your file www root and create phpinfo page to see the php version
# cd /usr/local/www/data

ee test.php
<?
phpinfo();
?>

Now access it:

http://localhost/test.php

nginx1

nginx2