Как запустить приложение Spring Boot на порту 80
Я не могу запустить приложение на 80-м порту.
Я попытался на моем локальном компьютере (используя мою IDE и на локальном сервере), не повезло.
Я проверил другие подобные посты и убедитесь, что я запускаю jar на сервере с root.
Это ошибка:
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)
Ответы
Ответ 1
На 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
Примечание. Чтобы узнать больше о конфигурациях виртуальных хостов, вы можете ознакомиться с подробным руководством 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
Ответ 2
Используйте sudo
на Linux.
Я запускал приложение Spring Boot в Ubuntu, и java -jar app.jar --server.port=80
выдал мне ту же ошибку. Поскольку порты ниже 1024 могут быть открыты только с помощью root-доступа, используйте "sudo": sudo java -jar app.jar --server.port=80
.
Этот способ развертывания предлагается только для локальных тестов из-за проблем безопасности. Смотрите комментарии для деталей.
Ответ 3
Вот шаги, которые я следовал на Centos.
Шаг 1 (необязательно): настройка порта
По умолчанию приложение весенней загрузки запускается на порту 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
Ответ 4
В случае использования macO теперь можно работать на порте 80 без каких-либо изменений в macO Mojave Version 10.14.
Ответ 5
Добавьте -Djava.net.preferIPv4Stack=true
в параметры виртуальной машины
API JavaMail для iMail - java.net.SocketException: Permission denied: connect