Я пытаюсь запустить Dancer2 как скрипт FastCGI под Apache 2.4, как описано здесь: https://metacpan.org/pod/Dancer2::Manual::Deployment#As-a-FastCGI-script
Мой /etc/apache2/sites-enabled/saltstrau.men.conf выглядит следующим образом:
<VirtualHost *:80>
ServerName saltstrau.men
DocumentRoot /var/www/me/MyApp/public
FcgidWrapper /var/www/me/MyApp/public/dispatch.fcgi
<Directory "/var/www/me/MyApp/public">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
AddHandler fastcgi-script .fcgi
Require all granted
Header set Access-Control-Allow-Origin "*"
</Directory>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /dispatch.fcgi$1 [QSA,L]
CustomLog /var/log/apache2/saltstrau.men_access.log combined
ErrorLog /var/log/apache2/saltstrau.men_error.log
</VirtualHost>
А веб-приложение Dancer2 - это стандартное демо-приложение, сгенерированное так:
$ dancer2 gen -a MyApp
Но когда я указываю браузер моего ноутбука на http://saltstrau.men/ вместо "Страница Perl is Dancing "Я получаю веб-страницу с текстом:
Not Found
The requested URL was not found on this server.
Apache/2.4.29 (Ubuntu) Server at saltstrau.men Port 80
Обратите внимание, что это не статическая страница Dancer2 ... / MyApp / public / 404.html.
Вопрос: Как заставить Dancer2 работать на порте 80 на Apache 2.4?
Некоторые неудачные попытки решить эту проблему:
ПерезапускApache требуется всякий раз, когда вносятся изменения в Dancer, но перезапуски Apache не влияют на эту проблему (как и перезагрузка сервера)
Мне удалось обслуживать статические веб-страницы (например ... /MyApp/public/404.html) для порта 80, закомментировав эти 3 строки:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /dispatch.fcgi$1 [QSA,L]
, но это dуничтожает цель, потому что мешает Dancer2 быть вызванным.
Я проверил, что Dancer2 правильно установлен и работает стандартное демонстрационное веб-приложение, протестировав их через plackup на сервере:
$ sudo plackup /var/www/me/MyApp/bin/app.psgi
HTTP::Server::PSGI: Accepting connections at http://0:5000/
[MyApp:2307] core @2019-10-15 01:03:53> looking for get / in
/usr/local/share/perl/5.26.1/Dancer2/Core/App.pm l. 36
[MyApp:2307] core @2019-10-15 01:03:53> Entering hook
core.app.before_request in (eval 218) l. 1
[MyApp:2307] core @2019-10-15 01:03:53> Entering hook
core.app.after_request in (eval 218) l. 1
Когда я сейчас указываю браузеру моего ноутбука на http://saltstrau.men:5000/ Я получаю знакомую страницу "Perl is Dancing". И http://saltstrau.men:5000/404.html возвращает статическую страницу, расположенную по адресу .... / MyApp / public / 404.html.
В другой попытке отладки конфигурации я даже попытался запустить автономный веб-приложение на порту 80, но порт 80 уже используется:
$ sudo plackup -p 80 /var/www/me/MyApp/bin/app.psgi
failed to listen to port 80: Address already in use at
/usr/local/share/perl/5.26.1/HTTP/Server/PSGI.pm line 103.
Мой сервер был создан за несколько днейназад, так что все версии ПО последние: Ubuntu 18.04, Apache 2.4.29 и Dancer2 0.208001. Все необходимые модули Apache включены:
/etc/apache2/mods-enabled$ ls
access_compat.load autoindex.load include.load setenvif.conf
alias.conf deflate.conf mime.conf setenvif.load
alias.load deflate.load mime.load socache_shmcb.load
auth_basic.load dir.conf mpm_event.conf ssl.conf
authn_core.load dir.load mpm_event.load ssl.load
authn_file.load env.load negotiation.conf status.conf
authz_core.load fcgid.conf negotiation.load status.load
authz_host.load fcgid.load reqtimeout.conf
authz_user.load filter.load reqtimeout.load
autoindex.conf headers.load rewrite.load