Làm thế nào để cấu hình Tomcat chạy Java Web Application

Trong bài viết này, Tiến hướng dẫn bạn cách cấu hình Tomcat chạy Java Web Application trên máy chủ CentOS.

Bài viết sẽ trả lời những câu hỏi sau:

Tomcat là gì?

Apache Tomcat, thường gọi là Tomcat Server, là một open-source Java Servlet Container được phát triển bởi Apache Software Foundation (ASF). Tomcat triển khai một số đặc tả của Java bao gồm Java Servlet, JavaServer Pages (JSP), Java EL, và Web Socket, và cung cấp một môi trường "Java" HTTP Web Server nơi mà Java code có thể chạy.

Tomcat được phát triển và nâng cấp/ duy trì bởi cộng đồng dưới sự bảo trợ của Apache Software Foundation, phát hành dưới giấy phép Apache License 2.0 và là phần mềm nguồn mở.

Các thành phần của Tomcat

  • CatalinaTomcat Servlet Container. Catalina thực hiện những yêu cầu kỹ thuật của Sun Microsystem cho servlet và JavaServer Pages (JSP). Trong Tomcat, phần tử Realm đại diện cho "database" của tên người dùng (username), mật khẩu (password) và vai trò (roles) (tương tự như các nhóm Unix) được gán cho những người dùng đó. Real cho phép Catalina tích hợp vào môi trường ở nơi có thông tin xác thực đã được tạo ra và duy trì. Và sau đó sử dụng thông tin này để triển khai Container Managed Security như mô tả trong Servlet Specification.
  • Coyote là một thành phần Connector cho Tomcat để hỗ trợ giao thức HTTP 1.1 như một web server. Điều này cho phép Catalina, trên danh nghĩa một Java Servlet hoặc JSP container, cũng hoạt động như một máy chủ web phục vụ local files như HTTP document. Coyote lắng nghe incoming connection tới server trên những TCP port cụ thể và forward request tới Tomcat Engine để xử lý request và gửi trả lại response tới client gửi request. Một Coyote Connector khác, Coyote JK cũng lắng nghe tương tự nhưng thay vì forward, nó gửi yêu cầu tới một máy chủ web server khác, như Apache, sử dụng giao thức JK. Điều này thường mang lại performance tốt hơn.
  • JasperTomcat JSP Engine. Jasper phân tích JSP files để biên dịch (compile) chúng thành Java code như servlet (có thể được xử lý bởi Catalina). Khi chạy, Jasper phát hiện các thay đổi với JSP files và recompile chúng.
  • Cluster để quản lý các ứng dụng lớn (large applications). Nó có tính năng load balancing, và yêu cầu phiên bản JDK 1.5 hoặc cao hơn.
  • High Availability tính năng này giúp thực hiện những thay đổi như new releases, change request mà không ảnh hưởng đến live environment. Điều này được thực hiện bằng cách gửi các yêu cầu truy cậu đến temporary server trên một different port trong khi main server được nâng cấp trên main port. Nó rất hữu dụng cho máy chủ web có lưu lượng truy cập cao.
  • Web Application

Java Web Application là gì?

Java Web Application được sử dụng để tạo dynamic website. Java cung cấp sự hỗ trợ cho web application thông qua Servlets và JSP. Chúng ta có thể static website nhưng khi chúng ta muốn dynamic website, chúng ta cần web application.

Bash Profile là gì?

Cả ~/.bashrc~/.bash_profile là một script có thể được thực hiện khi bash được gọi. ~.bashrc thực thi khi bạn chạy bash bằng cách sử dụng một interactive mà không phải login shell. ~/.bash_profile chỉ duy nhất thực thi khi thực thi trong login shell.

Làm thế nào để cấu hình Tomcat chạy Java Web Application?

Bước 1: chép source Java lên server

scp -R jdk1.7.0_75 tien-phan@:/opt  

Bước 2: jdk1.7.0_75/ dài quá, cần làm cho nó đơn giản hơn

ln -s /opt/jdk1.7.0_75 /opt/java  

Bước 3: khai báo Java Binary trong ~/.bash_profile

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then  
        . ~/.bashrc
fi

# User specific environment and startup programs

export JAVA_HOME=/opt/java

PATH=$PATH:$HOME/bin:$JAVA_HOME/bin:$ELIXIR/bin  

Bước 4: chép source Tomcat lên server

scp -R apache-tomcat-7.0.57 tien-phan@:/opt  

Bước 5: làm cho tên gọi apache-tomcat-7.0.57 đơn giản hơn

ln -s /opt/apache-tomcat-7.0.57 /opt/java  

Bước 6: ở đây, Tiến tạo 01 user để chạy Tomcat Web Application có tên ops. Sau đó chép các file nằm trong apache-tomcat-7.0.57/ vào home của ops

[ops@tien-phan ~]$ ls -lrt
total 6644  
drwxrwxr-x+ 9 ops ops    4096 Jul 11  2015 tomcat-ops  
[ops@tien-phan ~]$ ls -lrt tomcat-ops/
total 136  
drwxrwxr-x+ 3 ops ops  4096 Jul 11  2015 work  
drwxrwxr-x+ 2 ops ops  4096 Jul 11  2015 lib  
drwxrwxr-x+ 2 ops ops  4096 Nov 11  2015 bin  
drwxrwxr-x+ 3 ops ops  4096 Mar 13 10:36 conf  
drwxrwxr-x+ 3 ops ops  4096 Sep  1 01:27 webapps  
drwxrwxr-x+ 2 ops ops 36864 Sep  1 08:06 temp  
drwxrwxr-x+ 2 ops ops 73728 Sep  7 03:09 logs  

Cấu trúc thư mục và vai trò trong Tomcat Binary

/bin

  • chứa file startup.sh, shutdown.sh và những scripts/programs khác.

conf/

  • Server-wide Tomcat configuration.
  • Bạn sẽ chỉnh sửa server.xml và tomcat-users.xml to để cấu hình logging, authentication và access control, enable SSL, etc.
  • Web applications có thể ghi đè một số thiết lập cấu hình server-wide trong file cấu hình của riêng nó.

webapps/

  • Chứa thư mục web applications và WAR files.

logs/

  • Tomcat log files mặc định lưu ở đây.
  • Tomcat sinh ra log files có tên dạng catalina.out và localhostaccesslog.yyyy-mm-dd.log files.

Bước 7: chép binary file của Tomcat Java Web Application vào đường dẫn tomcat-ops/webapps/

[ops@tien-phan webapps]$ ls -lrt
total 151660  
-rw-rw----+ 1 ops ops 155295231 Sep  1 01:27 ops-portal.war

7 bước trên là phần dọn dẹp cho binary file có chỗ lưu trú. Giờ tới phần quan trọng hơn cấu hình khai báo thông tin database, thông tin xác thực cho Tomcat.

Bước 8: để tùy chỉnh dung lượng Memory (RAM) dành cho Tomcat Web App, bạn cần sửa file setenv.sh ở đường dẫn ~/tomcat-ops/bin

vim setenv.sh

JAVA_OPTS="-Xms1024m -Xmx8096m -XX:+TieredCompilation -XX:+UseNUMA   -XX:+UseParallelGC -XX:+UseCompressedOops -XX:MaxPermSize=2048m"  

Giải thích cấu hình

  • -Xms1024m -Xmx8096m thiết lập dung lượng Memory tối thiếu và Memory tối đa cho heap size của JVM với thông số -Xms-Xmx. Các giới hạn tốt nhất phụ thuộc vào nhiều điều kiện, chẳng hạn như ETL bạn chạy, đối với các truy vấn/ tìm kiếm dữ liệu nên khuyến cáo tối đa 1GB. Hãy tìm phương pháp đo cụ thể cho Tomcat Web Application của bạn.
  • -XX:MaxPermSize=2048m bạn cũng nên thiết lập maximum limit của PermGen (Permanent Generation) memory space tới dung lượng lớn hơn mặc định. Mặc định là 64 MB là không đủ cho các ứng dụng thuộc lớp enterprise. Một giới hạn bộ nhớ phù hợp phụ thuộc vào các tiêu chí khác nhau, nhưng 256 MB sẽ tạo ra sự lựa chọn tốt trong hầu hết các trường hợp. Nếu PermGen tối đa quá thấp, OutOfMemoryError: PermGen space có thể xảy ra.
  • -XX:+TieredCompilation Tiered compilation, introduced in Java SE 7, brings client startup speeds to the server VM. Normally, a server VM uses the interpreter to collect profiling information about methods that is fed into the compiler. In the tiered scheme, in addition to the interpreter, the client compiler is used to generate compiled versions of methods that collect profiling information about themselves. Since the compiled code is substantially faster than the interpreter, the program executes with greater performance during the profiling phase. In many cases, a startup that is even faster than with the client VM can be achieved because the final code produced by the server compiler may be already available during the early stages of application initialization. The tiered scheme can also achieve better peak performance than a regular server VM because the faster profiling phase allows a longer period of profiling, which may yield better optimization. Mình giữ nguyên tiếng Anh đoạn này, để mình và bạn ngẫm nghĩ với nó.
  • -XX:+UseNUMA NUMA architecture (ở thời điểm viết, mình chưa có kiến thức phần này)
  • -XX:+UseParallelGC (ở thời điểm viết, mình chưa có kiến thức phần này)
  • -XX:+UseCompressedOops (ở thời điểm viết, mình chưa có kiến thức phần này)

Bước 9: khai báo thông tin kết nối database ở file context.xml ở đường dẫn ~/tomcat-ops/conf

<?xml version='1.0' encoding='utf-8'?>  
<Context>  
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
        <Resource name="ops-portal-db" auth="Container" type="javax.sql.DataSource"
              username="ops" password=")(*&^%$#@!"
              url="jdbc:mysql://127.0.0.1:3307/ops-portal?useUnicode=yes&amp;characterEncoding=UTF-8&amp;autoReconnect=true"
              driverClassName="com.mysql.jdbc.Driver"
              initialSize="5" maxWait="5000"
              maxActive="40" maxIdle="5"
              validationQuery="select 1"
              poolPreparedStatements="true"/>
</Context>  

Giải thích cấu hình

  • WatchedResource
  • Resource name
  • driverClassName
  • initialSize
  • maxActive
  • validationQuery
  • poolPreparedStatements

Bước 10: khai báo thông số HTTP Web Application ở file server.xml ở đường dẫn ~/tomcat-ops/conf

<?xml version='1.0' encoding='utf-8'?>  
<Server port="8010" shutdown="SHUTDOWN">  
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JasperListener" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

  <Service name="Catalina">

    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="150" minSpareThreads="4"/>
    <Connector port="8085" protocol="HTTP/1.1"
                maxThreads="250" maxHttpHeaderSize="8192"
                enableLookups="false"  acceptCount="2000"
                connectionTimeout="20000" disableUploadTimeout="true" />

    <Engine name="Catalina" defaultHost="mc">
      <Host name="mc"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="mc_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>
    </Engine>
  </Service>
</Server>  

Giải thích cấu hình

  • Listener className
  • Service name="Catalina"

Làm thế nào để xuất bản Tomcat Java Web Application qua Nginx Web Server

Giờ là lúc bạn xuất bản Tomcat Java Web Application ra internet. Bạn cần Web Server đứng trước Tomcat Java Web App. Tôi dùng Nginx và cấu hình như dưới đây.

Tôi đi tới file cấu hình Nginx /etc/nginx/conf.d/default.conf
(Như một thói quen, bạn luôn luôn tạo 01 bản sao lưu của file cấu hình trước khi thay đổi và lưu thay đổi)

Tôi thêm Nginx directive sau cho ops-portal

location /ops-portal {  
    proxy_buffers 16 4k;
    proxy_buffer_size 2k;
    proxy_set_header X-Forwarded-Host   $host;
    proxy_set_header X-Real-IP          $remote_addr;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
    set_real_ip_from                    127.0.0.1;
    real_ip_header                      X-Forwarded-For;
    proxy_pass                          http://127.0.0.1:8085/ops-portal;
        proxy_read_timeout              300;
  }

Tiếp đó, để chắc chắn cú pháp Nginx configuration là đúng và đề phòng sai xót bất kỳ làm gián đoạn Web Server, bạn dùng lệnh sau để kiểm tra cú pháp:

[tien@tien-phan ~]# sudo nginx -t 
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok  
nginx: configuration file /etc/nginx/nginx.conf test is successful  

Sau cùng, bạn reload Nginx để nó lấy cấu hình mới và chính thức xuất bản Web Site ra internet.

[tien@tien-phan ~]# sudo nginx -s reload

Kết luận

Trong bài viết này, tôi đã hướng dẫn bạn cấu hình Tomcat chạy Java Web Application. Nếu bạn là người mới bắt đầu, tôi có niềm tin bài viết giúp ích cho bạn. Tôi rất vui khi bạn đọc tới đây.

Lời cám ơn

Tôi cám ơn bạn đã dành thời gian để đọc bài viết này. Tất nhiên, tôi luôn quan tâm đến hoàn thiện chất lượng bài viết, vì vậy mọi sự đóng góp của bạn là sự khích lệ đối với tôi.

Bài viết thể hiện quan điểm, văn phong của tác giả. Mọi sự tranh luận, phản biện được khuyến khích. Và tôi bảo lưu mọi quan điểm cho đến khi mọi thứ được sáng tỏ trên cơ sở sự chính xác của thông tin.

Tài liệu tham khảo

https://tomcat.apache.org/tomcat-7.0-doc/config/context.html
http://wiki.metawerx.net/wiki/Context.xml
https://stackoverflow.com/questions/198577/real-differences-between-java-server-and-java-client
https://docs.oracle.com/cd/E4051801/integrator.311/integratorinstall/src/clildiserverconfig.html
http://crunchify.com/how-to-change-jvm-heap-setting-xms-xmx-of-tomcat/
https://tomcat.apache.org/tomcat-7.0-doc/RUNNING.txt
https://www.unidata.ucar.edu/software/thredds/v4.3/tds/tds4.2/tutorial/GettingStarted.html
https://www.quora.com/What-is-bash
profile-and-what-is-its-use
http://hacktux.com/bashrc-bash_profile/
http://journaldev.com/1854/java-web-application-tutorial-for-beginners

Tien Phan

Read more posts by this author.

Subscribe to

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!