从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。