How To: ติดตั้งและรัน Redmine ด้วย Apache + mod_passenger บน Debian

Redmine เป็น Project Management Software (Bug Tracker) ตัวหนึ่ง เอาไว้จัดการโปรเจคต่างๆที่ทำกันเป็นทีมใหญ่ๆ เจ้า Redmine นี่เขียนและรันบน Ruby on Rails ซึ่งยังจัดเป็นของแปลกอยู่สำหรับทุกวันนี้ มันก็เลยติดตั้งค่อนข้างยุ่งยากกว่า PHP ที่นิยมใช้กันแพร่หลายและมักจะติดตั้งมาเป็น Default ของ Web Server ส่วนใหญ่

Redmine Screenshot
Redmine Screenshot

Blog นี้จะอธิบายขั้นตอนการติดตั้ง Redmine ไม่ใช่วิธีใช้

ถ้าต้องการอ่านวิธีใช้งานให้ไปอ่านที่ ใช้ Redmine พัฒนา project ของ @ploysics

Continue reading “How To: ติดตั้งและรัน Redmine ด้วย Apache + mod_passenger บน Debian”

ปรับ Apache ให้ซ่อนรายละเอียด Server

สิ่งที่ผมจะพูดต่อไปนี้อ้างอิงกับ Debian เท่านั้นนะครับ อาจดูเป็นเรื่องง่ายๆ แต่ผมไม่เคยเอะใจสักนิด

ปัญหาก็คือผมต้องการซ่อนรายละเอียดของ Server ที่รันเว็บอยู่ ซึ่งปกติมันจะบอกข้อมูลมาแบบนี้

Apache/2.2.9 (Debian) DAV/2 SVN/1.5.1 mod_python/3.3.1 Python/2.5.2 mod_ssl/2.2.9 OpenSSL/0.9.8g mod_wsgi/2.3 Phusion_Passenger/2.0.4 Server at <hidden> Port 80

วิธีซ่อนก็ไม่ยาก แค่ไปแก้สองคำสั่งใน apache2.conf ตามนี้ รายละเอียดพวกนี้ก็จะถูกซ่อนไป

ServerSignature Off
ServerTokens Prod

แต่เมื่อแก้เสร็จแล้ว Apache ก็ยังคายรายละเอียดของ Server ออกมาเยอะเหมือนเดิมอยู่ ซึ่งตามปกติถ้าเราปรับอย่างนั้นแล้ว มันไม่ควรจะคายอะไรออกมาเลย

ก็เลยลองไล่ดูคำสั่งในโฟลเดอร์ config ของ Apache ไปเรื่อยๆ จนเจอว่ามีอีกไฟล์ที่มีสองคำสั่งนั้นเช่นกัน คือ /etc/apache2/conf.d/security เลยตามเข้าไปแก้ในไฟล์นั้น และแล้วมันก็ซ่อนตามที่เราต้องการ

สาเหตุที่ปรับใน /etc/apache2/apache2.conf แล้วไม่ได้ผล นั่นเพราะ 2 คำสั่งข้างบนนั้น มันมาก่อนคำสั่ง

Include /etc/apache2/conf.d/

ซึ่งคำสั่งนี้ทำให้ Apache ดึงทุกไฟล์ในโฟลเดอร์ conf.d เข้ามาประมวลผล เนื่องจาก Apache ใช้หลักการ "มาทีหลังดังกว่า" ก็คือถ้ามีคำสั่งซ้ำกัน มันจะยึดตามอันที่มาหลังสุดเป็นหลัก ด้วยเหตุนี้ มันเลยอ่านคำสั่งในไฟล์ conf.d/security มาทับคำสั่งเดิมใน apache2.conf แทน

บทเรียนวันนี้: คิดจะแก้อะไร ลอง <code>grep -R</code> ดูก่อนทุกครั้ง – -"

Shortnote: Install Trac on Debian

Standalone Trac

  1. aptitude install trac
  2. trac-admin <envdir> initenv
  3. trac-admin <envdir> permission add <user> TRAC_ADMIN
  4. tracd –port <port> <envdir>

Apache + mod_python

  1. aptitude install libapache2-mod-python
  2. zless /usr/share/doc/trac/README.Debian.gz
  3. chmod -R www-data.www-data <envdir>
  4. If failed, see apache’s error.log

Reset MySQL Root Password บน Debian แบบง่ายๆ

หลังจากใช้วิธีถึกๆมาตลอด โดยรัน mysqld ใหม่แบบ skip-privileges แล้ว connect เข้าไป set root password ใน table เอาเอง ยุ่งยากโคตรๆ มาวันนี้พึ่งรู้ว่ามันมีวิธีง่ายๆด้วย

dpkg-reconfigure mysql-server-5.0

แน่นอน ว่าคนรันต้องเป็น root

รัน PHP4 และ PHP5 คู่กันบน Apache 2

พอดีช่วงนี้มีงานคอนฟิก Server เจ้าของเครื่องเขาจำเป็นต้องใช้ เลยไปลองหาๆวิธีมาทำดู เท่าที่อ่านมามีหลายวิธี แต่ที่ดูง่ายสุดคือรัน PHP5 เป็น Module ส่วน PHP4 รันเป็น CGI

ปัญหาแรกคือ Repository (Debian Lenny) ที่ใช้มันไม่มี PHP4 ให้โหลด (พึ่งมารู้ที่หลังว่าที่อื่นมี – -") เลยต้องโหลด Source มา Compile เอง ก็ขลุกขลักนิดหน่อย แต่สุดท้ายก็ Compile ผ่าน เสร็จแล้วก็ไปแก้คอนฟิก Apache ให้เฉพาะบาง vhost รัน .php ผ่าน PHP4 CGI (/cgi-bin/php4/php) แทนที่จะเป็น PHP5 Apache Module

วิธีคอนฟิก เริ่มแรก (หลังจาก Compile เสร็จ) ก็ Copy โฟลเดอร์ /sapi/cgi ไปไว้ที่ /home/php4/cgi เสร็จแล้วแก้ /etc/apache2/httpd.conf ให้อ่าน cgi-bin จากที่นี่

ScriptAlias /cgi-bin/php4/ /home/php4/cgi
<Directory "/home/php4/cgi">
    AllowOverride None
    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    Order allow,deny
    Allow from all
</Directory>

ที่เหลือก็แก้ vhost อันที่อยากให้เป็น PHP4 โดยเพิ่มคำสั่งพวกนี้เข้าไป

AddType application/php4 .php .phtml .php3
AddType application/php4-source .phps
Action application/php4 /cgi-bin/php4/php
Action application/php4-source /cgi-bin/php4/php

เท่านี้ vhost นั้นๆก็จะรันด้วย PHP4 แล้วครับ ทดสอบกันได้โดยคำสั่ง phpinfo();

แถมอีกนิด ถ้าอยากให้ vhost เดียวกันรันได้ทั้ง 2 รุ่น ก็ทำได้โดยแก้นามสกุลตรง AddType จาก php เป็นอย่างอื่น (เช่น .php4) แล้วทีนี้เวลาต้องการให้ script ไหนรันด้วย PHP4 ก็ตั้งนามสกุลเป็น .php4

AddType application/php4 .php4
Action application/php4 /cgi-bin/php4/php

ตามนี้เลยนะจ๊ะ :)