linux tomcat集羣

TOMCAT集羣 


目錄 
TOMCAT集羣 1 
1 集羣 1 
1.1 什麼是集羣 1 
1.2 集羣的特性 1 
1.3 集羣的分類 1 
1.4 TOMCAT集羣配置的優缺點 2 
1.5 APACHE+TOMCAT 2 
1.6 環境說明 2 
2 軟件安裝 3 
2.1 安裝說明 3 
2.2 JDK安裝 3 
2.3 APACHE安裝 4 
2.4 TOMCAT安裝 4 
3 集羣配置 6 
3.1 APACHE+MOD_JK+TOMCAT配置 6 
3.2 測試 7 
4 SESSION複製 8 
4.1 SESSION複製配置 8 
4.2 測試 10 




1 集羣 
1.1 什麼是集羣 
集羣是一組協同工作的服務實體,用以提供比單一服務實體更具擴展性與可用性的服務平臺。在客戶端看來,一個集羣就象是一個服務實體,但 事實上集羣由一組服務實體組成。 

1.2 集羣的特性 
與單一服務實體相比較,集羣提供了以下兩個關鍵特性: 
1,可擴展性--集羣的性能不限於單一的服務實體,新的服 務實體可以動態地加入到集羣,從而增強集羣的性能。 
2, 高可用性--集羣通過服務實體冗餘使客戶端免於輕易遇到out of service的警告。在集羣中,同樣的服務可以由多個服務實體提供。如果一個服務實體失敗了,另一個服務實體會接管失敗的服務實體。集羣提供的從一個出 錯的服務實體恢復到另一個服務實體的功能增強了應用的可用性。 
爲了具有可擴展性和高可用性特點,集羣的必須具備以下兩大能力: 
(1) 負 載均衡--負載均衡能把任務比較均衡地分佈到集羣環境下的計算和網絡資源。 
(2) 錯誤恢復--由於某種原因,執行某個任務的資源出現故障,另一服 務實體中執行同一任務的資源接着完成任務。這種由於一個實體中的資源不能工作,另一個實體中的資源透明的繼續完成任務的過程叫錯誤恢復。 
負載均衡 和錯誤恢復都要求各服務實體中有執行同一任務的資源存在,而且對於同一任務的各個資源來說,執行任務所需的信息視圖(信息上下文)必須是一樣的。 

1.3 集羣的分類 
集羣主要分成三大類:高可用集羣(High Availability Cluster/HA), 負載均衡集羣(Load Balance Cluster),高性能計算集羣(High Performance Computing Cluster/HPC) 
(1) 高可用集羣(High Availability Cluster/HA):一般是指當集羣中有某個節點失效的情況下,其上的任務會自動轉移到其他正常的節點上。還指可以將集羣中的某節點進行離線維護再上線,該過程並不影響整個集羣的運行。常見的就是2個節點做 成的HA集羣,有很多通俗的不科學的名稱,比如"雙機熱備", "雙機互備", "雙機",高可用集羣解決的是保障用戶的應用程序持續對外提供服 務的能力。 
(2) 負載均衡集羣(Load Balance Cluster):負載均衡集羣運行時一般通過一個或者多個前端負載均衡器將工作負載分發到後端的一組服務器上,從而達到將工作負載分發。這樣的計算機集羣有時也被稱爲服務器羣(Server Farm)。一般web服務器集羣、數據庫集羣 和應用服務器集羣都屬於這種類型。這種集羣可以在接到請求時,檢查接受請求較少,不繁忙的服務器,並把請求轉到這些服務器 上。從檢查其他服務器狀態這一點上 看,負載均衡和容錯集羣很接近,不同之處是數量上更多。 
(3) 高性能計算集羣(High Performance Computing Cluster/HPC):高性能計算集羣採用將計算任務分配到集羣的不同計算節點而提高計算能力,因而主要應用在科學計算領域。這類集羣致力於提供單個計算機所不能提供的強大的計算能力 

1.4 Tomcat集羣配置的優缺點 
通常配置tomcat集羣有三種方式:使用DNS輪詢,使用apache r-proxy代理方式,使用apache mod_jk方式。 
(1)DNS輪詢的缺點:當集羣中某臺服務器停止之後,用戶由於dns緩存的緣故,便無法訪問服務,必 須等到dns解析更新,或者這臺服務器重新啓動。還有就是必須把集羣中的所有服務端口暴露給外界,沒有用apache做前置代理的方式安全,並 且佔用大量公網IP地址,而且tomcat還要負責處理靜態網頁資源,影響效率。優點是集羣配置最簡單,dns設置也非常簡單。 
(2)R- proxy的缺點:當其中一臺tomcat停止運行的時候,apache仍然會轉發請求過去,導致502網關錯誤。但是隻要服務器再啓動就不存 在這個問題。 
(3)mod_jk方式的優點是,Apache 會自動檢測到停止掉的tomcat,然後不再發請求過去。缺點就是,當停 止掉的tomcat服務器再次啓動的時候,Apache檢測不到,仍然不會轉發請求過去。 
R-proxy和mod_jk的共同優點是.可 以只將Apache置於公網,節省公網IP地址資源。可以通過設置來實現Apache專門負責處理靜態網頁,讓Tomcat專門負責處理jsp和 servlet等動態請求。共同缺點是:如果前置Apache代理服務器停止運行,所有集羣服務將無法對外提供。R-proxy和 mod_jk對靜態頁面請求的處理,都可以通設置來選取一個儘可能優化的效果。這三種方式對實現最佳負載均衡都有一定不足,mod_jk相對好些,可以通過設置lbfactor參數來分配請求任務。 

1.5 Apache+Tomcat 
Apache+ Tomcat整合的目標: 
(1) 可以提高整體web服務器性能,將動態頁面交給tomcat處理,將靜態文件交給apache處理,可以大大提高服務器的靜態文件處理性能。 
(2) 可以實現web服務器的負載均衡,服務器可採用集羣的方式來響應客戶端請求。Apache的作用是做代理,將請求分發給各個tomcat處理,tomcat作爲集羣服務器處理請求。這樣可以提高整體web服務器性能和訪問量。 
(3) 可以實現無縫升級應用程序和容錯處理,在tomcat集羣中如果有一個tomcat掛掉了,用戶還可以通過其他tomcat來進行訪問,同時如果我們想升級應用程序,我們可以通過升級每個tomcat的應用程序來實現升級,在升級的過程中不會影響web服務器的訪問。 

下面就是以1個apache+2個tomcat通過mod_jk配置集羣。 

1.6 環境說明 
所需軟件包: 
JDK:jdk-6u7-linux-i586.bin 
Apache:httpd-2.2.19.tar.gz 
Tomcat:apache-tomcat-7.0.16.tar.gz 
Mod_jk:mod_jk-1.2.31-httpd-2.2.x.so 

服務器: 
服務器系統版本信息:CentOS release 5.3 
服務器IP:172.30.4.6 

2 軟件安裝 
2.1 安裝說明 
將下載好的軟件保存到服務器上:目錄爲/usr/tomcattest,也可以建立其他文件夾保存。 
JDK:jdk-6u7-linux-i586.bin 
Apache:httpd-2.2.19.tar.gz 
Tomcat:apache-tomcat-7.0.16.tar.gz 
Mod_jk:mod_jk-1.2.31-httpd-2.2.x.so 

2.2 JDK安裝 
Java代碼  收藏代碼
  1. 1)  拷貝軟件包  
  2. [root@172-30-4-6 ~]# mkdir /usr/java     #創建jdk安裝目錄  
  3. [root@172-30-4-6 ~]# cd /usr/tomcattest   #進入jdk軟件包目錄  
  4. [root@172-30-4-6 tomcattest]# cp jdk-6u7-linux-i586.bin /usr/java  #將jdk安裝文件拷貝到安裝目錄  
  5.   
  6. 2)  安裝JDK  
  7. [root@172-30-4-6 tomcattest]# cd /usr/java  #進入jdk安裝目錄  
  8. [root@172-30-4-6 java]# ./ jdk-6u7-linux-i586.bin   #執行安裝jdk文件  
  9.   
  10. 3)  配置環境變量  
  11.  [root@172-30-4-6 java] vim /etc/profile   #修改系統環境變量文件  
  12. #添加內容如下:  
  13. export JAVA_HOME=/usr/java/jdk1.6.0_02  
  14.          export JAVA_BIN=/usr/java/jdk1.6.0_02/bin  
  15.         export PATH=$PATH:$JAVA_HOME/bin  
  16.         export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar  
  17.             export JAVA_HOME JAVA_BIN PATH CLASSPATH  
  18. [root@172-30-4-6 profile]# cd /usr/bin     
  19.     [root@172-30-4-6 profile]# ln -s -f /usr/java/jdk1.6.0_02/jre/bin/java   
  20.      [root@172-30-4-6 profile]# ln -s -f /usr/java/jdk1.6.0_02/bin/javac    
  21.   
  22. 4)  測試  
  23. [root@172-30-4-6 profile]# java -version         #查看java安裝版本  
  24. 顯示結果:java version "jdk1.6.0_02"  


2.3 Apache安裝 
Java代碼  收藏代碼
  1. 1)  解壓  
  2. [root@172-30-4-6 ~]# cd /usr/tomcattest   #進入apache軟件包目錄  
  3. [root@172-30-4-6 tomcattest]# tar -zxvf httpd-2.2.19.tar.gz  #解壓apache安裝文件  
  4.   
  5. 2)  安裝  
  6. [root@172-30-4-6 tomcattest]# cd httpd-2.2.19      #進入apache安裝目錄  
  7. [root@172-30-4-6 httpd-2.2.19]# ./configure --prefix=/usr/apache   # configure參數可以自己根據需要修改,可以使用—help獲得相關命令參數信息。  
  8. [root@172-30-4-6 httpd-2.2.19]# make    #編譯  
  9. [root@172-30-4-6 httpd-2.2.19]# make install   #安裝  
  10.   
  11. 3)  啓動  
  12. [root@172-30-4-6 httpd-2.2.19]# cd /usr/apache/  #進入apache安裝目錄  
  13. [root@172-30-4-6 apache]# ./bin/apachectl start   #啓動apache服務器  
  14.       
  15. 4)  測試  
  16. 訪問apache服務器:http://172.30.4.6  
  17. 響應結果:It works!  #apache服務器安裝成功  


2.4 Tomcat安裝 
Java代碼  收藏代碼
  1. 1.  解壓  
  2. [root@172-30-4-6 ~]# cd /usr/tomcattest   #進入tomcat軟件包目錄  
  3. [root@172-30-4-6 tomcattest]# tar –zxvf apache-tomcat-7.0.16.tar.gz  #解壓tomcat安裝包  
  4.   
  5. 2.  安裝  
  6. [root@172-30-4-6 tomcattest]# cp -P apache-tomcat-7.0.16 /usr/tomcat1  #拷貝tomcat1  
  7. [root@172-30-4-6 tomcattest]# cp -P apache-tomcat-7.0.16 /usr/tomcat2  #拷貝tomcat2  
  8.       
  9. 3.  配置  
  10. 因爲該例子是在同一臺服務器上安裝兩個tomcat服務器,避免服務器端口使用衝突,tomcat1端口採用默認配置,tomcat2端口需要重新配置。  
  11. [root@172-30-4-6 tomcattest]# cd /usr/tomcat2/conf   #進入tomcat2配置目錄,可修改server.xml配置文件  
  12. [root@172-30-4-6 tomcattest]# cd /usr/tomcat1/conf   #進入tomcat1配置目錄,可修改server.xml配置文件  
  13. [root@172-30-4-6 conf]# vim server.xml        #修改tomcat2配置文件  
  14. 1) 修改server端口號  
  15. #tomcat1 默認配置  
  16. <Server port="8005" shutdown="SHUTDOWN">  
  17. #tomcat2 修改端口號爲9005  
  18. <Server port="9005" shutdown="SHUTDOWN">  
  19.   
  20. 2) 修改HTTP connector端口號  
  21. #tomcat1默認配置  
  22. <Connector port="8080" protocol="HTTP/1.1"   
  23.                connectionTimeout="20000"   
  24.                redirectPort="8443" />  
  25.     #tomcat2 修改端口號爲9080  
  26.     <Connector port="9080" protocol="HTTP/1.1"   
  27.                connectionTimeout="20000"   
  28.                redirectPort="8443" />  
  29.   
  30. 3) 修改 AJP connector 端口號  
  31. #tomcat1 默認配置  
  32. <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />  
  33. #tomcat2 修改端口號9009  
  34. <Connector port="9009" protocol="AJP/1.3" redirectPort="8443" />  
  35.   
  36. 4) 修改 engine 名稱  
  37. #tocmat1 修改jvmRoute=”tomcat1”  
  38. <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">  
  39. #tocmat2 修改jvmRoute=”tomcat2”  
  40. <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">  
  41.   
  42. 4.  啓動  
  43. [root@172-30-4-6 tomcattest]# /usr/tomcat1/bin/startup.sh    #啓動tomcat1  
  44. [root@172-30-4-6 tomcattest]# /usr/tomcat1/bin/startup.sh    #啓動tomcat2  
  45.   
  46. 5.  測試  
  47. #tomcat1測試  
  48. http://172.30.4.6:8080  
  49. #tomcat2 測試  
  50. http://172.30.4.6:9080  
  51.   
  52. 結果:顯示tomcat首頁  


3 集羣配置 
3.1 apache+mod_jk+tomcat配置 
Java代碼  收藏代碼
  1. 1,  httpd.conf的配置   
  2. [root@172-30-4-6 ~]# cd /usr/apache/conf         #進入apache配置目錄  
  3. [root@172-30-4-6 conf]# vim httpd.conf         #修改httpd.conf配置文件  
  4.         Include conf/mod_jk.conf            #增加include配置  
  5.   
  6. 2,  mod_jk.conf的配置  
  7. [root@172-30-4-6 conf]# touch mod_jk.conf      #創建mod_jk.conf文件  
  8. [root@172-30-4-6 conf]# vim mod_jk.conf       #修改mod_jk配置  
  9. #mod_jk 配置mod_jk包  
  10. LoadModule jk_module modules/mod_jk-1.2.31-httpd-2.2.x.so  
  11. #workers 配置工作負責文件  
  12. JkWorkersFile conf/workers.properties  
  13. #jk log 配置jk日誌文件  
  14. JkLogFile logs/mod_jk.log  
  15. #jk log leve 配置日誌級別  
  16. JkLogLevel info  
  17. # 配置jk日誌內存共享  
  18. JkShmFile logs/mod_jk.shm  
  19. #balancer 配置負載均衡模式  
  20. JkMount /*.jsp balancer  
  21.   
  22. [root@172-30-4-6 conf]# cp /usr/tomcattest/mod_jk-1.2.31-httpd-2.2.x.so /usr/apache/modules    #將mod_jkb包拷貝到apache的modules目錄下  
  23.   
  24. 3,  workers.properties的配置  
  25. [root@172-30-4-6 conf]# touch workers.properties      #創建worker.properties文件  
  26. [root@172-30-4-6 conf]# vim workers.properties  
  27. #tomcat1的配置  
  28. worker.tomcat1.port=8009  
  29. worker.tomcat1.host=172.30.4.6  
  30. worker.tomcat1.reference=worker.template  
  31. worker.tomcat1.activation=A  
  32. #worker.tomcat1.lbfactor=1  
  33. #tomcat2 的配置  
  34. worker.tomcat2.port=9009  
  35. worker.tomcat2.host=172.30.4.6  
  36. worker.tomcat2.reference=worker.template  
  37. worker.tomcat2.activation=A  
  38. #worker.tomcat2.lbfactor=1  
  39. worker.list=balancer  
  40. #balancer 負載配置  
  41. worker.balancer.type=lb  
  42. worker.balancer.balance_workers=tomcat1,tomcat2  
  43. worker.balancer.sticky_session=1  
  44. #tempalte 負載模板配置  
  45. worker.template.type=ajp13  


3.2 測試 
1, 創建測試項目 
新建一個項目:項目名稱都爲TestTomcat 
新建一個jsp頁面:名稱爲testjsp.jsp 

Java代碼  收藏代碼
  1. <%@ page language="java" import="java.util.Date"contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  
  2.   
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  7. <title>歡迎訪問</title>  
  8. </head>  
  9. <body>  
  10. <%  
  11. System.out.println(new Date()+"=============tomcat1=================");  
  12. %>  
  13. tomcat1=======<%=new Date()%>  
  14. </body>  
  15. </html>  


2, 發佈項目 
(1)將測試項目打包,包名爲TestTomcat.war,將測試項目發佈到tomcat1服務器上 。 
(2)修改項目testjsp.jsp文件 

Java代碼  收藏代碼
  1. <%@ page language="java" import="java.util.Date"contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  
  2.   
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  7. <title>歡迎訪問</title>  
  8. </head>  
  9. <body>  
  10. <%  
  11. System.out.println(new Date()+"=============tomcat2=================");  
  12. %>  
  13. tomcat2=======<%=new Date()%>  
  14. </body>  
  15. </html>  


(3)將修改後的項目TestTomcat.war發佈到tomcat2服務器上 

3, 測試集羣 
分別在不同的客戶端上訪問apache代理服務器。 
http://172.30.4.6/TestTomcat/testjsp.jsp 

訪問結果: 
tomcat2=======Wed Jun 29 13:25:03 CST 2011 
  或者 
tomcat1======Wed Jun 29 13:26:03 CST 2011 

4 Session複製 
在Tomcat集羣中實現session同步,可以通過session共享和複製來實現,下面以session複製來實現session同步。 
4.1 Session複製配置 
1, Tomcat中server.xml的配置 
[root@172-30-4-6 ~]# cd /usr/tomcat1/conf       #進入tomcat配置目錄 
[root@172-30-4-6 conf]# vim server.xml          #修改server.xml配置 
# 在<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">後面加上以下配置: 
Java代碼  收藏代碼
  1. <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"    
  2.                  channelSendOptions="8">    
  3.           
  4.           <Manager className="org.apache.catalina.ha.session.DeltaManager"    
  5.                    expireSessionsOnShutdown="false"    
  6.                    notifyListenersOnReplication="true"/>    
  7.     
  8.           <Channel className="org.apache.catalina.tribes.group.GroupChannel">    
  9.             <Membership className="org.apache.catalina.tribes.membership.McastService"    
  10.                         address="228.0.0.4"    
  11.                         port="45564"    
  12.                         frequency="500"    
  13.                         dropTime="3000"/>    
  14.             <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"    
  15.                       address="auto"   #默認爲auto,改爲自己的IP  
  16.                       port="4000"    #同一臺服務器上的tomcat必須修改爲不同的端口,tomcat1修改爲4001,tomcat2修改爲4002。  
  17.                       autoBind="100"    
  18.                       selectorTimeout="5000"    
  19.                       maxThreads="6"/>    
  20.     
  21.             <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">    
  22.               <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>    
  23.             </Sender>    
  24.             <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>    
  25.             <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>    
  26.           </Channel>    
  27.     
  28.           <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"    
  29.                  filter=""/>    
  30.           <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>    
  31.     
  32.           <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"    
  33.                     tempDir="/tmp/war-temp/"    
  34.                     deployDir="/tmp/war-deploy/"    
  35.                     watchDir="/tmp/war-listen/"    
  36.                     watchEnabled="false"/>    
  37.     
  38.           <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>    
  39.           <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>    
  40.         </Cluster>  


#分別給集羣中每個tomcat在Engine後添加cluster配置,需要修改紅色部分的配置: 
address=”172.30.4.6”   #本機IP地址 
port=”4001”  #同一機器需要修改端口號,tomcat1爲4001,tomcat2爲4002 

2, Tomcat應用項目中web.xml的配置 
[root@172-30-4-6 ~]# cd /usr/tomcat1/webapps   #進入到web應用項目中 
[root@172-30-4-6 webapps]# vim /TestTomcat/WEB-INF/web.xml     #修改web.xml 
#在web.xml文件中加入 
Java代碼  收藏代碼
  1. <!--此應用將與羣集服務器複製Session-->  
  2. <distributable/>  



4.2 測試 
1, 修改項目文件 
[root@172-30-4-6 ~]# cd /usr/tomcat1/webapps   #進入到web應用項目中 
[root@172-30-4-6 webapps]# vim /TestTomcat/ testjsp.jsp     #修改testjsp.jsp 
Java代碼  收藏代碼
  1. <%@ page language="java" import="java.util.Date"contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  
  2.   
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  7. <title>歡迎訪問</title>  
  8. </head>  
  9. <body>  
  10. <%  
  11. System.out.println(new Date()+"=============tomcat1=================");  
  12. session.setAttribute("name""tomcat1");  
  13. %>  
  14. tomcat1=======<%=new Date()%>===<%=session.getId() %>===<%=session.getAttribute("name") %>  
  15. </body>  
  16. </html>  


[root@172-30-4-6 ~]# cd /usr/tomcat2/webapps   #進入到web應用項目中 
[root@172-30-4-6 webapps]# vim /TestTomcat/ testjsp.jsp     #修改testjsp.jsp 

Java代碼  收藏代碼
  1. <%@ page language="java" import="java.util.Date"contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  
  2.   
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  7. <title>歡迎訪問</title>  
  8. </head>  
  9. <body>  
  10. <%  
  11. System.out.println(new Date()+"=============tomcat2=================");  
  12. %>  
  13. tomcat2=======<%=new Date()%>===<%=session.getId() %>===<%=session.getAttribute("name") %>  
  14. </body>  
  15. </html>  


2, 測試 
(1) 訪問http://172.30.4.6/TestTomcat/testjsp.jsp 
頁面顯示結果爲: 
tomcat1===Thu Jun 30 11:24:10 CST 2011==27E35C1389F5595A17F8B5FD00561EDA.tomcat1===tomcat1 
(2) 關閉tomcat1 
[root@172-30-4-6 ~]# /usr/tomcat1/bin/shutdown.sh 

(3) 訪問http://172.30.4.6/TestTomcat/testjsp.jsp 
頁面顯示結果爲: 
tomcat2==Thu Jun 30 11:37:42 CST 2011===605087B0015E978752640DB389B874A2.tomcat2===tomcat1 
#證明session複製成功 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章