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

QuanTriMang.com - Trong bài viết sau, Quản Trị Mạng 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.comwww.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.
; http://php.net/cgi.fix-pathinfo
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 webmaster@example1.com
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 webmaster@example2.com
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: http://www.example1.com/info.php. 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 http://www.example2.com/info.php. 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ỉ http://www.example2.com/info.php, 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!

Thứ Sáu, 10/09/2010 13:24
51 👨 1.275
0 Bình luận
Sắp xếp theo
    ❖ Tổng hợp