Spring Boot在端口80上运行app

5er*_*5er 28 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)
Run Code Online (Sandbox Code Playgroud)

Osk*_*icz 53

在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
Run Code Online (Sandbox Code Playgroud)

编辑文件:

<VIRTUALHOST *:80>

    ProxyPreserveHost On

    # ...

    ProxyPass / http://localhost:8080/
</VIRTUALHOST>
Run Code Online (Sandbox Code Playgroud)

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

注意:要了解有关虚拟主机配置的更多信息,请单击此处查看有关该主题的详细Apache手册.

重新启动Apache2以应用更改:

sudo service apache2 restart
Run Code Online (Sandbox Code Playgroud)

要么

sudo systemctl restart apache2
Run Code Online (Sandbox Code Playgroud)

解决方案2:端口转发

使用iptables进行重定向

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
Run Code Online (Sandbox Code Playgroud)

如果你需要使用localhost也添加这个

iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 8080
Run Code Online (Sandbox Code Playgroud)

  • 感谢iptables解决方案. (4认同)

Pho*_*Pan 8

sudo在Linux上使用。

我在Ubuntu上运行Spring Boot应用程序,并java -jar app.jar --server.port=80给了我同样的错误。由于低于1024的端口只能通过root用户访问来打开,因此请使用“ sudo” :sudo java -jar app.jar --server.port=80

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

  • 从安全的角度来看,这不是一个好主意:现在您的 java 应用程序以超级用户权限运行。`iptables` 解决方案巧妙地避免了这种情况。 (4认同)
  • @dirkjot 是的,感谢您指出这一点。到我编写解决方案时,已接受答案中的“iptables”部分还不存在,所以我只是将其作为本地测试的快速解决方案。这绝对不利于生产部署。 (2认同)

VK3*_*321 5

这是我在centos上遵循的步骤。

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

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

server.port = 8082 // any port above than 1024
Run Code Online (Sandbox Code Playgroud)

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

在 Centos 7

sudo yum install httpd
Run Code Online (Sandbox Code Playgroud)

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

/etc/httpd/conf.d/vhost.conf
Run Code Online (Sandbox Code Playgroud)

你的配置应该是这样的

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

   ProxyPreserveHost On
   ProxyPass / http://localhost:8082/
   ProxyPassReverse / http://localhost:8082/
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

并重启apache

sudo service httpd restart
Run Code Online (Sandbox Code Playgroud)