Apache перестает обслуживать статические страницы, когда приложение FastCGI Dancer2 включено - PullRequest
1 голос
/ 15 октября 2019

Я пытаюсь запустить 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?

Некоторые неудачные попытки решить эту проблему:

  1. ПерезапускApache требуется всякий раз, когда вносятся изменения в Dancer, но перезапуски Apache не влияют на эту проблему (как и перезагрузка сервера)

  2. Мне удалось обслуживать статические веб-страницы (например ... /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

1 Ответ

1 голос
/ 15 октября 2019

Сначала я думал, что решил эту проблему, изменив

AddHandler fastcgi-script .fcgi

на

SetHandler fcgid-script

в моем /etc/apache2/sites-enabled/saltstrau.men.conf.

, как показано в примере «Директивы конфигурации» документа Apache: http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html#examples

Однако это «решение» длилось недолго, поэтому я перестал запускать Dancer2 как быстрый CGIприменение.

РЕШЕНИЕ: В итоге я запустил Dancer2 в качестве автономного демона и использовал ProxyPass в своей конфигурации Apache для пересылки запросов в Dancer2. Как предложено в комментариях выше. Это работает надежно уже несколько дней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...