post-image

Deploy SpringBoot trên Tomcat với Ubuntu Server

Deployment & CI/CD

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);
    }
}

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'
    // …
}

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

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

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

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

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

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>

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>

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.

Nguồn: https://medium.com/@kongminh/deploy-spring-boot-tr%C3%AAn-apache-tomcat-v%E1%BB%9Bi-ubuntu-server-51ee74cee1ab

Leave a Reply

Your email address will not be published. Required fields are marked *