Apache Handler là gì?
Handler
là cơ chế (script, chức năng module) thành thi hành khi một file nào đó được Apache gọi đến. Điều này có nghĩa mỗi kiểu file (file type như .php
, .html
, .cgi
...) có một Handler riêng, nhiều khi có thể cấu hình để với kiểu file, vị trí của file trên đĩa tương ứng với một loại Hander. Handler
có loại tích hợp sẵn trong Apache Server, có loại tải vào bằng Module (như php), có loại tải vào bằng cấu hình theo ngữ cảnh Action
nào đó. Theo như https://httpd.apache.org/
có các Hander mặc định tích hợp sẵn là:
default-handler
: sử dụng phục vụ các nội dung tĩnh (như các file ảnh .jpg ...)send-as-is
: (mod_asis) - Apache gửi file nhưng không có hầu hết phần header thông thườngcgi-script
: hander này thi hành file nhưcgi script
server-info
: lấy thông tin serverserver-status
: lấy trạng thái servertype-map
: phân tích file, ánh xạ đến nội dung cần thiết
Handler cũng được gán bằng một CGI script được kích hoạt bởi Action
, ví dụ khi khi gọi đến file có phần mở rộng .xyz thì xử lý file đó với script CGI "/cgi-bin/program.cgi"
# Files of a particular file extension AddHandler my-file-type .xyz Action my-file-type "/cgi-bin/program.cgi"
Ví dụ thêm vào Virtual Host thiết lập
<Location "/server-info"> SetHandler server-info </Location>
Khi gọi đến địa chỉ /server-info
thì Hander server-info
sẽ thi hành và trả về toàn bộ thông tin của Apache Server
Tương tư với Handler server-status
Sử dụng Handler cơ bản
Những cú pháp này viết trong file config (httpd.conf
)
#Thêm một hander AddHandler handler-name extension # handler-nam là tên handler # extension là phần mở rông của file gắn với handler (php, html ...) #Loại bỏ Handler RemoveHandler extension # extension là phần mở rông của file gắn với handler cần bỏ
# Thiết lập hander cho một nhóm file phù hợp # SetHandler handler-name #Các file .php sẽ mở bằng handler có tên application/x-httpd-php <FilesMatch "\.php$"> SetHandler application/x-httpd-php </FilesMatch>
Các PHP Handler
Khi Apache chạy các file .php
thì nó sử dụng Handler phù hợp để đọc được mã PHP, yêu cầu PHP thi hành và có được nội dung trả về cho client.
Khi cài đặt PHP
có một số PHP Handler bạn có thể sử dụng với Apache như CGI
, DSO
, FPM
, FCGId
, suPHP
Kiểm tra PHP Handle
Chạy script php sau: phpinfo.php
<php phpinfo(); ?>
Dòng Server API
sẽ cho biết Apache đã dùng Handler gì để gọi file .php
Apache 2.0 Handler
Đây là Handler PHP mặc định trong Apache/Php, nó thiết lập tính an toàn cao bằng cách chạy các script php với user là nobody
hoặc apache
, tuy nhiên nếu dùng suPHP
thì an toan hơn nhiều, nhưng suPHP
không còn được duy trì cập nhật (bản cuối 2013
suphp.org)
FastCGI Handler
FastCGI
kế thừa từ CGI
nó được tùy chỉnh để giảm tải sự tương tác giữa script CGI
và Webserver, cho phép Server phụ vụ được nhiều yêu cầu cùng lúc hơn.
Cài đặt FastCGI trên CentOS7, PHP 7
# yum install php php-cli mod_fcgid
Sau khi cài đặt sẽ có module Apache mod_fcgid
, giờ sẽ thiết lập để phối hợp cùng module mod_action
chạy file .php
Hủy PHP Handler mặc định, mở file vi /etc/httpd/conf.d/php.conf
, và comment (thêm # vào đầu)
#<FilesMatch \.(php|phar)> # SetHandler application/x-httpd-php #</FilesMatch>
Tạo Script Handler
Thư mục gốc ứng dụng web của bạn đang ở /var/www/
tạo ra một script
có tên
với nội dung như sauvi /var/www/cgi-bin/php.fastcgi
#!/bin/bash exec /usr/bin/php-cgi
Lưu lại, rồi chuyển owner mong muốn, chmod quyền chạy được như sau:
# chown apache:apache /var/www/cgi-bin/php.fastcgi # chmod +x /var/www/cgi-bin/php.fastcgi
Có thể mở /etc/httpd/conf.d/fcgid.conf
thêm các thiết lập
FcgidConnectTimeout 20 # 20 second timeout on connnect FcgidMaxRequestLen 268435456 # 256MB upload/post limit FcgidMaxProcessesPerClass 10 # Up to 10 PHP processes per user at a time FcgidIOTimeout 300 # 5 minute timeout on request
Tại các cấu hình Virtual Host, host thư mục web mặc định thiết lập Handler mới dùng đến script cgi trên, dạng cơ bản như sau:
<Directory "/var/www">
AllowOverride None
# Allow open access:
Require all granted
AddHandler php-fastcgi .php
Action php-fastcgi /cgi-bin/php.fastcgi
AllowOverride All
Order allow,deny
Allow from All
</Directory>
Nếu không thích dùng Action như trên có thể dùng FcgidWrapper
AddHandler fcgid-script .php FcgidWrapper /var/www/cgi-bin/php.fastcgi .php <Directory "/var/www"> Options +ExecCGI </Directory>
Khởi động lại Apache, chạy script kiểm tra phpinfo
# service httpd restartPHP-FPM
Tương tự như FastCGI ở trên, chạy php qua CGI nhưng PHP-FPM sử dụng proxy với proxy_fcgi, Handler này có nhiều ưu điểm nhất FPM
Hủy Handler cũ đi và tiến hành cài đặt
# yum install php-fpm
Cài đặt xong sẽ có dịch vụ php-fpm
, thiết lập nó tự động chạy cùng hệ thống
# chkconfig php-fpm on Hoặc CentOS7 # systemctl enable php-fpm Chạy php-fpm # service php-fpm start
Lúc này có một dịch vụ chờ ở proxy 127.0.0.1:9000
chuyên để chạy PHP Script, giờ vào httpd.conf
thiết lập Handler gọi để Apache sử dụng Proxy này chạy PHP
#Thiết lập Handler này cho tất cả các file SetHandler "proxy:fcgi://127.0.0.1:9000" #Hoặc chỉ .php #AddHandler "proxy:fcgi://127.0.0.1:9000" .php
Khởi động lại Apache service httpd restart
và kiểm tra xem