โอ้ย 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 > /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-ไม่ตรง
ลองดูนะครับ เนื่องจากผมเขียนรวดเดียวจบอาจมีข้อผิดพลาดนะครับ อ้างอิง