Hướng dẫn cài đặt và thiết lập Apache2 với module
mod_fcgid và PHP5 trên Ubuntu 10.04
Trong bài viết sau, Quản Trị sẽ giới thiệu với các bạn cách
cài đặt Apache2 với module hỗ trợ mod_fcgid và PHP5 trên
nền tảng Ubuntu 10.04. Module này là 1 sự thay thế khá
hoàn hảo cho module cũ – mod_fastcgi. Nó cho phép b
ạn thực
hiện các đoạn mã PHP với tài khoản tương ứng của Apache.
Lưu ý sơ bộ
Tại bài thử nghiệm này chúng ta sử dụng hệ điều hành Ubuntu
server với hostname server1.example.com và địa chỉ IP
192.168.0.100. Tại đây, ta tạo 2 vhost Apache, bao gồm
www.example1.com và www.example2.com để mô phỏng mục
đích sử dụng của mod_fcgid. Hãy đăng nhập vào hệ thống bằng
tài khoản root:
sudo su
/bin/sh là đường dẫn liên kết đến /bin/dash, nhưng chúng ta chỉ
cần đến /bin/bash chứ không phải là /bin/dash. Do vậy hãy gõ
lệnh sau:
dpkg-reconfigure dash
Install dash as /bin/sh? < gõ No
Tiếp đó, chúng ta cần tắt bỏ AppArmor:
/etc/init.d/apparmor stop
update-rc.d -f apparmor remove
aptitude remove apparmor apparmor-utils
Cài đặt Apache2 / mod_fcgi / PHP5
Để cài đặt đầy đủ 3 ứng dụng trên theo thứ tự, sử dụng lệnh sau:
aptitude install apache2 apache2-suexec libapache2-mod-fcgid
php5
-cgi
Nhưng nếu Apache2 đã được cài đặt cùng với PHP5 như 1
module của Apache thì cần phải tắt bỏ module PHP5 đó đi:
a2dismod php5
và kích hoạt những module sau:
a2enmod rewrite
a2enmod suexec
a2enmod include
a2enmod fcgid
Sau đó mở file /etc/php5/cgi/php.ini:
vi /etc/php5/cgi/php.ini
bỏ chú thích tại dòng cgi.fix_pathinfo = 1:
[ ]
; cgi.fix_pathinfo provides *real*
PATH_INFO/PATH_TRANSLATED support for CGI. PHP's
; previous behaviour was to set PATH_TRANSLATED to
SCRIPT_FILENAME, and to not grok
; what PATH_INFO is. For more information on PATH_INFO,
see the cgi specs. Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the
spec. A setting
; of zero causes PHP to behave as before. Default is 1. You
should fix your scripts
; to use SCRIPT_FILENAME rather than
PATH_TRANSLATED.
;
cgi.fix_pathinfo=1
[ ]
Tiếp tục mở file /etc/apache2/mods-available/fcgid.conf … :
vi /etc/apache2/mods-available/fcgid.conf
và thêm dòng mã PHP_Fix_Pathinfo_Enable 1 (không giống
như các phiên bản Ubuntu trước kia, với bản 10.04 d
òng mã này
không được nằm trong section của <VirtualHost> nếu không sẽ
gây ra lỗi PHP_Fix_Pathinfo_Enable cannot occur within
<VirtualHost> section):
<IfModule mod_fcgid.c>
AddHandler fcgid
-script .fcgi
FcgidConnectTimeout 20
PHP_Fix_Pathinfo_Enable 1
</IfModule>
Và khởi động lại Apache:
/etc/init.d/apache2 restart
Tạo Vhosts cho www.example1.com và
www.example2.com
Trong bước tiếp theo, chúng ta sẽ tạo 2 vhost -
www.example1.com (với thư mục tài liệu gốc là
/var/www/web1/web) và www.example2.com (thư mục tài
liệu gốc là /var/www/web2/web). Trong đó,
www.example1.com thuộc sở hữu của tài khoản người
dùng và nhóm web1, còn www.example2.com thuộc sở
hữu của tài khoản người dùng và nhóm web2. Trước tiên,
chúng ta tạo tài khoản người sử dụng và các nhóm tương
ứng:
groupadd web1
groupadd web2
useradd -s /bin/false -d /var/www/web1 -m -g web1 web1
useradd -s /bin/false -d /var/www/web2 -m -g web2 web2
Tiếp theo, tạo các thư mục tài liệu gốc tương ứng với các
vhost và nhóm đó:
mkdir -p /var/www/web1/web
chown web1:web1 /var/www/web1/web
mkdir -p /var/www/web2/web
chown web2:web2 /var/www/web2/web
Chúng ta sẽ sử dụng PHP với suExec, và thư mục tài liệu
gốc của suExec tại /var/www, như được chỉ ra bằng lệnh
sau:
/usr/lib/apache2/suexec -V
root@server1:~# /usr/lib/apache2/suexec -V
-D AP_DOC_ROOT="/var/www"
-D AP_GID_MIN=100
-D AP_HTTPD_USER="www-data"
-D AP_LOG_EXEC="/var/log/apache2/suexec.log"
-D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
-D AP_UID_MIN=100
-D AP_USERDIR_SUFFIX="public_html"
root@server1:~#
Nhưng chúng ta lại không thể gọi trực tiếp các file PHP nhị
phân (/usr/lib/cgi-bin/php) trực tiếp bởi vì ó được đặt bên
ngoài thư mục gốc của suExec. Nhưng suExec lại không
chấp nhận các đường dẫn liên kết mềm, do đó cách giải
quyết duy nhất để khắc phục vấn đề này là tạo mã kích hoạt
hỗ trợ cho từng website riêng biệt trong thư mục con của
/var/www; và những đoạn mã này sẽ đảm nhận nhiệm vụ
gọi các thư viện của PHP tại /usr/lib/cgi-bin/php. Và những
đoạn mã này phải thuộc quyền quản lý của các tài khoản
người dùng và nhóm riêng biệt trong từng website. Tại đây,
chúng ta sẽ tạo những đoạn mã tương ứng bên trong thư
mục /var/www/php-fcgi-scripts, ví dụ là /var/www/php-
fcgi-scripts/web1 và /var/www/php-fcgi-scripts/web2:
mkdir -p /var/www/php-fcgi-scripts/web1
mkdir -p /var/www/php-fcgi-scripts/web2
vi /var/www/php-fcgi-scripts/web1/php-fcgi-starter
#!/bin/sh
PHPRC=/etc/php5/cgi/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/lib/cgi-bin/php
vi /var/www/php-fcgi-scripts/web2/php-fcgi-starter
#!/bin/sh
PHPRC=/etc/php5/cgi/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/lib/cgi-bin/php
Thông tin tại dòng PHPRC sẽ chỉ tới thư mục của file
php.ini (ví dụ /etc/php5/cgi/ thành /etc/php5/cgi/php.ini).
PHP_FCGI_MAX_REQUESTS là số lượng các yêu cầu tối
đa được fcgid xử lý trước khi dừng lại và quá trình mới bắt
đầu. PHP_FCGI_CHILDREN khởi tạo số lượng các “PHP
children” sẽ được kích hoạt.
Đoạn mã php-fcgi-starter phải được thực thi:
chmod 755 /var/www/php-fcgi-scripts/web1/php-fcgi-
starter
chmod 755 /var/www/php-fcgi-scripts/web2/php-fcgi-
starter
chown -R web1:web1 /var/www/php-fcgi-scripts/web1
chown -R web2:web2 /var/www/php-fcgi-scripts/web2
Bây giờ, chúng ta sẽ tạo vhost Apache dành cho
www.example1.com và www.example2.com:
vi /etc/apache2/sites-available/web1
<VirtualHost *:80>
ServerName www.example1.com
ServerAlias example1.com
ServerAdmin
DocumentRoot /var/www/web1/web/
<IfModule mod_fcgid.c>
SuexecUserGroup web1 web1
<Directory /var/www/web1/web/>
Options +ExecCGI
AllowOverride All
AddHandler fcgid-script .php
FCGIWrapper /var/www/php-fcgi-scripts/web1/php-fcgi-
starter .php
Order allow,deny
Allow from all
</Directory>
</IfModule>
# ErrorLog /var/log/apache2/error.log
# CustomLog /var/log/apache2/access.log combined
ServerSignature Off
</VirtualHost>
a2ensite web1
vi /etc/apache2/sites-available/web2
<VirtualHost *:80>
ServerName www.example2.com
ServerAlias example2.com
ServerAdmin
DocumentRoot /var/www/web2/web/
<IfModule mod_fcgid.c>
SuexecUserGroup web2 web2
<Directory /var/www/web2/web/>
Options +ExecCGI
AllowOverride All
AddHandler fcgid-script .php
FCGIWrapper /var/www/php-fcgi-scripts/web2/php-fcgi-
starter .php
Order allow,deny
Allow from all
</Directory>
</IfModule>
# ErrorLog /var/log/apache2/error.log
# CustomLog /var/log/apache2/access.log combined
ServerSignature Off
</VirtualHost>
a2ensite web2
Hãy chắc chắn rằng bạn đã khai báo đường dẫn chính xác,
bao gồm cả tên các tài khoản người dùng và nhóm tại dòng
SuexecUserGroup. Reload Apache với lệnh sau:
/etc/init.d/apache2 reload
Kiểm tra
Để tiến hành kiểm tra, chúng ta sẽ tạo 1 file PHP nho nhỏ.
Ví dụ với www.example1.com:
vi /var/www/web1/web/info.php
<?php
phpinfo();
?>
Sau đó, mở trình duyệt và gõ địa chỉ sau:
Nếu tất cả hoạt động
bình thường, kết quả hiển thị sẽ giống như hình dưới đây,
và bạn sẽ nhìn thấy thông số CGI/FastCGI tại dòng Server
API:
Tùy chỉnh file php.ini cho từng website
Như đã đề cập bên trên, mỗi website riêng biệt đều có mã
kích hoạt php-fcgi-starter tương ứng, vì vậy chúng ta không
thể tạo riêng file php.ini cho từng website được. Để mô tả
quá trình này, chúng ta sẽ copy file php.ini mặc định
(/etc/php5/cgi/php.ini) tới thư mục /var/www/web2/ và
“ép” www.example2.com sử dụng php.ini từ thư mục
/var/www/web2/:
cp /etc/php5/cgi/php.ini /var/www/web2/
chown web2:web2 /var/www/web2/php.ini
Tại đây, bạn có thể chỉnh lại file /var/www/web2/php.ini
theo ý thích. Sau đó chúng ta tiếp tục mở file
/var/www/php-fcgi-scripts/web2/php-fcgi-starter … :
vi /var/www/php-fcgi-scripts/web2/php-fcgi-starter
và thêm giá trị /var/www/web2/ vào dòng PHPRC:
#!/bin/sh
PHPRC=/var/www/web2/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/lib/cgi-bin/php
Và tải lại Apache:
/etc/init.d/apache2 reload
Tiếp theo, tạo file phpinfo(); cho www.example2.com … :
vi /var/www/web2/web/info.php
<?php
phpinfo();
?>
Và kiểm tra bằng đường dẫn
Tại dòng Loaded
Configuration File sẽ hiển thị thông tin
/var/www/web2/php.ini:
Thay đổi thiết lập của file cấu hình PHP
Trong quá trình luân chuyển file php.ini mới tới website,
bạn vẫn có thể thay đổi lại những thiết lập của mã php-fcgi-
starter (hoặc sử dụng song song cả 2) bằng cách thêm tiền
tố -d để chuyển thành file PHP thực thi. Ví dụ, nếu muốn
tắt bỏ module magic_quotes_gpc của website
www.example2.com thì chúng ta sẽ làm như sau:
vi /var/www/php-fcgi-scripts/web2/php-fcgi-starter
#!/bin/sh
PHPRC=/etc/php5/cgi/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/lib/cgi-bin/php -d magic_quotes_gpc=off
Tiếp tục tải lại Apache:
/etc/init.d/apache2 reload
Mở trình duyệt, kiểm tra lại mã info.php bằng địa chỉ
tìm kiếm thông tin của
magic_quotes_gpc – hệ thống sẽ hiển thị tình trạng Off:
Trên đây là 1 số thao tác để cài đặt Apache2 cùng module
mod_fcgid và PHP5 trên nền tảng Ubuntu 10.04. Chúc các
bạn thành công!