需要哪些配置文件
① 基於ssh框架的javaweb項目配置文件都有哪些
三大框架需要用到的配置文件總共有一下幾個:struts.xml、hibernate-cfg.xml 、spring.xml 、web.xml。添加了配置文件其實只是其中的一個步驟,第二步,應該添加各個框架的jar包(添加需要用到的就行)。 這樣,三個框架的環境才算配置完成。
② 網路配置涉及哪些配置文件
Ubuntu系統進行網路配置有的時候用圖形界面不起作用,這種情況下可以直接修改某些啟動腳本或配置文件
Ubuntu系統進行網路配置涉及到幾個配置文件1./etc/network/interfaces 2./etc/resolv.conf
操縱步驟:
1.打開ubuntu的/etc/network/interfaces文件默認的內容如下:
auto lo
iface lo inet loopback
動態獲取的配置方法:
auto eth0
iface eth0 inet dhcp
靜態分配的配置方法:
auto eth0
iface eth0 inet static
address 192.168.0.1
netmask 255.255.255.0
gateway 192.168.0.1
根據配置要求(是動態分配還是自動獲取)修改該配置文件保存。
2.添加域名伺服器:打開/etc/resolv.conf文件
添加這行:nameserver 202.99.166.4
3.重啟下網路
$/etc/init.d/networking restart(這條命令是重啟網卡)
或者
$ifdown eth0
$ifup eth0(這兩條命令是有針對性的重啟某個網路介面,因為一個系統可能有多個網路介面)
4.查看網路配置的參數是不是正確(每進行一次操作都可以查看一下是不是修改了網路配置)
$ifconfig
5.看看是不是能夠ping通
ping不通網關說明網路配置有問題 ping不通域名說明dns有問題
有些時候需要修改網卡的硬體地址:
方法一:
$ifconfig eth0 hw ether XX:XX:XX:XX:XX:XX
$/etc/init.d/networking restart(重啟網卡)
方法二:
以上只是暫時的修改硬體地址要永久修改,直接編輯 /etc/network/interfaces 文件,在 iface eth0
inet static 後面添加一行: pre-up ifconfig eth0 hw ether
xx:xx:xx:xx:xx:xx(要改成的MAC)
$ sudo /etc/init.d/networking restart(重啟網卡)
③ SpringBoot 配置文件詳解(告別XML)
快速學會和掌握 SpringBoot 的 核心配置文件的使用。
SpringBoot 提供了豐富的 外部配置 ,常見的有:
其中核心配置文件我們並不陌生,主要以Key-Value的形式進行配置,其中屬性Key主要分為兩種:
在 application.properties 添加配置如下:
① 添加數據源信息
在 application.propertis 添加配置如下:
① 添加認證信息,其中 socks.indentity.* 是自定義的屬性前綴。
② 添加隨機值,其中spring.test.* 是自定義的屬性前綴。
使用方法: @ConfigurationProperties(prefix = "spring.datasource")
使用說明:提供 Setter方法 和 標記組件 Component
如何驗證是否成功讀取配置?答:這里可以簡單做個驗證,注入 MyDataSource ,使用 Debug 模式可以看到如下信息:
使用方法: @Value("spring.datasource.*")
使用說明:提供 Setter方法 和 標記組件 Component
注意事項:@Value不支持注入靜態變數,可間接通過Setter注入來實現。
關於兩者的簡單功能對比:
顯然,前者支持松綁定的特性更強大,所以在實際開發中建議使用@ConfigurationProperties來讀取自定義屬性。
SpringBoot 默認會載入這些路徑載入核心配置文件,按優先順序從高到低進行排列:具體規則詳見 ConfigFileApplicationListener
如果存在多個配置文件,則嚴格按照優先順序進行覆蓋,最高者勝出:
舉個簡單的例子,例如再上述位置都有一個application.properties ,並且每個文件都寫入了server.port=xx (xx分別是9001,9002,9003,9004),在啟動成功之後,最終應用的埠為:9004。圖例:
如果想修改默認的載入路徑 或者 調改默認的配置文件名,我們可以藉助命令行參數進行指定,例如:
YAML是JSON的一個超集,是一種可輕松定義層次結構的數據格式。
答: 因為配置文件這東西,結構化越早接觸越規范越好。這里推薦閱讀阮一峰老師寫的 YAML語言教程 ,寫的很簡單明了。
引入依賴: 在POM文件引入 snakeyaml 的依賴。
使用說明: 直接在類路徑添加 application.yml 即可。
例如下面這兩段配置是完全等價的:
① 在 application.yml 配置數據源:
② 在 application.properties 配置數據源:
在項目的實際開發中,我們往往需要根據不同的環境來載入不同的配置文件。例如生產環境,測試環境和開發環境等。此時,我們可以藉助 Profiles 來指定載入哪些配置文件。例如:
溫馨提示:如果spring.profiles.active指定了多個配置文件,則按順序載入,其中最後的優先順序最高,也就是最後的會覆蓋前者。
使用方法:
使用Maven插件打包好項目,然後在當前路徑,執行DOS命令: java -jar demo.jar --server.port=8081 ,在控制台可看到應用埠變成了8081。
實現原理:
默認情況下,SpringBoot會將這些命令行參數轉化成一個 Property ,並將其添加到 Environment 上下文。
溫馨提示:
由於命令行參數優先順序非常之高,基本高於所有常見的外部配置,所以使用的時候要謹慎。詳見 PropertySource 執行順序 。
關閉方法:
如果想禁用命令行屬性,可以設置如下操作:springApplication.setAddCommandLineProperties(false)
④ 使用https訪問http/https通信協議,需要哪些配置文件
項目里需要訪問其他介面,通過http/https協議。我們一般是用HttpClient類來實現具體的http/https協議介面的調用。
// Init a HttpClient
HttpClient client = new HttpClient();
String url=http://www.xxx.com/xxx;
// Init a HttpMethod
HttpMethod get = new GetMethod(url);
get.setDoAuthentication(true);
get.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(1, false));
// Call http interface
try {
client.executeMethod(get);
// Handle the response from http interface
InputStream in = get.getResponseBodyAsStream();
SAXReader reader = new SAXReader();
Document doc = reader.read(in);
} finally {
// Release the http connection
get.releaseConnection();
}
以上代碼在通過普通的http協議是沒有問題的,但如果是https協議的話,就會有證書文件的要求了。一般情況下,是這樣去做的。
// Init a HttpClient
HttpClient client = new HttpClient();
String url=https://www.xxx.com/xxx;
if (url.startsWith("https:")) {
System.setProperty("javax.net.ssl.trustStore", "/.sis.cer");
System.setProperty("javax.net.ssl.trustStorePassword", "public");
}
於是,這里就需要事先生成一個.sis.cer的文件,生成這個文件的方法一般是先通過瀏覽器訪問https://,導出證書文件,再用JAVA keytool command 生成證書
# $JAVA_HOME/bin/keytool -import -file sis.cer -keystore .sis.cer
但這樣做,一比較麻煩,二來證書也有有效期,過了有效期之後,又需要重新生成一次證書。如果能夠避開生成證書文件的方式來使用https的話,就比較好了。
還好,在最近的項目里,我們終於找到了方法。
// Init a HttpClient
HttpClient client = new HttpClient();
String url=https://www.xxx.com/xxx;
if (url.startsWith("https:")) {
this.supportSSL(url, client);
}
用到了supportSSL(url, client)這個方法,看看這個方法是如何實現的。
private void supportSSL(String url, HttpClient client) {
if(StringUtils.isBlank(url)) {
return;
}
String siteUrl = StringUtils.lowerCase(url);
if (!(siteUrl.startsWith("https"))) {
return;
}
try {
setSSLProtocol(siteUrl, client);
} catch (Exception e) {
logger.error("setProtocol error ", e);
}
Security.setProperty( "ssl.SocketFactory.provider",
"com.tool.util.DummySSLSocketFactory");
}
private static void setSSLProtocol(String strUrl, HttpClient client) throws Exception {
URL url = new URL(strUrl);
String host = url.getHost();
int port = url.getPort();
if (port <= 0) {
port = 443;
}
ProtocolSocketFactory factory = new SSLSocketFactory();
Protocol authhttps = new Protocol("https", factory, port);
Protocol.registerProtocol("https", authhttps);
// set https protocol
client.getHostConfiguration().setHost(host, port, authhttps);
}
在supportSSL方法里,調用了Security.setProperty( "ssl.SocketFactory.provider",
"com.tool.util.DummySSLSocketFactory");
那麼這個com.tool.util.DummySSLSocketFactory是這樣的:
訪問https 資源時,讓httpclient接受所有ssl證書,在weblogic等容器中很有用
代碼如下:
1. import java.io.IOException;
2. import java.net.InetAddress;
3. import java.net.InetSocketAddress;
4. import java.net.Socket;
5. import java.net.SocketAddress;
6. import java.net.UnknownHostException;
7. import java.security.KeyManagementException;
8. import java.security.NoSuchAlgorithmException;
9. import java.security.cert.CertificateException;
10. import java.security.cert.X509Certificate;
11.
12. import javax.net.SocketFactory;
13. import javax.net.ssl.SSLContext;
14. import javax.net.ssl.TrustManager;
15. import javax.net.ssl.X509TrustManager;
16.
17. import org.apache.commons.httpclient.ConnectTimeoutException;
18. import org.apache.commons.httpclient.params.HttpConnectionParams;
19. import org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory;
20.
21. public class MySecureProtocolSocketFactory implements SecureProtocolSocketFactory {
22. static{
23. System.out.println(">>>>in MySecureProtocolSocketFactory>>");
24. }
25. private SSLContext sslcontext = null;
26.
27. private SSLContext createSSLContext() {
28. SSLContext sslcontext=null;
29. try {
30. sslcontext = SSLContext.getInstance("SSL");
31. sslcontext.init(null, new TrustManager[]{new TrustAnyTrustManager()}, new java.security.SecureRandom());
32. } catch (NoSuchAlgorithmException e) {
33. e.printStackTrace();
34. } catch (KeyManagementException e) {
35. e.printStackTrace();
36. }
37. return sslcontext;
38. }
39.
40. private SSLContext getSSLContext() {
41. if (this.sslcontext == null) {
42. this.sslcontext = createSSLContext();
43. }
44. return this.sslcontext;
45. }
46.
47. public Socket createSocket(Socket socket, String host, int port, boolean autoClose)
48. throws IOException, UnknownHostException {
49. return getSSLContext().getSocketFactory().createSocket(
50. socket,
51. host,
52. port,
53. autoClose
54. );
55. }
56.
57. public Socket createSocket(String host, int port) throws IOException,
58. UnknownHostException {
59. return getSSLContext().getSocketFactory().createSocket(
60. host,
61. port
62. );
63. }
64.
65.
66. public Socket createSocket(String host, int port, InetAddress clientHost, int clientPort)
67. throws IOException, UnknownHostException {
68. return getSSLContext().getSocketFactory().createSocket(host, port, clientHost, clientPort);
69. }
70.
71. public Socket createSocket(String host, int port, InetAddress localAddress,
72. int localPort, HttpConnectionParams params) throws IOException,
73. UnknownHostException, ConnectTimeoutException {
74. if (params == null) {
75. throw new IllegalArgumentException("Parameters may not be null");
76. }
77. int timeout = params.getConnectionTimeout();
78. SocketFactory socketfactory = getSSLContext().getSocketFactory();
79. if (timeout == 0) {
80. return socketfactory.createSocket(host, port, localAddress, localPort);
81. } else {
82. Socket socket = socketfactory.createSocket();
83. SocketAddress localaddr = new InetSocketAddress(localAddress, localPort);
84. SocketAddress remoteaddr = new InetSocketAddress(host, port);
85. socket.bind(localaddr);
86. socket.connect(remoteaddr, timeout);
87. return socket;
88. }
89. }
90.
91. //自定義私有類
92. private static class TrustAnyTrustManager implements X509TrustManager {
93.
94. public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
95. }
96.
97. public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
98. }
99.
100. public X509Certificate[] getAcceptedIssuers() {
101. return new X509Certificate[]{};
102. }
103. }
104.
105. }
public class MySecureProtocolSocketFactory implements SecureProtocolSocketFactory {
static{
System.out.println(">>>>in MySecureProtocolSocketFactory>>");
}
private SSLContext sslcontext = null;
private SSLContext createSSLContext() {
SSLContext sslcontext=null;
try {
sslcontext = SSLContext.getInstance("SSL");
sslcontext.init(null, new TrustManager[]{new TrustAnyTrustManager()}, new java.security.SecureRandom());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
return sslcontext;
}
private SSLContext getSSLContext() {
if (this.sslcontext == null) {
this.sslcontext = createSSLContext();
}
return this.sslcontext;
}
public Socket createSocket(Socket socket, String host, int port, boolean autoClose)
throws IOException, UnknownHostException {
return getSSLContext().getSocketFactory().createSocket(
socket,
host,
port,
autoClose
);
}
public Socket createSocket(String host, int port) throws IOException,
UnknownHostException {
return getSSLContext().getSocketFactory().createSocket(
host,
port
然後按如下方式使用HttpClient
Protocol myhttps = new Protocol("https", new MySecureProtocolSocketFactory (), 443);
Protocol.registerProtocol("https", myhttps);
HttpClient httpclient=new HttpClient();
⑤ 軟體開發中,什麼叫「配置文件」,一般配置文件里放什麼
配置文件里放程序啟動時需要對程序進行配置的信息,比如我們平時啟動剛安裝的一款軟體時,會出現一些填寫注冊信息的控制項,並詢問您是否要勾選記住密碼、下次自動登錄等的復選框(比如QQ、微信),這些注冊信息就被寫進了相應程序的配置文件里,當程序下次在啟動時就會自動讀取配置文件,對程序進行配置,這樣我們就不用每次都填寫這些注冊信息,程序就會自啟動了。個人覺得這好像是配置文件在我們開發軟體時的一個運用,由於能力有限,暫且只能回答到這。
在下曾經寫過一個連接數據的程序,將資料庫的連接信息寫入一個配置文件中(.ini後綴文件或.xml後綴的文件),然後在程序中對這個配置文件進行讀寫,就可以達到自動連接資料庫或修改資料庫原有的連接信息的目的。
希望以上回答is helpful!
⑥ web.xml文件主要配置有哪些,都有什麼含義
①web.xml文件是用來配置:歡迎頁、servlet、filter等配置文件用的。當你的web工程沒用到這些時,你可以不用web.xml文件來配置你的web工程
web.xml的模式文件中定義的標簽並不是定死的,模式文件也是可以改變的,一般來說,隨著web.mxl模式文件的版本升級,裡面定義的功能會越來越復雜,
也即標簽元素的種類會越來越多,但有些是不常用的,我們只需記住一些常用的就可以了。
首先是定義頭和根元素
聲明為xml文件,版本為1.0,編碼為utf-8
聲明該文件的內容可以使用xsi的標簽庫
聲明標簽的使用范圍是被javaee的開發使用的
聲明可以使用的標簽庫和對應的具體的標簽庫版本地址。
web.xml的模式(Schema)文件中定義了多少種標簽元素,它就能擁有定義出來的那些功能
隨著web.mxl模式文件的版本升級,裡面定義的功能會越來越復雜,也即標簽元素的種類會越來越多.
定義項目的名稱.
項目名稱
歡迎頁面
servlet
配置springmvc DispatcherServlet( 前台控制器)-->example這個Servlet的名字是example,可以有多個DispatcherServlet,是通過名字來區分的。
async-supported
啟動一個新的線程去處理你的請求,完成之後調用你指定的回調函數來完成整個非同步操作。
一般的jsp是通過地址欄輸入一個地址,或者提交表單的方式發送請求的,這樣網頁都會被刷新。但是如果你在jsp頁面發送一個ajax請求的話,跟前兩種不同,
後台會返回給jsp頁面內容,頁面不會直接刷新,這樣可以把返回的數據寫在頁面的div中,這樣就完成了頁面的局部刷新。
舉個例子,你做一個查詢功能,頁面上有查詢條件和查詢結果顯示區域,你可以點查詢按鈕的時候通過ajax非同步發送你的查詢條件,
而你得到後台返回的查詢結果後,更新你的jsp頁面的查詢結果,jsp的其他部分,比如查詢條件,都沒有更新,jsp沒有刷新,而是更新了查詢結果這一塊內容
url-pattern 默認匹配所有請求Servlet攔截匹配規則可以自已定義1、攔截*.do、*.htm, 例如:/user/add.do,這是最傳統的方式,最簡單也最實用。不會導致靜態文件(jpg,js,css)被攔截。2、攔截/,例如:/user/add,可以實現現在很流行的REST風格。很多互聯網類型的應用很喜歡這種風格的URL。弊端:會導致靜態文件(jpg,js,css)被攔截後不能正常顯示。
監聽器
Listener獲取的是Web應用ServletContext(application)的配置參數。-為Web應用配置Listener的兩種方式: 使用@WebListener修飾Listener實現類即可 在web.xml文檔中使用進行配置。我們選擇web.xml這種配置方式,只有一個元素指定Listener的實現類.
②啟動WEB項目的時候,Tomcat容器首先會去它的配置文件讀取兩個節點listener和context-param。
然後Tomcat會創建一個ServletContext(application),WEB項目所有部分都將共享這個上下文
將applicationContext.xml存入ServletContext中
Tomcat容器根據class類路徑來創建監聽
上面這些都是在web項目還沒有完全啟動起來就完成的工作,而servlet是在第一次發起請求時被實例化的
而且一般不會被容器銷毀,並服務於多個用戶的請求.
web.xml的載入順序是: context-param-> listener -> filter -> servlet.
filter
Filter可認為是Servlet的「增強版」,因此Filter配置與Servlet的配置非常相似,需要配置兩部分:配置Filter名稱和Filter攔截器URL模式。區別在於Servlet通常只配置一個URL,而Filter可以同時配置多個請求的URL。配置Filter有兩種方式:
在Filter類中通過Annotation進行配置。
在web.xml文件中通過配置文件進行配置。
①網路
②http://blog.csdn.net/believejava/article/details/43229361
1.在web.xml里配置監聽器、過濾器、攔截器,書寫順序有沒有什麼要求?
根據網上資料來分析,應該是沒有書寫順序的要求,容器會按照自己的載入方式去載入順序.
2.監聽器是必須要配置的嗎?
不是必須要配置.
3假設配置了多個listener,那麼會先載入哪個listener
如果有多個listener的情況下,我們可以根據自己的需要去手動設置先去載入哪個listener.
今天的分享就到這里啦,歡迎大家點贊、轉發、留言、拍磚~
技能樹.IT修真院
「我們相信人人都可以成為一個工程師,現在開始,找個師兄,帶你入門,掌控自己學習的節奏,學習的路上不再迷茫」。
這里是技能樹.IT修真院,成千上萬的師兄在這里找到了自己的學習路線,學習透明化,成長可見化,師兄1對1免費指導。快來與我一起學習吧~
http://www.jnshu.com/login/1/14708688
PPT : https://ptteng.github.io/PPT/PPT-java/Java-task2-webxml.html#/
⑦ 是否了解tomcat的調優工作,需要修改哪些配置文件實
Tomcat性能調優方案
一、操作系統調優
對於操作系統優化來說,是盡可能的增大可使用的內存容量、提高CPU的頻率,保證文件系統的讀寫速率等。經過壓力測試驗證,在並發連接很多的情況下,CPU的處理能力越強,系統運行速度越快。。
【適用場景】 任何項目。
二、Java虛擬機調優
應該選擇SUN的JVM,在滿足項目需要的前提下,盡量選用版本較高的JVM,一般來說高版本產品在速度和效率上比低版本會有改進。
JDK1.4比JDK1.3性能提高了近10%-20%,JDK1.5比JDK1.4性能提高25%-75%。
因此對性能要求較高的情況推薦使用 JDK1.6。
【適用場景】 任何項目。
三、Apache集成Tomcat
Web伺服器專門處理HTTP請求,應用伺服器是通過很多協議為應用提供商業邏輯。雖然Tomcat也可以作web伺服器,但其處理靜態html的速度比不上Apache,且其作為web伺服器的功能遠不如Apache,因此把Apache和Tomcat集成起來,將html和Jsp的功能部分進行明確分工,讓Tomcat只處理Jsp部分,其他的由Apache,IIS等web伺服器去處理,由此大大提高Tomcat的運行效率。
如果一個項目中大量使用了靜態頁面、大量的圖片等,並有有較大的訪問量,推薦使用Apache集成Tomcat的方式來提高系統的整體性能。
Apache和Tomcat的整合有三種方式,分別是JK、http_proxy和ajp_proxy.其中JK方式是最常見的方式,JK本身有兩個版本分別是1和2,目前1最新版本是1.2.8,而版本2早已經廢棄了。http_proxy是利用Apache自帶的mod_proxy模塊使用代理技術來連接Tomcat。Ajp_proxy連接方式其實跟http_proxy方式一樣,都是由mod_proxy所提供的功能。只需要把配置中的http://換成ajp://,同時連接的是Tomcat的AJP Connector所在的埠。
相對於JK的連接方式,後兩種在配置上比較簡單的,靈活性方面也一點都不遜色。但就穩定性而言不像JK這樣久經考驗,所以建議採用JK的連接方式。
Apache+JK+Tomcat配置:
使用到的兩個配置文件分別是:httpd.conf和mod_jk.conf。其中httpd.conf是Apache伺服器的配置文件,用來載入JK模塊以及指定JK配置文件信息。mod_jk.conf是到Tomcat伺服器的連接定義文件。
【部署步驟】
1.安裝Apache伺服器
2.部署Tomcat
3.將mod_jk.so拷貝到moles目錄下面
4.修改httpd.conf和mod_jk.conf
【適用場景】 大量使用靜態頁面的應用系統。
四、Apache和Tomcat集群
對於並發要求很高的系統,我們需要採取負載均衡的方式來分擔Tomcat伺服器的壓力。負載均衡實現大概有四種:第一是通過DNS,但只能簡單的實現輪流分配,不能處理故障;第二是基於MS IIS,windows 2003 server本身就帶了負載均衡服務;第三是硬體方式,通過交換機功能或專門的負載均衡設備來實現;第四種是軟體的方式,通過一台負載均衡伺服器進行,上面安裝軟體。使用Apache Httpd Server做負載均衡器,Tomcat集群節點使用Tomcat就可以做到上述第四種方式,這種方式比較靈活,成本相對比較低,另外一個很大的優點就是可以根據應用情況和伺服器的情況做一些靈活的配置。所以推薦使用Apache+Tomcat集群來實現負載均衡。
採用Tomcat集群可以最大程度的發揮伺服器的性能,可以在配置較高的伺服器上部署多個Tomcat,也可以在多台伺服器上分別部署Tomcat,Apache和Tomcat整合的方式還是JK方式。經過驗證,系統對大用戶量使用的響應方面,Apache+3Tomccat集群> Apache+2Tomcat集群 > Apache集成Tomcat > 單個Tomcat。並且採用Apache+多Tomcat集群的部署方式時,如果一個Tomcat出現宕機,系統可以繼續使用,所以在硬體系統性能足夠優越的情況下,需要盡量發揮軟體的性能,可以採用增加Tomcat集群的方式。
Apache+Tomcat集群的方式使用到得配置文件有httpd.conf、mod_jk.conf、workers.properties。其中mod_jk.conf是對JK信息的配置,包括JK的路徑等,workers.properties配置文件是對Tomcat伺服器的連接定義文件。
Apache需要調整運行參數,這樣才能構建一個適合相應網路環境的web服務。其中可進行的優化配置如下:
1. 設置MPM(Multi Processing Moles多道處理模塊)。ThreadPerChild,這個參數用於設置每個進程的線程數,在Windows環境下默認值是64,最大值是1920,建議設置為100-500之間,伺服器性能高的話值大一些,反之小一些。MaxRequestPerChild表示每個子進程能夠處理的最大請求數。這個參數的值更大程度上取決於伺服器的內存,如果內存比較大的話可以設置為很大的參數,否則設置一個較小的值,建議值是3000.
2. 關閉DNS和名字解析 HostnameLookups off
3. 打開UseCanonicalName模塊 UseCanonicalName on
4. 關閉多餘模塊 一般來說,不需要載入的模塊有,mod_include.so、mod_autoindex.so、mod_access.so、mod_auth.so.
5. 打開KeepAlive支持
KeepAlive on, KeepAliveTimeout 15 MaxKeepAliveRequests 1000
根據實際經驗,通過Apache和Tomcat集群的方式提高系統性能的效果十分明顯,這種方式可以最大化的利用硬體資源,通過多個Tomcat的處理來分擔單Tomcat時的壓力。
【部署步驟】
1.安裝Apache伺服器
2.部署Tomcat集群,即多個相同的Tomcat。
3.將mod_jk.so拷貝到moles目錄下面
4.修改httpd.conf、mod_jk.conf和workers.properties
【適用場景】 並發用戶量及在線使用用戶數量比較高的系統。
五、Tomcat自身優化
1. JVM參數調優:-Xms<size> 表示JVM初始化堆的大小,-Xmx<size>表示JVM堆的最大值。這兩個值的大小一般根據需要進行設置。當應用程序需要的內存超出堆的最大值時虛擬機就會提示內存溢出,並且導致應用服務崩潰。因此一般建議堆的最大值設置為可用內存的最大值的80%。在catalina.bat中,設置JAVA_OPTS='-Xms256m -Xmx512m',表示初始化內存為256MB,可以使用的最大內存為512MB。
2. 禁用DNS查詢
當web應用程序向要記錄客戶端的信息時,它也會記錄客戶端的IP地址或者通過域名伺服器查找機器名轉換為IP地址。DNS查詢需要佔用網路,並且包括可能從很多很遠的伺服器或者不起作用的伺服器上去獲取對應的IP的過程,這樣會消耗一定的時間。為了消除DNS查詢對性能的影響我們可以關閉DNS查詢,方式是修改server.xml文件中的enableLookups參數值:
Tomcat4
<Connector className="org.apache.coyote.tomcat4.CoyoteConnector" port="80" minProcessors="5" maxProcessors="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" useURIValidationHack="false" disableUploadTimeout="true" />
Tomcat5
<Connector port="80" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true"/>
3. 調整線程數
通過應用程序的連接器(Connector)進行性能控制的的參數是創建的處理請求的線程數。Tomcat使用線程池加速響應速度來處理請求。在Java中線程是程序運行時的路徑,是在一個程序中與其它控制線程無關的、能夠獨立運行的代碼段。它們共享相同的地址空間。多線程幫助程序員寫出CPU最大利用率的高效程序,使空閑時間保持最低,從而接受更多的請求。
Tomcat4中可以通過修改minProcessors和maxProcessors的值來控制線程數。這些值在安裝後就已經設定為默認值並且是足夠使用的,但是隨著站點的擴容而改大這些值。minProcessors伺服器啟動時創建的處理請求的線程數應該足夠處理一個小量的負載。也就是說,如果一天內每秒僅發生5次單擊事件,並且每個請求任務處理需要1秒鍾,那麼預先設置線程數為5就足夠了。但在你的站點訪問量較大時就需要設置更大的線程數,指定為參數maxProcessors的值。maxProcessors的值也是有上限的,應防止流量不可控制(或者惡意的服務攻擊),從而導致超出了虛擬機使用內存的大小。如果要加大並發連接數,應同時加大這兩個參數。web server允許的最大連接數還受制於操作系統的內核參數設置,通常Windows是2000個左右,Linux是1000個左右。
在Tomcat5對這些參數進行了調整,請看下面屬性:
maxThreads Tomcat使用線程來處理接收的每個請求。這個值表示Tomcat可創建的最大的線程數。
acceptCount 指定當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理。
connnectionTimeout 網路連接超時,單位:毫秒。設置為0表示永不超時,這樣設置有隱患的。通常可設置為30000毫秒。
minSpareThreads Tomcat初始化時創建的線程數。
maxSpareThreads 一旦創建的線程超過這個值,Tomcat就會關閉不再需要的socket線程。
最好的方式是多設置幾次並且進行測試,觀察響應時間和內存使用情況。在不同的機器、操作系統或虛擬機組合的情況下可能會不同,而且並不是所有人的web站點的流量都是一樣的,因此沒有一刀切的方案來確定線程數的值。
六、APR庫使用
Tomcat中使用APR庫,其實就是在Tomcat中使用JNI的方式來讀取文件以及進行網路傳輸。可以大大提升Tomcat對靜態文件的處理性能,同時如果你使用了HTTPS方式傳輸的話,也可以提升SSL的處理性能。
一般在Windows下,可以直接下載編譯好的二進製版本的dll庫文件來使Tomcat啟用APR,一般建議拷貝庫文件tcnative-1.dll到Tomcat的bin目錄下。而在Linux下,可以直接解壓和安裝bin目錄下的tomcat_native.tar.gz文件,編譯之前要確保apr庫已經安裝。
怎麼才能判斷Tomcat是否已經啟用了APR庫呢?方法是通過看Tomcat的啟動日誌:
如果沒有啟用APR,則啟動日誌一般有這么一條:
org.apache.coyote.http11.Http11Protocol start
如果啟用了APR,則這條日誌就會變成:
org.apache.coyote.http11.Http11AprProtocol start
tcnative-1.dll 下載地址:http://tomcat.heanet.ie/native/
調優綜述
根據以上分析,如果想要Tomcat達到最優的效果,首先要爭取使得操作系統以及網路資源達到最優,並且最好使用高版本的JDK。對於有大量靜態頁面的系統,採用Apache集成Tomcat的方式,把靜態頁面交由Apache處理,動態部分交由Tomcat處理,能極大解放Tomcat的處理能力。使用ARP庫也能極大的提高Tomcat對靜態文件的處理能力。對於並發要求較高的系統,採用Apache加Tomcat集群的方式,將負載分別分擔到多個Tomcat上,能很大的提高系統的性能,充分利用硬體資源。同時需要對Tomcat自身進行優化,包括增大內存、調節並發線程數等。
⑧ CA server需要配置哪些內容
需配置cas-theme-default.properties。系列messages_*.properties。default_views.properties和protocol_views.properties。log4j.xml。
cas-theme-default.properties:該文件存放的是css文件的路徑,用戶可以在這里指定使用的css文件為自定義的css文件,也可以更改配置文件中對應的css文件已更改默認的樣式。
系列messages_*.properties:國際化支持對應的資源文件。
default_views.properties和protocol_views.properties:CasServer中使用到的視圖配置文件,用於定義對應視圖的處理類及其文件路徑。
log4j.xml:log4j的配置文件。
⑨ java常用的配置文件有哪些
項目中經常會需要讀取配置文件(properties文件),給你總結了配置文件讀取方法如下:
1、通過java.util.Properties讀取
Java代碼
Propertiesp=newProperties();
//p需要InputStream對象進行讀取文件,而獲取InputStream有多種方法:
//1、通過絕對路徑:InputStreamis=newFileInputStream(filePath);
//2、通過Class.getResourceAsStream(path);
//3、通過ClassLoader.getResourceAsStream(path);
p.load(InputStreamis);
is.close();
p.getString(String(key))
2、通過java.util.ResourceBundle讀取
ResourceBundlerb=ResourceBundle.getBundle(packageName);
rb.getString(Stringkey);
Java代碼
⑩ supervisor配置文件(詳細說明)
supervisor 安裝啟動
Windows-INI-style (python ConfigParser)類型文件,包含以 [header] 標記開頭的模塊和這個模塊里一系列的key/value鍵值對
supervisord啟動時使用的環境變數,用的是python %(ENV_X)s 字元串表達式語法格式
[unix_http_server] 模塊下配置了需要監聽UNIX domain socket的http服務的配置參數;如果在conf文件里沒有配置這個模塊,那需要監聽UNIX domain socket的supervisorctl就不會被啟動
1. file : supervisor為HTTP/XML-RPC請求監聽UNIX domain socket的路徑(socket文件路徑); supervisorctl 通過這個文件完成與supervisor的交流;這個選項可以用 %(here)s ,如果用 %(here)s 這個值,那麼會直接擴展到supervisord的配置文件所在目錄
這個關鍵字默認不配置,也不是必須要配置的,但是要注意,如果 supervisor.sock 文件被刪除或者沒有配置,supervisorctl就不能連接到supervisord,也就不能用suepervisorctl控制進程了,例如下面這個錯誤:
2. chmod : socket文件許可權的指定,默認是0700
3. chown : 改變socket文件的用戶和組,默認使用啟動supervisord的用戶和用戶組
4. username : supervisorctl連接supervisord時的授權用戶,默認無指定用戶
5. password : supervisorctl連接supervisord時的授權密碼,默認無密碼;密碼既可以是純文本密碼,也可以是帶有 {SHA} 前綴的SHA-1的哈希,例如: {SHA}
[unix_http_server] 這個模塊配置是監聽TCP socket的配置,如果.conf裡面沒有配置這個模塊,inet的http服務就不會啟動,那web server和remote supervisorctl就不能使用;
這個模塊默認未開啟狀態 ,如果需要啟用這個模塊需要絕對信任的環境——應該綁定localhost或者只能通過一個可信賴的獨立網路訪問,inet的http服務不支持任何形式的加密,不能使用默認認證方式;
inet的http服務可以被supervisorctl遠程式控制制,也可以通過web界面的方式控制子進程,查看log,但是不可以把inet的http服務暴露在公共網路裡面
1. port : 一個tcp的host:port配置,例如 127.0.0.1:9001 ,supervisorctl會通過這個埠和supervisord交流;無默認配置
2. username 和 password : 與 [unix_http_server] 模塊下的 username && password 作用相同
這個模塊配置了supervisord進程有關的全局配置,這個默認可以不配置,但是不配置時,supervisord運行可能會出現問題
1. logfile :默認值: $CWD/supervisord.log ,指定supervisord進程的log文件的路徑,也可以直接用 %(here)s ;如果指定了log文件&&需要做log滾動(根據log大小限制生成新的log文件)的話,必須配置 logfile_maxbytes > 0
2. logfile_maxbytes : 默認50MB,配置日誌滾動的log位元組數限制, KB/MB/GB 這些單位都是可以用的,如果配置為0,則認為log文件不限制大小,不做log滾動
4. logfile_backups : 備份保留log個數,默認保留最近10個,如果設置為0就不做任何備份
5. loglevel : log級別:默認記錄info級別的日誌,可選: critical||error||warn||info||debug||trace||blather ;如果指定日誌記錄為debug級別,supervisord 的log文件里會記錄子進程的輸入輸出,也會記錄進程狀態改變的信息,在某個進程啟動異常做調試的時候比較方便
6. pidfile : supervisord的pid文件路徑,默認 $CWD/supervisord.pid ,也可以使用 %(here)s
7. umask : supervisord進程的文件許可權掩碼,默認 022
8. nodaemon : 設置這個選項為 true 的時候,會在前台啟動supervisor,默認flase
8. minfds : supervisor啟動前要求的最小空閑文件描述符數值,supervisord啟動時對硬體和軟體資源的要求,低於這個最低值,supervisor無法啟動;如果supervisord基於root用戶啟動,硬體限制會有所提高,所以指定要求的資源限制最低值,可以確保程序運行過程中不會造成資源耗盡的情況,默認值是1024
9. minprocs : supervisord啟動時,系統中最小可用進程數的配置,低於當前數值,supervisord不會啟動;默認值=200
10. nocleanup : 默認false,如果想避免supervisord啟動時「auto」路徑下的清理子進程的log文件可以設置為true
11. childlogdir : 子進程的「auto」 log文件目錄,默認取的是python的 tempfile.get_tempdir() 路徑,也可以用 %(here)s
12. user : 在做進程管理之前,supervisord需要轉變用戶使用指定的unix用戶(默認是當前用戶),支持這個配置的前提是supervisord使用root用戶啟動
PS:3.3.4版本以後,如果supervisord不能轉換到指定用戶,會記錄錯誤信息到log里然後立即退出;之前的版本會記 critical log,但是程序可以繼續運行
13. directory : supervisord作為守護進程的時候,會轉換路徑到這個dictionary,默認不配置,可以使用 %(here)s
14. strip_ansi : 清除子進程log文件中的ANSI內容,默認不清除
15. environment : supervisord進程啟動環境中的環境變數配置,是 KEY="val",KEY2="val2" 這樣一系列的key-value鍵值對,如果鍵值對的value值包含一些非標准字元,例如 KEY="val:123",KEY2="val,456" 這種一定要用""括起來,最好的話還是使用轉義減少問題
16. identifier : RPC交互使用的supervisor進程的聲明,默認值= supervisor
使用supervisorctl和supervisord交互的配置
1. serverurl : 訪問supervisord服務的url: unix:///absolute/path/to/file.sock ;默認配置 http://localhost:9001
2. username 和 password : 訪問supervisord服務時的身份認證用戶和密碼, username 需要和supervisord的用戶是同一個,默認是不配置的;需要注意的是,如果使用 password ,就必須設置密碼為純文本字元串,這里不支持SHA hash格式的密碼
3. prompt : supervisorctl 命令行標識符,默認 supervisor
4. history_file : 歷史文件的路徑,如果啟用這個配置指定文件路徑,那麼supervisorctl的歷史命令會被保存在這個文件裡面,並且可以命令查看之前supervisorctl session的歷史記錄,默認不配置
這個模塊在配置文件中至少要有1個,是必須要有的模塊,可以有多個,這個模塊告訴supervisord 需要控制的服務項目有哪些;模塊的頭部是 program:接項目名 組成的,後面的名字就是supervisord控制的服務名,後面supervisorctl就是直接通過這個服務名稱來做進程管理;
如果一個program沒有指定名字,或者不是用 : 指定的,supervisod啟動時會直接失敗;
新版本(3.0)中,一個 [program:x] 將會被supervisor看做是一個同類進程組,這一系列進程組通過 numprocs 和 process_name 定義在配置文件中,當然默認情況下還是一個program就只是一個單獨的進程,以便更好的兼容歷史版本;
testMul這個program就是一個進程組,包含了相同命令啟動的三個進程:testMul_00、testMul_01、testMul_02
以 [include] 開頭的一個模塊,這模塊一旦配置,必須包含 files 這個配置,指定額外的配置文件要包含在當前配置中;
這個模塊只有supervisord用,supervisorctl不會用到
1. files : 一個隔離開來的文件系列,每個系列裡的文件可以是獨立的,也可以實現相互關聯的,直接包含就可以了;這個所謂的一個系列,需要根據unix的使用規則指定一定的模式,然後用 *||?||[] 這種匹配模式去匹配,包含 host_node_name||here 的字元喜歡表達式也是可以的;
沒有默認值,啟用模塊必須配置
這個模塊通常是做組進程管理的,將多個[program:x]放到一個進程中管理,為了把一組program作為一個整體進行管理,就要在配置[group:x]的時候,必須填好programs的配置項,指定你要綁定在一起的programs們;
模塊命名與program一樣的,header錯誤會導致啟動失敗
一個group模塊下可以配置多個programs;
1. programs : 成組的programs
2. priority : 優先順序
supervisor允許在配置文件里指定進程組(「事件監聽池」)的,這些進程可能需要接受或者回應supervisor事件系統的事件提醒,eventlistener做的就是訂閱這些事件做監聽
1. 支持 [program:x] 下除了stdout_capture_maxbytes的所有可選配置項
2. buffer_size : 事件監聽池裡時間序列的緩存大小,當一個事件監聽池發生溢出時,就會丟棄緩存中最舊的事件
3. events : 逗號分隔的事件類型列表,只出需要監聽的進程的的哪些事件
4. result_handler : 一個python回調函數pkg_resources模塊的入口,默認 supervisor.dispatchers:default_handler
只用於擴展supervisor額外的用戶定製行為