Tomcat是由Apache軟件基金會下屬的Jakarta項目開發的一個Servlet容器,按照Sun Microsystems提供的技術規範,實現了對Servlet和JavaServer Page(JSP)的支持,並提供了做爲web服務器的一些特有功能,如Tomcat管理和控制平臺、安全域管理和Tomcat閾等。可是不能將Tomcat和Apache HTTP服務器混淆,Apache HTTP服務器時一個用C語言實現的HTTP web服務器,而Tomcat則是由Java編寫。html
Java是一種普遍使用的計算機編程語言,擁有跨平臺、面向對象、泛型編程的特性,普遍應用於企業級Web應用開發和移動應用開發。Java的特色之一面向對象,是程序設計方法的一種。java
過程式編程:以指令爲中心,數據服務於代碼 對象式編程:以數據位中,指令服務於數據
用java語言編譯源代碼,經過JAVAC (Java complie)它編譯成java .class(bytes code)文件,而後在Java VM中運行.class文件;當編寫程序時,經過調用類(API class)中的方法來訪問系統資源,而當程序運行時,它經過調用class文件中實現Java API的方法來知足程序的Java API調用。Java VM 和Java API一塊兒組成一個平臺,被稱爲JDK(Java Development Kit),全部的Java程序都在其上編譯和運行。mysql
Java VM主要任務時裝載class文件而且執行其中的字節碼,加載程序的類文件即程序的類文件依賴到的其餘的類文件然後運行,整個運行表現爲一個jvm進程。它包含一個類裝載器(class loader)能夠從程序和API裝載class文件;可是Java API的類只在程序執行中須要時纔會裝載。linux
Java SE包含了Java二進制程序(如JVM和Java字碼編譯器)和Java的核心代碼庫;而Java EE標準則包含了一組適用於建立企業級Web應用程序API。Java EE是創建在Java SE基礎之上;它包含了多個獨立的API,如Servlet和JSP等nginx
方法區線程共享,用於存儲被JVM加載的class信息、常量、靜態變量、方法等程序員
堆JVM所管理的內存中佔用空間最大的一部分;也是GC管理的主要區域;存儲對象web
棧線程私有,存儲線程本身的局部變量正則表達式
PC寄存器線程私有的內存空間,程序的指令指針sql
本地方法棧執行引擎調用本地方法是的運行時聶村去數據庫
JVM的功能模塊主要包括類加載器、執行引擎和垃圾回收系統。
-- JVM組成
JRE(JVM+java SE API):是用於實現java程序運行的最小環境 JDK(Java+API+JVM):是用於實現Java程序開發的最小環境
index.jsp-->jasper-->servert Source Code(.java)-->Java Compiler (.class)-->在JVM虛擬機上運行
Tomcat不是一個完整意義上的Java EE服務器,甚至沒有提供對一個主要java EE API。因爲遵照apache開源協議,tomcat爲衆多java應用程序服務器嵌入本身的產品中構建商業的java應用程序服務器,如JBoss等
Servlet一般須要實現編譯好,而JSP則並不是必須事先編譯。這意味着Servlet一般放置於私有資源區域,而JSP則一般以嵌入代碼的方式包含於HTML頁面文件中,這些HTML文件一般放置在公開資源區域。
MVC架構由Contoller、Model和View構成,實現Apache Structs框架。
a、Servlet用於實現應用邏輯 b、JSP用於內容展現 c、標籤庫和JSP擴展語言用於替換JSP內部嵌入Java代碼,進而下降了HTML維護的複雜度 d、MVC框架用於實現展現和應用邏輯分離
對於一個web應用程序而言,其一般由Servlet、JSP和其餘文件等共同組成。這些文件一般被打包成WAR(Web Application Archive)格式,並以.war做爲打包後的文件擴展名。而Servlet規範則定義了在WAR內部組織這些文件的標準目錄結構。
/ :web應用程序的根目錄,全部可被公開訪問的文件均放置於此處,如HTML、JSP和圖片文件等 /WEB-INF :此目錄爲私有資源目錄,其內部的全部文件和子目錄不能被公開訪問;包含此web應用程序的配置文件web.xml,一般放置於此目錄 /WEB-INF/classes:當前web應用程序的類文件存在目錄 /WEB-INF/lib:可被打包爲JAR格式的類文件一般放置於此目錄
bin:腳本,即啓動時用到的類 conf:配置文件目錄 lib:庫文件,Java類庫,jar logs:日誌文件目錄 temp:臨時文件目錄 webapps:webapp的默認目錄 work:工做目錄,存放編譯後的字節碼文件
server.xml tomcat主配置文件,包含service、connector、engine、realm、valve、host相關配置信息
web.xml 每一個webapp只有「部署」後才能被訪問,它的部署方式一般有web.xml進行定義,其存放的位置爲WEB-INF/目錄下,次文件爲全部的webapps提供默認部署相關的配置
context.xml 每一個文本app均可以使用的配置文件,它一般有專用的配置文件contest.xml來定義,其存放位置爲WEB-INF/目錄下
tomcat-user.xml realm認證時用到的相關角色、用戶和密碼等信息;tomcat自帶的manager默認狀況下會用到此文件。此文件在tomcat啓動時被裝入內存
catalina.policy 當使用-security選項啓動tomcat時,用於爲tomcat設置安全策略
catalina.properties Java屬性的定義文件,用於設定類加載器路徑,以及一些與JVM調優相關參數
logging.properties 日誌系統相關的配置
Tomcat組件
頂級組件:位於配置層次的頂級,而且彼此間有着嚴格的對應關係(server、service) 鏈接器:鏈接客戶端請求至servlet(connector) 容器:包含一組其餘組件(engine、host、context) 被嵌套的組件:位於一個容器當中,但不能包含其餘組件(valve、logger、realm) <Server> <Service> <connector/> <connector/> ... <Engine> <Host> <Context/> <Context/> ... </Host> <Host> ... </Host> ... </Engine> </Service> </Server>
server:表明tomcat instance,即表現出一個java進程;監聽在8005端口,只能接受「SHUTDOWN」指令。各server監聽的端口不能相同,所以在同一物理主機啓動多個示例時,須要修改其監聽端口爲不一樣的端口。這個端口的定義爲管理員提供一個關閉此示例的便捷途徑,管理員能夠直接使用telnet命令鏈接此端口SHUTDOWN關閉此示例。基於安全角度考慮,一般不容許遠程進行
service:用於實現將一個或多個connector組件關聯至一個engine組件
className:用於實現service的類名 name:此服務的名稱,默認爲catalina
connector:負責接收請求,常見的有三類http、https、ajp
address:指定鏈接器監聽的地址,默認爲全部地址maxThreads:支持的最大併發鏈接數,默認爲200 port:監聽的端口,默認爲0 protocol:鏈接器使用的協議,默認爲HTTP/1.1,定義AJP協議時一般爲AJP/1.3redirectPort:若是某鏈接器支持的協議時HTTP,當接收客戶端發來的HTTPS請求時則轉發至此屬性的定義端口connectionTimeout:等待客戶端發送請求的超時時間,單位爲毫秒,默認爲6000 enableLookups:是否經過request.getRemoteHost()便是否啓用DNS查詢功能acceptCount:設置等待隊列的最大長度
engine: servlet示例,即servlet引擎,其內部能夠一個或多個host組件來定義站點;一般須要defaultHost屬性來爲其定義一個接受全部發往非明肯定義虛擬主機的請求的host組件
name:engine組件的名稱,用於日誌和錯誤信息記錄時卻別不一樣的引擎
host:位於engine內部用於接受請求並進行響應處理的主機或虛擬主機
appBase:此host的webapps的默認存放目錄,指存放非歸檔的web應用程序的目錄或歸檔的WAR文件目錄路徑;可使用基於$CATALINA_BASE變量所定義的路徑的相對路徑 autoDepoly:在tomcat處於運動狀態時,將某webapp放置於appBase所定義的目錄中,是否自動將其部署至tomcat;默認爲true unpackWars:在啓用此webapss時是否對WAR格式的歸檔文件先進行展開,默認爲true
主機別名定義:若是一個主機有兩個或兩個以上的主機名,額外的名稱都可以以別名的形式進行定義
示例
<Host name="www.test.com" appBase="webapps" unpackWARS="true"> <Alias>test.com</Alias> </Host>
context:context在某些意義上相似於apache的路徑別名,一個context定義用於表示tomcat示例中的一個web應用程序
docBase:相應的web應用程序存放位置;也可使用相對路徑,起始路徑爲Context所屬Host中appBase定義的路徑;切記,docBase的路徑名不能與相應的Host中的appBase中定義的路徑名有包含關係,好比appBase爲deploy,而docBase決不能爲deploy-bbs類的名字 path:相對於web服務器根目錄而言的URI,若是爲空,則表示爲webapp的根路徑;若是context定義了一個單獨的xml文件,此屬性不須要定義 reloadable:是否容許從新加載此context相關的web應用程序類,默認爲false
示例
<Context path="/path" docBase="/path/to/somedir" reloadable=""/>
realm:一個realm表示一個安全上下文,受權訪問某個給定context的用戶列表和某用戶所容許切換角色相關定義的列表
valve: 相似於過濾器,valve定義的次序決定了他們的生效次序。
RemoteHostValve:基於遠程主機名稱的訪問控制 RemouteAddrValve:基於遠程地址的訪問控制
控制自己能夠經過allow或deny來進行定義,這有點相似於apache的訪問控制功能
示例:
<Context path="/test" docBase="test"> <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.0\.0\.1"/> </Context> *className*:相關的java實現的類名 *allow*:以逗號分開的容許訪問的IP地址列表,支持正則表達式,使用「.」須要轉義;僅定義allow選項是,被明確allow的地址均被deny *deny*:以逗號分開的禁止訪問IP地址列表,支持正則表達式,使用方式同allow
部署(deploy)webapp相關操做
將webapp的源文件放置於目標目錄,配置tomcat服務器可以基於web.xml和context.xml文件中定義的路徑來訪問webapp;將其特有的類和依賴的類經過class loader裝載至JVM中
部署方式: (1)自動部署auto deploy (2)手動部署 冷部署:把webapp複製到指定的位置,然後才能啓動tomcat 熱部署:在不中止tomcat的前提下進行部署 部署工具:manager、ant腳本、tcd(tomcat client deployer) undeploy:拆除(反部署),中止webapp,並從tomcat示例上卸載webapp start:啓動處於中止狀態的webapp stop:中止webapp,再也不向用戶提供服務,其類亦然在jvm上 redeploy:從新部署
<role rolename="manager-gui"/> <role rolename="manager-script"/> <role rolename="standard"/> <user username="tomcat" password="secret" roles="admin-gui,manager-script,standard"/>
(1)standalone:請求來自客戶端瀏覽器 (2)由其餘的web server反代,來自前段的反代服務器 nginx-->http connector -->tomcat httpd(proxy_http_module)-->http connector-->tomcat httpd(proxy_ajp_module)-->ajp connector -->tomcat http(mod_jk)-->ajp connector -->tomcat
使用yum源安裝便可
(1)安裝jdk環境,因爲base源提供了三個不一樣版本的jdk環境,根據咱們的須要自行安裝所須要的版本
[root@localhost~]#yum install -y java-1.8.0-openjdk-src
[root@localhost~]#java -version
#查看是否安裝成功
若是多 版本並存時,可以使用alternatives命令設定默認使用的版本。
(2)安裝tomcat
[root@localhost~]#yum install -y tomcat tomcat-admin-webapps tomcat-docs-webapp tomcat-webapps tomcat-libs
[root@localhost~]#systemctl start tomcat.service
#啓動服務
(1)從官網下載rpm安裝jdk
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
[root@localhost~]#rpm -ivh jdk-8u144-linux-x64.rpm
[root@localhost~]#java -version
#測試是否安裝成功
(2)二進制安裝tomcat
https://tomcat.apache.org/download-80.cgi
[root@localhost~]#tar xf apache-tomcat-7.0.78.tar.gz -C /usr/local/
#解壓縮
[root@localhost~]#cd /usr/local/
[root@localhost/usr/local]#ln -sv apache-tomcat-7.0.78/ tomcat
#建立軟鏈接
[root@localhost/usr/local/tomcat]#vim /etc/profile.d/tomcat.sh
#修改環境變量
1 export CATALINA_BASE=/usr/local/tomcat 2 export PATH=$CATALINA_BASE/bin:$PATH
修改權限
[root@localhost/usr/local]#useradd -r tomcat
#建立用戶
[root@localhost/usr/local]#chown -R :tomcat tomcat/
#修改配置文件所屬組
[root@localhost/usr/local/tomcat]#chown tomcat ./{logs,temp,work,webapps}
[root@localhost/usr/local/tomcat]#source /etc/profile.d/tomcat.sh
#使環境變量生效
(3)重啓服務測試
[root@localhost/usr/local/tomcat/bin]#catalina.sh --help
Usage: catalina.sh ( commands ... ) commands: debug Start Catalina in a debugger debug -security Debug Catalina with a security manager jpda start Start Catalina under JPDA debugger run Start Catalina in the current window run -security Start in the current window with security manager start Start Catalina in a separate window start -security Start in a separate window with security manager stop Stop Catalina, waiting up to 5 seconds for the process to end stop n Stop Catalina, waiting up to n seconds for the process to end stop -force Stop Catalina, wait up to 5 seconds and then use kill -KILL if still running stop n -force Stop Catalina, wait up to n seconds and then use kill -KILL if still running configtest Run a basic syntax check on server.xml - check exit code for result version What version of tomcat are you running?
[root@localhost~]#mkdir test/{logs,temp,work,webapps} -pv
[root@localhost~]#chown -R tomcat test/{logs,temp,work,webapps}
[root@localhost/usr/local/tomcat/bin]#catalina.sh start
#啓動服務
建議通常以普通用戶運行tomcat
(1)建立所須要的目錄
[root@localhost~]#mkdir test/{classes,lib,WEB-INF} -pv
(2)建立index.jsp文件
[root@localhost~]#vim test/index.jsp
1 <%@ page language="java" %> 2 <%@ page import="java.util.*" %> 3 <html> 4 <head> 5 <title>Test Page</title> 6 </head> 7 <body> 8 <% out.println("hello world"); 9 %> 10 </body> 11 </html>
(3)將test目錄移動到webapps目錄下
[root@localhost~]#cp -r test/ /usr/share/tomcat/webapps/
(4)重啓服務測試
[root@localhost~]#systemctl start tomcat
若是是程序員將打包好的jar文件發給咱們,能夠將此包直接防止webapps目錄下,能夠自行部署
(5)查看部署過程
[root@localhost/usr/share/tomcat/work/Catalina/localhost]#tree test/
test/ └── org └── apache └── jsp ├── index_jsp.class └── index_jsp.java
(1)首先先查看下咱們的服務是否正常運行
(2)使用telnet鏈接關閉服務
此時咱們再看服務已經沒有開啓了,爲了防止惡意之人,咱們須要將命令修改成隨機數等等
[root@localhost/etc/tomcat]#openssl rand -hex 20
fb8a9c1a78827dcb81950feca0e18c6d4470997e
[root@localhost/etc/tomcat]#vim server.xml
[root@localhost/etc/tomcat]#mkdir -pv /app/webapps
[root@localhost/etc/tomcat]#mkdir -pv /app/webapps/ROOT/{lib,classes,WEB-INF}
[root@localhost/etc/tomcat]#cp /usr/share/tomcat/webapps/test/index.jsp /app/webapps/ROOT/
#建立站點文件
重啓服務測試
[root@localhost/etc/tomcat]#systemctl start tomcat
[root@localhost/etc/tomcat]#curl www.test.com:8080
<html> <head> <title>Test Page</title> </head> <body> hello world </body> </html>
出現上述結果正常,使用的是curl命令沒有作修改
[root@localhost/etc/tomcat]#links www.test.com:8080
(1)建立目錄
[root@localhost~]#cp -r test/ /data/test
(2)編輯server.xml文件
[root@localhost~]#vim /etc/tomcat/server.xml
(3)編輯index.jsp文件
[root@localhost/data/test]#vim index.jsp
1 <%@ page language="java" %> 2 <%@ page import="java.util.*" %> 3 <html> 4 <head> 5 <title>Test Page</title> 6 </head> 7 <body> 8 <% out.println("hello tomcat"); 9 %> 10 </body> 11 </html>
(4)重啓服務測試
[root@localhost/data/test]#links www.test.com:8080/test
(1)若是咱們想啓用Server Status功能須要認證,若是咱們點擊cancle則出現指示方法
(2)修改tomcat-user.xml配置文件
[root@localhost/etc/tomcat]#vim tomcat-users.xml
(3)重啓tomcat服務測試
[root@localhost/etc/tomcat]#systemctl restart tomcat
(1)編輯server.xml配置文件
[root@localhost/etc/tomcat]#vim server.xml
(2)測試
禁止此IP訪問沒有顯示內容
那麼接下來咱們容許此IP訪問並再次重啓服務測試
安裝mysql數據庫
(1)安裝mysql並配置環境
[root@mysql ~]# yum install -y mysql-server
[root@mysql ~]# service httpd start
#啓動服務
[root@mysql ~]# mysql_secure_installation
#mysql安全初始化
(2)建立數據庫並受權用戶
[root@mysql ~]# mysql -uroot -p
mysql> CREATE DATABASE testprocess; mysql> GRANT ALL ON testprocess.* TO 'joah'@'192.168.4.61' IDENTIFIED BY '123456';
tomcat
(1)安裝jdk環境
[root@tomcat/etc/tomcat]#yum install -y java-1.8.0-openjdk-src
(2)安裝tomcat
[root@tomcat~]#yum install -y tomcat tomcat-lib tomcat-admin-webapps tomcat-docs tomcat-webapps
(3)啓動服務測試是否成功
[root@tomcat~]#systemctl enable tomcat
#設置爲開機自動啓動
[root@tomcat~]#systemctl start tomcat
#啓動服務
使tomcat與mysql能夠鏈接
MySQL Connector / J是一個本地Java驅動程序,能夠將JDBC(Java Database Connectivity)調用MySQL數據庫使用的網絡協議。
(1)安裝mysql-connector-java
[root@tomcat~]#yum install -y mysql-connector-java
#用於使用java鏈接mysql數據庫
[root@tomcat~]#cp /usr/share/java/mysql-connector-java.jar /usr/share/tomcat/lib/
將此壓縮包複製到此目錄下,自動安裝部署
[root@tomcat~]#systemctl restart tomcat
#重啓服務
(2)修改mysql中的配置文件
[root@mysql ~]# vim /etc/my.cnf
[root@mysql ~]# service mysqld restart
#重啓服務
查看是否生效
建立數據庫並受權
mysql> CREATE DATABASE tomcat; mysql> CREATE TABLE tom(id int,name varchar(40)); mysql> insert into tom values(1,'test'); mysql> GRANT ALL ON tomcat.* TO 'joah'@'192.168.4.61' IDENTIFIED BY '123456';
測試是否成功
[root@tomcat~]#mysql -ujoah -p -h 192.168.4.56
編輯test.jsp文件
[root@tomcat/usr/share/tomcat/webapps/ROOT]#vim test.jsp
1 <%@ page contentType="text/html;charset=utf-8"%> 2 <%@ page import="java.sql.*"%> 3 <html> 4 <body> 5 <%Class.forName("org.gjt.mm.mysql.Driver").newInstance(); 6 String url ="jdbc:mysql://192.168.4.56(此處須要換成mysql的地址)/tomcat?user=joah(鏈接數據庫使用的名字)&password=123456(鏈接數據庫的密碼)&useUnicode=tr ue&characterEncoding=utf-8"; 7 Connection conn= DriverManager.getConnection(url); 8 Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_ UPDATABLE); 9 String sql="select * from tom(鏈接數據庫中的表)"; 10 ResultSet rs=stmt.executeQuery(sql); 11 while(rs.next()) {%> 12 step:<%=rs.getString(1)%> 13 context:<%=rs.getString(2)%><br><br><%} 14 %> 15 16 <%out.print("Congratulations!!! JSP connect MYSQL IS OK!!");%> 17 <%rs.close(); 18 stmt.close(); 19 conn.close(); 20 %> 21 </body> 22 </html>
修改nginx.conf配置文件
[root@nginx/etc/nginx]#vim nginx.conf
47 location / { 48 proxy_pass http://192.168.4.61:8080; 49 } 50 location ~*\.(jsp|do)$ { 51 proxy_pass http://test.com:8080; 52 }
[root@nginx/etc/nginx]#nginx -t
[root@nginx/etc/nginx]#systemctl restart nginx
#重啓服務測試
重啓服務測試
至此咱們的LNMT環境搭建成功
(1)apache安裝
[root@web~]#yum install -y httpd
[root@web~]#systemctl enable httpd
#設置開機啓動
[root@web~]#systemctl start httpd.service
#啓動服務
(2)修改配置文件httpd.conf
基於http鏈接
查看是否有支持http協議的代理模塊
[root@web/etc/httpd/conf]#httpd -M |grep http
proxy_http_module (shared)
編輯配置文件
[root@web/etc/httpd/conf.d]#vim host.conf
1 <VirtualHost *:80> 2 ServerName www.test.com 3 ProxyRequests off 關閉正向代理 4 ProxyVia on 是否記錄代理 5 ProxyPreserveHost on #開啓保留主機名 6 <Proxy *> 7 Require all granted 8 </Proxy> 9 ProxyPass / http://192.168.4.61:8080/ 10 ProxyPa***everse / http://192.168.4.61:8080/ 11 <Location /> 12 Require all granted 13 </Location> 14 </VirtualHost>
重啓服務測試
[root@web/etc/httpd/conf.d]#systemctl restart httpd.service
基於AJP協議鏈接
查看是否加載了支持ajp協議的反向代理模塊
[root@web/etc/httpd/conf]#httpd -M |grep ajp
proxy_ajp_module (shared)
編輯配置文件
[root@web/etc/httpd/conf.d]#vim host.conf
1 <VirtualHost *:80> 2 ServerName www.test.com 3 ProxyRequests off 4 ProxyVia on 5 ProxyPreserveHost on 6 <Proxy *> 7 Require all granted 8 </Proxy> 9 ProxyPass / ajp://192.168.4.61:8009/ 10 ProxyPa***everse / ajp://192.168.4.61:8009/ 11 <Location /> 12 Require all granted 13 </Location> 14 </VirtualHost>
重啓服務測試
後續的安裝和LNMT的安裝方法同樣,就再也不累述。