Tomcat教程

从8080改变端口号

在默认安装过程中,Tomcat被配置为监听端口8080,而不是更常用的Web服务器端号80。这是明智的选择,因为默认端口80通常已处于在用状态,且在Linui Solaris, BSD 等其他非Windows等操怍系统上,打开网络服务器包监听默认端口80需要特殊的权限。但在多数情况下,让Tomcat运行在80端口上仍然有意义,而不是使用默认的8080端口。

要改变该端口号,请编辑server.xml文件中的主Connector元素。査找像下面这样的xml标 记:

<!--在8080端口上定义非SSL HTTP/1.1 Connector-->
<Conrrector port="8080" protocol="HTTP/l.1" 
	          connectionTimeout="20000"
	          redirectPort="8443"/>

只要将端口属性8080改为80,并重启Tomcat就可以了,除非该端口号已在用,或者您不 具备在端口 80上启动服务器的权限,否则Tomcat现在已应对端口80运作了。

通常需要较髙的管理权限才能让服务器运行在80端口上,如Linux, Solaris. BSD和其他 非Windows等操作系统上的root张户。

根据个人意愿或站点安全策略,您可能不信任以root用户运行Tomcat但笔者还没有听 到过相关报道,说一台机器的安全性是因Tomcat以root用户运行而受到威胁的。如果您 对此表示担忧,笔者提供广其他的方法,可以不用root运行TomcatWJVM进程,而使 Tomcat对端口80实行应答。

将端口80的TCP连接传递给端口 8080

为了在非Windows操怍系统的80端口上打开服务器包,确实需要JVM必须以root用户运 行。怛是,如果除JVM进程之外的东西可以将所有端口80的TCP连接传递给高于1024端口的端口(如8080端口),那么JVM就可以不必以root用户运行,Tomcat可以在8080 端口上打开其Web服务器,且具有合适权限的其他用户可以把80端口TCP连接传递给Tomcat的8080端口。在任何给定的操作系统上,它都是一个非常顺手、通用的功能,因 此有多种方法完成该项工作,在端口传递或网络过滤时,您通常会引用这一功能。

Linux的内嵌iptables特性允许各种防火墙、网络过滤和信息传递,而且可以简黾地将端 P80的TCP连接传递给Tomcat。Iptables特性是Linux内核的特性.通常默认为enabled (使能)状态,并可使用iptables命令行工具进行配以root用户执行下列命令,检 查Linux内核的这一特性是否处于enabled状态:

# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target    prot opt source	            destination
Chain POSTROUTING (policy ACCEPT)
taxget    prot opt source	            destination
Chain OUTPUT (policy ACCEPT)
target    prot opt source	            destination

如果看到了相同或类似输出结果,那么您大概就可使用iptables来传递Tomcat的端口连 接了。如果您看到的是下列信息:

iptables vi.3.5: can't initialize iptables table 'filter': iptables who? (do you need 
to insmod?)

那您可能需要升级iptables或Linux的内核。

这意味着iptables在内核中没有处于enabled状态,且在它发挥作用(有关描述如何让其发 挥作用的内容超出了本书范围)之前,首先需要在内核中启用(使能)它。 假定该特性已发挥作用,即通过下列两条命令,您可以让80端口的所有TCP连接按机器 配置寻址到所有网络目的地址:

#iptables -t nat -I PRERDUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080 
#iptables -t nat -I OUTPUT -p tcp --dport 80 -j REDIRECT --to-ports 8080

这两条命令会在iptables的配置中增加必要的传递规则。它把机器上目的地为80端口的 所有连接需重定向到8080端口的信息通知给内核。 如果您只想把机器配置的一个IP地址的连接传递给8080端口,那么可以在追加H的地址 IP时选择性地使用--dst切换开关,如下所示:

#iptables -t nat -I PREROLTTINC -p tcp --dst 192.168.1.100 --dport 80 -j REDIRECT --to- 
ports 8080
#iptables -t nat -I OUTPUT -p tcp --dst l92.168.1.100 --dport 80 -j REDIRECT --to-ports 
8080

Tomcat会认定请求来源于8080端口,因为它在8080端口上打开了Web服务器连接器,因 此无论何时发送重定向,它都会追加上端口号8080,除非您按如下方式在server.xml连接 器配置文件中增加了proxyPort="80"的信息:

<Connector port="8080" protocol- "HTTP/l. lrr proxyPort="80" 
						connectionTimeout="20000" 
						redirect Port="8443" />

如果您安装的Tomcat就是充当了主页的功能,那么您也会想设置proxyName="Thostname.example.com"。

关于如何让iptables正常工作并能使用其他哪些相关选项的内容,请参阅Linux iptables 手册,以得到更多信息,至少在Linux上,这是Tomcat不采用root用户而应答80端口请 求的最简方法。 其他操作系统也可以采取方法把TCP业务传递或重定向到不同端例如,在FreeBSD Unix上,这是ps (包过滤,packet filter)机制的一部分功能。典型地,您可以使用/etc/pf.conf文件中的下面一行:

#map tomcat on 8080 to appear to be on 80 
rdr on ne3 proto tcp from any to any port 80 -> 127.0.0.1 port 8080

ne3在这里代表Etnernei接口名。rdr行让pf将80端口的所有引入包都重定向到Tomcat能看到的8080端口上要想了解具体细节与选项,请参阅pfct1手册, 尽管笔者在这些例子中使用的是80端口,但您也可以使用相同技术使Tomcat监听1~65535的任意端口号,只要该端口未被占用,且您具备在该端口上启动服务器的权限 就可以了!


在80端口上通过Service Wrapper运行Tomcat

在80端口上以不是root的用户运行Tomcat的另一方法是使用服务封装二进制文件(a service wrapper binary)。服务封装器是为下列目的而专门用C语言编写的程序;在非 Windows操作系统上,以不是root的用户运行绑定到授权端口的Java服务器。这是像root一样,启动服务封装器二进制文件,以独立的进程例示该文件中VM具有像root的能力,在已授权的端口上打开服务器包,虽然不是以root用户运行,但Tomcat却 能在已授权的端U上打开服务器包。jsvs( "Java Service"的缩写)是Tomcat的二进制 发行版本身所带的服务封装器。

下面的方法显示了如何让jsvc工作:

解包Tomcat的二进制发行版,您会在bin/directory中找到一个名为jsvc.tar.mrv的文件。该 目标文件Tomcat包含了的源码最好不要在Tomcat安装目录的附近解该目标文 件。出于安全防护因素,开发者的机器刚好就是把文件放在这一位置,您最好将这些文 件放在您喜欢的位置,一旦安装成功且使其正常工作,请立即删除这些文件。

将源码解压到需要编译的位置:

#cd /home/jasonb
#gunzip apache-tomcat-6.0-14.tar.gz
#tar xvf apache-tomcat-6.0.14-tar
#cd apache-tomeat-6.0.14/bin
#gunzip jsvc.tar.gz
#tar xvf jsvc.tar.gz

将目录切换到/jsvc-src/目录下:

# cd jsvc-src

要了解关于安装公共后台进程jsvc (Commons Daemon jsvc) 二进制文件的信息,请阅读INSTALL.txt文档:

#more INSTALL.txt

如下是编译jsvc的方法:

#./ccnfigure -with-java=$JAVA_H0ME

确保JAVA_H0ME被设置为Java的绝对安装珞径(JDK或JRE会工作的路径),然后,运行make命令:

# make

编译结束后,系统在当前目录下创建了一个jsvc的可执行文件。

现在,尝试运行含-help切换开关的jsvc命令。如下所示,它应输出具体用法的语法:

# ./jsvc -help
Usage: jsvc [-options] class [args...]

这些选项包栝:

-jvm

使用特定的Java虚似机,可用的JVMs有:

       'server'
-cp / -classpath <directories and zip/jar files>

设置服务类别和资源的检索路径

-home <directory>

设置JDK或JRE安装的路径(或者设置JAVA_HOME环境变量)

-version

显示当前:Java环堆版本(栓査-home和-jvm的正确性。暗指-nodetach

-help / -?

显示本help页(暗指-nodetach)

-nodetach

不从父进程分离,且成为一个后台进程

-debug

打印冗长的调试信息

-check

只检査服务(暗指-nodetach)

-user <user>

用于运行后台进程的用户(默认为当前用户)

-verbose[:class|gc|jni]

启用verbose输出

-outfile </full/path/to/file>

Stdout的输出位置(默认为/dev/null)

使用值‘&2’模仿‘1>&2’

-errfile </full/path/to/file>
							Location for output from stderr (defaults to /dev/null)

使用值‘&1’模仿‘2>&1’

-pidfile

包含jsvc的pid文件的输出位置(默认为/var/run/jsvc.pid)

-D<name>=<value>

设置Hava系统所有权

-X<option>

设置虚拟机特定选项

-viait <waittime>

设置启动服务等待的秒数,waittime应为10的倍数(最小等于10)

-stop

使用-pidfile选项中提供的文件,终止服务

可以把它复制到选择的bin目录中,从而实现安装过程。但是,首先要确认系统上没有jsvc二进制文件:

# which jsvc

如果存在,应确信运行的jsvc是刚编译过的,而不是系统中已经安装的,因为它可能与您的Tomcat版本不完全匹配。

大概安装jsvc的最佳位置是在Tomcat的bin/目录下:

# cp jsvc /opt/tomcat/bin/
# chmod 700/opt/tomcat/bin
# chown loot.root /opt/tomcat/bin/jsvc

此时,因为您已经编译并安装了该二进制文件,所以您可以删除jsvc-src目录了,您可以 一直从二进制发行版中重新解包该源码。 笔者打算以tomcat用户运行Tomcat,所以您必须创建该用户:

# useradd -d /opt/tomcat/temp -s /sbin/nologin -g nobody tomcat

如果您愿意,也可以使用不同用户。确信您使用的用户没有登录口令,且除了对Tomcat logs、 temp、 webapps和work目录(如果您计划使用Admin webapp,也可以包含conf目录) 具有读/写权限外,几乎没有其他权限:

# set CATALINA_HOME=/opt/tomcat
# export CATALINA_HOME
# chown -R tomcat $CATALINA_HOME/logs  
# chown -R tomcat $CATALINA_HOME/temp
# chown -R tomcat $CATALINA_HOHE/webapps
# chown -R tomcat $CATALINA_HOME/work

现在,从jsvc运行Tomcat,您不得不了解使用startup.sh或catalina.sh时运行的命令 行。要了解这一内容,请使用startup.sh或catalina.sh启动Tomcat,常规应该是:

# /opt/tomcat/bin/catalina.sh start

一旦Tomcat已处于运行状态,请使用ps找出执行启动Tomcat JVM的命令行脚本:

# ps auwwx 丨 grep java
tomcat 2S222 2,7  3.8 1754532 74832 ?	s1 14:19  0:07 /usi/Java/jdkl.6,0_
02/bin/java -Djvm=tomcat -Xmx384M -Djava.awt.headless=true -Djava.util.logging. 
fnanager-org,apache.juli.ClassLoaderLagHanager -Djava,util,logging.config.file=/opt/ 
tomcat/conf/logging.pxoperties -Djava.endorsed.dirs=/opt/tomcai;/commor/endorsed - 
classpath :/opt/tomcat/bin/bootstrap.jar:/opt/tomcat/bin/commons-logging-api.jar - 
Datalina.base=/opt/tomcat -Datalina.home=/opt/tomcat -Djava.io.tmpdir=/opt/tomcat/ 
temp org.apache.catalina.startup.Bootstrap start

然后,确信停止了Tomcat,因为笔者紧接着使用了jsvc运行了Tomcat。

关注微信获取最新动态