Deploy SpringBoot trên Tomcat với Ubuntu Server
NỘI DUNG BÀI VIẾT
Có nhiều cách để deploy ứng dụng Spring Boot: Export ra file Jar và chạy trực tiếp file jar; Sử dụng Gradle bootRun; Chạy trên Tomcat. Mình chọn cách Deploy SpringBoot trên Tomcat vì dựa trên kinh nghiệm cá nhân mình thấy Tomcat ổn định và đáng tin cậy. Ngoài ra nếu chạy trực tiếp file jar (thực ra Tomcat đã được đóng gói trong file này) thì khi deploy phiên bản mới bạn phải khởi động lại cả web engine, trong khi sử dụng Tomcat bạn chỉ cần chạy lại ứng dụng. Sử dụng Gradle bootRun cũng là một cách hay, nhưng mình chưa thấy bài báo nào nói về sử dụng nó cho production. Deploy lên Tomcat server vẫn là cách truyền thống đem lại sự ổn định và hiệu suất cao cho sản phẩm.
Dưới đây là các bước deploy ứng dụng Spring Boot trên Apache Tomcat với Ubuntu server.
1. Export file war từ Spring Boot source code
1.1. Thêm SpringApplicationBuilder vào SpringBootApplication:
Thông thường source code Spring Boot chỉ có hàm main trong SpringBootApplication, bạn cần extends bởi SpringBootServletInitializer và thêm configure SpringApplicationBuilder vào class nàu như sau:
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Code language: JavaScript (javascript)
Ngoài ra bạn phải thêm gói spring-boot-starter-tomcat như sau:
dependencies {
// …
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
// …
}
Code language: JavaScript (javascript)
1.2. Export file war
Export file war cũng có nhiều cách, nhưng bạn nên sử dụng Gradle. Trước hết bạn cần thêm war plugin vào file build.grade của project như sau:
apply plugin: 'java'
apply plugin: 'war' => thêm dòng này
Code language: PHP (php)
Nếu đã cài đặt Gradle cli, bạn export file war bằng lệnh sau (tại thư mục dự án):
gradle bootWar
Nếu ko muốn phải cài đặt Gradle bạn có thể dùng gradle wrapper:
./gradlew bootWar
Nếu source code có nhiều project bạn dùng lệnh sau:
./gradlew project_name:bootWar
2. Cài đặt Tomcat trên Ubuntu:
2.1. Cài đặt JDK:
Trước hết bạn update Ubuntu package:
sudo apt update
Sau đó cài đặt JDK:
sudo apt install default-jdk
Code language: JavaScript (javascript)
Nếu project của bạn yêu cầu Jdk 8, bạn hãy dùng lệnh sau:
sudo apt install openjdk-8-jdk
2.2. Tạo Tomcat user:
Bạn cần có Ubuntu user để chạy Tomcat. Trước hết tạo group user:
sudo groupadd tomcat
Sau đó bạn tạo user:
sudo useradd -s /bin/false -g tomcat -d /opt/tomcat tomcat
Code language: JavaScript (javascript)
2.3. Cài đặt Tomcat:
Vào thư mục temp để download Tomcat:
cd /tmp
Download Tomcat bằng lệnh sau:
curl -O http://mirror.downloadvn.com/apache/tomcat/tomcat-9/v9.0.14/bin/apache-tomcat-9.0.14.tar.gz
Code language: JavaScript (javascript)
Tạo thư mục cài đặt Tomcat và giải nén ứng dụng bạn vừa download về vào đó:
sudo mkdir /opt/tomcat
sudo tar xzvf apache-tomcat-9*tar.gz -C /opt/tomcat --strip-components=1
2.4. Phân quyền cho Tomcat:
Chuyển tới thư mục cài đặt Tomcat:
cd /opt/tomcat
Cấp quyền group tomcat cho thư mục này:
sudo chgrp -R tomcat /opt/tomcat
Cấp quyền truy cập cho thư mục conf:
sudo chmod -R g+r conf
sudo chmod g+x conf
Và cấp quyền owner cho một số thư mục khác:
sudo chown -R tomcat webapps/ work/ temp/ logs/
2.5. Tạo Tomcat service:
Xác định vị trí của JDK để gán cho biến JAVA_HOME mà bạn cần sau đó:
sudo update-java-alternatives -l
Sẽ trả về cho bạn kết quả để xác định được vị trí của JDK tương tự thế này:
java-1.11.0-openjdk-amd64 1081 /usr/lib/jvm/java-1.11.0-openjdk-amd64
Tiếp theo bạn tạo file tomcat.service bằng lệnh sau:
sudo nano /etc/systemd/system/tomcat.service
Nhập nội dung file như sau:
[Unit]
Description=Apache Tomcat Web Application Container
After=network.target
[Service]
Type=forking
Environment=JAVA_HOME=usr/lib/jvm/java-1.11.0-openjdk-amd64
Environment=CATALINA_PID=/opt/tomcat/temp/tomcat.pid
Environment=CATALINA_HOME=/opt/tomcat
Environment=CATALINA_BASE=/opt/tomcat
Environment='CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC'
Environment='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom'
ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh
User=tomcat
Group=tomcat
UMask=0007
RestartSec=10
Restart=always
[Install]
WantedBy=multi-user.target
Code language: JavaScript (javascript)
Trong đó bạn cần thay biến JAVA_HOME với giá trị chính là location của JDK mà bạn vừa tìm ra ở trên.
Reload lại service của Ubuntu bằng lệnh sau:
sudo systemctl daemon-reload
Sau đó bạn có thể khởi chạy Tomcat:
sudo systemctl start tomcat
Bạn có thể kiểm tra trạng thái hoạt động của Tomcat service bằng lệnh sau:
sudo systemctl status tomcat
2.6. Cấu hình firewall và chạy thử:
Chạy lệnh sau để mở firewall cho phép truy cập cổng của Tomcat (mặc định là 8080):
sudo ufw allow 8080
Giờ đây bạn có thể truy cập vào Tomcat web bằng link sau: http://server_domain_or_IP:8080
Để Tomcat service tự khởi động cùng hệ thống bạn dùng lệnh sau:
sudo systemctl enable tomcat
2.7. Cấu hình web quản lý Tomcat:
Mặc định trong cấu hình của Tomcat sẽ không có user truy cập vào web quản lý Tomcat, do đó bạn cần cấu hình lại bằng cách sửa file sau:
sudo nano /opt/tomcat/conf/tomcat-users.xml
Thêm user vào thẻ tomcat-users như sau:
<tomcat-users . . .>
<user username="admin" password="password" roles="manager-gui,admin-gui"/>
</tomcat-users>
Code language: HTML, XML (xml)
Mặc định Manager app và Host Manager app sẽ giới hạn IP truy cập, do đó bạn muốn remote access được 2 ứng dụng này bạn phải sửa 2 file context.xml của 2 ứng dụng này:
sudo nano /opt/tomcat/webapps/manager/META-INF/context.xml
sudo nano /opt/tomcat/webapps/host-manager/META-INF/context.xml
Bạn chỉ cần comment tag limit IP như sau:
<Context antiResourceLocking="false" privileged="true" >
<!--<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />-->
</Context>
Code language: HTML, XML (xml)
Lưu lại những file trên và khởi động lại Tomcat là bạn hoàn tất việc cấu hình web quản lý Tomcat. Khởi động lại Tomcat service bằng lệnh sau:
sudo systemctl restart tomcat
3. Deploy file war lên Tomcat bằng Web quản lý của Tomcat:
Truy cập vào Manager app bằng link sau: http://server_domain_or_IP:8080/manager/html
Sẽ xuất hiện màn hình Manager app như sau:
Bạn chỉ cần chọn file war đã được export ở trên và upload lên, ứng dụng của bạn sẽ được deploy và xuất hiện trên List Applications của màn hình quản lý. Ở đây có các lệnh tương ứng bạn có thể sử dụng với ứng dụng của mình như Start, Stop, Reload, Undeploy.
Chúc bạn deploy thành công.
Leave a Reply