Web back-end (6) - Kết nối web server và chương trình dịch

1.1       Kết nối web server và chương trình dịch

Qua các bài học trước, chúng ta đã biết cách cài đặt phần mềm web server, nó là cổng giao tiếp giữa trình duyệt và máy web server. Chúng ta cũng đã biết cách sử dụng chương trình dịch để thực thi mã nguồn tại máy web server. Tuy nhiên, do chưa có sự kết nối giữa phần mềm web server và chương trình dịch, nên phần mềm web server chưa thể chuyển yêu cầu của trình duyệt cho chương trình dịch được, và ngược lại, chương trình dịch cũng chưa thể gửi kết quả xử lý cho trình duyệt.

Trong phần này, chúng ta sẽ tìm hiểu việc kết nối giữa phần mềm web server và chương trình dịch. Thực hiện trên một số hệ thống khác nhau nhằm giúp bạn có thêm những hiểu biết sơ khởi về hoạt động tại hệ thống web server.

Xem hình minh họa,

1.1.1       Kết nối Apache với trình thông dịch PHP

Nhớ lại chu trình hoạt động của web, áp dụng cho trường hợp gồm Apache và PHP:

– Trình duyệt gửi yêu cầu tới Apache

– Apache gọi trình thông dịch PHP để xử lý yêu cầu

– Sau khi xử lý xong yêu cầu, trình thông dịch PHP gửi trả kết quả về Apache

– Apache gửi kết quả về trình duyệt

Có một số cách để kết nối Apache với trình thông dịch PHP như:

– Sử dụng cửa sổ dòng lệnh (không nên sử dụng cách này)

– Sử dụng mod_php (hay Apache module): giải pháp cũ, bảo mật không tốt

– CGI: dùng thay thế khi mod_php không hỗ trợ, bảo mật không tốt. CGI là viết tắt của Common Gateway Interface.

– mod_suPHP: là giải pháp nâng cấp của CGI, bảo mật tốt, tốn tài nguyên CPU, không thể sử dụng opcode cache

– FCGI (php-fpm): giải pháp tối ưu nhất, đang được khuyến khích sử dụng

Mỗi cách kết nối Apache với trình thông dịch PHP có những ưu và nhược điểm riêng, bạn nên thử cài đặt các giải pháp để tìm hiểu. Chúng ta sẽ thực hiện kết nối Apache và trình thông dịch PHP bằng cách sử dụng mod_php.

Sử dụng mod_php

Sau đây là các bước thực hiện (bước nào bạn đã thực hiện rồi thì bỏ qua):

– Cài đặt Apache

– Cài đặt PHP interpreter. Lưu ý bạn cần phải sử dụng bản PHP đa luồng thì mới có tập tin php8apache2_4 .dll để thực hiện cấu hình bằng mod_php. Ví dụ sử dụng bản PHP VS16 x64 Thread Safe (2021-Oct-19 11:57:36).

Thực hành tình huống ví dụ:

– Trong htdocs, tạo tập tin index.html với nội dung bất kỳ, ví dụ:

<!DOCTYPE html>

<html>

    <head>

        <title>Trang web cua Teo</title>

    </head>

    <body>

        <h1>Trang web trong web root</h1>

    </body>

</html>

– Chạy Apache

– Mở trình duyệt, nhập vào trình duyệt đường dẫn http://localhost, sẽ thấy thông tin xuất hiện trên trình duyệt

Trang web trong web root

– Trong htdocs, tạo tập tin index.php với nội dung bất kỳ, ví dụ,

<?php

    phpinfo();

    echo "Chao bac Teo";

?>

– Vào cửa sổ dòng lệnh, vào thư mục htdocs, chạy tập tin index.php để xem kết quả,

C:\Apache24\htdocs>php index.php

phpinfo()

PHP Version => 8.0.11

...

Chao bac Teo

Kết quả tại cửa sổ dòng lệnh sẽ gồm thông tin về PHP và dòng chữ “Chao bac Teo”

– Chạy thử tập tin index.php trên trình duyệt, bằng cách nhập vào đường dẫn sau,

http://localhost/index.php

– Kết quả là trình duyệt sẽ hiển thị mã nguồn PHP. Do Apache chưa kết nối và làm việc được với PHP interpreter, nên Apache chưa gọi được trình thông dịch PHP để thực thi mã nguồn. Đây là kết quả hiển thị trên trình duyệt:

<?php

    phpinfo();

    echo "Chao bac Teo";

?>

Kết nối Apache với PHP interpreter

– Trong thư mục C:\Apache24\conf, mở tập tin httpd.conf  bằng một text/code editor bất kì, ví dụ VS code

– Thêm các dòng khai báo sau vào cuối tập tin httpd.conf.

LoadModule php_module "C:\php\php8apache2_4.dll"

AddHandler application/x-httpd-php .php

PHPIniDir "C:\php"

– Lưu lại tập tin httpd.conf

– Vào thư mục C:\php, nhân bản (copy và paste tại chỗ) tập tin php.ini-development thành một tập tin mới, đổi tên tập tin mới thành php.ini

– Mở chương trình cửa sổ dòng lệnh (cmd), di chuyển dấu nhắc lệnh tới C:\Apache24\bin> gõ lệnh httpd –t để kiểm tra xem tập tin cấu hình của Apache đã hợp lệ hay chưa?

C:\Apache24\bin>httpd -t

– Tập tin httpd.conf có thể có lỗi này,

 C:\Apache24\bin>httpd -t

AH00112: Warning: DocumentRoot [C:/Apache24/docs/dummy-host.example.com] does not exist

AH00112: Warning: DocumentRoot [C:/Apache24/docs/dummy-host2.example.com] does not exist

AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::55a:efd7:6c14:46fc. Set the 'ServerName' directive globally to suppress this message

Syntax OK

– Sửa lỗi trên bằng cách vào tập tin httpd.conf, sửa dòng khai báo sau:

#ServerName www.example.com:80

Thành:

ServerName localhost

– Lưu lại tập tin httpd.conf, chạy lại lệnh httpd –t, sẽ thấy không còn lỗi.

 C:\Apache24\bin>httpd -t

AH00112: Warning: DocumentRoot [C:/Apache24/docs/dummy-host.example.com] does not exist

AH00112: Warning: DocumentRoot [C:/Apache24/docs/dummy-host2.example.com] does not exist

Syntax OK

– Khởi động lại Apache để hoàn thành việc cấu hình kết nối Apache với PHP interpreter

– Mở trình duyệt, nhập lại địa chỉ http://localhost/index.php sẽ thấy trang web hiển thị thông tin về PHP và dòng chữ “Chao bac Teo”. Vậy là mã PHP đã được thực thi, kết quả đã được gửi lại Apache và gửi về trình duyệt.

Bạn có thể thực hiện kết nối giữa Apache và PHP interpreter bằng các phương pháp khác để tìm hiểu thêm.

1.1.2       Nối kết Nginx và trình thông dịch PHP

Một số phần mềm web server cho phép kết nối với các trình dịch mã khác nhau. Như ở phần trước, chúng ta đã thực hiện kết nối phần mềm Apache với PHP interpreter. Ở phần này, chúng ta sẽ thực hiện kết nối Nginx với PHP interpreter.

Các bước thực hiện:

– Cài đặt phần mềm web server Nginx

– Cài đặt trình thông dịch PHP (PHP interpreter)

Thực hành tình huống ví dụ:

– Trong thư mục nginx\html, tạo tập tin index.html với nội dung bất kỳ, ví dụ:

<!DOCTYPE html>

<html>

    <head>

        <title>Trang web cua Teo</title>

    </head>

    <body>

        <h1>Trang web trong nginx\html</h1>

    </body>

</html>

– Chạy Nginx

– Mở trình duyệt, nhập vào trình duyệt đường dẫn http://localhost, sẽ thấy thông tin xuất hiện trên trình duyệt

Trang web trong nginx\html

– Trong html, tạo tập tin index.php với nội dung bất kỳ, ví dụ,

<?php

    phpinfo();

    echo "Chao bac Teo - nginx";

?>

– Vào cửa sổ dòng lệnh, vào thư mục nginx\html, chạy tập tin index.php để xem kết quả,

C:\nginx\html>php index.php

phpinfo()

PHP Version => 8.0.11

...

Chao bac Teo - nginx

Kết quả tại cửa sổ dòng lệnh sẽ gồm thông tin về PHP và dòng chữ “Chao bac Teo - nginx”

– Chạy thử tập tin index.php trên trình duyệt, bằng cách nhập vào đường dẫn sau,

http://localhost/index.php

– Kết quả là trình duyệt sẽ hiển thị trang index.html, hoặc tải trang index.php về máy tính, hoặc báo lỗi “403 Forbidden” . Do Nginx chưa kết nối và làm việc được với PHP interpreter, nên nó chưa gọi được trình thông dịch PHP để thực thi mã nguồn.

Kết nối Nginx với PHP interpreter

– Mở tập tin nginx\conf\nginx.conf bằng một text editor hoặc code editor bất kỳ (ví dụ VS code)

– Thêm khai báo index.php vào dòng khai báo sau (dòng thứ 43 đến 46):
location / {

            root   html;

            index  index.php index.html index.htm;

        }

– Bỏ chú thích (bỏ dấu #) ở các dòng 65 tới 71, sửa lại giá trị $document_root, rồi lưu lại những thay đổi vừa cập nhật.

location ~ \.php$ {

            root           html;

            fastcgi_pass   127.0.0.1:9000;

            fastcgi_index  index.php;

            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

            include        fastcgi_params;

        }

(Mục cấu hình trên giúp Nginx giao tiếp với CGI qua địa chỉ 127.0.0.1 và cổng 9000).

– Mở cửa sổ dòng lệnh, vào thư mục của PHP interpreter (nơi có tập tin php-cgi.exe) để khởi chạy CGI

C:\PHP>php-cgi.exe -b 127.0.0.1:9000

– Mở cửa sổ trình duyệt, nhập địa chỉ http://127.0.0.1/index.php, kết quả là trang index.php đã được thực thi.

– Để tắt CGI, trong cửa sổ dòng lệnh bấm tổ hợp phím Ctrl + C

– Để tắt Nginx, vào cửa sổ Task manager, chọn Nginx và End task

1.1.3       Xem và đọc thêm

Dùng các từ khóa sau tìm kiếm trên mạng để đọc thêm: mod_php, php-fpm, config Nginx and PHP

– [1] PHP interpreter interact with Apache: https://stackoverflow.com/questions/37350289/how-does-the-php-interpreter-interact-with-apache

– [2] Using mod_php to connect Apache and PHP  https://www.youtube.com/watch?v=Bb21iI6yoUE

– [3] How to the php-fpm  operate: https://www.youtube.com/watch?v=qNQSdy0eflo

– [4] Configuration php-fpm [read]: http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html

– [5] Configuration php-fpm [view]: https://www.youtube.com/watch?v=UXrJPrGaPB0

– [6] Nginx and PHP: https://www.youtube.com/watch?v=Jdxr_wFvelA

1.1.4       Bài tập và thực hành

Bài tập 1. Thực hành các minh họa trong phần lý thuyết.

Bài tập 2. Cấu hình kết nối Apache với PHP interpreter sử dụng FCGI (php-fpm).

[Gợi ý làm bài tập]

Bài tập 2. Cấu hình kết nối Apache với PHP interpreter sử dụng FCGI (php-fpm).

– Đã cài đặt Apache

– Đã cài đặt PHP interpreter

[Nếu trước đó bạn đã cấu hình kết nối Apache với PHP interpreter bằng mod_php thì bạn có thể tạm vô hiệu nó bằng cách đánh dấu chú thích cho các khai báo trong tập tin httpd.conf,

# LoadModule php_module "C:\php\php8apache2_4.dll"

# AddHandler application/x-httpd-php .php

# PHPIniDir "C:\php"

]

– Tải module mod_fcgid tại đường dẫn: https://www.apachelounge.com/download/

– Giải nén thư mục vừa tải về (ví dụ: mod_fcgid-2.3.10-win64-VS16)

– Đọc hướng dẫn trong tập tin mod_fcgid-2.3.10-win64-VS16\ReadMe.txt để thực hiện việc cấu hình

– Nếu máy tính chưa cài đặt Visual C++ Redistributable for Visual Studio 2015-2019, thì tải và cài tại đây: https://www.apachelounge.com/download/

– Chép tập tin mod_fcgid.so từ thư mục mod_fcgid-2.3.10-win64-VS16 vào thư mục C:\Apache24\modules

– Chép đoạn khai báo sau từ tập tin mod_fcgid-2.3.10-win64-VS16\ReadMe.txt vào cuối tập tin httpd.conf

FcgidInitialEnv PATH "c:/php;C:/WINDOWS/system32;C:/WINDOWS;C:/WINDOWS/System32/Wbem;"

FcgidInitialEnv SystemRoot "C:/Windows"

FcgidInitialEnv SystemDrive "C:"

FcgidInitialEnv TEMP "C:/WINDOWS/Temp"

FcgidInitialEnv TMP "C:/WINDOWS/Temp"

FcgidInitialEnv windir "C:/WINDOWS"

FcgidIOTimeout 64

FcgidConnectTimeout 16

FcgidMaxRequestsPerProcess 1000

FcgidMaxProcesses 50

FcgidMaxRequestLen 8131072

# Location php.ini:

FcgidInitialEnv PHPRC "c:/php"

FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 1000

 

<Files ~ "\.php$>"

  AddHandler fcgid-script .php

  FcgidWrapper "c:/php/php-cgi.exe" .php

</Files>

– Lưu lại tập tin httpd.conf, restart lại dịch vụ Apache2.4

– Vào cửa sổ dòng lệnh, gõ lệnh sau để kiểm tra thông tin cấu hình, nếu không có lỗi là được

C:\Apache24\bin>httpd -t

AH00112: Warning: DocumentRoot [C:/Apache24/docs/dummy-host.example.com] does not exist

AH00112: Warning: DocumentRoot [C:/Apache24/docs/dummy-host2.example.com] does not exist

Syntax OK

– Vào trình duyệt, mở trang web php để kiểm tra, ví dụ: http://localhost/index.php, nếu trang web hiển thị bình thường là được.

– Trang web có thể thông báo lỗi liên quan đến phân quyền như sau:

Forbidden

You don't have permission to access this resource.

– Tìm tới chỗ cấu hình tên miền ảo, mục phân quyền, để thêm khai báo liên quan đến Exec CGI như sau, (ví dụ: C:\Apache24\conf\extra\ httpd-vhosts.conf)

<VirtualHost *:80>

    DocumentRoot "C:\Apache24\htdocs"

    ServerName localhost

    <Directory "C:\Apache24\htdocs">

        Options Indexes FollowSymLinks MultiViews ExecCGI

        AllowOverride all

        Require all granted

    </Directory>

</VirtualHost>

– Lưu lại tập tin httpd-vhosts.conf, restart lại Apache2.4, chạy lại : http://localhost/index.php để xem kết quả.

1.1.5       Câu hỏi ôn tập

Câu 1. Phát biểu nào không đúng khi nói về Apache?

A. Là trình thông dịch mã PHP

B. Là cổng kết nối giữa web client và trình dịch mã

C. Là một phần mềm web server

D. Là phần mềm mã nguồn mở

Câu 2. Sau đây là một số cách kết nối Apache và chương trình dịch PHP, cái nào không đúng ?

A. FCGI

B. CGI

C. HTTP

D. Apache module

Câu 3. Thư mục gốc (web root) mặc định của web server trên hệ thống Apache là:

A. conf

B. bin

C. htdocs

D. manual

Câu 4. Thư mục gốc (web root) mặc định của web server trên hệ thống Nginx là:

A. conf

B. docs

C. contrib

D. html

-----

Cập nhật: 17/8/2023

-----

Bạn muốn tự học HTML bài bản? Xem thêm