如何在端口80上运行Spring Boot应用程序

时间:2015-11-14 00:51:00

标签: java spring spring-boot

我无法在端口80上启动应用程序。

我在我的本地计算机上尝试过(使用我的IDE和本地服务器),没有运气。

我已检查过其他类似的帖子,并确保我在root服务器上运行jar。

这是错误:

 till here all ok
...
java.net.SocketException: Permission denied
at sun.nio.ch.Net.bind0(Native Method)
at sun.nio.ch.Net.bind(Net.java:433)
at sun.nio.ch.Net.bind(Net.java:425)
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:338)
at org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:760)
at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:472)
at org.apache.catalina.connector.Connector.startInternal(Connector.java:986)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.StandardService.addConnector(StandardService.java:237)
at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.addPreviouslyRemovedConnectors(TomcatEmbeddedServletContainer.java:186)
at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.start(TomcatEmbeddedServletContainer.java:149)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.startEmbeddedServletContainer(EmbeddedWebApplicationContext.java:288)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.finishRefresh(EmbeddedWebApplicationContext.java:141)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:483)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:957)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:946)
at com.andirod.StartApplication.main(StartApplication.java:20)
...
...
...
Exception in thread "main" java.lang.IllegalStateException: Tomcat connector in failed state
at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.start(TomcatEmbeddedServletContainer.java:157)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.startEmbeddedServletContainer(EmbeddedWebApplicationContext.java:288)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.finishRefresh(EmbeddedWebApplicationContext.java:141)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:483)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:957)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:946)
at com.andirod.StartApplication.main(StartApplication.java:20)

6 个答案:

答案 0 :(得分:43)

在linux下,1024以下的端口只能由root打开,因此默认情况下端口80是受限制的

如果您想在80端口上发布应用程序,则需要将请求从端口80重定向到您将运行springapp的端口(例如8080)端口

解决方案1:HTTP代理服务器

您可以使用默认允许的Apache2服务器在端口80上工作,并可以将请求转发给Tomcat

Debian的配置示例

sudo apt-get install apache2

a2enmod proxy
a2enmod proxy_http   

cd /etc/apache2/sites-enabled
sudo nano 000-default.conf

编辑文件:

<VIRTUALHOST *:80>

    ProxyPreserveHost On

    # ...

    ProxyPass / http://localhost:8080/
</VIRTUALHOST>

保存文件: Ctrl + O ENTER Ctrl + X

注意:要了解有关虚拟主机配置的更多信息,可以单击here查看有关该主题的详细Apache手册。

重新启动Apache2以应用更改:

sudo service apache2 restart

sudo systemctl restart apache2

解决方案2:端口转发

使用iptables进行重定向

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

如果您需要使用localhost也添加此

iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 8080

答案 1 :(得分:4)

刚遇到这个问题。我在Ubuntu AWS实例上运行Spring Boot应用程序。

java -jar app.jar --server.port=80会像你描述的那样给我一个错误。解决方案,因为1024以下的端口只能由root打开,添加&#34; sudo&#34;。 sudo java -jar app.jar --server.port=80

出于安全考虑,这种部署方式仅建议用于本地测试。有关详细信息,请参阅注释。

答案 2 :(得分:1)

以下是我在centos上遵循的步骤。

第1步(可选):设置端口

默认情况下,Spring Boot应用程序在端口8080上运行,如果要更改此设置,可以在src / main / resources / application.properties文件中进行更改

server.port = 8082 // any port above than 1024

第2步:如果尚未安装apache,请安装

在Centos 7上

sudo yum install httpd

步骤3:编辑您的虚拟主机

/etc/httpd/conf.d/vhost.conf

您的配置应如下所示

<VirtualHost *:80>
   ServerName yourdomin.com
   #DocumentRoot /var/www/html

   ProxyPreserveHost On
   ProxyPass / http://localhost:8082/
   ProxyPassReverse / http://localhost:8082/
</VirtualHost>

然后重新启动apache

sudo service httpd restart

答案 3 :(得分:0)

在使用 macOs 的情况下,现在可以在端口80上运行,而无需在 macOs Mojave版本10.14 上进行任何更改。

答案 4 :(得分:0)

如果您正在使用docker运行spring boot。

Dockerfile:

FROM adoptopenjdk/openjdk13 AS server
ADD /target/AppServer-1.0.jar AppServer-1.0.jar
ENTRYPOINT ["java", "-jar" , "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:9000", "-Dcom.sun.management.jmxremote", "-Dcom.sun.management.jmxremote.authenticate=false", "-Dcom.sun.management.jmxremote.ssl=false", "-Dcom.sun.management.jmxremote.local.only=false", "-Dcom.sun.management.jmxremote.port=1099", "-Dcom.sun.management.jmxremote.rmi.port=1099", "-Djava.rmi.server.hostname=127.0.0.1", "-Dlog4j.configurationFile=log4j2-docker.xml", "AppServer-1.0.jar", "--server.port=80"]

(*)向右滚动直到结尾,然后在jar名称后面看到--server.port=80

构建图像并运行:

docker run -it -p 8080:80 --cap-drop all --cap-add net_bind_service <image-name>:<tag>

(!)请注意,我删除了此进程/容器的所有功能,仅添加了相关的功能-net_bind_service,该功能将套接字绑定到特权端口(端口号小于1024)。

答案 5 :(得分:-1)