Apache

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ường
  • cgi-script : hander này thi hành file như cgi script
  • server-info : lấy thông tin server
  • server-status : lấy trạng thái server
  • type-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

Server Info

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();
    ?>
PHP HANDLER

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 vi /var/www/cgi-bin/php.fastcgi với nội dung như sau

#!/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 restart fastcgi

PHP-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

FPM