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=" {"clientip":"%h","ClientUser":"%l"," ;authenticated":"%u","AccessTime":"%t"," method":"%r","status":"%s","SendBytes&qu ot;:"%b","Query? string":"%q","partner":"% {Referer}i","AgentVersion":"%{User-Agent}i"}"/> ################################################################################ ######## <!-- pattern="%h %l %u %t "%r" %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 "%r" %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 "%r" %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開源