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, upstreamphp/*/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/letsencryptvào Nginx container như trên.Mapping
/srv/wwwgiú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).rootphả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:
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
php83tham 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:
Test PHP:
Tạo file
info.phptrong webroot: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.
- Đăng nhập để gửi ý kiến


