由于 Tomcat 基于 Java,實際上在各種 Linux 發行版里的配置方法都大同小異,只是我看見在 Arch Linux 環境里搭建 Tomcat 的文章比較少,所以在 Arch Linux 實踐一遍然后得出此文。此文假設你對 Tomcat 并不十分了解,主要筆墨將會在 Tomcat 的配置之上。
1、安裝 Java JDK
在 Arch Linux 的 extra 源里有 jdk7-openjdk 和 openjdk6,可以直接使用 pacman 安裝,至于選用哪一個可以視具體情況而定。我安裝的是 OpenJDK 7:
$ sudo pacman -S jdk7-openjdk
2、安裝 Tomcat
同樣地,extra 源里已有 tomcat 版本5、6、7,可以根據具體情況而定,我這里安裝的是tomcat 6。
$ sudo pacman -S tomcat6
默認情況 tomcat 6 安裝路徑為 /usr/share/tomcat6,這里羅列一下主要目錄的作用(箭頭表示目錄鏈接的實際位置):
- /usr/share/tomcat6: 程序主目錄,也是變量 $CATALINA_HOME 所指向的位置,在單 tomcat 實例的情況下,也是變量 $CATALINA_BASE 所指向的位置。
- conf -> /etc/tomcat6: 配置文件目錄。
- lib -> /usr/share/java/tomcat6: 共享jar包目錄,這些包既給 tomcat 所使用,也能給 web 應用程序所引用。
- logs -> /var/log/tomcat6: 日志目錄,對于查找錯誤以及查看訪問記錄很有幫助。
- webapps -> /var/lib/tomcat6/webapps: 默認的 web 應用程序目錄,tomcat 6 自帶了幾個示例程序,下面會介紹。
現在可以嘗試啟動 tomcat 服務:
$ sudo / etc / rc.d / tomcat start
根據安裝的 Java 運行時的不同,啟動時可能有錯誤,檢查啟動腳本的配置文件 /etc/conf.d/tomcat6 里面的 TOMCAT_JAVA_HOME 變量的值,在我的安裝中 Java 運行時應該在 /opt/java 里(用 $ which java 就可以看到了),因此將:
TOMCAT_JAVA_HOME=/usr/lib/jvm/java-7-openjdk 更改為如下即可: TOMCAT_JAVA_HOME=/opt/java
重啟 tomcat 服務:
$ sudo / etc / rc.d / tomcat6 restart
一般應該沒有問題,打開任意瀏覽器并在地址欄里輸入 “http://localhost:8080″,如果看到 tomcat 貓即說明服務已經安裝妥當并且能正常運行了。
3、認識 webapps 目錄
這個目錄位于 tomcat6 的安裝目錄之下,實際內容位于 /var/lib/tomcat6/webapps。 webapps 目錄里每一個目錄對應一個web應用程序,比如 docs 目錄的訪問地址是 http://localhost:8080/docs,同理 manager 目錄的訪問地址是 http://localhost:8080/manager,其中比較特殊的是 ROOT 目錄,它對應的訪問地址恰好是網站的根目錄,即 http://localhost:8080/。
Tomcat 附帶的示例程序可以逐個訪問體驗一下,其中 manager 和 host-manager 這兩個應用程序設置了需要登錄驗證才能訪問,增加登錄用戶的方法是編輯 Tomcat 安裝目錄下的配置文件 conf/tomcat-users.xml (實際上也是文件 /etc/tomcat6/tomcat-users.xml),添加如下幾行:
<role rolename = "manager-gui" /> <role rolename = "admin-script" /> <role rolename = "admin-gui" /> <user username = "tomcat" password = "tomcat" roles = "manager-gui,admin-script,admin-gui" />
然后重啟 Tomcat 服務,即可以通過用戶名 tomcat 和密碼 tomcat 登錄并訪問 manager 和 host-manager 兩個應用程序。
每個 Java Web 應用程序 都有如下的 目錄結構 :
- /index.html 訪客直接訪問的資源,比如靜態圖片和CSS樣式表。
- /WEB-INF/ 訪客不能直接訪問的資源。
- /WEB-INF/classes 應用程序的 Java 源碼編譯后的class文件。
- /WEB-INF/web.xml 應用程序的配置文件。
- /WEB-INF/lib 應用程序所引用的包。
當然也不是所有都是必須的,你甚至可以創建一個目錄,比如“hello”,然后在里面只創建一個 index.html 文件(內容隨便),即可以通過 http://localhost:8080/hello/index.html 訪問了。(當然這樣的不是Web應用程序,此方法僅用于測試用)
下面使用 Apache Maven 創建一個最簡單的 Web 應用程序,在用戶目錄里執行如下命令創建 Web 應用程序的骨架:
$ mvn archetype:generate
在交互界面中,
Choose a number or apply filter: 輸入 174,即創建 maven-archetype-webapp 類型項目。 Choose version: 輸入5,即版本 1.0。 Define value for property ‘groupId’: 輸入 org.test。 Define value for property ‘artifactId’: 輸入 demo。 Define value for property ‘version’: 輸入 1.0。 Define value for property ‘package’: 輸入 org.test.demo Confirm properties configuration: 直接回車
上面涉及 Maven 知識不在此文的討論范圍,如果不熟悉的話可以參閱免費的中文電子圖書 《Maven in action》 ,順帶提一下,Maven 是Java項目構建和管理的最常用工具之一。
現在應該看到一個名為 demo 的目錄,進入后可以使用 Maven 打包項目:
$
cd
demo
$ mvn package
打包的結果是文件 ./target/demo.war,把這個文件復制到 webapps 目錄:
$ sudo cp target / demo.war / var / lib / tomcat6 / webapps /
由于 Tomcat 默認創建的站點會自動部署應用程序,所以剛才復制到 webapps 目錄的文件 demo.war 會被自動解壓縮,檢視 webapps 目錄應該會發現多出一個名字為 demo 的目錄,現在可以在瀏覽器里嘗試訪問 http://localhost:8080/demo,應該看到 “Hello World!”字樣,這就是剛才用 Maven 創建的 Web 應用程序運行的結果。
需要說明的是,java web 應用程序打包之后所形成的 war 文件并不是一定要解壓出來才能運行的,這點將會在下一節的配置里會講到。
4、認識 Tomcat 的主配置文件 server.xml
這個文件位于 tomcat 6 安裝目錄之下的 conf 目錄之內,實際內容位于 /etc/tomcat6/server.xml。
正如該文件的擴展名所示,這是一個 xml 格式的文件,打開之后將會看到如下的結構:
<Server port = "8005" shutdown = "SHUTDOWN" > <Service name = "Catalina" > <Executor ...... /> <Connector ...... /> <Connector ...... /> <Engine name = "Catalina" ... > <Host name = "localhost" ... > <Context ... /> </Host > </Engine > </Service > </Server >
即一個由 Server->Service->Engine->Host->Context 組成的四層結構,從里層向外層分別是:
- Context: 即 Web 應用程序,一個 Context 即對于一個 Web 應用程序。
- Host :即虛擬主機,比如 www.dog.com 對應一個虛擬主機,api.dog.com 對于另一個虛擬主機。一個 Host 用于定義一個虛擬主機。(所謂的”一個虛擬主機 ”可簡單理解為”一個網站 ”)
- Engine:一組虛擬主機的集合 。比如www.dog.com 和 api.dog.com 可以組成一組虛擬主機集合。
- Service:一組 Engine 的集合 ,包括線程池 Executor 和連接器 Connector 的定義。
CONNECTOR 的配置
一個 Connector 即一個對外界開放的端口,簡單理解就是大部分網絡服務程序都會遇到的 IpAddress:Port 的組合,比如 192.168.0.10:8080 就是一個端口,當然在 Connector 里可以定義的內容要豐富得多,即 Connector 這個 XML 節點里可以加上許多屬性。下面列舉一下常用的:
- enableLookups :(default=true) 是否允許 反向解析訪客的IP地址 ,當你的應用程序使用 request.getRemoteHost() 時如果只需要IP地址,建議禁用此項,這樣能節省反向域名解析的時間。
- maxPostSize :(default=2097152 即2MB) 最大允許 POST 上傳的數據大小 (單位為:字節),對于一般網站來說,比如有寫評論寫文章的網站,默認的2MB已經足夠,不過如果網站帶有圖片甚至 文件上傳 功能,則需要根據具體情況來定。
-
protocol:連接器的類型
,tomcat 6 有如下幾種選擇
- org.apache.coyote.http11.Http11Protocol:簡寫為 “HTTP/1.1″,這是默認的連接器,一個訪客網絡連接需要一個線程,并發性能比較低。
- org.apache.coyote.http11.Http11NioProtocol:NIO連接器,一個由非阻塞的socket工作模式構成的連接器,并發性能良好,純Java實現。
- org.apache.coyote.http11.Http11AprProtocol:APR連接器,所謂 APR 就是網絡上最多服務器使用的 Web 服務程序 Apache Http Server 所使用的庫,Tomcat 建議在生產環境使用,具體方法下面會介紹。
- redirectPort :當用戶訪問非https的資源而該資源又需要https方式訪問時,tomcat會自動重定向到https端口,一般https使用 TCP 443端口,所以一般取值” 443 ″。
- SSLEnabled:(default=false), 設置當前連接器是否使用安全SSL傳輸,如果設置為”true”,則應該同時設置下面兩個屬性: scheme=”https” (default=http) 可以設置為 http 或者 https。 secure=”true” (default=false)。
- adress:連接器所綁定的IP地址 ,當一臺服務器存在多個ip地址時可以指定其中的需要綁定的一個, 默認不設置 該屬性的值表示綁定當前服務器的所有ip地址。
- compressableMimeType:(default=”text/html,text/xml,text/plain”) 指定需要GZIP壓縮的資源的類型。
- compression:(default=off) 是否啟用GZIP壓縮 ,可以取值 on/off/force,設置為on之后會對 compressableMimeType 屬性指定的資源類型啟用GZIP壓縮。
- connectionTimeout :(default=”60000″) 當訪客網絡連接后,服務器 等待第一行Request頭出現的時間 。單位是毫秒。
- executor :指定當前連接器使用的線程池的名稱,如果指定,則忽略其他針對線程數量的設置,比如 maxThreads。
- maxThreads :(default=200) 最多可創建線程的數量。
- port=”80″:綁定端口 。
- keepAliveTimeout :(default=connectionTimeout),訪客完成一次請求后維持網絡連接的時間。
一個簡單的 Connector 定義如下:
<Connector port = "80" protocol = "HTTP/1.1" connectionTimeout = "60000" redirectPort = "443" />
EXECUTOR 的配置
Executor 用于定義共享的線程池。默認情況下每個 Connector 都會產生自己的一個線程池,如果你想多個 Connector 共享一個線程池,則可以先定義一個線程池,如:
<Executor name = "tomcatThreadPool" namePrefix = "catalina-exec-" maxThreads = "150" minSpareThreads = "4" />
然后修改上述的 Connector 配置,增加 executor 屬性,修改后的配置如下:
<Connector executor = "tomcatThreadPool" port = "80" protocol = "HTTP/1.1" connectionTimeout = "60000" redirectPort = "443" />
HOST 的配置
一個 Host 配置即為一個虛擬主機,例如下面是一個簡單的 Host 配置:
<Host name = "localhost" appBase = "webapps" unpackWARs = "true" autoDeploy = "true" > <Alias > dog.com </Alias > <Valve className = "org.apache.catalina.valves.AccessLogValve" directory = "logs" prefix = "localhost_access_log." suffix = ".txt" pattern = "common" resolveHosts = "false" /> </Host >
Host 配置節點各個屬性的作用:
- name:設置虛擬主機的域名,比如 localhost 表示本機名稱,實際應用時應該填寫具體域名,比如 www.dog.com 或者 dog.com,當然如果該虛擬主機是給內部人員訪問的,也可以直接填寫服務器的 ip 地址,比如 192.168.1.10。
- autoDeploy :是否允許自動部署,默認值是 true,即表示 Tomcat 會自動檢測 appBase 目錄下面的文件變化從而自動應用到正在運行的 Web 應用程序。
- unpackWARs:設置是否自動展開 war 壓縮包再運行 Web 應用程序,默認值是 true。
- appBase :設置 Web 應用程序組的路徑。前面說過一個虛擬主機可以由多個 Web 應用程序構成,所以這里的 appBase 所指向的目錄應該是準備用于存放這一組 Web 應用程序的目錄,而不是具體某個 Web 應用程序的目錄本身(即使該虛擬主機只由一個 Web 應用程序組成)。 appBase 屬性的值可以是相對于 Tomcat 安裝目錄的相對路徑,也可以是絕對路徑,需要注意的是該路徑必須是 Tomcat 有權限訪問的 ,通過 Arch Linux 源安裝的 Tomcat 是通過 tomcat 用戶運行的,因此創建一個新的 appBase 目錄之后可以使用 chown 命令更改目錄的所有者。
下面舉例說明如何創建一個新的虛擬主機 www.dog.com:
在目錄 /var/lib/tomcat6 下面可以看到安裝 Tomcat 時默認創建的 webapps 目錄,為了方便管理我們即將創建的虛擬主機的文檔也在 /var/lib/tomcat6 里創建:
$ sudo mkdir dog
然后在 dog 目錄里面創建目錄 ROOT,再在 ROOT 里面創建文件 index.html(內容隨便)。
現在將目錄的所有者和所有組都更改為 tomcat:
$ sudo chown -R tomcat:tomcat dog
然后在 server.xml 的 Host 節點下增加如下 Host 節點:
<Host name = "www.dog.com" appBase = "/var/lib/tomcat6/dog" > </Host >
重啟 Tomcat 服務就可以在瀏覽器里通過地址 http://www.dog.com 訪問這個新創建的虛擬主機了,當然你必須要先在 /etc/hosts 文件里增加 www.dog.com 到 127.0.0.1 的解析記錄,如下:
127.0.0.1 www.dog.com
有時一個虛擬主機可能會同時綁定多個域名,比如 www.dog.com 和 dog.com,這時可以通過在 Host 配置節點里增加 Alias 實現,比如:
<Alias > dog.com </Alias >
另外上面示例當中的 <Valve className=… /> 配置了訪客的訪問日志的儲存位置以及文件名。
ENGINE 的配置
默認的 Engine 節點如下:
<Engine name = "Catalina" defaultHost = "localhost" > </Engine >
這個應該不用展開敘述了,其中 defaultHost 用于指定訪客在沒有相應的虛擬主機時,Tomcat 默認選擇的虛擬主機的名稱。考慮如下的情形:
假如有3個域名都 DNS 解析到你的服務器,比如 dog.com, www.dog.com, api.dog.com,當前你只配置了虛擬主機 dog.com 和 www.dog.com,那么當有個訪客通過 api.dog.com 訪問你的服務器時,Tomcat 就會依據 defaultHost 的設置返回其中一個虛擬主機運行的結果。實際應用中 defaultHost 應該設置為你的主力域名,比如 www.dog.com。
5、多站點的配置:設置多個HOST節點
有時我們需要在一臺服務器上跑多個站點,通過 Tomcat 很容易實現這點,下面假設我們要搭建 www.dog.com 和 www.cat.com 這兩個站點。
首先要確定你的兩個域名的 DNS 已經能正確解析到你的服務器,因為這里我們是做實驗,所以可以在本機添加域名解析。修改 /etc/hosts 文件,加入如下兩行:
127.0.0.1 www.cat.com 127.0.0.1 www.dog.com
然后在 /var/lib/tomcat6 目錄里分別創建名字為 cat 和 dog 的兩個目錄,然后在每個目錄里都創建名字為 ROOT 的目錄,并在 ROOT 里面創建名字為 index.html 文件(內容隨便)。然后將目錄 cat 和 dog 的所有者和所有組都更改為 tomcat,方法參考上一節,這里不再贅述。
現在編輯 Tomcat 的主配置文件 server.xml,在默認的 Host 節點下面再加入如下兩個新的 Host 節點:
<Host name = "www.dog.com" appBase = "/var/lib/tomcat6/dog" autoDeploy = "true" unpackWARs = "true" > </Host > <Host name = "www.cat.com" appBase = "/var/lib/tomcat6/cat" autoDeploy = "true" unpackWARs = "true" > </Host >
在 Host 節點里面可以根據上一節的說明加入自己需要的屬性或者 Alias 和 Value 子節點。重啟 Tomcat 服務,現在應該可以在瀏覽器里分別通過 http://www.dog.com 和 http://www.cat.com 瀏覽這兩個站點了。
6、使用 NIO 連接器
默認的連接器并發性能不太好,如果網站的并發訪問量不大則無所謂,或者在公司內部網這點可能體會不出來(因為在內部網可能每個請求在1秒鐘之內就完成了),當環境換成 Internet 之后,可能每個客戶請求在網絡會幾秒甚至幾十秒的延時才傳輸完成,這樣則會導致“許多訪客同時連接”的現象,當 Tomcat 的連接器所有線程都被占用的情況下,后來者(訪客)就會被卡在門外。因此我們最好在實際環境中把默認的連接器改成 NIO 連接器(non blocking Java connector)。方法很簡單,只要把 Connector 節點的 protocol 屬性值更改為 “org.apache.coyote.http11.Http11NioProtocol” 即可,例如原先的是這樣:
<Connector port = "80" protocol = "HTTP/1.1" redirectPort = "443" />
修改為:
<Connector port = "80" protocol = "org.apache.coyote.http11.Http11NioProtocol" redirectPort = "443" />
然后重啟 Tomcat 服務器即可。
7、為網站添加 SSL 證書
有時網站可能涉及重要的業務數據,在互聯網上傳輸這些頁面最好以 https 方式傳輸,這樣可以防止重要信息被中間環節竊取。
詳細的方法可以參考我之前的一篇文章 《添加 GoDaddy SSL 證書到你的網站》 ,文章介紹如何申請簽名的 SSL 證書以及如何修改 Tomcat 的配置。如果你現在只是想試驗一下為網站添加 https 功能,或者只是在公司的內部網站使用上 https,則可以使用一個簡單的方法實現:使用自簽名 SSL 證書。所謂自簽名的 SSL 證書就是自己產生的證書,這種證書沒有通過第三方證書商簽名認證,所以在瀏覽這種網站時瀏覽器會提示證書錯誤,不過訪客是完全可以繼續瀏覽網站內容。
下面假設我們要為上一節的 www.dog.com 添加SSL證書。首先使用 Java 自帶的 keytool 工具產生一個 keystore 文件(一種用于存放證書的文件格式),在自家目錄執行如下命令:
$ keytool -keysize 2048 -genkey -alias tomcat -keyalg RSA -keystore tomcat.keystore
然后它會提示你設置一個密碼以及輸入DN信息:
Enter keystore password: 設置一個用于保護你keystore文件的密碼,例如123456 Re-enter new password: 重復上面的密碼 What is your first and last name? [Unknown]: www.dog.com (就是域名啦) What is the name of your organizational unit? [Unknown]: Networking 組織單位名稱(隨便) What is the name of your organization? [Unknown]: dog.com 組織名稱(隨便) What is the name of your City or Locality? [Unknown]: Shenzhen 所在城市(隨便) What is the name of your State or Province? [Unknown]: Guangdong 所在省份(隨便) What is the two-letter country code for this unit? [Unknown]: CN 所在國家的兩位代號(隨便) Is CN=www.dog.com, OU=Networking, O=dog.com, L=Shenzhen, ST=Guangdong, C=CN correct? [no]: yes 以上信息正確則輸入yes Enter key password for (RETURN if same as keystore password): 這一步直接敲回車
完成后會在當前目錄產生一個 tomcat.keystore 文件。把這個文件復制到 dog 網站應用程序的根目錄(即 /var/lib/tomcat6/dog):
$ sudo cp tomcat.keystore / var / lib / tomcat6 / dog
然后修改 Tomcat 的主配置文件 server.xml,在默認的 Connector 節點之下添加如下的新 Connector 節點:
<Connector
port
=
"443"
protocol
=
"HTTP/1.1″
SSLEnabled="
true
"
scheme="
https
" secure="
true
"
clientAuth="
false
" sslProtocol="
TLS
"
keystoreFile="
/var/lib/tomcat6/dog/tomcat.keystore
"
keystorePass="
123456
" />
假如你使用的是 NIO 連接器,則應該這樣把 protocol 屬性值換成 Http11NioProtocol,即:
<Connector
port
=
"443"
protocol
=
"Http11NioProtocol″
SSLEnabled="
true
"
scheme="
https
" secure="
true
"
clientAuth="
false
" sslProtocol="
TLS
"
keystoreFile="
/var/lib/tomcat6/dog/tomcat.keystore
"
keystorePass="
123456
" />
重啟 Tomcat 服務,用瀏覽器訪問 https://www.dog.com,這時瀏覽器可能會提示證書錯誤,忽略它(對于 Firefox 瀏覽器還需要點擊 “添加例外” 按鈕才能忽略)即可以看到已經是 https 方式在瀏覽網頁了。
8、使用 APR 高性能連接器
APR 即 Apache Portable Runtime ,提供了 Apache Http 的高性能特性,下面普通連接器、NIO和APR的特性簡單比較( 摘自這里 ):
Java Blocking Connector Java Nio Blocking Connector APR Connector Classname Http11Protocol Http11NioProtocol Http11AprProtocol Tomcat Version 3.x 4.x 5.x 6.x 6.x 5.5.x 6.x Support Polling NO YES YES Polling Size N/A Unlimited - Restricted by mem Unlimited - Configurable Read HTTP Request Blocking Non Blocking Blocking Read HTTP Body Blocking Sim Blocking Blocking Write HTTP Response Blocking Sim Blocking Blocking SSL Support Java SSL Java SSL OpenSSL SSL Handshake Blocking Non blocking Blocking Max Connections maxThreads See polling size See polling size
Tomcat 文檔在 NIO 和 APR 之間比較推薦后者,由于我沒有實際環境(即大量從 internet 過來的訪問)詳細測試和比較,所以我也不太清楚兩者相差多少。下面介紹使用 APR 的方法:
先安裝 APR for Tomcat 的本地庫和 OpenSSL(假如需要使用 SSL 證書并且系統還沒安裝的話),Arch Linux 的 local 源里面已經存在這兩者,所以安裝方法很簡單:
$ sudo pacman -S tomcat-native $ sudo pacman -S openssl
然后修改 Tomcat 的主配置文件 server.xml,把 Connector 的 protocol 屬性值修改為“org.apache.coyote.http11.Http11AprProtocol”,修改后的配置大致如下:
<Connector port = "80" protocol = "org.apache.coyote.http11.Http11AprProtocol" redirectPort = "443" />
(注:保留 protocol=”HTTP/1.1″ 屬性值也是可以的)
然后重啟 Tomcat 服務即可,如何知道是否用上 APR 連接器呢?只要翻查 Tomcat 的日志文件就知道了,默認的日志文件為:/var/log/tomcat6/catalina.err:
$ sudo tail / var / log / tomcat6 / catalina.err
如果在重啟 Tomcat 服務后看到日志末尾處有出現下面紅色字的內容,則表示已經成功用上 APR連接器了。
Feb 19, 2012 9:44:05 AM org.apache.coyote.http11. Http11AprProtocol start INFO: Starting Coyote HTTP/1.1 on http-80 Feb 19, 2012 9:44:05 AM org.apache.coyote.http11. Http11AprProtocol start INFO: Starting Coyote HTTP/1.1 on http-443 Feb 19, 2012 9:44:05 AM org.apache.catalina.startup.Catalina start INFO: Server startup in 1281 ms
如果你使用了 APR 連接器同時又需要添加 SSL 證書(即需要 https 訪問功能),則需要使用 OpenSSL 的方法產生加密私鑰并且修改一下相應的 Connector 的配置,仍然以上面第7節的例子,即為 www.dog.com 站點添加 SSL 證書來講解。
先用 OpenSSL 產生私鑰以及自簽名,在自家目錄下執行下面命令:
# Generate private key $ openssl genrsa -out ca.key 1024 # Generate CSR $ openssl req -new -key ca.key -out ca.csr # Generate Self Signed Key $ openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt
同上面第7節類似,中途也會要求你輸入 DN 信息,完成后把 ca.crt 和 ca.key 文件復制到 dog 站點應用程序的根目錄:
$ sudo cp ca.crt / var / lib / tomcat6 / dog $ sudo cp ca.key / var / lib / tomcat6 / dog
然后修改 Connector 節點為如下:
<Connector port = "443" SSLEnabled = "true" scheme = "https" secure = "true" SSLCertificateFile = "/var/lib/tomcat6/dog/ca.crt" SSLCertificateKeyFile = "/var/lib/tomcat6/dog/ca.key" />
重啟 Tomcat 服務之后生效。
最后
此文簡單講述在 Arch Linux 環境下安裝 Tomcat 6、修改主配置文件、搭建多站點、添加 SSL 證書以及使用高性能的 NIO 和 APR 連接器的方法和步驟。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
