Website được thiết kế tối ưu cho thành viên chính thức. Hãy Đăng nhập hoặc Đăng ký để truy cập đầy đủ nội dung và chức năng. Nội dung bạn cần không thấy trên website, có thể do bạn chưa đăng nhập. Nếu là thành viên của website, bạn cũng có thể yêu cầu trong nhóm Zalo "CNTT" các nội dung bạn quan tâm.

6. Triển khai Nginx và PHP-FPM bằng Docker

ICT

Trong kiến trúc Web Server hiện đại, Nginx và PHP-FPM là hai thành phần “lõi” của lớp ứng dụng. Docker hóa hai thành phần này giúp bạn chuẩn hóa môi trường chạy, chạy song song nhiều phiên bản PHP và giảm rủi ro cấu hình chồng chéo trên host. Tuy nhiên, để vận hành ổn định trong production, cần triển khai theo nguyên tắc: đơn giản, tách vai trò, network rõ ràng, log rõ ràng.

Bài này trình bày cách triển khai Nginx + PHP-FPM bằng Docker theo hướng thực chiến, đồng thời đảm bảo vẫn tương thích với mô hình MariaDB Docker theo nhóm site ở các bài sau.


1. Khi nào nên Docker hóa Nginx và PHP-FPM?

Docker hóa Nginx/PHP-FPM phù hợp khi bạn có một hoặc nhiều nhu cầu sau:

  • Cần chạy song song nhiều phiên bản PHP (7.4/8.1/8.3…) cho các website khác nhau.

  • Muốn chuẩn hóa triển khai: cùng một cấu hình chạy giống nhau giữa các máy.

  • Muốn tách rõ lớp web (Nginx) và lớp runtime (PHP-FPM), dễ thay đổi từng phần.

  • Muốn “đóng gói” môi trường web server để dễ migrate.

Nếu hệ thống nhỏ, ít site, ít thay đổi, Nginx/PHP-FPM chạy host vẫn là lựa chọn đơn giản. Tuy nhiên, series này hướng đến kiến trúc mở rộng, nên triển khai Docker là hợp lý.


2. Kiến trúc đề xuất: Nginx container + PHP-FPM container

Mô hình chuẩn:

Nguyên tắc:

  • Nginx là điểm vào HTTP/HTTPS duy nhất.

  • PHP-FPM không expose ra Internet (chỉ nội bộ Docker network).

  • MariaDB không expose ra Internet; chỉ app network được phép truy cập.


3. Chuẩn hóa thư mục cho stack web

Khuyến nghị tạo:

Giải thích:

  • nginx/conf.d/: vhost, upstream

  • php/*/conf.d/: override php.ini (memory_limit, upload_max_filesize…)

  • logs/: log tách riêng để dễ debug và rotate


4. Docker Compose mẫu cho Nginx + PHP-FPM

Dưới đây là mẫu docker-compose.yml tối giản nhưng đủ dùng production (có network, volumes, restart policy).

Lưu ý vận hành:

  • Nếu bạn dùng certbot trên host, vẫn có thể mount /etc/letsencrypt vào Nginx container như trên.

  • Mapping /srv/www giúp bạn không cần build image riêng chỉ vì code.


5. Cấu hình Nginx vhost để chạy PHP-FPM trong Docker

Ví dụ file: /srv/docker/web/nginx/conf.d/site.conf

Điểm quan trọng:

  • fastcgi_pass web_php83:9000; dùng container name làm hostname (nhờ Docker DNS).

  • root phải trỏ đúng path trong container Nginx (ở đây mount /srv/www).


6. PHP-FPM tuning cơ bản cho production

Ví dụ php/8.3/conf.d/99-overrides.ini:

 
memory_limit=512M
upload_max_filesize=64M
post_max_size=64M
max_execution_time=120
date.timezone=Asia/Ho_Chi_Minh
log_errors=On
error_log=/var/log/php/php-error.log

Tùy hệ thống, bạn có thể thêm:

  • OPCache

  • setting cho Drupal (realpath_cache_size…)


7. Kết nối tới MariaDB theo nhóm site

Bạn có hai cách phổ biến:

Cách A: MariaDB bind localhost, PHP kết nối 127.0.0.1

Không phù hợp khi PHP ở trong Docker vì container không thấy 127.0.0.1 của host theo cách bạn kỳ vọng.

Cách B: Docker network chung giữa PHP và MariaDB

Đây là cách phù hợp nếu cả PHP và MariaDB đều trong Docker.

Cách làm:

  • Tạo network dùng chung (ví dụ backend_net)

  • Cho php83 tham gia network đó

  • Cho các MariaDB group (sites_qms, sites_web, sites_art) cũng tham gia network đó

  • PHP sẽ kết nối bằng hostname container, ví dụ mariadb_sites_qms:3306

Ở bài về MariaDB, chúng ta sẽ chuẩn hóa network để đảm bảo “PHP chỉ thấy DB cần thấy”.


8. Những nguyên tắc production cần tuân thủ

  • Không expose cổng PHP-FPM ra ngoài host.

  • Nginx only: expose 80/443.

  • Dùng restart: unless-stopped.

  • Log có vị trí rõ ràng; có chính sách rotate.

  • Không chỉnh tay trong container; mọi thay đổi qua file cấu hình.


9. Kiểm tra nhanh sau triển khai

Chạy stack:

 
cd /srv/docker/web
docker compose up -d
docker ps
docker logs web_nginx --tail 50

Test PHP:

  • Tạo file info.php trong webroot:

    <?php phpinfo();
  • Truy cập URL để xác nhận Nginx → PHP-FPM hoạt động.

Sau khi kiểm tra xong, nên xóa info.php vì rủi ro lộ cấu hình.


10. Kết luận

Triển khai Nginx và PHP-FPM bằng Docker giúp:

  • Chuẩn hóa môi trường chạy web server

  • Dễ chạy song song nhiều phiên bản PHP

  • Giảm xung đột cấu hình trên host

  • Sẵn sàng kết nối với MariaDB theo nhóm site

Ở bài tiếp theo, chúng ta sẽ đi vào phần trọng tâm của series:
Triển khai MariaDB bằng Docker theo mô hình nhóm site (sites_web, sites_qms, sites_art), bao gồm cấu hình network, volume dữ liệu và nguyên tắc tạo database/user cho từng site.