WPMU Multi Subdomain กับ Nginx เขียนเมื่อ 2011.08.09 โดย

เป็นเรื่องมาจากประสบการณ์ติดตั้ง (ย้าย) WPMU ครั้งแรก ย้ายจาก Apache แยก MySQL มารวมกันบนเครื่องเดียว ปัญหาไม่ใช่เรื่องการติดตั้ง ทำเสร็จอย่างง่ายดาย ปัญหาคือระบบ multi-site ที่ทำงานไม่ถูกต้อง คือไม่ว่าจะเข้าหน้า home ของ subdomain ไหนแล้วไปเข้า subdomain อื่นก็จะเป็น home ของ subdomain แรก หลังจาก clear wp-cache แล้วก็หายทำงานได้ แต่ก็จะเป็นอาการเดิมอีก นั่นคือ URI สำหรับหน้า home (URI = /) ไม่ได้แยกแต่ละ subdomain ไว้ หรือก็คือตัว WPMU ไม่ได้รับค่า HTTP_HOST ที่ถูกต้อง

เมื่อทำการ
<?php
print $_SERVER["HTTP_HOST"];
?>

ก็จะได้ค่า $_SERVER["HTTP_HOST"] เป็น wildcard (*.domain.com)

บน Nginx เราสามารถส่งค่า parameter ตามที่ต้องการผ่านไปยัง cgi script ได้ด้วยคำสั่ง fastcgi_param โดยมีรูปแบบ
fastcgi_param <parameter name> <value>

ดังนั้นจึงเพิ่ม
fastcgi_param HTTP_HOST $host;

โดยตัวแปร $host นั้นตัว Nginx ทำการส่งค่ามาให้อยู่แล้วเป็นค่า host ที่ได้จาก http request จากนั้นเมื่อเราทำการตรวจสอบก็จะพบว่ามีค่า $_SERVER["HTTP_HOST"] ได้รับมาอย่างถูกต้องแล้ว

แต่เมื่อทำการทดสอบจริงกลับได้ผลเหมือนเดิม จึงทำการ
<?php
print_r($_SERVER);
?>
ยังมีอีกตัวแปรที่ได้ค่าไม่ถูกต้องคือ $_SERVER["SERVER_NAME"] ซึ่ง Nginx ส่งค่า $server_name ให้เป็นค่าปริยาย ดังนั้นเราก็ทำการเพิ่ม
fastcgi_param SERVER_NAME $host;


หลังจากเพิ่มทั้ง 2 ค่าแล้ว WPMU ก็สามารถทำงานได้อย่างถูกต้อง
ส่วนของ rewrite rule นั้น แปะไว้เป็นบันทึกเผื่อท่านใดต้องการนำไปใช้
index index.html index.php;
root /var/www/html;
rewrite ^.*/files/(.*) /wp-content/blogs.php?file=$1;

location / {
try_files $uri $uri/ /index.php?q=$uri;

if (!-e $request_filename) {
rewrite ^.+/?(/wp-.*) $1 last;
rewrite ^.+/?(/.*\.php)$ $1 last;
rewrite . /index.php last;
}
}

location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
}

อย่าลืมเปลี่ยนค่า root เป็น path ของ WPMU ของท่านด้วย



คำเตือนคำเตือน เนื้อหาต่างๆ ในบทความ รวมถึงรูปภาพทั้งหมดในบทความนี้ เป็นความเห็นส่วนตัวของผู้เขียนแต่ละคน ซึ่งแต่ละคนได้ทำการลงทะเบียน และเขียนบทความลงใน Modoeye Articles นี้โดยไม่มีค่าธรรมเนียมใดๆ บทความเหล่านี้เป้าหมายเพื่อการศึกษา และความบันเทิงเท่านั้น การนำส่วนหนึ่งส่วนใดของบทความไปใช้งาน ควรทำการอ้างอิงถึงผู้เขียนและแหล่งที่มาด้วย