ปรับปรุงล่าสุด 11/09/2011 11.15 น. แก้ไขให้รองรับสำหรับคนใช้ csf รุ่นใหม่
ก่อนอื่นแจ้งว่าที่ไม่อยากโพสในกระทู้เดิมเพราะค่อนข้างยาวและรายละเอียดต่างกันพอสมควรครับ. จากกระทู้เดิมผมลองแล้วชอบทุกอย่างยกเว้น
- เวลาสร้าง user ใหม่พบว่ารูปไม่ขึ้นต้องสั่งตามด้านล่าง (เครดิต น้องมีน) ซึ่งถ้ามี user จ่ายผ่าน paypal กลางคืนเช้าเมล์เข้าแล้วบ่นว่ารูปไม่ขึ้น. (ปัญหานี้อาจเป็นกับผมคนเดียวและไม่สามารถถือว่าเป็นปัญหาที่มาจากกระทู้เดิมได้)
rm -f /usr/local/directadmin/data/users/*/nginx.conf
cat /dev/null > /usr/local/nginx/etc/virtual.conf
#Rewrite All
/usr/local/directadmin/scripts/nginx_direct.sh all
- ผมไม่รู้ว่า ทำไมต้อง run cron ผมไม่อยาก cron คำสั่งอะไรที่ผมไม่รู้แน่ชัดว่าทำไปเพื่ออะไร.
crontab -e
* * * * * /usr/local/directadmin/scripts/nginx_task.sh
- ผมไม่ต้องการแก้ไขอะไรกับ DA ด้วย file ที่ไม่ใช่ Official release จาก Directadmin.com ผมเคยเมล์ถาม john (DA support) เกี่ยวกับ nginx ได้คำตอบว่าไม่มีนโยบายเกี่ยวกับ nginx เลย. ดังนั้นผมจะไม่จับ nginx ไปยุ่งกับ DA เลยนี่คือโจทย์ของผม
โอเคเริ่มเลยแล้วกัน. วิธีด้านล่างสามารถใช้ได้ทั้ง Cli และ CGI โดยไม่ต้องยุ่งกับ Directadmin เลย และไม่ต้องปรับค่า unlimit (อันหลังตรง unlimit ผมไม่ชัวร์นะครับเพราะไม่รู้ว่าแต่ละเครื่องต่างกันหรือเปล่าแต่โดยส่วนตัวผมไม่ได้รับค่านี้เลย. แต่โดยหลักแล้ว nginx run ด้วย user คือ apache อะไรที่ apache ทำได้ nginx ก็ควรจะทำได้เหมือนกัน). ข้อมูลเกี่ยวกับ server ของผมที่ผมใช้ test คือ
apache 2.2.19
php 5.2.16 + suhosin patch + complie แบบ cli
ขั้นตอนที่ 1: ติดตั้ง nginx ก่อน โดยผมจะติดตั้งเพิ่ม 3 module
wget http://nginx.org/download/nginx-1.1.0.tar.gz
tar xvfz nginx-1.1.0.tar.gz
cd nginx-1.1.0
./configure --sbin-path=/usr/local/sbin --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module
make
make install
ดูจากกระทู้เดิมผมยังไม่เข้าใจว่าในไฟล์ nginx.conf สั่ง gzip ได้ยังไงเพราะยังไม่ติดตั้ง mod หรือว่า gzip มีอยู่แล้วใน linux อันนี้ผมไม่แน่ใจจริง ๆ ค่อนข้างจะ งง ๆ
ขั้นตอนที่ 2: แก้ไขไฟล์ nginx.conf + สร้าง dir เก็บ log
nano -w /usr/local/nginx/conf/nginx.conf
โดย code ที่ผมใช้ประยุกต์มาจากกระทู้เก่า (ห้ามเป็นนักกอล์ฟนะครับมีส่วนที่ต้องแก้ ip ด้วยแก้ก่อนเอาไปใช้นะครับ)
user apache apache;
worker_processes 4; # Set it according to what your CPU have. 4 Cores = 4
worker_rlimit_nofile 8192;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include 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"';
server_tokens off;
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error_log debug;
server_names_hash_bucket_size 64;
sendfile on;
tcp_nopush on;
tcp_nodelay off;
keepalive_timeout 30;
gzip on;
gzip_comp_level 9;
gzip_proxied any;
proxy_buffering on;
proxy_cache_path /usr/local/nginx/proxy_temp levels=1:2 keys_zone=one:15m inactive=7d max_size=1000m;
proxy_buffer_size 16k;
proxy_buffers 100 8k;
proxy_connect_timeout 60;
proxy_send_timeout 60;
proxy_read_timeout 60;
server {
listen [color="#FF0000"][b]ไอพีของคุณเองนะ[/b][/color]:85 default rcvbuf=8192 sndbuf=16384 backlog=32000; # Real IP here
server_name domain.name _ ; # "_" is for handle all hosts that are not described by server_name
charset off;
access_log /var/log/nginx/nginx_host_general.access.log main;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://[color="#FF0000"][b]ไอพีของคุณเองนะ[/b][/color]; # Real IP here และไม่มี / ปิดท้าย
client_max_body_size 16m;
client_body_buffer_size 128k;
proxy_buffering on;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 120;
proxy_buffer_size 16k;
proxy_buffers 32 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
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;
}
location ~* ^/(stats)/.+\.(jpg|jpeg|gif|png|html|htm)$ {
root /var/www/html/;
access_log off;
}
location ~* ^/(mrtg|imrtg)/.+\.(jpg|jpeg|gif|png|html|htm)$ {
root /var/www/html/;
access_log off;
}
location /nginx_status {
stub_status on;
access_log off;
allow [color="#FF0000"][b]ใส่ไปตามต้องการ[/b][/color]; # Real IP here
allow 127.0.0.1;
deny all;
}
}
# เพื่อไว้สำหรับคนที่จะแยกค่า conf นะครับ. ไฟล์ตามด้านล่างของผมคือไฟล์ว่างเปล่า
include /usr/local/nginx/etc/*.conf;
}
อย่าลืมสร้าง Dir คือ
/var/log/nginx
และสร้างไฟล์
touch access.log
touch error_log
touch nginx_host_general.access.log
ขั้นตอนที่ 3: สร้างไฟล์เพื่อ start/stop/restart nginx service + pid
ต้องสร้าง pid ตามที่ระบุไว้ในไฟล์ .conf ตามข้อสองด้วยครับ
touch /var/run/nginx.pid
จากนั้นสร้างไฟล์เพื่อ start/stop/restart nginx service
touch /etc/init.d/nginx
จากนั้นแก้ไขโค๊ด
nano -w /etc/init.d/nginx
ใส่ค่าคือ (เครดิต http://www.hikaro.com/linux/centos/nginx-init-script.html )
#!/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
เปลี่ยน mod ด้วยครับ
chmod +x /etc/init.d/nginx
ขั้นตอนที่ 4: ทดสอบก่อนใช้งานจริง (สำคัญมาก)
ให้สั่ง
service nginx restart
จากนั้นลองเข้าเว็บดู
การเทสหนึ่งรูปต้องขึ้นทั้งหมด, สอง mod_rewrite ต้องใช้ได้ทั้งหมด, สามเทส sub domain ต้องทำงานได้ปกติทั้งหมด. ถ้าขาดแม้ข้อเดียวห้ามเปิดใช้งานจริงเพราะไม่ถือว่าเสถียรพอจะใช้ในระดับ sever production ได้.
ขั้นตอนที่ 5: Forward port
5.1 สำหรับคนที่ไม่ได้ใช้ csf (คือใช้ iptables)
ให้สั่ง
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 85
ในกรณีที่เกิดข้อผิดพลาดใด ๆ ก็ตามจะรูปไม่ขึ้นเหมือนตอนที่เทสก็ดีหรือ server load ผิดปกติให้สั่งย้อนคำสั่งด้านบน (เครดิตน้องมีน)
iptables -t nat -D PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 85
หลังจาก FW port แล้วให้ตรวจสอบเว็บไซต์อีกครั้งแบบเดียวกับที่ทำในขั้นตอนที่ 4
5.2 สำหรับคนใช้ csf
เนื่องจาก csf รุ่น version ใหม่ถ้าจะสั่ง FW Port ต้องทำผ่าน csf เท่านั้นทำผ่าน iptables ตรง ๆ ไม่ได้ครับ
วิธีการคือเพิ่ม line
|80||85|tcp
เข้าไปที่ feature “Firewall redirect”
จากนั้น restart csf
ขั้นตอนที่ 6: ติดตั้อง mod_rpaf ให้กับ apache เพื่อให้ log ตรง
(Copy ของคุณ KKE มาเลยจากกระทู้ varnish)
#wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
#tar xzf mod_rpaf-0.6.tar.gz
#apxs -cia mod_rpaf-2.0.c
จากนั้นแก้ไขไฟล์
/etc/httpd/conf/extra/httpd-includes.conf
โดยเพิ่มคำสั่งนี้ไว้ท้ายไฟล์ครับ
LoadModule rpaf_module /usr/lib/apache/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname On
RPAFproxy_ips ไอพีเซิร์ฟเวอร์ของคุณอันเดียวกับที่ใส่ใน nginx แหละ
RPAFheader X-Forwarded-For
ขั้นตอนที่ 7: สั่งให้ nginx ทำงานทันทีเมื่อ restart เครื่องและ save iptables จากข้อ 5
/sbin/chkconfig nginx on
และ
/etc/init.d/iptables save
ข้อมูลควรรู้อื่น ๆ
-
สามารถเข้าดู nginx status ได้โดยพิมพ์ http://ip/nginx_status ตาม stub_status ที่เราสั่งติดตั้งไปจากข้อ 1
-
วิธีเพิ่ม nginx ลงที่หน้าดู service ของ Directadmin (เครดิตคุณแมน KKE)
nano -w /usr/local/directadmin/data/admin/services.status
จากนั้นเพิ่มโค๊ดด้านล่างไปที่ท้ายสุดของไฟล์
nginx=ON
- โดยส่วนตัวผมมองว่า log ของ nginx น่าเบื่อมากและบวมเร็วสุด ๆ ผมดูใน error log พบว่า log ส่วนมากจะเป็น “(110: Connection timed out)”. ผมมองว่า log แบบนี้ผมไม่ต้องการเพราะเกิดขึ้นได้ตลอดเวลาทั้งวันด้วยหลายสาเหตุไม่ว่าคุณจะปรับค่า timeout เพิ่มยังไงก็จะต้องมี error แบบนี้. ส่วน access log ผมก็คิดว่าไม่จำเป็นเพราะ apache ทำการเก็บไว้อยู่แล้วผมไม่อยากให้มีการทำงานซ้ำซ้อน. และเปลือง io ด้วย. ถ้าใครคิดว่าแนวคิดแบบนี้ดีก็แก้ดังนี้นะครับ
แก้ไฟล์ nginx.conf จาก
error_log /var/log/nginx/error_log debug;
เป็น (จะเก็บ error เฉพาะที่สำคัญจริง ๆ เช่น nginx ล่ม start ไม่ขึ้น)
error_log /var/log/nginx/error_log crit;
และ
access_log /var/log/nginx_host_general.access.log main;
แก้เป็น
access_log off;
-
ผลการทดสอบส่วนตัวช่วงวันสองวันนี้คือหลังจากที่พายุเข้าไทยที่ server มีเว็บของศูนย์อุธกวิทยาภาคเหนือตอนบนอยู่และคนเข้ามากมายเพื่อเช็คเรื่องน้ำนี่แหละครับผู้ดูแลเว็บบอกว่าเชียงใหม่น้ำท่วมคนจะเข้ามาดูเว็บมาเพื่อเช็คข้อมูลพอเข้าไปดู apache server status โอ้แม่เจ้ามาเป็นกองทัพเลย. ทำให้ load average ขึ้นไปเยอะพอสมควรคือ 4.xx - 5.xx ตลอด. หลังจากที่ลองใช้ nginx แล้วพบว่า load average กลับมาอยู่ในสถานะปกติอีกครั้งคือ 1-2 ในช่วงปกติ และ 3.xx ในช่วง peak (ช่วง peak ของผมคือตอนเช้าโดยมาจาก exim เป็นหลัก). แต่ทั้งนี้ผลที่ได้จากแต่ละ server ย่อมมีความแตกต่างกันตามปริมาณของการเรียกใช้ static files ถ้าเรียกใช้เยอะอยู่แล้วติด nginx ลงไป load average ก็จะลดลงมากทีเดียวครับ. ยิ่งเป็น server download file จะยิ่งเห็นได้ชัด.
-
ถ้าท่านลองแล้วเจ๊ง PM มาถามผมได้หรือโพสที่กระทู้นี้ได้เลยผมยินดีอย่างยิ่งที่จะช่วยฟรีไม่คิดค่าใช้จ่ายใด ๆ ทั้งสิ้น.
ท้ายสุดผิดพลาดอย่างไรต้องขออภัยไว้ล่วงหน้า Try with your own risk
.