【问题标题】:How to listen in two port numbers in tomcat?如何在tomcat中监听两个端口号?
【发布时间】:2016-02-12 22:08:20
【问题描述】:

我有一个带有 tomcat 8 的 EC2 实例。这个 tomcat 有一个我在 android 应用程序中使用的 rest web 服务(在端口 8080 中)。现在,我想在同一个 tomcat 中放置一个网站。我可以通过这种方式访问​​网站:

www.domain.com:8080

我知道要在没有端口号的情况下访问网站,我需要将默认 tomcat 端口更改为 80。但如果我这样做,我的 Android 应用程序将无法再访问 Web 服务。

那么,我该怎么做呢?在不指定端口号的情况下访问网站并为我的 android 应用程序保留 8080 端口?

编辑:

这是我的 server.xml

<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
    type="org.apache.catalina.UserDatabase"
    description="User database that can be updated and saved"
    factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
    pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>

<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443" />

<Connector port="80" protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443" />

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

<Engine name="Catalina" defaultHost="localhost">
    <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
            resourceName="UserDatabase"/>
    </Realm>

    <Host name="localhost"  appBase="webapps"
        unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
            prefix="localhost_access_log" suffix=".txt"
            pattern="%h %l %u %t &quot;%r&quot; %s %b" />

    </Host>

</Engine>
</Service>
    </Server>

编辑 2:

如果我运行这个:

sudo netstat -lnp | grep 2563 (tomcat PID)

我明白了:

tcp        0      0 ::ffff:127.0.0.1:8005       :::*                        LISTEN      2563/java           
tcp        0      0 :::8080                     :::*                        LISTEN      2563/java 

【问题讨论】:

  • 这对我不起作用。 ://
  • 刚试了一下,在本地的tomcat 8上运行良好。我猜你的安全设置没有让端口 80 离开你的 EC2 实例。
  • 我的 EC2 安全设置已经允许来自任何来源的端口 80 入站。我现在检查了。
  • 你不要告诉我们你得到什么错误信息。

标签: tomcat amazon-ec2


【解决方案1】:

在 conf/server.XML 中添加/更新新的/现有的连接器。根据需要更改端口或协议。

【讨论】:

  • 我添加了一个新的连接器(端口 80),android 仍然可以正常使用 Web 服务,但我无法仅使用域或 www.domain.com:80 访问该网站。如果我使用旧的只有:www.domain.com:8080
  • 端口 80(Apache Web 服务器默认使用)可能已被其他进程使用。在 Unix 或 Windows 上运行检查端口使用情况...u?
  • 使用 netstat 命令或使用 netstat -a | 检查端口 80 上运行的内容grep 80
  • 始终建议使用超过 4000 的更高端口,因为这些天它们是保留的。80 通常由于安全问题而被阻止。所以最好的办法是更改端口并在前面使用 Apache..
  • 我检查了,80端口没有被使用。
【解决方案2】:

喜欢@Sheetal Mohan Sharma 评论他的回答:“80 通常由于安全问题而被阻止”。

所以,这给了我正确的方向。 事实上,80 端口确实被阻塞了,在 linux 中解决这个问题的解决方法是安装 authbind。但对我来说,这并不能解决问题,因为 authbind 无法安装在我的 ec2 实例中(例如 yum install)。

为了最终解决这个问题,我按照本站的教程进行操作:

http://www.excelsior-usa.com/articles/tomcat-amazon-ec2-advanced.html

步骤如下:

1 - 将传入的端口 80 请求转发到端口 8080

sudo /sbin/iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

2 - 测试一下。如果可以的话,你可以保存这个 iptables 规则

sudo /sbin/service iptables save

3 - 就像链接中所说的那样:最后,您需要 Web 应用程序中的 servlet 就像传入的请求被定向到端口 80 一样。这将防止非特权端口出现在任何发送回客户端的 URL。在 server.xml 中的 HTTP 连接器配置中包含 proxyPort 属性:

<Connector port="8080" proxyPort="80" .../>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    相关资源
    最近更新 更多