Hiển thị các bài đăng có nhãn Tomcat. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Tomcat. Hiển thị tất cả bài đăng

Thứ Tư, 20 tháng 1, 2021

Tạo và dùng Role với Ansible - Cài đặt Tomcat 9 trong Ubuntu với Ansible

Xem thêm về cách dùng Ansible tại đây: Giới thiệu Ansible

1. Role trong Ansible là gì?

Trong Ansible, role là một cơ chế cho phép chia nhỏ một playbook thành nhiều tập tin. Điều này giúp đơn giản hóa khi ta muốn viết một playbook phức tạp và giúp ta tái sử dụng chúng.

Một role chỉ nên giới hạn trong việc thực hiện một tác vụ trọn vẹn với đầy đủ những bước để hoàn tất nó. Ngoài ra, nó cũng có thể gọi đến những role mà nó phụ thuộc nếu cần.

Chẳng hạn, ta muốn tạo một playbook để cài đặt Tomcat 9 trong Ubuntu. Và Tomcat cần có Java để hoạt động. Trong trường hợp này, ta sẽ tạo hai role, một để cài đặt Java 11 và một để cài đặt Tomcat. Trong role Tomcat ta sẽ gọi đến role Java để cài Java trước khi cài Tomcat.

Role không phải là playbook. Role chỉ là những tác vụ nhỏ có thể được thực thi một cách độc lập bên trong một playbook. Ta không thể trực tiếp thực thi role, và nó cũng không trực tiếp cho biết nó sẽ được áp dụng vào host nào. Như vậy playbook sẽ gọi đến để thực thi các role và tập tin inventory sẽ xác định các host mà role sẽ thực thi trên đó.


2. Cấu trúc của một role

Thư mục chứa các tập tin của một role có cấu trúc được quy ước bởi Ansible. Các role được tạo bên trong thư mục có tên "roles" nằm cùng thư mục với tập tin playbook. Tên của một role là tên của thư mục chứa role đó.

Chẳng hạn ta có thể tạo một thư mục role có tên tomcat9 với lệnh sau :

$ ansible-galaxy init tomcat9 
hoặc 
$ ansible-galaxy init --force --offline tomcat9 

Role tomcat9 vừa phát sinh này có cấu trúc như sau :
$ tree tomcat9/
tomcat9/
├── README.md
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
└── main.yml

8 directories, 8 files

Một role không nhất thiết phải có tất cả các thư mục như trên. Role đơn giản nhất chỉ cần có thư mục tasks. Tập tin main.yml trong thư mục này định nghĩa các tác vụ cho role.

Chú thích :

- tasks/main.yml : định nghĩa các tác vụ cho role thực thi

- handlers/main.yml : các handlers có thể được dùng bên trong hoặc bên ngoài role.

- defaults/main.yml : định nghĩa các biến mặc định dùng trong role. Các biến này có quyền ưu tiên thấp nhất và có thể được định nghĩa lại bên ngoài role.

- files/: chứa các tập tin mà role dùng trong việc thực thi nó.

- templates/: chứa các tập tin template dùng trong việc triển khai role. Các templates này có thể dùng cú pháp của Jinja2 để tham chiếu đến các biến định nghĩa trong ansible.

- meta/main.yml : định nghĩa những role mà role này phụ thuộc. Các role được định nghĩa ở đây sẽ được thực thi trước tiên, sau đó mới thực thi các tác vụ trong role hiện hành.

Một khi ta đã định nghĩa xong role tomcat9, ta sẽ tạo một playbook để thực thi role này như sau :

- name: Content of toan_ubuntu16
hosts: toan_ubuntu16
become: yes
roles:
- { role: ./roles/tomcat9 }

Dưới đây là một ví dụ cụ thể về việc dùng role với Ansible.



3. Cài đặt Tomcat 9 bằng Ansible

Việc cài đặt Tomcat 9 cần có java, python(2 hoặc 3), unzip cài đặt sẵn nên dưới đây ta cũng tạo các role này. Cụ thể cấu trúc các thư mục và tập tin cần tạo ta có như sau :

vagrant@ansible:~$ tree /vagrant/toan/
/vagrant/toan/
├── inventory-all-vms.yml
├── playbook-tomcat.yml
└── roles
├── open-jdk-11
│   └── tasks
│   └── main.yml
├── python
│   └── tasks
│   └── main.yml
├── python3
│   └── tasks
│   └── main.yml
├── tomcat9
│   ├── defaults
│   │   └── main.yml
│   ├── handlers
│   │   └── main.yml
│   ├── meta
│   │   └── main.yml
│   ├── tasks
│   │   └── main.yml
│   └── templates
│   └── tomcat9.service.j2
└── unzip
└── tasks
└── main.yml

15 directories, 11 files

 

Nội dung các tập tin trên như sau :

* Role open-jdk-11

open-jdk-11\tasks\main.yml :

---
- name: add openjdk repository
become: yes
apt_repository:
repo: ppa:openjdk-r/ppa
state: present

- name: install openjdk 11
become: yes
apt:
name: openjdk-11-jdk
state: present

- name: install openjre 11
become: yes
apt:
name: openjdk-11-jre
state: present

* Role python

python\tasks\main.yml :

- name: ensure python-dev is the latest version
become: yes
apt:
name: ["python", "python-pip", "python-setuptools", "python-dev", "python-dev", "build-essential", "libssl-dev", "libffi-dev", "libxml2-dev", "libxslt1-dev", "zlib1g-dev", "python-lxml"]
state: latest
force_apt_get: yes

* Role python3

python3\tasks\main.yml :

- name: ensure python3-dev is the latest version
become: yes
apt:
name: ["python3", "python3-pip", "python3-setuptools", "python-dev", "python3-dev", "build-essential", "libssl-dev", "libffi-dev", "libxml2-dev", "libxslt1-dev", "zlib1g-dev", "python3-lxml", "python3-pexpect"]
state: latest
force_apt_get: yes

* Role unzip

unzip\tasks\main.yml:

---
- name: install package
become: yes
apt:
name: unzip
state: present

* Role tomcat9

tomcat9\defaults\main.yml : tập tin này định nghĩa các biến dùng cho role tomcat9

tomcat9_service: "tomcat9"
tomcat9_server_root: "/etc/tomcat9"
tomcat9_conf_path: "/etc/tomcat9"
tomcat9_home: "/usr/share/tomcat9"
tomcat9_archive_url: "https://mirror.ibcp.fr/pub/apache/tomcat/tomcat-9/v9.0.41/bin/apache-tomcat-9.0.41.tar.gz"

tomcat9_user: "tomcat9"
tomcat9_port: "8084"
tomcat9_group: "{{ tomcat9_user }}"
tomcat9_webapps_dir: "/usr/share/tomcat9/webapps/"
tomcat9_config_server_file: "/usr/share/tomcat9/conf/server.xml"

tomcat9_logs_dir: "/usr/share/tomcat9/logs"

 

tomcat9\handlers\main.yml :

---
- name: start tomcat9
become: yes
service:
name: "{{ tomcat9_service }}"
state: started

- name: restart tomcat9
become: yes
service:
name: "{{ tomcat9_service }}"
state: restarted

- name: stop tomcat9
become: yes
service:
name: "{{ tomcat9_service }}"
state: stopped 

 

tomcat9\meta\main.yml :

---
dependencies:
- { role: open-jdk-11 }

Role tomcat9 phụ thuộc vào role open-jdk-11, do đó open-jdk-11 sẽ được cài đặt trước khi cài đặt tomcat 9

 

tomcat9\templates\tomcat9.service.j2

[Unit]
Description=Tomcat 9
After=syslog.target network.target

[Service]
Type=simple

User={{ tomcat9_user }}
Group={{ tomcat9_group }}

Environment=JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
Environment='JAVA_OPTS=-Djava.awt.headless=true'

Environment=CATALINA_HOME=/usr/share/tomcat9
Environment=CATALINA_BASE=/usr/share/tomcat9

WorkingDirectory=/usr/share/tomcat9/bin

ExecStop=/bin/sh /usr/share/tomcat9/bin/catalina.sh stop
ExecStart=/bin/sh /usr/share/tomcat9/bin/catalina.sh run
UMask=0022
LogsDirectory=/usr/share/tomcat9/logs
LogsDirectoryMode=777
ReadWritePaths=/usr/share/tomcat9/webapps/

[Install]
WantedBy=multi-user.target

 

tomcat9\tasks\main.yml :

---
- name: add tomcat group
become: yes
group:
name: "{{ tomcat9_group }}"

- name: add tomcat user
become: yes
user:
name: "{{ tomcat9_user }}"
group: "{{ tomcat9_group }}"
home: "{{ tomcat9_home }}"
createhome: no

- name: Create a tomcat directory /usr/share/tomcat9
become: yes
file:
path: "{{ tomcat9_home }}"
state: directory
owner: "{{ tomcat9_user }}"
group: "{{ tomcat9_group }}"

- name: download and unarchive tomcat .tar.gz
become: yes
unarchive:
src: "{{ tomcat9_archive_url }}"
dest: "{{ tomcat9_home }}"
remote_src: yes
extra_opts: [--strip-components=1]

- name: Change ownership
become: yes
file:
path: "{{ tomcat9_home }}"
owner: "{{ tomcat9_user }}"
group: "{{ tomcat9_group }}"
mode: "u+rwx,g+rwx,o=rwx"
recurse: yes
state: directory

- name: Copy tomcat service file
become: yes
template:
src: templates/tomcat9.service.j2
dest: /etc/systemd/system/tomcat9.service
mode: 0644

- name: "configure server file {{ tomcat9_config_server_file }}"
xml:
path: "{{ tomcat9_config_server_file }}"
xpath: "/Server/Service[@name='Catalina']/Connector"
attribute: "port"
value: '{{ tomcat9_port }}'

- name: Create void catalina.out file and give permission
file:
path: /usr/share/tomcat9/logs/catalina.out
state: touch
mode: 0644

- name: Ensure logs are readable not only by tomcat9 user
become: yes
file:
path: "{{ tomcat9_logs_dir }}"
owner: root
group: root
state: directory
mode: a+xrw
recurse: yes

- name: Give permissions to work directory
file:
path: /usr/share/tomcat9/work
owner: root
group: root
mode: a+xrw
recurse: yes

- name: Give permissions to conf directory
file:
path: /usr/share/tomcat9/conf
owner: root
group: root
recurse: yes

- name: Create Catalina directory and give permission
file:
path: /usr/share/tomcat9/conf/Catalina
owner: "{{ tomcat9_user }}"
group: root
state: directory
mode: o+xrw
recurse: yes

- name: Give permissions to bin directory
file:
path: /usr/share/tomcat9/bin
owner: root
group: root
mode: a+xr
recurse: yes

- name: Give permissions to lib directory
file:
path: /usr/share/tomcat9/lib
owner: root
group: root
mode: a+xrw
recurse: yes

- name: Give permissions to webapps directory
file:
path: /usr/share/tomcat9/webapps
mode: a+xrw
recurse: yes

- name: Start and enable Tomcat service
systemd:
name: "{{ tomcat9_service }}"
state: started
enabled: yes
daemon_reload: yes

Tập tin trên định nghĩa quá trình cài đặt tomcat 9. Ở đây ta cài đặt Tomcat 9 trong Ubuntu 16.4 bằng cách tải gói tar.gz của nó về.

 

inventory-all-vms.yml

all:
children:
ubuntu_servers:
hosts:
jenkins_ubuntu18:
ansible_host: 10.0.0.11

toan_local:
hosts:
toan_ubuntu16:
ansible_host: 10.0.0.12

Trên đây là tập tin inventory định nghĩa các host 

 

playbook-tomcat.yml

- name: Content of all VMs
hosts: all
become: yes
roles:
- { role: ./roles/unzip }
- { role: ./roles/python3 }
- { role: ./roles/python }

- name: Content of toan_ubuntu16
hosts: toan_ubuntu16
become: yes
roles:
- { role: ./roles/tomcat9 }

Trên đây là tập tin playbook, nó sẽ thực hiện các role unzip, python, python3 trên tất cả các host. Nó chỉ thực thi role tomcat9 trên host toan_ubuntu16.

* Thực thi playbook này như sau :

vagrant@ansible:~$ ansible-playbook /vagrant/toan/playbook-tomcat.yml -i /vagrant/toan/inventory-all-vms.yml

 

* Tập tin Vagrantfile định nghĩa các máy ảo như sau :

Vagrant.configure("2") do |config|

#common part of vms
BOX_IMAGE = "ubuntu/bionic64" # bionic 64 = ubuntu 18.04 64 bits

#ansible vm description
config.vm.define "ansible" do |ansible|
ansible.vm.box = BOX_IMAGE
ansible.vm.hostname = "ansible"
ansible.vm.network "private_network", ip: "10.0.0.10", virtualbox__intnet: true
ansible.vm.provision "shell", inline: "apt install python -yq", privileged: true
ansible.vm.provision "shell", inline: "sudo apt-get install -yq software-properties-common", privileged: true
ansible.vm.provision "shell", inline: "sudo apt-add-repository -y ppa:ansible/ansible", privileged: true
ansible.vm.provision "shell", inline: "sudo apt-get update -yq", privileged: true
ansible.vm.provision "shell", inline: "sudo apt-get install -yq ansible", privileged: true
ansible.vm.provision "shell", inline: "sudo apt-get install -yq mc", privileged: true
end

#jenkins vm description
config.vm.define "jenkins" do |jenkins|
jenkins.vm.box = BOX_IMAGE
jenkins.vm.hostname = "jenkins"
jenkins.vm.network "private_network", ip: "10.0.0.11", virtualbox__intnet: true
jenkins.vm.provision "shell", inline: "sudo apt-get install -yq mc", privileged: true
end

config.vm.define "toan" do |toan|
toan.vm.box = "ubuntu/xenial64"
toan.vm.hostname = "toan"
toan.vm.network "private_network", ip: "10.0.0.12", virtualbox__intnet: true
toan.vm.network "forwarded_port", guest: 8084, host: 8084
toan.vm.provision "shell", inline: "sudo apt-get install -yq mc", privileged: true
end

end

Ở đây ta forward port của tomcat trong máy ảo là 8084 (định nghĩa trong lúc cài đặt tomcat ở trên) sang port 8084 của localhost. Sau khi thực hiện lệnh ansible-playbook như trên để cài đặt tomcat9, ta có thể kiểm tra tomcat có hoạt động hay chưa bằng URL sau :

http://localhost:8084/



Thứ Ba, 18 tháng 8, 2020

Cài đặt Tomcat trong Ubuntu

Ubuntu cung cấp các gói tomcat, cập nhật thông tin các gói có thể cài đặt :

$ sudo apt-get update

Lệnh sau cho biết Ubuntu có những gói tomcat nào
$ sudo apt-cache search tomcat

Chẳng hạn ta chọn tomcat7, cài đặt nó với lệnh sau :
$ sudo apt-get install tomcat7

Sau khi cài đặt, các tập tin cấu hình của Tomcat nằm trong thư mục /etc/tomcat7

Mặc định, Tomcat dùng cổng 8080 cho kết nối HTTP, thông tin này được định trong tập tin /etc/tomcat7/server.xml , chẳng hạn:
<Connector port="8080" protocol="HTTP/1.1" 
			connectionTimeout="20000"  redirectPort="8443" />
...
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />


Nếu cổng 8080, đã có dịch vụ khác dùng rồi thì phải thay đổi cổng HTTP này cho tomcat với lệnh sau chẳng hạn :
$ sudo vi /etc/tomcat7/server.xml

Mặc định, Tomcat sẽ tìm JVM OpenJDK, rồi đến JVM Sun rồi mới tới các JVM khác. Ta có thể buộc Tomcat dùng một JVM nhất định bằng cách định nghĩa JAVA_HOME trong tập tin /etc/default/tomcat7 chẳng hạn mở tập tin này:
$ sudo vi /etc/default/tomcat7

Rồi định nghĩa JAVA_HOME
JAVA_HOME=/usr/lib/jvm/java-7-oracle

Các user và role (nhóm) được định nghĩa trong tập tin /etc/tomcat7/tomcat-users.xml chẳng hạn :
<role rolename="admin"/>
<user username="tomcat" password="tomcat7" roles="admin"/>

Khi cài đặt gói tomcat7 như trên thì một user và nhóm tomcat7 cũng được thêm vào trong Ubuntu, ta có thể thấy cụ thể điều này như sau :

Danh sách các group nằm trong tập tin /etc/group ta xem nó với lệnh sau chẳng hạn :
$ cat /etc/group
Xem danh sách các user :
$ cat /etc/passwd

Vì lý do an toàn, mặc định user tomcat7 không có quyền viết trong thư mục /etc/tomcat7 . Một số chức năng quản trị ứng dụng web cần có quyền viết trong thư mục này, ta cần phải trao quyền cần thiết này cho các user của nhóm tomcat7 :
$ sudo chgrp -R tomcat7 /etc/tomcat7
$ sudo chmod -R g+w /etc/tomcat7 


* Để kiểm tra xem tomcat sau khi cài đặt có hoạt động không có lỗi hay không, ta có thể cài một gói ví dụ sau để kiểm tra :
$ sudo apt-get install tomcat7-examples

Sau đó kiểm tra có thể xem ứng dụng này tại địa chỉ :
http://localhost:8080/examples


Trong trường hợp bị lỗi, xem thêm thông tin lỗi với lệnh :
$ sudo service tomcat7 status

Hoặc xem chi tiết log :
$ sudo cat /var/log/tomcat7/catalina.out


Kiểm tra xem port 8080 đã có dịch vụ nào dùng chưa :
$ netstat -lntu | grep 8080

Nếu có dịch vụ khác xài rồi thì phải đổi port này.



* Các lệnh khởi động và dừng tomcat :

$ sudo service tomcat7 stop
$ sudo service tomcat7 start

Các tập tin/thư mục liên quan đến tomcat :
/etc/init.d/tomcat7
/usr/share/tomcat7
/var/lib/tomcat7/
/var/log/tomcat7/
/var/cache/tomcat7/

 

* Đổi người dùng cho tomcat

Khi cài đặt gói tomcat7 trong Ubuntu, người dùng  và nhóm mặc định của tomcat được cấu hình là tomcat7:tomcat7. Chẳng hạn ta muốn chọn người dùng 'toan' cho Tomcat, trước hết dừng Tomcat.

$ sudo service tomcat7 stop

Ta có thể đổi người dùng bằng cách cấu hình lại quyền cho các thư mục sau như dưới đây :
$ sudo chgrp -R toan /etc/tomcat7

$ sudo chown -R toan:toan /var/lib/tomcat7
$ sudo chown -R toan:toan /var/cache/tomcat7
$ sudo chown -R toan:toan /var/log/tomcat7

 

Định nghĩa lại người dùng trong tập tin cấu hình của tomcat :

$ sudo vi /etc/default/tomcat7
Cập nhật thông tin như sau :
TOMCAT7_USER=toan
TOMCAT7_GROUP=toan

Sau đó khởi động lại Tomcat :
$ sudo service tomcat7 start

 

* Đôi lúc khi khởi động, tomcat không tìm thấy một số thư mục, ta có thể tạo đường dẫn liên kết đến chúng theo cú pháp :

$ ln -s source link_symb

Ví dụ tạo đường trong /usr/share/tomcat7 đường dẫn conf đến thư mục /etc/tomcat7 và nối logs đến /var/log/tomcat7:
$ cd /usr/share/tomcat7

$ sudo ln -s /etc/tomcat7 conf
$ sudo ln -s /var/log/tomcat7 logs

Có thể xóa đường dẫn liên kết này bằng lện unlink :
$ sudo unlink conf
 

* Ta có thể thay đổi host name trong /etc/tomcat7/server.xml:

$ sudo vi /etc/tomcat7/server.xml
Rồi thay đổi defaultHost và name như ý muốn :
<Engine name="Catalina" defaultHost="172.0.0.1">
<Host name="172.0.0.1"  appBase="webapps"
 unpackWARs="true" autoDeploy="true">


 

* Khởi động Tomcat bằng script

Ta có thể khởi động Tomcat bằng startup.sh và ngừng nó bằng shutdown.sh như sau :

$ sudo /usr/share/tomcat7/bin/startup.sh
$ sudo /usr/share/tomcat7/bin/shutdown.sh

Hai script này gọi đến script catalina.sh, ta nên kiểm tra các biến environment CATALINA_HOME và CATALINA_BASE, để khi khởi động không bị lỗi như sau :
$ /usr/share/tomcat7/bin/catalina.sh version

Cách khác để kiểm tra hai biến này có được định nghĩa đúng không :
$ ps aux | grep catalina

Mặc định thì CATALINA_BASE (configurations) và CATALINA_HOME (binaries) trỏ đến cùng một thư mục. Nhưng khi cài đặt gói tomcat7 trong Ubuntu nó sẽ cài ở hai thư mục để cho phép chạy nhiều instance của Tomcat mà không cần phải copy lại phần binaires. Ta phải định nghĩa lại hai biến này : CATALINA_HOME trỏ đến /usr/share/tomcat7, và CATALINA_BASE trỏ đến /var/lib/tomcat7.

Để làm điều này ta tạo tập tin setenv.sh định nghĩa hai biến này trong /usr/share/tomcat7/bin/
$ cd /usr/share/tomcat7/bin

Tạo tập tin setenv.sh và đổi quyền để có thể thực thi nó :
$ sudo touch setenv.sh
$ sudo chmod 755 setenv.sh


Nội dung của tập tin setenv.sh :
#! /bin/sh

# Directory where the Tomcat binary distribution resides
CATALINA_HOME=/usr/share/tomcat7

# Directory for per-instance configuration files and webapps
CATALINA_BASE=/var/lib/tomcat7


Sau đó khởi động lại Tomcat ta sẽ thấy hai biến này đã được cập nhật
$ sudo /usr/share/tomcat7/bin/startup.sh


Thứ Hai, 22 tháng 4, 2013

Sơ lược về máy chủ Web (Web server)

Một máy chủ web (web server) bao gồm tổng thể nhiều thành phần, dựa vào đó các ứng dụng web (web application) chạy. Ở đây ta giới hạn chỉ nói đến máy chủ web dành cho ứng dụng web dùng Java. Những thành phần của máy chủ web này có thể bao gồm :
- máy chủ HTTP (HTTP server)
- bộ chứa Servlet/JSP (Servlet/JSP container)
- gói hiện dựng JSF (bundled JSF implementation)
- máy chủ EJB (EJB server)
- bộ chứa EJB (EJB container)
- Các dịch vụ Java EE (JNDI Resources, JDBC DataSources, JMS, Web Services JAX-RS hay JAX-WS, JPA, JAAS ...)
- Các dịch vụ khác (SSI, SSL, Security Manager, ...)
- ...

Thứ Năm, 18 tháng 4, 2013

HTTP : Sơ Lược giao thức HTTP (HTTP protocole)

    Giao thức HTTP (Hipertext Transfer Protocol - Giao thức truyền tải siêu văn bản) là giao thức giao tiếp theo kiểu truy vấn - trả lời (request-response) giữa khách-chủ (client-server) được sử dụng phổ biến trên internet. Cũng nên biết là trên internet ngoài HTTP ta còn có rất nhiều giao thức khác như FTP (File Transfer Protocol - Giao thức truyền tập tin), SMTP (Simple Mail Transfer Protocol - Giao thức truyền tải thư tín đơn giản)... World Wide Web được xây dựng dưa trên nền tảng giao thức HTTP và công nghệ HTML (Hipertext Markup Language : Ngôn ngữ đánh dấu siêu văn bản).
    Một HTTP khách (HTTP client), chẳng hạn một trình duyệt web (web browser), dùng HTTP để truy vấn một tài liệu HTML, khi nhận được trả lời từ HTTP chủ (HTTP server), chẳng hạn máy chủ Apache (Apache HTTP server : httpd), nó sẽ định dạng (format) rồi hiển thị tài liệu này cho người dùng. HTTP được sử dụng để truyền tải không chỉ HTML, tuy nhiên HTML là ngôn ngữ giao tiếp (lingua franca) của web và ứng dụng web.

Thứ Hai, 26 tháng 11, 2012

Cài đặt Apache Tomcat trên Linux

Dưới đây ta sẽ cài Tomcat trên hệ điều hành OpenSuse theo các bước sau :
- Tải gói nén của Tomcat về máy,
$ wget http://mir2.ovh.net/ftp.apache.org/dist/tomcat/tomcat-7/v7.0.29/bin/apache-tomcat-7.0.29.tar.gz

- Giải nén gói vừa tải về
$ tar xzvf apache-tomcat-7.0.29.tar.gz

- Chép phần vừa giải nén này vào thư mục /opt/
$ mv apache-tomcat-7.0.29 /opt/

- Tạo một đường dẫn tượng trưng (symbolic link) cho thư mục này, /opt/tomcat là đường dẫn tượng trưng chỉ tới thư mục /opt/apache-tomcat-7.0.29/
$ ln -s /opt/apache-tomcat-7.0.29/ /opt/tomcat

- Khởi động Tomcat, để kiểm tra
$ /opt/tomcat/bin/startup.sh