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ì?
- Java Web Application là gì?
- Bash Profile là gì?
- Làm thế nào để cấu hình Tomcat chạy Java Web Application?
- Làm thế nào để xuất bản Tomcat Java Web Application qua Nginx Web Server
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
- Catalina là Tomcat 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.
- Jasper là Tomcat 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
và ~/.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
và-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&characterEncoding=UTF-8&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 "%r" %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-bashprofile-and-what-is-its-use
http://hacktux.com/bashrc-bash_profile/
http://journaldev.com/1854/java-web-application-tutorial-for-beginners