TOMCAT和JAVA應用

战斗小人發表於2024-09-03

JDK 和 JRE

JRE只有執行環境,JDK是開發開發工具包(包含JRE)
# 使用LTS, 長期穩定版

安裝JDK

#ubuntu22.04預設是openjdk-11,這個是開源的jdk。如果要用官方的要去oracle下載
#不管用openjdk還是用官方jdk都可以

#生產環境中沒有特殊要求,用openjdk即可
[root@ubuntu ~]#apt list *jdk*    #檢視可用jdk版本
[root@ubuntu ~]#apt update && apt install -y openjdk-11-jdk
[root@ubuntu ~]#java --version

#安裝 Oracle 官方 JDK ARM64是arm晶片 x64是64位 inter晶片 RPM和Debian包,低版本沒有Debian包(比如沒有java8的deb包) Compressed Archive包需要解壓縮,做配置,不需要編譯了(linux系統通用) #在oracle下載deb和rpm包 (直接安裝即可) jdk-11.0.24_linux-x64_bin.deb #ubuntu使用 jdk-11.0.24_linux-x64_bin.rpm #rocky使用 #Oracle JDK的二進位制檔案安裝 # 下載版本x64 Compressed Archive [root@centos8 ~]#tar xvf jdk-8u241-linux-x64.tar.gz -C /usr/local/ [root@centos8 ~]#cd /usr/local/ [root@centos8 ~]#ln -s jdk1.8.0_241/ jdk #初始化環境變數 [root@centos8 ~]#vim /etc/profile.d/jdk.sh [root@centos8 ~]#cat /etc/profile.d/jdk.sh export JAVA_HOME=/usr/local/jdk #java程式執行所需環境變數(tomcat等需要) export PATH=$PATH:$JAVA_HOME/bin #方便使用java命令

java程式碼編譯例項

#java程式碼
[root@ubuntu ~]#vim Hello.java
class Hello{  
    public static void main(String[] args)
    {  
        System.out.println("hello, world");  
    }  
}  

#編譯成位元組碼檔案
[root@ubuntu ~]#javac Hello.java
#生成class檔案,無法檢視(這個檔案就是跨平臺檔案)
[root@ubuntu ~]#ls
Hello.class  Hello.java

#執行class檔案,不用寫字尾
[root@ubuntu ~]#java Hello
hello, world

Tomcat

#Tomcat是java編寫的,必須跑在JVM上

java包格式: jar包, war包
jar包直接跑在JVM上,war包需要跑在tomcat上(tomcat跑在JVM上)

#安裝
#直接apt安裝
#ubuntu中的包安裝版tomcat存在Bug(無法將資源配置到 catalina.base 目錄之外)
#如果之前沒有安裝過java,也會自動安裝openjdk-11-jre
[root@ubuntu ~]# apt install tomcat9*    #把doc,admin等相關功能一起安裝
#這種方式安裝檔案路徑需要找
[root@ubuntu ~]# systemctl status tomcat9.service
# 在瀏覽器中訪問 http://10.0.0.151:8080


#二進位制安裝 Tomcat 
#官網下載,Binary Distributions(二進位制,不用編譯,解壓就能用)
#Core核心包,下這個就行
#從tomcat官網下載
[root@ubuntu ~]#wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.91/bin/apache-tomcat-9.0.91.tar.gz
[root@ubuntu ~]#tar xf apache-tomcat-9.0.91.tar.gz -C /usr/local/
[root@ubuntu ~]#cd /usr/local/
[root@ubuntu local]#ln -sv apache-tomcat-9.0.91/ tomcat
'tomcat' -> 'apache-tomcat-9.0.91/'

#加環境變數
[root@ubuntu local]# ln -sv /usr/local/tomcat/bin/* /usr/local/bin/

#啟動
[root@ubuntu local]#catalina.sh start
[root@ubuntu local]#ss -lntp | grep 8080
LISTEN 0      100                     *:8080            *:*    users:(("java",pid=1302,fd=43)) 
#瀏覽器訪問測試
http://10.0.0.151:8080/

#檢視版本
[root@ubuntu local]#catalina.sh version

#停止
[root@ubuntu local]#catalina.sh stop

#用systemctl去管理
#新增使用者並修改檔案屬主屬組
[root@ubuntu ~]# useradd -r -s /sbin/nologin tomcat
[root@ubuntu ~]# chown -R tomcat.tomcat /usr/local/tomcat/
#服務指令碼
[root@ubuntu local]#vim /lib/systemd/system/tomcat.service
[Unit]
Description=Tomcat
After=syslog.target network.target    #基於哪些資源之後啟動(要求這些資源先啟動)

[Service]
Type=forking
Environment=JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
PrivateTmp=true
User=tomcat
Group=tomcat

[Install]
WantedBy=multi-user.target

[root@ubuntu local]#systemctl daemon-reload

#啟動服務
[root@ubuntu ~]# systemctl start tomcat.service 
[root@ubuntu ~]# systemctl status tomcat.service

Tomcat 組成

[root@ubuntu ~]# ls -1 /usr/local/tomcat/
bin # 管理指令碼檔案目錄
BUILDING.txt    #編譯的說明檔案
conf # 配置檔案目錄
CONTRIBUTING.md
lib # 庫檔案目錄
LICENSE
logs # 日誌目錄
NOTICE
README.md
RELEASE-NOTES
RUNNING.txt
temp # 臨時檔案目錄
webapps # 應用程式目錄(網站內容)
#work相當於快取(有修改自動更新),刪了不影響,就再次把jsp編譯serlet和class走一遍
work # jsp編譯後的結果檔案(serlet和class),建議提前預熱訪問,升級應用後,刪除此目錄資料才能更新

目錄結構

#注意tomcat訪問路徑和nginx不同,如果帶路徑,不在ROOT,還是和ROOT平級路徑
http://10.0.0.200:8080/test.jsp
/usr/local/tomcat/webapps/ROOT/test.jsp

http://10.0.0.200:8080/myapp/test.jsp
/usr/local/tomcat/webapps/myapp/test.jsp

www.magedu.org/index.jsp -->        /usr/local/tomcat/webapps/ROOT/index.jsp 
www.magedu.org/tmall/index.jsp  --> /usr/local/tomcat/webapps/tmall/index.jsp
www.magedu.org/pig/index.jsp        /usr/local/tomcat/webapps/pig/index.jsp

配置檔案和日誌

#/usr/local/tomcat/conf/server.xml

#元件說明
Server  伺服器,Tomcat 執行的程序例項,一個Server中可以有多個service,但通常就一
個
Service  服務,用來組織Engine和Connector的對應關係,一個service中只有一個Engine
Connector  聯結器,負責客戶端的HTTP、HTTPS、A JP等協議連線,一個Connector只屬於某
一個Engine
Engine  引擎,用來響應並處理使用者請求。一個Engine上可以繫結多個Connector
Host  虛擬主機,可以實現多虛擬主機,例如使用不同的主機頭區分
Context  應用的上下文,配置特定url路徑對映和目錄的對映關係:url => directory

#只要會配 <Host>,裡面加上<Valve> 功能即可

#日誌配置 
日誌正常情況下只要關注 catalina.out 即可

#範例: tomcat日誌實現json格式的訪問日誌
[root@centos8 ~]#vim /usr/local/tomcat/conf/server.xml
.......
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
########################新增下面一行,注意是一行,不要換行
#####################################
pattern="
{&quot;clientip&quot;:&quot;%h&quot;,&quot;ClientUser&quot;:&quot;%l&quot;,&quot
;authenticated&quot;:&quot;%u&quot;,&quot;AccessTime&quot;:&quot;%t&quot;,&quot;
method&quot;:&quot;%r&quot;,&quot;status&quot;:&quot;%s&quot;,&quot;SendBytes&qu
ot;:&quot;%b&quot;,&quot;Query?
string&quot;:&quot;%q&quot;,&quot;partner&quot;:&quot;%
{Referer}i&quot;,&quot;AgentVersion&quot;:&quot;%{User-Agent}i&quot;}"/>
################################################################################
########
<!-- pattern="%h %l %u %t &quot;%r&quot; %s %b" /> -->
     </Host>
   </Engine>
 </Service>
</Server>
[root@centos8 ~]#systemctl restart tomcat

Tomcat 內部組成

#nginx
<Host name="localhost"  appBase="webapps"

#tomcat
server {
     server_name localhost;
     root webapps;
 }

應用部署

預設專案配置

<Host name="www.xyz.com"  appBase="/data/www.www.xyz.com"></Host>
#如果單個檔案,會去找ROOT下的檔案
www.xyz.com/index.html ----------------- /data/www/www.xyz.com/ROOT/index.html
#如果有路徑,那就回找該路徑下的檔案(優先順序高),如果沒有就去ROOT+路徑下找
www.xyz.com/dir1/index.html ----------------- /data/www/www.xyz.com/dir1/index.html

部署

[root@ubuntu tomcat]#mkdir webapps/dira
[root@ubuntu tomcat]#echo "dira index" > webapps/dira/index.html
[root@ubuntu tomcat]#vim webapps/dira/test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>jsp</title>
    </head>
    <body>
        hello world!<br />
        <% 
            out.println("this is test page");
        %>
        <br />
        <%=request.getRequestURL()%>
        </body>
</html>

# 在瀏覽器中測試
# http://10.0.0.151:8080/dira/
# http://10.0.0.151:8080/dira/test.jsp

# 訪問jsp時tomcat會轉為serlet, 訪問 JSP 會生成快取
[root@ubuntu tomcat]# tree work/
work/
└── Catalina
   └── localhost
       ├── dira
       │   └── org
       │       └── apache
       │           └── jsp
       │               ├── test_jsp.class # java 位元組碼,非文字格式
       │               └── test_jsp.java       # servlet 程式碼

預設主頁

[root@ubuntu tomcat]# vim conf/web.xml
<welcome-file-list>    #優先順序從上到下排序
       <welcome-file>index.html</welcome-file>
       <welcome-file>index.htm</welcome-file>
       <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
   
#可以自己寫一個index.html
[root@ubuntu tomcat]# echo "ROOT INDEX" > webapps/ROOT/index.html

#單獨專案預設主頁
[root@ubuntu tomcat]# ls webapps/dira/
[root@ubuntu tomcat]# mkdir webapps/dira/WEB-INF
[root@ubuntu tomcat]# vim webapps/dira/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0" metadata-complete="true">
   <welcome-file-list>
          <welcome-file>xx.txt</welcome-file>
       <welcome-file>test.jsp</welcome-file>
       <welcome-file>index.html</welcome-file>
   </welcome-file-list>
</web-app>

[root@ubuntu tomcat]# echo "xxxxxxxx" > webapps/dira/xx.txt
[root@ubuntu tomcat]# chown -R tomcat.tomcat webapps/dira
#重啟tomcat

#測試瀏覽器輸入
10.0.0.151:8080/dira/

部署獨立域名的WEB服務

[root@ubuntu ~]#mkdir -pv /data/java.m99-magedu.com/ROOT
[root@ubuntu ~]#echo "java.m99-magedu.com index" > /data/java.m99-magedu.com/ROOT/index.html
[root@ubuntu tomcat]#vim /data/java.m99-magedu.com/ROOT/test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>jsp</title>
    </head>
    <body>
        hello world!<br />
        <% 
            out.println("this is test page");
        %>
        <br />
        <%=request.getRequestURL()%>
        </body>
</html>
[root@ubuntu ~]#chown -R tomcat.tomcat /data/

#新增域名配置
[root@ubuntu tomcat]# vim conf/server.xml
 <Host name="java.m99-magedu.com"  appBase="/data/java.m99-magedu.com" unpackWARs="true" autoDeploy="true">
 </Host>

#重啟服務,在客戶端配置域名解析,並測試
[root@ubuntu tomcat]# systemctl restart tomcat.service

#瀏覽器測試
http://java.m99-magedu.com:8080/

以 war 格式壓縮包部署

[root@ubuntu ~]#mkdir app1
[root@ubuntu ~]#cp /data/java.m99-magedu.com/ROOT/index.html  app1/
[root@ubuntu ~]#cp /data/java.m99-magedu.com/ROOT/test.jsp app1/

[root@ubuntu ~]#chown -R tomcat.tomcat app1/
##打成 war 包
[root@ubuntu ~]#cd app1/
[root@ubuntu app1]#jar cvf ../app1.war *

[root@ubuntu ~]#cp app1.war /data/java.m99-magedu.com/
[root@ubuntu ~]#cd /data/java.m99-magedu.com/
#自動解包來自於配置檔案中的設定 unpackWARs="true" 表示自動解包包
[root@ubuntu java.m99-magedu.com]#ls
app1.war  ROOT
[root@ubuntu java.m99-magedu.com]#ls
app1  app1.war  ROOT

#瀏覽器測試
http://java.m99-magedu.com:8080/app1
http://java.m99-magedu.com:8080/app1/test.jsp


#示例:
#部署jpress
[root@ubuntu webapps]#mkdir -pv /data/webapps
[root@ubuntu webapps]#chown -R tomcat.tomcat /data/
#傳入jpress.war包,改名ROOT.war(jpress設計問題,必須根路徑,否則跳轉有問題)

[root@ubuntu tomcat]#vim conf/server.xml
<Host name="www.magedu.org"  appBase="/data/webapps"
            unpackWARs="true" autoDeploy="true">
</Host>

#重啟服務,在客戶端配置域名解析,並測試
[root@ubuntu tomcat]# systemctl restart tomcat.service

#瀏覽器測試
http://www.magedu.org:8080

以 jar 包部署 halo 開源專案 (自帶sqlit資料庫)

#jar包直接跑在jvm上(jar包自帶web server)

[root@ubuntu ~]# wget https://dl.halo.run/release/halo-1.6.1.jar -O halo.jar
[root@ubuntu ~]# java -jar halo.jar

# 在瀏覽器中測試
# http://10.0.0.151:8090/

預設應用管理

# Server Status 是狀態檢視頁,預設只能透過本機訪問
# Manager App 是應用管理,預設只能透過本機訪問
# Host Manager 是虛擬主機管理,預設只能透過本機訪問
# Server Status,Manager App 導航對應的專案目錄是 manager,根據頁面提示,修改下列配置

上述內容需要訪問,除了配置ip允許訪問,還需要新增允許訪問使用者
# webapps/host-manager/META-INF/context.xml 也按此配置修改
[root@ubuntu tomcat]# vim webapps/manager/META-INF/context.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context antiResourceLocking="false" privileged="true" >
 <CookieProcessor 
className="org.apache.tomcat.util.http.Rfc6265CookieProcessor"
                   sameSiteCookies="strict" />
  #此處限定的是遠端訪問IP,新增 |10\.0\.0\.\d+ 
 <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|10\.0\.0\.\d+" />
 <Manager sessionAttributeValueClassNameFilter="java\.lang\.
(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreve
ntionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>

# 新增角色和授權使用者
# http://10.0.0.206:8080/docs/manager-howto.html role 與專案對應關係文件
[root@ubuntu tomcat]# cat conf/tomcat-users.xml
# manager 專案配置
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcater" password="123456" roles="manager-gui,admin-gui"/>

#不用重啟tomcat,直接就能登入訪問了

#很少使用介面部署

結合反向代理實現 Tomcat 部署

Nginx 單機反向代理實現

#把圖片複製到專案ROOT下
[root@ubuntu ~]#cd /data/java.m99-magedu.com/ROOT
[root@ubuntu ROOT]# rz
[root@ubuntu ROOT]#chown tomcat.tomcat tank.jpeg

#在tomcat專案中直接日誌,方便檢視
[root@ubuntu tomcat]#vim conf/server.xml
<Host name="java.m99-magedu.com"  appBase="/data/java.m99-magedu.com" unpackWARs="true" autoDeploy="true">
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
     prefix="java.m99-magedu.com_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>
[root@ubuntu tomcat]#systemctl restart tomcat.service

#在 nginx 中配置動靜分離
[root@ubuntu nginx]#vim sites-enabled/java.m99-magedu.com.conf
[root@ubuntu ~]# cat /etc/nginx/sites-enabled/java.m99-magedu.com.conf
server{
    listen 80;
    server_name java.m99-magedu.com;
    root /var/www/html/java.m99-magedu.com;
    
    # 將 .jsp 轉發給 tomcat
    location ~* \.jsp$ {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header host $http_host;
    }
}

[root@ubuntu ~]# systemctl restart nginx.service 

[root@ubuntu nginx]#mkdir -pv /var/www/html/java.m99-magedu.com
[root@ubuntu nginx]#cd /var/www/html/java.m99-magedu.com
#傳圖片
[root@ubuntu java.m99-magedu.com]#rz

#測試
http://java.m99-magedu.com/f.jpg

Nginx 代理多機 Tomcat 實現

#nginx 配置
[root@ubuntu ~]# cat /etc/nginx/sites-enabled/java.m99-magedu.com.conf 
upstream tomcat {
 server 10.0.0.208:8080;
 server 10.0.0.210:8080;
}

server{
 listen 80;
 server_name java.m99-magedu.com;
 root /var/www/html/java.m99-magedu.com;#靜態資源在本地
 
 location ~* \.jsp$ {
 proxy_pass http://tomcat;
 proxy_set_header host $http_host;
 }
}

配置 Https 監聽 轉發到後端 Http

#可以自建證書,把CA證書ca.crt匯入系統。(可以谷歌瀏覽器,安全,管理證書,受信任的證書)

實現真實客戶端IP地址透傳

#nginx
upstream blog {
   server 10.0.0.101:8080;
   server 10.0.0.102:8080;
}
server {
   listen 80;
   server_name blog.wangxiaochun.com;
   return 302 https://$host$request_uri;
    #return 302 https://$server_name$request_uri; #$server_name 來自於上面的server_name,即blog.wangxiaochun.com
}
server {
   listen 443 ssl;
   server_name blog.wangxiaochun.com;
   ssl_certificate   /etc/nginx/ssl/blog.wangxiaochun.com.pem;
   ssl_certificate_key /etc/nginx/ssl/blog.wangxiaochun.com.key;
   client_max_body_size 20m;    #預設1m,要是上傳資源大就加上
   location / {
       proxy_pass http://blog;
       proxy_set_header Host  $http_host; 
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   }
}


#tomcat 中設定單獨的訪問日誌
[root@ubuntu ~]# cat /usr/local/tomcat/conf/server.xml
 <Host name="java.m99-magedu.com"  appBase="/data/webapps" unpackWARs="true"
autoDeploy="true">
       <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="java.m99-magedu.com_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b %{x-forwarded-for}i"/> #i不區分大小寫
   </Host> 

Tomcat Session 複製叢集

tomcat的session是寫在記憶體中的,php的session是寫在檔案中的

#session複製是tomcat自己帶的功能,tomcat之間互相同步session (適合小叢集,少量伺服器)

Memcached 實現 Session 共享

memchached瞭解即可,生產中使用機會不多(不支援持久化)

後端把session存到memchached中,實現共享

-m 設定記憶體(生產環境可以調成總記憶體的1/4)

#memchached沒提供客戶端工具,可以用telnet連線

虛擬機器

HotSpot不開源,openjdk開源

相關文章