Vì sao Tomcat trên VM vẫn là lựa chọn số một cho doanh nghiệp?
Sau nửa năm trực tiếp migrate hệ thống từ CentOS 7 sang CentOS Stream 9, mình rút ra một điều: Dù Docker hay Kubernetes đang làm mưa làm gió, việc chạy Apache Tomcat trực tiếp trên máy ảo (VM) vẫn có chỗ đứng riêng. Với các ứng dụng Java Web truyền thống (legacy), cách này giúp tối ưu hiệu năng I/O và dễ debug hơn hẳn. CentOS Stream 9 kết hợp với JDK 17 hoặc 21 hiện là bộ đôi cực kỳ ăn ý về độ ổn định.
Thực tế tại dự án mình vừa triển khai, khó khăn lớn nhất không nằm ở code. Vấn đề thường đến từ cách quản lý service và xung đột quyền hạn trên môi trường RHEL-based. Nếu không nắm vững cách cấu hình Firewall hay SELinux, bạn sẽ mất cả ngày chỉ để tìm hiểu tại sao app không thể kết nối ra ngoài.
Yêu cầu hệ thống
Bạn cần một server CentOS Stream 9 (hoặc Rocky/AlmaLinux) sạch sẽ. Trong bài này, mình chọn Tomcat 10 để tận dụng sức mạnh của Jakarta EE. Một lưu ý nhỏ: hãy chuẩn bị server có tối thiểu 2GB RAM để Java chạy mượt mà nhất.
Bước 1: Cài đặt OpenJDK 17 LTS
Tomcat không thể sống thiếu Java. Mình ưu tiên OpenJDK 17 vì đây là bản LTS có hiệu năng cực tốt và được hỗ trợ dài hạn.
sudo dnf update -y
sudo dnf install java-17-openjdk-devel -y
Cài xong, bạn hãy gõ lệnh này để kiểm tra:
java -version
Nếu thấy dòng openjdk version "17.x.x" hiện ra là chúng ta đã xong phần móng.
Bước 2: Tạo User riêng – Đừng bao giờ dùng Root
Nhiều anh em có thói quen chạy Tomcat bằng quyền root cho “tiện”. Đây là sai lầm cực kỳ nguy hiểm. Nếu app bị dính lỗ hổng Remote Code Execution, hacker sẽ chiếm trọn server của bạn. Hãy tạo một user riêng, không có quyền shell để cô lập service.
sudo useradd -m -U -d /opt/tomcat -s /bin/false tomcat
Lệnh này tạo user tomcat với thư mục home tại /opt/tomcat nhưng khóa khả năng đăng nhập trực tiếp.
Bước 3: Tải và giải nén Apache Tomcat 10
Bạn hãy lên trang chủ lấy link bản 10.1.x mới nhất. Lưu ý đừng copy máy móc version cũ vì các bản vá bảo mật được cập nhật liên tục.
cd /tmp
wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.18/bin/apache-tomcat-10.1.18.tar.gz
# Giải nén trực tiếp vào thư mục đích
sudo tar -xf apache-tomcat-10.1.18.tar.gz -C /opt/tomcat --strip-components=1
Sau đó, hãy bàn giao quyền sở hữu thư mục cho đúng chủ nhân của nó:
sudo chown -R tomcat:tomcat /opt/tomcat
sudo chmod -R g+r /opt/tomcat/conf
sudo chmod g+x /opt/tomcat/conf
sudo chown -R tomcat /opt/tomcat/webapps/ /opt/tomcat/work/ /opt/tomcat/temp/ /opt/tomcat/logs/
Bước 4: Quản lý Tomcat chuyên nghiệp bằng Systemd
Đừng dùng file startup.sh thủ công. Hãy biến Tomcat thành một service để nó tự khởi động cùng OS. Việc này cũng giúp bạn quản lý log tập trung qua journalctl cực kỳ nhàn.
Tạo file cấu hình service:
sudo nano /etc/systemd/system/tomcat.service
Dán nội dung dưới đây vào. Chú ý thông số -Xmx1024M – nếu server bạn có 4GB RAM, hãy nâng con số này lên 2048M để tối ưu.
[Unit]
Description=Apache Tomcat Web Application Container
After=network.target
[Service]
Type=forking
User=tomcat
Group=tomcat
Environment="JAVA_HOME=/usr/lib/jvm/jre"
Environment="JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom"
Environment="CATALINA_BASE=/opt/tomcat"
Environment="CATALINA_HOME=/opt/tomcat"
Environment="CATALINA_PID=/opt/tomcat/temp/tomcat.pid"
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseG1GC"
ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh
[Install]
WantedBy=multi-user.target
Kích hoạt service ngay lập tức:
sudo systemctl daemon-reload
sudo systemctl enable --now tomcat
Bước 5: Mở cổng Firewall
Mặc định Tomcat lắng nghe ở cổng 8080, nhưng CentOS 9 sẽ chặn mọi kết nối lạ. Bạn cần mở “cửa” cho nó:
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload
Nếu bạn đổi port trong server.xml, đừng quên cập nhật lại lệnh firewall tương ứng.
Bước 6: Thiết lập Web Manager
Để dùng giao diện quản lý web, bạn cần cấp quyền trong file tomcat-users.xml.
sudo nano /opt/tomcat/conf/tomcat-users.xml
Thêm user admin với mật khẩu đủ mạnh:
<role rolename="manager-gui"/>
<user username="admin" password="MatKhauSieuKho2024!" roles="manager-gui"/>
Mặc định, Tomcat chỉ cho truy cập từ localhost. Nếu muốn remote từ IP cá nhân, bạn phải vào webapps/manager/META-INF/context.xml để comment đoạn Valve chặn IP lại.
Lời kết: Những bài học từ thực tế vận hành
Cài xong không có nghĩa là xong. Để hệ thống chạy ổn định 24/7, anh em cần lưu ý 3 điểm mấu chốt:
- Đọc log thường xuyên: File
catalina.outlà nơi đầu tiên bạn phải kiểm tra khi app gặp sự cố. - Tối ưu RAM: Đừng bao giờ để
-Xmxvượt quá 70% tổng RAM server, nếu không OS sẽ kill process Tomcat khi bị tràn. - Sử dụng Reverse Proxy: Trong thực tế, mình luôn đặt Nginx đứng trước Tomcat. Nginx sẽ lo phần SSL và nén gzip, để Tomcat chỉ tập trung xử lý logic Java.
Hy vọng những chia sẻ này giúp anh em triển khai hệ thống nhanh chóng và an toàn hơn. Chúc anh em thành công!

