หากต้องการใช้ IPv6 Apache เป็นอีกหนึ่งบริการที่เราต้องไปตั้งค่าให้ถูกต้อง สำหรับค่า config ที่เกี่ยวข้องกับ IPv6 มีดังนี้

  • Listen
  • VirtualHost

มาดูวิธีการกันครับ ค่า Listen จะเป็นการกำหนดว่าเราจะให้ Apache Listen จาก IP Address อะไร port อะไร เช่น Listen 0.0.0.0:80 หรือ Listen 80 ก็คือ Listen IP Address อะไรก็ได้ port ที่ใช้คือ 80 แต่ถ้าต้องการตั้งค่าสำหรับ IPv6 ต้องตั้งค่าอย่างนี้ครับ

Listen [::]:80
Listen 0.0.0.0:80

สำหรับในส่วน VirtualHost ก็ง่ายๆ ใส่ IPAddres ลงใน [] เท่านี้ก็เรียบร้อย

<VirtualHost [2001:db8::a00:20ff:fea7:ccea]>
ServerAdmin webmaster@host.example.com
DocumentRoot /www/docs/host.example.com
ServerName host.example.com
ErrorLog logs/host.example.com-error_log
TransferLog logs/host.example.com-access_log
</VirtualHost>

ทุกวันนี้หลายเว็บคงจะมีเว็บสำหรับ Mobile เพื่อรองรับการเข้าชมของอุปกรณ์ประเภท Smart Phone และ Tablet ซึ่งหากท่านใช้ CMS ที่สามารถแปลงเว็บไซต์จากหน้าเว็บแบบเข้าชมจากเครื่อง PC ไปเป็น Mobile ได้ก็คงไม่เป็นปัญหาอะไรมากนัก แต่ถ้าไม่มีก็คงต้องหาวิธีเขียนโปรแกรมเพื่อตรวจสอบเว็บเบราเซอร์กันเอาเอง วันนี้ผมมีวิธีง่ายๆ ในการ Redirect เว็บไซต์ ให้ถูกต้องตามอุปกรณ์ที่เรียกใช้กันครับ วิธีง่ายๆ ที่ว่าก็คือการใช้ mod_rewrite นี่แหละครับ

มาทำความเข้าใจกันก่อน สมมุติว่าคุณมีเว็บไซต์ที่ให้บริการผู้เข้าชม 2 แบบ คือแบบปกติเข้าชมผ่านเครื่องคอมพิวเตอร์ และแบบ Mobile เข้าชมผ่าน Smart Phone/Tablet มีโดเมนดังต่อไปนี้

  • เว็บปกติ http://www.my-example.com
  • เว็บสำหรับ Mobile http://m.my-example.com

หากผู้เข้าชมเปิดด้วยเครื่องคอมพิวเตอร์ปกติให้ Apache redirect ไปยังเว็บปกติ หากเป็น Smart Phone ก็ redirect ไปยังหน้าเว็บสำหรับ Mobile เงือนไขมีประมาณนี้ครับ มาลงมือกันเลย

เริ่มจากหน้าเว็บปกติคือ www.my-example.com ให้เพิ่ม .htaccess ใน document root ของ virtual host นี้เพื่อสั่ง redirect หากเข้าชมผ่าน Mobile ให้ redirect ไปที่ m.my-example.com เขียน rewrite rules ได้ดังนี้

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} "android|blackberry|googlebot-mobile|iemobile|ipad|iphone|ipod|opera mobile|palmos|webos" [NC]
RewriteRule ^$ http://m.my-example.com/ [L,R=302]
</IfModule>

ในหน้าเว็บ Mobile คือ m.my-example.com ให้เพิ่ม .htaccess ใน document root ของ virtual host นี้เพื่อสั่ง redirect หากเข้าชมผ่านคอมพิวเตอร์ ให้ redirect ไปที่ www.my-example.com เขียน rewrite rules ได้ดังนี้

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} "!(android|blackberry|googlebot-mobile|iemobile|ipad|iphone|ipod|opera mobile|palmos|webos)" [NC]
RewriteRule ^$ http://www.example.com/ [L,R=302]
</IfModule>

เท่านี้ก็เรียบร้อยแล้ว :)

หลายท่านที่ใช้บริการดาวน์โหลดไฟล์ในโครงการ Suriyan, Chantra, ThaiOS และเอกสารใน pub.thaiopensource.org อาจสงสัยว่าทำไมดาวน์โหลดไฟล์ยากจัง? และดาวน์โหลดได้เพียงไม่กี่กิโลไบต์ สาเหตุมาจากการใช้งานที่ท่วมท้นของสมาชิกทำให้เน็ตเวิร์คภายใน SIPA เดี๊ยง ถึงเดี๊ยงที่สุด :P และทีมงาน Thai Open Source ก็โดนดุตามระเบียบ ก็เลยทำให้มีการแจ้งย้ายแหล่งดาวน์โหลดทั้งหมดไปไว้ที่ pub.thaiopensource.org และทำการ shape bandwidth ด้วย modcband เพื่อให้ Apache คุม bandwidth ของเว็บที่ให้ดาวน์โหลดไว้ ให้วิ่งไม่กี่กิโลไบต์ ทำให้ลดเรื่องการใช้ bandwidth เกินกำลัง แต่ปัญหาที่ตามมาคือ ไฟล์ iso ขนาด 1.5GB ใช้เวลาดาวน์โหลดประมาณ 9 วัน TT ใช่ครับ 9 วัน ไร้สาระมากๆ และระยะเวลายิ่งนานผู้ใช้ก็ยิ่งซอยชิ้นของไฟล์ให้มากขึ้น และคิดว่ามันจะช่วยให้ดาวน์โหลดเร็วขึ้นซึ่งนั่นคิดผิดครับ :P ผมก็เลยตัดสินใจ กดเครื่องคิดเลขและเปลี่ยนมาจำกัดจำนวนการเชื่อมต่อของแต่ละ IP ให้ Apache แทน ซึ่งมีวิธีการดังนี้

เครื่องมือที่เรานำมาใช้จำกัดจำนวนการเชื่อมต่อของแต่ละ IP ชื่อ mod_limitipconn ซึ่งเจ้าตัวนี้สามารถกำหนดไดเรคทอรี และชนิดของไฟล์ที่เราต้องการจำกัดจำนวนการเชื่อมต่อได้ ยกตัวอย่างเช่น เว็บไซต์ http://pub.thaiopensource.org/suriyan-archive ในไดเรคทอรี suriyan-archive ทั้งหมดผมต้องการจำกัดการเชื่อมต่อเพื่อดาวน์โหลดไฟล์ iso ที่อยู่ในนั้น เราก็สามารถทำได้ มาดูของจริงกันครับ

ผมมีเว็บ pub.thaiopensource.org ซึ่งเป็น virtual host ของ Apache อยู่แล้วในเว็บนี้มีไฟล์ให้ดาวน์โหลดเยอะแยะ เราจะจำกัดการดาวน์โหลดไฟล์ ในหน้า http://pub.thaiopensource.org/suriyan-archive กันครับ วิธีการง่ายๆ มีดังนี้

ดาวน์โหลด mod_limitipconn มาก่อน

สำหรับ amd64 ใช้

wget http://elonen.iki.fi/code/unofficial-debs/mod-limitipconn/apache2-mod-limitipconn_0.22-2_amd64.deb

สำหรับ i386 ใช้

wget http://elonen.iki.fi/code/unofficial-debs/mod-limitipconn/apache2-mod-limitipconn_0.22-1_i386.deb

จากนั้นสั่งติดตั้งด้วยคำสั่ง

sudo dpkg -i apache2-mod-limitipconn_0.22-2_amd64.deb

หรือ

sudo dpkg -i apache2-mod-limitipconn_0.22-1_i386.deb

จากนั้นสั่งให้ Apache เรียกใช้ module นี้ด้วยคำสั่ง

sudo a2enmod limitipconn

ทีนี้เราก็ไปแก้ไขไฟล์ virualhost ได้แล้ว โดยใส่ข้อมูลไดเรคทอรีที่เราต้องการจะจำกัดจำนวนการเชื่อมต่อดังนี้

<Location /suriyan-archive >
MaxConnPerIP 1
# In this case, all MIME types other than application/x-iso9660-image
# are exempt from the limit check
OnlyIPLimit application/x-iso9660-image
</Location>

จาก config ข้างต้น เราจำกัดการเชื่อมต่อในไดเรคทอรี suriyan-archive ให้มีการเชื่อมต่อต่อ IP Address เพียง 1 การเชื่อมต่อ และจำกัดเฉพาะไฟล์ iso เท่านั้น เพียงเท่านี้คุณก็สามารถจำกัดการเชื่อมต่อให้ Apache ได้แล้ว

ปัญหา DOS และ Brute Force Attack เป็นปัญหาที่หลายๆ คนอาจได้พบบ้าง แต่ถ้า DDOS ก็ตัวใครตัวมันครับ :P ปัญหาเหล่านี้เป็นปัญหายอดนิยม โดยเฉพาะเครื่องที่โดน Attack มักจะมีของสำคัญๆ อยู่ในนั้น เช่น รูปภาพ, ไฟล์ข้อมูล หรือ ตกเป็นเป้าเพื่อใช้ยืมเครื่องไปยิงเครื่องอื่นๆ ต่อ ซึ่งวิธีการที่ยอดฮิดมากคือการยิงผ่านช่องโหว่ของ Web Application ที่เราใช้ๆ กันอยู่อย่างเช่น CMS, โปรแกรมจัดการฐานข้อมูล เป็นต้น หากวัตถุประสงค์เพื่อก่อกวนให้ Apache ทำงานไม่ได้ หรือเครื่องเซิร์ฟเวอร์ทำงานไม่ได้ มักจะโดน DOS หรือ DDOS แต่เราสามารถป้องกันเหตุการณ์เหล่านี้ได้ โดยใช้ fail2ban ครับ

มาวิเคราะห์สถานการณ์กันก่อน คำถามที่ต้องถามตัวเองคือ เราจะทราบได้อย่างไรว่าเครื่องไหน IP อะไรเข้าข่าย attack เราบ่อยครั้ง ? คำตอบง่ายๆ ก็ดู log หน้าเว็บที่ถูกเรียก และปริมาณของ package ที่ส่งเข้ามา ยกตัวอย่างเช่น เว็บ ABC โดน DOS โดยมีเครื่องคอมพิวเตอร์ไม่ซ้ำ IP เปิดเว็บหน้าหนึ่งซึ่งพยายามจะดาวน์โหลดไฟล์ xxx.exe ที่ไม่มีอยู่ในเครื่องเซิร์ฟเวอร์ของ ABC เลย ถ้าอย่างนี้เรียกโดน 2 เด้ง แสดงว่าเซิร์ฟเวอร์(เคย)มี trojan ฝังอยู่ และเครื่องที่ติด trojan หรือ virus ก็พยายามขยายตัวเองออกไปยังเครื่องอื่นๆ อย่างนี้เว็บ ABC ก็จะมี traffic จำนวนมหาศาลดาวน์โหลดไฟล์ xxx.exe นี้ หากเรามาพิจารณา log ไฟล์ จะพบ Error 404 ที่เรียกไฟล์ xxx.exe ดังนี้

...
220.191.231.206 - - [05/Mar/2007:11:50:20 +0100] "GET http://www.abc.com/xxx.exe HTTP/1.0" 404 534 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"
...

หาดูที่ log จะพบว่า เครื่องที่เรียกไฟล์ xxx.exe นี้มาจาก IP Address 220.191.231.206 หากมีการ attack นิดเดียว เราสามารถใช้ iptables มา band IP Address นี้ได้ แต่ถ้ามีมากจนนับไม่ได้นี่ก็ต้องใช้เครื่องมือช่วยครับ นั่นคือ fail2ban นั่นเอง ในส่วน config ไฟล์ชื่อ jail.conf เราสามารถใช้ regular expression ในการจัดการ filter ข้อมูลใน log ไฟล์ที่เราต้องการได้ ในที่นี้คือ IP ของเครื่องปลายทางที่เรียกไฟล์ xxx.exe นั่นเอง เราก็จะสามารถเพิ่ม config ให้ fail2ban ได้ดังนี้

[apache-trojan-xxx]

enabled = true
filter = ^<HOST> - .*GET.*/xxx.exe
logpath = /var/log/apache/access.log
maxretry = 6

แค่นี้เราก็ได้วิธีการ band เครื่องที่เป็นปัญหาแล้ว :) ลองเอาไปประยุกต์ใช้กันดูนะครับ

คราวที่แล้วเขียนเรื่อง Wildcard DNS record ไป เพื่อบอกให้ Bind รู้ว่าอะไรที่เกี่ยวข้องหรือตรงกับเงื่อนไขให้อ้างอิง domain นั้นโดยตรง สำหรับ How-To ครั้งนี้จะมาเล่าวิธีกการประยุกต์ใช้  Wildcard DNS และการตั้งค่า VirtualHost เพื่อรองรับการเรียกผ่าน subdomain ใดๆ ใครจำเรื่อง DNS Wildcard ไม่ได้ลองมาพิจารณาดู record ดังนี้

example.com.        A    10.11.12.13
*.example.com.    CNAME    example.com.

หากเรา dig xyz.example.com เราจะพบว่า DNS จะบอกว่า IP เป็น 10.11.12.13 คือ CNAME ของ example.com นั่นเอง คราวนี้หากเราจะเพิ่ม VirtualHost ให้ Apache จะทำได้อย่างไร และต้องการให้ซัพพอร์ทในทุกๆ subdomain มาลองดูวิธีกันนะครับอันดับแรก เริ่มจากการตั้งค่า DNS กันก่อน ในโซนไฟล์ให้เพิ่ม wildcard สำหรับ domain ดังนี้

*.example.com.    IN      A       192.168.1.1

ผมยกตัวอย่าง domain ที่ชื่อ example.com นะครับ เมื่อกำหนด wildcard ให้กับ DNS แล้วนั่นหมายความว่า subdomain ใดๆ ที่อยู่ภายใต้โดเมน example จะถูกกำหนดเป็น IP 192.168.1.1 ทั้งหมด มาตั้งค่า VirtualHost ให้กับ Apache กันต่อครับ ในไฟล์ VirtualHost ให้เพิ่ม ServerAliase เป็น *.example ดังตัวอย่าง

<VirtualHost *>
        ServerName  www.example.com
        ServerAlias *.example.com

        DirectoryIndex index.html
        DocumentRoot /home/www/www.example.com/htdocs

    ….
</VirtualHost>

จากตัวอย่างข้างต้น subdomain ใดๆ ที่อยู่ภายใต้โดเมน example จะมี DocumentRoot อยู่ที่ /home/www/www.example.com/htdocs ตัวอย่างเช่น หากเราเปิด xxx.example.com ก้อจะเปิดไฟล์ index ที่อยู่ในไดเรคทอรี /home/www/www.example.com/htdocs หากต้องการแยก subdomain อยู่คนละ directory สามารถกำหนดเพิ่มได้ในส่วน VirtualHost เรื่อยๆ หากต้องการตั้งค่า VirtualHost เพียงครั้งเดียวเราสามารถใช้ mod_rewrite เพื่อสร้าง redirect ไปยังไดเรคทอรีใดๆ ที่อยู่ใน DocumentRoot ได้ ตัวอย่างเช่น

webmail.example.com    ชี้ไปที่ http://www.example.com/webmail
scm.example.com    ชี้ไปที่ http://www.example.com/scm
dm.example.com    ชี้ไปที่ http://www.example.com/dm
download.example.com    ชี้ไปที่ http://www.example.com/download

การตั้งค่า ใน VirtualHost เพื่อ redirect ในแต่ละ request ให้เพิ่มข้อมูลดังนี้

RewriteEngine on
RewriteCond %{http_host} .
RewriteCond %{http_host} !^www.example.com [NC]
RewriteCond %{http_host} ^([^.]+).example.com [NC]
RewriteRule ^(.*) http://www.example.com/%1/ [R=301,L,QSA]

ในกรณีที่เราเรียกใช้ subdomain ที่ไม่มีไดเรคทอรีรองรับ เช่น dummy.example.com จะต้องมีไดเรคทอรี dummy อยู่ที่ DocumentRoot หากไม่มีจะพบข้อความ Error 404 ซึ่งเป็นค่า default หากต้องการกำหนด Error Page เฉพาะในแต่ละ VirtualHost สามารถเพิ่มไฟล์แสดงผล Error ในแบบต่างๆ ของเราลงไปได้

Alias /error/ "/home/www/www.example.com/htdocs"
ErrorDocument 400 /error/invalidSyntax.html
ErrorDocument 401 /error/authorizationRequired.html
ErrorDocument 403 /error/forbidden.html
ErrorDocument 404 /error/fileNotFound.html
ErrorDocument 405 /error/methodNotAllowed.html
ErrorDocument 500 /error/internalServerError.html
ErrorDocument 503 /error/overloaded.html

เท่านี้คุณก็สามารถตั้งค่า DNS แบบ Wildcard เพื่อเชื่อมต่อกับ Apache VirtualHost ได้แล้ว ลองนำไปประยุกต์ใช้ดูนะครับ

เมื่อคราวที่แล้วเขียนเรื่อง Load Balance ให้ Apache Web Serverv ง่ายๆ โดยใช้ DNS Round Robin ซึ่งสามารถทำ Load Balance ได้ง่ายๆ แต่มีปัญหาที่มีโอกาสเกิดขึ้นได้ คือ เมื่อ Web Server ตัวใดตัวหนึ่งมีปัญหา ผู้เข้าเว็บที่โชคดีได้ IP Address เครื่องนั้นไปก็จะไม่สามารถเข้าถึงเว็บได้ DNS Round Robin ช่วยเรื่อง Load Balance ได้จริง แต่จัดการเรื่อง fail over ไม่ได้ :) ครั้งนี้จะมาแนะนำการทำ Load Balance ง่ายๆ อีกเช่นเคย โดยใช้ Pound

Pound ทำหน้าที่

  • reverse proxy : ส่ง request จากเว็บเบราเซอร์ไปยัง back-end server ที่มีอยู่
  • load balancer : ส่ง request จากเว็บเบราเซอร์ไปยัง back-end server ที่มีอยู่และจัดการข้อมูล session ด้วย
  • SSL Wrapper : ถอดรหัส HTTPS จากเว็บเบราเซอร์และส่งไปยัง back-end server ที่มีอยู่
  • กลั่นกรอง HTTP/HTTPS : ตรวจสอบ request เพื่อความถูกต้องและรับ reuest ที่มีรูปแบบถูกต้องเท่านั้น
  • fail over-server : หากมี back-end server ตาย Pound จะจำเครื่อง server นั้นและหยุดส่ง request จนกว่าจะมีการแก้ไข
  • request redirector : request จาก Pound สามารถกระจายไปยัง back-end server ทั้งหมดได้ขึ้นอยู่กับ request URL

    Pound เป็นโปรแกรมเล็กๆ ง่ายในการจัดการ คุณสามารถสั่งให้ Pound ทำงานแบบ chroot jail ได้โดยการกำหนด uid/gid ได้ :) ก่อนจะติดตั้งและใช้งาน Pound มาทำความเข้าใจโครงสร้างการเชื่อมต่อกันก่อน

จากภาพข้างต้นเราใช้ Pound เป็น Balancer เพื่อกระจาย request จาก Client ไปยังเครื่องเซิร์ฟเวอร์ที่ต่อกับ Pound อยู่ มาติดตั้ง Pound กันเลย สำหรับท่านที่ใช้ Debian, Ubuntu ติดตั้งดังนี้

sudo apt-get install pound

จากนั้นแก้ไข config ที่ /etc/default/pound ดูตรงบรรทัด startup=0 เปลี่ยนเป็น startup=1 จากนั้นมาแก้ไข /etc/pound/pound.cfg ดูในส่วน ListenHTTP ดังนี้

ListenHTTP
Address 10.11.12.10
Port 80
Service
BackEnd
Address 10.11.12.11
Port 80
End
BackEnd
Address 10.11.12.12
Port 80
End
BackEnd
Address 10.11.12.13
Port 80
End
End
End

หากต้องการกำหนด Priority เพื่อกระจายโหลดไปยังเครื่องใดเครื่องหนึ่งมากกว่าเครื่องอื่นๆ ในกรณีที่มีเครื่องใดเครื่องหนึ่งมี Resource มากกว่าเครื่องอื่นๆ และสามารถรับโหลดได้มากกว่าเครื่องอื่นๆ เราสามารถกำหนด Priority เพื่อกระจายโหลดไปยังเครื่องนั้นๆ ได้ ยกตัวอย่าง เช่น เครื่อง Web Server 1 เพียงเพิ่ม Config เข้าไปอีก 1 บรรทัดเพื่อกำหนด Priority ดังนี้

ListenHTTP
Address 10.11.12.10
Port 80
Service
BackEnd
Address 10.11.12.11
Port 80
Priority 7
End
BackEnd
Address 10.11.12.12
Port 80
End
BackEnd
Address 10.11.12.13
Port 80
End
End
End

เพียงเท่านี้คุณก็สามารถจัดการ Load Balance ให้กับ Web Server ของคุณได้แล้วครับ ;)

นับเป็นครั้งแรกที่ไมโครซอฟต์มีการแจกจ่ายโค้ดให้กับโปรเจ็กโอเพ่นวอร์ส Apache ซึ่งทำให้เห็นว่านโยบายต่าง ๆ ของบริษัทนั้นค่อนข้างจะอ่อนลง และจุดยืนของบริษัทเรื่องเปลี่ยนไป โดยให้ความสำคัญกับโอเพ่นซอร์สมากยิ่งขึ้น

โดยล่าสุดไมโครซอฟต์ออกมาระบุว่าจะมีการพัฒนาโปรเจ็ค Stonehenge ซึ่งเป็นการสร้างชุดแอพพลิเคชันตัวอย่างในการพัฒนา SOA โดยอาศัยโพรโตคอลมาตรฐานอย่าง W3C และ OASIS ซึ่งทั้งสองนั้นเป็นกลุ่มหลักที่กำหนดทิศทางและมาตรฐานเทคโนโลยีต่าง ๆ ที่ใช้ในการสร้าง SOA ขึ้นมา

โดย SOA นั้นจะอ้างกลับไปถึงสถาปัจยกรรมไอที รวมไปถึงความสัมพันธ์กับผลิตภัณฑ์ที่ออกมาโดยแยกฟังก์ชันของแอพพลิเคชันออกจากกันให้สามารถทำงานข้ามกันได้ในรูปแบบของเซอร์วิส ส่งผลให้นักพัฒนามีความยืดหยุ่นและสามารถใช้ชุดโค้ดดังกล่าวในหลาย ๆ โปรแกรมอย่างไม่อยากนัก โดยมาตรฐานนับเป็นสิ่งสำคัญในการทำงานของ SOA เพราะจะช่วยให้การสร้างชุดเซอร์วิสต่างๆ นั้นทำงานได้ในแอพพลิเคชันเดียวกัน และสามารถส่งผลหรือแลกเปลี่ยนข้อมูลระหว่างกันได้ผ่านทางโพรโตคอลมาตรฐาน

สำหรับข้อมูลจากเว็บของ Apache นั้นระบุว่า Stonehenge ถูกวางตัวเอาไว้เป็นชุดตัวอย่างที่นักพัฒนาสามารถใช้สร้างแอพพลิเคชันเพื่อให้ทำงานร่วมกันได้ โดยมีการสื่อสารและแยกกันชุดเจนระหว่างโพรโตคอลและโครงสร้างพื้นฐานของซอฟต์แวร์ เพื่อที่จะจำลองการทำงานร่วมกันระหว่างแพล็ตฟอร์มต่าง ๆ กันเพื่อช่วยค้นหาจุดที่อาจจะเกิดปัญหาในระหว่างขั้นตอนการทำงานข้ามระบบกันนั่นเอง

ที่ผ่านมาในช่วงหลายปีมานัก ไมโครซอฟต์ดูจะค่อย ๆ พัฒนาความสัมพันธ์กับการพัฒนาของกลุ่มโอเพ่นซอร์ส มากขึ้นเรื่อย ๆ และให้การสนับสนุนที่ดีขึ้นกว่าเมื่อก่อน โดยสำหรับโปรเจ็คร่วมกับ Apache นั้นเมื่อปีที่ผ่านมา ไมโครซอฟต์สนับสนุนงบบริจาคให้กับโครงการโอเพ่นซอร์ส Apache ถึง 100000 ดอลลาร์เลยทีเดียว หลังจากนั้นไม่นานก็มีการประกาศสนับสนุนโครงการ Stonehenge แต่ยังไม่ได้มีการตกลงกันถึงรื่องค้ดในตอนนั้น แต่ท้ายที่สุดแล้วก็มีการเปิดโค้ดให้ใช้งานกันได้อย่างอิสระเช่นกัน

ขอบคุณข้อมูลจาก
นิตยสาร PC WORLD ฉบับเดือนกุมภาพันธ์ 2552

ข่าวจาก blognone : ผมเชื่อว่าสิ่งหนึ่งที่หลายๆ คนในเว็บนี้พยายามบอกกับคนในชุมชนคือไมโครซอฟท์กับโลกโอเพนซอร์สไม่ได้เป็น ศัตรูกันแบบความดีและความชั่ว แม้ผลิตภัณฑ์หลายๆ อย่างของทั้งสองค่ายจะทับซ้อนกัน แต่ก็ยังคงความร่วมมือกันต่อไปได้ในอีกหลายๆ ส่วน และข่าวในวันนี้ก็ตอกย้ำภาพนี้อีกครั้ง เมื่อทางไมโครซอฟท์ได้ส่งซอร์สโค้ดในส่วนของ ADOdb ซึ่งเป็นไลบรารีเชื่อมต่อระบบฐานข้อมูลในภาษา PHP ให้กับทางโครงการ

ซอร์สโค้ดที่ส่งให้นี้ใช้สัญญาอนุญาตแบบ LGPL ทำให้คนที่ต้องการใช้ซอฟต์แวร์นี้สามารถนำไปใช้งานได้โดยไม่ต้องจ่ายเงินใดๆ ให้กับไมโครซอฟท์แม้จะนำไปใช้งานในซอฟต์แวร์ปิดก็ตามที อีกทั้งในงาน OSCON ปีนี้ทางไมโครซอฟท์ยังระบุว่ายังมีแพตซ์อีกจำนวนมากที่เกี่ยวกับภาษา PHP กำลังจะตามมา

พร้อมๆ กับข่าวนี้ ทางไมโครซอฟท์ก็สมัครเข้าเป็นสมาชิกของ Apache Foundation ด้วยค่าสมาชิก 100,000 ดอลลาร์ต่อปี และประกาศเข้าร่วมพัฒนาโครงการ POI ซึ่งเป็นชุดไลบรารีภาษาจาวาที่ใช้ในการเข้าถึงไฟล์ของไมโครซอฟท์ออฟฟิศ

ข่าวดีกว่าทั้งสองข่าวนั้นอีกคือไมโครซอฟท์ตกลงขยายโครงการ Microsoft Open Specification Promise ที่เปิดให้นักพัฒนาภายนอกเข้าถึงสเปคของไมโครซอฟท์ได้ฟรี โดยก่อนหน้านี้โปรโตคอลจำนวนมากต้องซื้อจากไมโครซอฟท์โดยเจรจาค่าใช้จ่าย เป็นครั้งๆ ไป เช่นเมื่อครั้งที่ทาง Samba ได้เข้าไปอ่านเอกสารของโปรโตคอล SMB