ปรับ Directadmin เพิ่มความแรงให้ Server ด้วย Nginx

โอ้ย server เราช้าอีกแล้ว… ลูกค้าบ่นๆๆๆๆ เชียวเลย

ไหนลองดูสิช่วงแรกๆ เร็วนัก ใช้ไปสักพักก็เริ่มช้าลงๆๆๆๆ ตรวจสอบดูโอ้แม้เจ้าลูกค้า upload อะไรเพียบไปหมด ไหนจะ mp3,exe,รูปภาพ,ฯลฯ traffic กระจายเชียว

แหมโฮสเราก็เล่นแบบ unlimit เสียด้วยสิ งานนี้แก้ไงละ

ก็ไอ้ apache ของเรานี้มันเล่นอ่านไฟล์ไว้ในหน่วยความจำเสียหมดอย่างนี้มันก็ช้าสิ…

งานนี้เราก็ต้องหาข้อมูลเพื่อทำให้มันเร็วขึ้นให้ได้ แนวทางอาจใช้ squid proxy อึมมันก็ดีเร็วขึ้น แต่ squid มันก็ cache ไฟล์ได้จำกัดเหมือนกัน

เอ้างั้นลองวิธีนี้ดูดีกว่าเรียกว่าเอามามิกซ์ซะดีมั้ย

มาดูกัน Apache นั้นมันใช้กับ Dynamic Script ได้ดี พวก php นะ มันใช้ได้ดี แต่ไฟล์ที่มันเป็น Static มันไม่ค่อยจะดีเอาเสียเลยว่ามั้ย

ส่วน Nginx มันก็ใช้ Static ได้ดีเหลือเกินใช้ RAM ก็น้อยด้วย งั้นเราก็ต้องเอามาใช้ประโยชน์เสียแล้วละ

แนวคิด ไฟล์ที่เป็น Static ก็ให้เจ้า Nginx มันทำไป ส่วนพวก PHP เราก็ให้เจ้า Apache มันทำไป (เออเข้าท่าแฮะ)

ขั้นตอนการทำให้ Directadim ของเราทำตามแนวคิดที่ว่ามานี้

ก่อนอื่นเรามาเพิ่มประสิทธิภาพของ Apache กับ PHP ด้วย Fcgi กันก่อน ไปที่ blog คุณ Icez ตาม link นี้ http://www.icez.net/blog/389/directadmin-mod_fcgid-php-fastcgi (หากไม่ใช้ fcgi ก็ไม่ต้องติดตั้งก็ได้ครับ)

เอาหละถ้าใครทำเสร็จแล้วเราก็มาต่อกันเลย (อันนี้ผมทำใน Debian นะครับพอดีผมไม่ได้เล่น centos ใครใช้ centos วิธีการคงไม่ต่างกันมาก)

ลง Nginx กันก่อน ดาวน์โหลดเวอร์ชั่นล่าสุดที่นี่เลย http://nginx.org/en/download.html

แตก tar ซะ

tar xvf nginx-0.9.4.tar.gz

cd nginx-0.9.4

./configure --sbin-path=/usr/local/sbin --with-http_ssl_module

make

make install

จากนั้นแก้ไขไฟล์ config

vim /usr/local/nginx/conf/nginx.conf

[color="#FF0000"]user apache apache;

worker_processes 4;

worker_rlimit_nofile 150000;

error_log /var/log/nginx/error_log;

pid /var/run/nginx/nginx.pid;

events {

worker_connections 25000;

}

http {

include       mime.types;

default_type  application/octet-stream;       



log_format  main  '$remote_addr - $remote_user [$time_local] $status '

                  '"$request" $body_bytes_sent "$http_referer" '      

                  '"$http_user_agent" "$http_x_forwarded_for"';       



access_log  /var/log/nginx/access.log  main;



limit_zone   one  $binary_remote_addr  10m;

limit_conn   one  7;                       

limit_rate         512K;                   

limit_zone cglob $binary_remote_addr 16m;



client_header_timeout       60;

client_body_timeout         60;

send_timeout                120;

proxy_read_timeout          60; 

proxy_connect_timeout       60; 

proxy_send_timeout          180;



msie_padding                on;



proxy_buffer_size           32K;

proxy_buffers               64 512K;

proxy_busy_buffers_size     1024K;  

proxy_temp_file_write_size  1024K;  



gzip on;

gzip_min_length  10240;

gzip_buffers     32 64k;

gzip_types       application/x-javascript text/css text/xml text/plain;



client_header_buffer_size   4K;

client_max_body_size        100000000;

large_client_header_buffers 16 8K;    



sendfile            on;

tcp_nopush          on;

tcp_nodelay         on;



output_buffers   32 256k;

postpone_output  1460;   



lingering_time     30;

lingering_timeout  6; 

reset_timedout_connection  on;



keepalive_timeout  20;

server_names_hash_bucket_size 10240;

server {

    listen       **IP ของ server เรานะ**:85 default rcvbuf=8192 sndbuf=16384;

    server_name  localhost;

    access_log  /var/log/httpd/access_log  main;

    error_log   /var/log/nginx/error_log info;



    location / {

                proxy_pass         http://**IP ของ server เรานะ**/;

                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;

            }

    # Main Static files location

    location ~* ^/(phpmyadmin|webmail|squirrelmail|uebimiau|roundcube)/.+\.(jpg|jpeg|gif|png|ico|css|zip|tar|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|wav|bmp|rtf|js|wmv|avi|cur|swf|mp3|wma|htc|cur)$ {

                    root /var/www/html/;

                    expires      30d;

                    access_log        off;

     }

     # MRTG

        location ~* ^/(stats)/.+\.(jpg|jpeg|gif|png|html|htm)$ {

        root /var/www/html/;

        access_log        off;

    }



    #Static files location

    location ~* ^.+\.(jpg|jpeg|gif|mp3|png|avi|vob|mpg|mpeg|mp4|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|wav|bmp|rtf|js)$ {

        root /var/www/html;

    }

}

include /usr/local/nginx/etc/virtual.conf;

}[/color]

จากนั้นเราก็สร้างไฟล์ดังนี้

ไฟล์ที่ 1

vim /usr/local/directadmin/data/templates/custom/nginx.conf

[color="#FF0000"]server {

    listen       |IP|:85;

    server_name  |DOMAIN| www.|DOMAIN| |SERVER_ALIASES|;

    access_log /var/log/httpd/domains/|DOMAIN|.log  main;

    error_log  /var/log/httpd/domains/|DOMAIN|.error.log error;

    location / {

                    proxy_pass         http://|IP|;

                    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 60;

                    proxy_send_timeout 90;

                    proxy_read_timeout 90;

                    

                    

                    proxy_buffer_size 4k;

                    proxy_buffers 120 64k;

                    proxy_busy_buffers_size 64k;

                    proxy_temp_file_write_size 64k;

                    

                }

location @back {

	    proxy_pass         http://|IP|;

	    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;

    }

    #Static files location

location ~* ^.+\.(jpg|jpeg|gif|mp3|png|avi|vob|mpg|mpeg|mp4|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|wav|bmp|rtf|js)$ {

        root |HOME|/domains/|DOMAIN|/public_html;

        expires 14d;

        error_page   404  =  @back;

    }

}

[/color]

ไฟล์ที่ 2

vim /usr/local/directadmin/scripts/nginx_direct.sh

[color="#FF0000"]#!/bin/bash

NGINXHOST=/usr/local/nginx/etc/virtual.conf;

PATH_CONF=/usr/local/directadmin/data/users;

NGINXTEMPATE=/usr/local/directadmin/data/templates/custom/nginx.conf;

NGINXSUBTEMPATE=/usr/local/directadmin/data/templates/custom/nginx_sub.conf;

HOLD=/tmp/nginx.conf.$$;

showHelp() {

echo “Rewrite all users’s nginx.conf from template:”;

echo "$0 all ";

echo “Rewrite users nginx.conf :”;

echo “$0 -u username”;

echo “For useing modify nginx.conf , you mast create file:”;

echo “/usr/local/directadmin/data/users/USERNAME/domains/DOMAIN_NAME.custom_nginx with modify config.”;

}

do_exit() {

exit 1;

}

check_user(){

  if [ "$1" = "" ] ; then

#echo "User not exit";

return 1;

  else 

return 0;

 fi

}

check_domain()

{

if [ ! -s $1 ];then

    return 1;

else 

    return 0;

fi

}

user_configs(){

_UHOME=grep -e "^${1}:" /etc/passwd | cut -d: -f6;

_USER=$1;

_DOMAINLIST=${PATH_CONF}/$_USER/domains.list;

_NGINXCONF=${PATH_CONF}/$_USER/nginx.conf;

if ! check_user $_UHOME; then

return 1;

fi

if ! check_domain $_DOMAINLIST; then

return 1;

fi

_UIP=cat ${PATH_CONF}/$_USER/user.conf | grep ip= | cut -d= -f2;

if [ ! -f $_NGINXCONF ]

then

    echo "include $_NGINXCONF;" >> $NGINXHOST;

else

    cat $_NGINXCONF > $HOLD;

    rm -rf $_NGINXCONF;

fi

for i in cat $_DOMAINLIST; do

    if [ -f ${PATH_CONF}/$_USER/domains/$i.custom_nginx ]

    then

cat ${PATH_CONF}/$_USER/domains/$i.custom_nginx >> $_NGINXCONF;

    else

    if [ -f ${PATH_CONF}/$_USER/domains/$i.pointers ]

    then

            for j in `cat ${PATH_CONF}/$_USER/domains/$i.pointers | awk -F= '{print $1}' `; do

                    park=`echo "$park $j www.$j"`;

            done

    fi

    if ! cat $NGINXTEMPATE | sed 's#|HOME|#'$_UHOME'#g' | sed 's!|DOMAIN|!'$i'!g' |sed 's/|SERVER_ALIASES|/'"$park"'/' | sed 's!|IP|!'$_UIP'!'  | sed 's!|USERNAME!'$1'!' >> $_NGINXCONF; then

if [ -f  $HOLD ]; then

    cat $HOLD > $_NGINXCONF;

 fi

return 1;

    fi

    fi

    for l in `cat ${PATH_CONF}/$_USER/domains/$i.subdomains`; do

           cat $NGINXSUBTEMPATE | sed 's#|HOME|#'$_UHOME'#g' | sed 's!|DOMAIN|!'$i'!g'|sed 's/|SUB|/'$l'/g' | sed 's!|IP|!'$_UIP'!' | sed 's!|USERNAME|!'$1'!' >> $_NGINXCONF;

    done

    park=""; 

done

if [ -f $HOLD ]; then

rm -rf $HOLD;

fi

}

doAll(){

for i in ls /usr/local/directadmin/data/users/; do

user_configs $i;

done

}

case “$1” in

all) doAll;

    ;;     

-u) user_configs $2;

    ;;

* ) showHelp;

    do_exit 0;

    ;;

esac

do_exit 0;

[/color]

ไฟล์ที่ 3

vim /usr/local/directadmin/scripts/nginx_task.sh

[color="#FF0000"]#!/bin/bash

if [ -f /usr/local/nginx/etc/task.nginx ]; then

cat /usr/local/nginx/etc/task.nginx | sort -u > /usr/local/nginx/etc/task.nginx.do

rm -rf /usr/local/nginx/etc/task.nginx

while read LINE

do

echo sh $LINE;

done < /usr/local/nginx/etc/task.nginx.do

rm -rf /usr/local/nginx/etc/task.nginx.do

/etc/init.d/nginx reload

fi

[/color]

ไฟล์ที่ 4

vim /usr/local/directadmin/scripts/nginx_del.sh

[color="#FF0000"]#!/bin/bash

USER_CONF=“include /usr/local/directadmin/data/users/$1/nginx.conf;”;

if cp /usr/local/nginx/etc/virtual.conf /usr/local/nginx/etc/virtual.conf.bak; then

rm -rf /usr/local/nginx/etc/users/$1;

STR="/usr/bin/perl -pi -e 's#$USER_CONF##' /usr/local/nginx/etc/virtual.conf.bak";

eval ${STR};

sed '/^$/d' /usr/local/nginx/etc/virtual.conf.bak &gt; /usr/local/nginx/etc/virtual.conf;

rm -rf /usr/local/nginx/etc/virtual.conf.bak

fi

[/color]

จากนั้นเอาข้อความนี้

echo “/usr/local/directadmin/scripts/nginx_direct.sh -u $username” >> /usr/local/nginx/etc/task.nginx

ใส่ในไฟล์รายชื่อด้านล่าง หากไม่ไฟล์อยูแล้วให้เพิ่มลงไป หากยังไม่มีไม่ไฟล์ให้สร้างขั้น ไฟล์ทั้งหมดอยู่ใน folder /usr/local/directadmin/scripts/custom นะครับ

domain_create_post.sh

domain_destroy_post.sh

domain_pointer_create_post.sh

domain_pointer_destroy_post.sh

subdomain_create_post.sh

subdomain_destroy_post.sh

user_create_post.sh

ส่วน user_destroy_post.sh ให้ใส่ว่า /usr/local/directadmin/scripts/nginx_del.sh $username

ทำการเปลี่ยนเจ้าของไฟล์ซะ

chown diradmin:diradmin -R /usr/local/directadmin/scripts/*

เปลี่ยน mode ไฟล์ด้วยนะ

chmod a+x /usr/local/directadmin/scripts/custom/*.sh

chmod a+x /usr/local/directadmin/scripts/*.sh

เพิ่มใน crontab ด้วนะ

crontab -e

          • /usr/local/directadmin/scripts/nginx_task.sh

ที่นี้เราก็ปรับ IPtable ให้มันเตะ port 80 เข้าที่ Nginx เลย

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 85

ปรับ IP ให้ตรง http://www.icez.net/blog/131/แก้ปัญหา-ip-ใน-log-apache-ไม่ตรง

ลองดูนะครับ เนื่องจากผมเขียนรวดเดียวจบอาจมีข้อผิดพลาดนะครับ อ้างอิง

http://directadm.in/nginx#use_nginx_as_proxy

ขอบคุณครับ

ขอบคุณสำหรับการแบ่งบันครับ +1

มีอีกวิธีคือเอา nginx มารันแทน apache ไปเลย

ประหยัดแรมไปได้เยอะ

แหมท่านก็ จริงๆ ก็อยากอยู่ครับ แต่ไม่เป็นอ่ะครับ คุณ icez ก็เขียนเป็นแนวทางหน่อยสิครับ แบบว่าเปลี่ยน Directamin ที่ใช้ Apache ไปเป็น Nginx แบบนี้ เดียวผมจะลองเปลี่ยนตามคนแรกเลยเอ้า…

ขอบคุณค้าบพี่โป้ง +1

ต้องหาเครื่องลองซะแล้ว ขอบคุณครับ

โฮสติ้งของผมก็ใช้ Nginx เป็น reverse proxy เหมือนกันครับ ใช้งานได้ดีทีเดียว

ขอบคุณสำหรับการแบ่งปันวิธีทำครับ คงจะเห็นหลายๆโฮสต์หันมาใช้ Nginx กันมากขึ้น

ขอบคุณครับว่าจะลอง ยังไม่ได้ลองทำสักทีง่วง เขียน app อย่างเดียวเลย ^^

Bookmarks ไว้ ยังไม่ได้ลองซะที

http://www.directadmin.com/forum/showthread.php?t=20133

+1 ครับ

ขอบคุณมากครับ

ลืมนึกไป ทำจริง rewrite ไม่ได้กันพอดี

หมายความว่าถ้าจะใช้ Mod_Rewrite ต้อง Apache เท่านั้นหรือครับ Ice

ต้องบอกว่า ถ้าจะใช้ .htaccess ต้อง apache เท่านั้นครับ

ไม่รวม litespeed นะ อันนั้นขาย

ถ้าทำ hosting ยังไงก็ต้องมี .htaccess ครับ script ใช้เยอะมาก

ยอดเยี่ยม เดี๋ยวเครื่องใหน static file เยอะๆ จะลองเอาไปปรับใช้ดู

เข้ามาศึกษาครับ ขอบคุณครับ

พอดีลงเล่นใน VZ ครับ

[root@cent64bit-nginx ~]# iptables -t nat -A PREROUTING -i venet0:1 -p tcp --dport 80 -j REDIRECT --to-port 85

iptables: Unknown error 18446744073709551615

กับมาที่ OpenVZ

vi /etc/vz/vz.conf

เพิ่ม ipt_REDIRECT iptable_nat

IPv4 iptables kernel modules

IPTABLES=“ipt_REDIRECT iptable_nat ipt_REJECT ipt_tos ipt_limit ipt_multiport iptable_filter iptable_mangle ipt_TCPMSS ipt_tcpmss ipt_ttl ipt_length”

Restart OpenVZ

#Check iptable_nat

lsmod | grep nat

#Check rule

vzctl exec VZID iptables -t nat -nvL

ก็จะเพิ่ม ได้ปกติครับ

ผิดพลาดประการใด รบกวนชี้แนะด้วยครับ

ไม่แน่ใจผิดพลาดอย่างไรไหมครับ

พวกภาพไม่ขึ้น ขึ้น 404 Not Found หมดเลย

แต่ก็เช็คแล้วว่า หากเป็น static file รันผ่าน nginx ครับ

สั่ง /usr/local/directadmin/scripts/nginx_direct.sh all

แล้วครับ

ก็ยังไม่ได้

มารายงานต่อว่าได้แล้วครับ


จากด้านบ้าน

ให้สร้างไฟล์ /usr/local/nginx/etc/virtual.conf เปล่าๆ ไว้ด้วยครับ หากไม่สร้างจะ error file not found


#Run every 2 minutes

crontab -e

*/2 * * * * root /usr/local/directadmin/scripts/nginx_task.sh


เมื่อทำการติดตั้งดังที่แนะนำด้านบน

สั่ง /usr/local/directadmin/scripts/nginx_direct.sh all

เพื่อ rewrite Nginx ไปยัง ทุกๆ user


เพิ่มเติมให้ คือ script สำหรับ สั่ง service ของ nginx

http://www.hikaro.com/linux/centos/nginx-init-script.html#

vi /etc/init.d/nginx

#!/bin/sh

#

# nginx - this script starts and stops the nginx daemin

# Taken from http://www.hikaro.com

# chkconfig:   - 85 15 

# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \

#               proxy and IMAP/POP3 proxy server

# processname: nginx

# config:      /usr/local/nginx/conf/nginx.conf

# pidfile:     /usr/local/nginx/logs/nginx.pid

 

# Source function library.

. /etc/rc.d/init.d/functions

 

# Source networking configuration.

. /etc/sysconfig/network

 

# Check that networking is up.

[ "$NETWORKING" = "no" ] && exit 0

 

nginx="/usr/local/sbin/nginx"

prog=$(basename $nginx)

 

NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"

 

lockfile=/var/lock/subsys/nginx

 

start() {

    [ -x $nginx ] || exit 5

    [ -f $NGINX_CONF_FILE ] || exit 6

    echo -n $"Starting $prog: "

    daemon $nginx -c $NGINX_CONF_FILE

    retval=$?

    echo

    [ $retval -eq 0 ] && touch $lockfile

    return $retval

}

 

stop() {

    echo -n $"Stopping $prog: "

    killproc $prog -QUIT

    retval=$?

    echo

    [ $retval -eq 0 ] && rm -f $lockfile

    return $retval

}

 

restart() {

    configtest || return $?

    stop

    start

}

 

reload() {

    configtest || return $?

    echo -n $"Reloading $prog: "

    killproc $nginx -HUP

    RETVAL=$?

    echo

}

 

force_reload() {

    restart

}

 

configtest() {

  $nginx -t -c $NGINX_CONF_FILE

}

 

rh_status() {

    status $prog

}

 

rh_status_q() {

    rh_status >/dev/null 2>&1

}

 

case "$1" in

    start)

        rh_status_q && exit 0

        $1

        ;;

    stop)

        rh_status_q || exit 0

        $1

        ;;

    restart|configtest)

        $1

        ;;

    reload)

        rh_status_q || exit 7

        $1

        ;;

    force-reload)

        force_reload

        ;;

    status)

        rh_status

        ;;

    condrestart|try-restart)

        rh_status_q || exit 0

            ;;

    *)

        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"

        exit 2

esac

save the code and execute

chmod +x /etc/init.d/nginx

make it start when the server run

/sbin/chkconfig nginx on

to check it

/sbin/chkconfig --list nginx

check the function if it works

service nginx start

service nginx stop

service nginx restart

service nginx reload

service nginx configtest

service nginx status

แก้ตรง nginx=“/usr/local/nginx/sbin/nginx”

เป็น nginx=“/usr/local/sbin/nginx”

หลังจากนั้นสั้ง service nginx restart

เมื่อสักครู่เผลอ ลบ /sbin

สั้ง reinstall โดยสั้ง

rpm -qa --queryformat "%{NAME}.%{ARCH}
"|xargs yum -y reinstall

ขอบคุณไอซ์มากมาย.

จริงลง nginx ด้วย yum ก็ได้

ถ้า debian ก็ apt-get