tomcat7 目錄結構html
--- webapps 應用存放目錄,能夠配置Host 來決定這個文件的目錄,能夠配置多個Host,多個webappsjava
---ROOT 項目根目錄,Tomcat會特殊對待這個目錄,配置Host時會影響到這個目錄web
--- conf 配置文件存放目錄 配置端口 Host Domain 等apache
--- logs 日誌存放目錄windows
--- worktomcat
--- bin 可執行文件存放目錄服務器
--- lib 第三方包存放目錄app
--- temp 臨時文件存放目錄dom
如何配置Tomcat的Host,Domain?webapp
<Engine name="Catalina" defaultHost="www.jrpy.net">...</Engine>
<Host name="www.jrpy.net" appBase="webapps"
unpackWARs="true" autoDeploy="true" debug="0" reloadable="false">
<Context path="" docBase="D:/test/jrpynet" reloadable="true"/>
</Host>
Engine 在這個標籤下能夠配置訪問域名,日誌輸出等。一個Tomcat只能配置一個Engine
defaultHost 配置默認訪問域名,就是若是用IP,或者其餘指向這個服務器的域名都會跳到
這個Host所指的項目,在Engine標籤下必須存在defaultHost屬性所指的Host.
Host 是用來配置訪問域名的。
Host-name 表示的域名。 能夠填localhost,和指向這個服務器的域名。
Host-appBase 當前Host的訪問空間。 能夠爲一個絕對路徑, 也能夠填寫一個相對於Tomcat Home的相對路徑
unpackWARs 若是值爲true 將會在程序啓動時自動解壓Host-appBase下的全部War文件
autoDeploy 若是值爲true 將會自動部署Host-appBase目錄下的全部項目
reloadable 若是爲true 將會自動監聽Host-appBase目錄War文件和項目的變化,若是存在變化,將自動從新加載。
Host/Context 用來配置應用所在位置,訪問ContentPath 等。
Context-path 用來配置項目的訪問ContentPath 通常咱們配置爲 "" 這樣就能夠訪問爲根目錄,
若是值爲abc ,那麼訪問是要在Domain的後面加上abc而後在是訪問路徑和參數,如:http://domain:port/abc/...
docBase 配置項目目錄,能夠指向一個絕對路徑,或者一個相對於Host-appBase的路徑. 若是指向的是文件夾,那麼文件夾裏面的內容就是項目內容。
若是指向的爲一個War文件,這個文件將會被解壓到Host-appBase所指路徑。 若是Host-appBase 不存在ROOT文件夾,而這個war文件爲
非ROOT.war文件,那麼這個war文件將會解壓和部署兩次,一個是ROOT項目,另一個是它自己。因此建議將這個文件命名爲ROOT.war文件。
這樣就只會有一次解壓和部署。
如何配置Log4j的日誌存放路徑?
在log4j.xml 或log4j.properties 文件中你會找到相似這樣的配置
<param name="File" value="../logs/wmf_handler.log"/>
log44j 的日誌配置路徑,若是配置爲 ../logs/... 在windows系統下面會將日誌文件寫到Tomcat 或者其餘服務器的Home下面。
可是若是爲Linux系統下,這樣的配置將會把日誌文件寫的根目錄下, 可是每每咱們會在Linux下不會已Root用戶啓動Tomcat。
因此Tomcat將會沒有權限寫日誌文件。 日誌就不會成功寫出。
那麼解決方法就是,不要把配置寫成 ../logs/... 這樣的形式。 那麼咱們該這麼寫呢?配置到那個文件夾合適呢?
1. tomcat目錄, 若是把日誌寫到這個目錄,咱們就有權限。 這個文件夾下面,日誌會一直存在和追加。 方面之後追蹤錯誤。
若是要配置到這個目錄,咱們可使用這樣的形式配置 ${catalina.home}/logs/...
由於 Tomcat 會在項目啓動的時候設置catalina.home這個系統變量指向咱們的Tomcat Home
2. 項目目錄。 這個文件夾下面有兩個好處。
1,咱們能夠配置來經過項目的web訪問日誌,
2,這個目錄在咱們項目從新部署時。能夠方便刪除日誌文件,每次查看都是此次運行產生的日誌
若是要配置到這個目錄,咱們可使用這樣的配置,${webapp.root}/logs/...
可是咱們必需要在web.xml中存在Log4jConfigListener 監聽器, 由於這個監聽器會配置一個webapp.root
的系統變量指向咱們的項目根目錄, 你也能夠本身配置 一個webapp.root 名字能夠本身隨便給。
也能夠經過web.xml 配置這個名字(可是必須配合Log4jConfigListener) 。 配置代碼以下:
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>wmfWebApp.root</param-value>
</context-param>
如何配置Tomcat的執行用戶?
在Linux系統下,特別是服務,不能使用ROOT用戶來啓動Tomcat,
由於一旦使用ROOT用戶來啓動,Tomcat就會得到最高執行權限,
這樣的話若是******的虎就能夠經過Tomcat來控制整個系統。
因此,咱們不能使用Root用戶運行Tomcat,那麼咱們該如何配置Tomcat的執行用戶呢?
如何配置,請參考:http://os.51cto.com/art/201002/184813.htm
如何使用Tomcat配置域名跳轉?
兩種方式。
1. 使用apache + tomcat 配置 域名跳轉 參考:http://gaoxingf.blog.51cto.com/612518/193209
2. 使用service.xml 中的Host + 域名跳轉項目。
新建一個項目,使用Filter ,須要在xml中配置。 Filter具體代碼以下:
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpResponse;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Created with IntelliJ IDEA.
* User: Ryan
* Date: 14-2-11
* Time: 上午11:33
*/
public class ForwardFilter implements Filter {
private String forwardTo;
@Override
public void init(FilterConfig config) throws ServletException {
forwardTo = config.getInitParameter("to");
if (null == forwardTo) {
throw new RuntimeException("you must set forward to in init parameter.");
}
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
request.setCharacterEncoding("utf-8");
// 獲取請求路徑
String serverName = request.getServerName();
int end = serverName.indexOf(forwardTo);
String path = request.getRequestURI();
String requestURI = "http://" + forwardTo + path;
if (end == -1 || end == 0) {
if ("get".equalsIgnoreCase(request.getMethod())) {
String queryString = (request.getQueryString() == null ? "" : "?" + request.getQueryString());
response.setStatus(301);
response.setHeader("Location", requestURI + queryString);
response.setHeader("Connection", "close");
} else {
List<BasicNameValuePair> list = new ArrayList<BasicNameValuePair>();
Map pms = request.getParameterMap();
if (pms != null && !pms.isEmpty()) {
for (Object key : pms.keySet()) {
Object val = pms.get(key);
if (val instanceof String[]) {
String[] values = (String[]) val;
for (String value : values) {
list.add(new BasicNameValuePair(key.toString(), value));
}
} else {
list.add(new BasicNameValuePair(key.toString(), val.toString()));
}
}
}
try {
// 實現將請求的參數封裝到表單中,請求體重
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, "utf-8");
// 使用Post方式提交數據
HttpPost httpPost = new HttpPost(requestURI);
httpPost.setEntity(entity);
// 指定post請求
DefaultHttpClient client = new DefaultHttpClient();
HttpResponse httpResponse = client.execute(httpPost);
print(response, IOUtils.toString(httpResponse.getEntity().getContent(), "utf-8"));
} catch (Exception e) {
e.printStackTrace();
}
}
} else {
chain.doFilter(request, response);
}
}
//向請求端發送返回數據
public void print(HttpServletResponse response, String content) {
try {
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");
response.getWriter().print(content);
response.getWriter().flush();
response.getWriter().close();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void destroy() {
}
}
如何配置啓動tomcat時使用大內存
CATALINA_OPTS="-Xms512m -Xmx800m -XX:PermSize=256m -XX:MaxPermSize=512m"
將這句加入到 /etc/init.d/tomcat 文件的最開始。
或者在啓動tomcat時先設置這個變量
如何配置Tomcat開機自啓動,和啓動Service?
http://calvinliu.iteye.com/blog/1122974