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,
– 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,
– 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