踩坑记录 :ubuntu 下 tomcat 启动慢、 80端口无法启动项目解决方案

想要学习一门语言,不仅要学习基本语法,还要知晓其相关技术栈、项目的部署方式,于是恰逢朋友有一个java项目让我部署,遇到的一些问题记录下来
问题一:启动超慢

tomcat起动的时候 大概过五分钟左右 才能完全启动起来,这让我很郁闷,于是查询了下原因,果然有很多人遇到,
朋友买了1g内存的阿里云服务器,cpu也只有1核 一开始启动超慢以为只是机器原因,后来深入了解到Tomcat 7/8都使用org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom类产生安全随机类SecureRandom的实例作为会话ID,这里花去了342秒,也即接近6分钟。具体可参考http://blog.csdn.net/xzs1980/article/details/71545512 这篇文章
解决办法:/usr/share/tomcat7/bin/catalina.sh 中 加入
[code]JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom"[/code]
问题二:80端口启动不起来
这里顺便提下,如果你是阿里云的话,别忘了先在控制台配置下安全组,把80 和8080端口都放开。
tomcat 默认是8080 启动,但是当我改成80的时候,就会报错 就是启不来 报错现象如下:

Caused by: java.net.BindException: Permission denied (Bind failed) <null>:80 at org.apache.tomcat.util.net.JIoEndpoint.bind(JIoEndpoint.java:410) at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:640) at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:434) at org.apache.coyote.http11.AbstractHttp11JsseProtocol.init(AbstractHttp11JsseProtocol.java:119) at org.apache.catalina.connector.Connector.initInternal(Connector.java:978)

… 13 more Caused by: java.net.BindException: Permission denied (Bind failed) at java.net.PlainSocketImpl.socketBind(Native Method) at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:387) at java.net.ServerSocket.bind(ServerSocket.java:375) at java.net.ServerSocket.<init>(ServerSocket.java:237) at java.net.ServerSocket.<init>(ServerSocket.java:181) at org.apache.tomcat.util.net.DefaultServerSocketFactory.createSocket(DefaultServerSocketFactory.java:49) at org.apache.tomcat.util.net.JIoEndpoint.bind(JIoEndpoint.java:397) … 17 mor

]

后来意识到 因为linux不允许普通用户使用1024之下的端口,使用的话会报无权限,tomcat root运行没有是成功,基于此原因 提供两个解决方案:

方案一  :iptables转发

sudo iptables -t nat -A PREROUTING -p tcp –dport 80 -j REDIRECT –to-port 8080

  改完保存下:
service iptables save
此方案会把所有的80打到8080上,如果你服务器上只有java应用的话 是可以的,但是如果你有php的应用的时候怎么办,下面说下方案二:

方案二 :nginx转发
提供下nginx配置文件,

[code]
server {
listen 80;
server_name xxxx.com www.xxx.com www.xxxx.cn;
location / {
proxy_pass http://localhost:8080;
proxy_redirect default;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
[/code]
这样 你既能用nginx 管理php应用 也可以转发java应用

发表评论

电子邮件地址不会被公开。 必填项已用*标注