目前,我只是使用额外的终端选项卡来手动启动worker和clock进程,以及始终在线的apache代理到php-fpm。
当我开始使用heroku时,我尝试了heroku local,但它的设置击败了我。
现在我想给予一次。
我用homebrew
php
在High Sierra上运行,但到目前为止我一直坚持使用内置apache的mac os,看起来brew的apache可能是一个更好的选择,但希望我们能在下面找到答案。
我从这里提供的答案(由buildpack的顶级贡献者提供)中意识到,heroku local使用的apache必须在heroku local启动时停止,在heroku支持的答案here中也有类似的引用。
我还注意到,我自己的发现是,应该像在composer require --dev heroku/heroku-buildpack-php "*"
中一样在本地安装buildpack,以确保最新版本。
现在,当我使用mac osx的内置apache(我让它监听端口8080以服务于我的php开发环境,但为了这个目的,用sudo apachectl stop
停止了它)发出heroku local时,我得到了以下结果。
m$ heroku local
[OKAY] Loaded ENV .env File as KEY=VALUE Format
12:21:03 PM horizon.1 | Horizon started successfully.
12:21:03 PM clock.1 | [2019-09-20 11:21:03] Calling scheduler
12:21:03 PM clock.1 | No scheduled commands are ready to run.
12:21:03 PM web.1 | DOCUMENT_ROOT changed to 'public/'
12:21:04 PM web.1 | 4 processes at 128MB memory limit.
12:21:04 PM web.1 | Starting php-fpm...
12:21:06 PM web.1 | Starting httpd...
12:21:06 PM web.1 | Application ready for connections on port 5000.
12:21:06 PM web.1 | [Fri Sep 20 12:21:06.155117 2019] [core:emerg] [pid 25867] (2)No such file or directory: AH00023: Couldn't create the mpm-accept mutex (file /private/var/run/mpm-accept-0.25867)
12:21:06 PM web.1 | (2)No such file or directory: could not create accept mutex
12:21:06 PM web.1 | AH00015: Unable to open logs
12:21:06 PM web.1 | Process exited unexpectedly: httpd
12:21:06 PM web.1 | Going down, terminating child processes...
[DONE] Killing all processes with signal SIGINT
12:21:06 PM horizon.1 | Shutting down...
12:21:06 PM clock.1 Exited with exit code SIGINT
12:21:06 PM web.1 Exited with exit code null
12:21:07 PM horizon.1 | [2019-09-20 11:21:06][1033] Processing: Laravel\Scout\Jobs\MakeSearchable
12:21:07 PM horizon.1 | [2019-09-20 11:21:06][1032] Processing: Laravel\Scout\Jobs\MakeSearchable
12:21:07 PM horizon.1 | [2019-09-20 11:21:06][1034] Processing: Laravel\Scout\Jobs\MakeSearchable
12:21:08 PM horizon.1 | [2019-09-20 11:21:06][1033] Processed: Laravel\Scout\Jobs\MakeSearchable
12:21:08 PM horizon.1 | [2019-09-20 11:21:06][1032] Processed: Laravel\Scout\Jobs\MakeSearchable
12:21:08 PM horizon.1 | [2019-09-20 11:21:06][1034] Processed: Laravel\Scout\Jobs\MakeSearchable
12:21:08 PM horizon.1 Exited Successfully
我的mac os apache vhosts转发到/tmp/php72-fpm.sock
。权限没有问题,因为本地浏览器中的apache达到php-fpm。
我看到实际的错误是(由于没有换行符,它在上面的代码中向右滚动):Could not create the mpm-accept mutex
。我现在知道有几个不同的apache多处理模块,不确定我是否需要了解更多。
我注意到mac osx apache需要sudo,就像在sudo apachectl start
中一样,我正在运行heroku local而没有sudo,我可以尝试sudo heroku local
,但在我知道它会做什么之前,我宁愿不尝试。
因此,在没有更多理解的情况下(这将是很好的),我可能会尝试安装brew apache(httpd 24).看起来heroku local只会调用httpd
,所以,路径中的第一个将被选中。
部分回答
我意识到当heroku local启动系统apache时,系统apache当然仍然会有它当前的所有配置。这意味着写入sudo位置,错误日志,我添加的vhosts。当然,如果没有sudo,这将出错。修复上述问题的第一步是从httpd.conf中删除listen指令,这会产生一个新的错误:
(13)Permission denied: AH00091: httpd: could not open error log file /private/var/log/apache2/error_log.
然后我注解了errorlog来修复这个,这给了另一个:
(2)No such file or directory: AH02291: Cannot access directory '/usr/logs/' for main error log
2:17:25 PM web.1 | AH00014: Configuration check failed
2:17:25 PM web.1 | This program requires Apache 2.4.10 or newer with mod_proxy and mod_proxy_fcgi enabled; check your 'httpd' command.
可以看到这是怎么回事。基本上,我将需要删除几乎所有我的mac osx apaches配置,使它不会出错(当启动没有sudo)。
因此,让我们考虑使用brew apache代替...(如下)。
值得注意的是,检查/tmp
,每次我运行heroku local时,我都会看到下面的文件,如heroku.xxxxx
,写在零字节以下。我注意到下面的apache日志文件可以作为日志指令在构建包的默认vhost中找到,在<buildpack>/conf/apache2/heroku.conf
中,因此它们存在于这里。
mbp:tmp m$ ll
total 8
drwxrwxrwt@ 16 root wheel 512B 20 Sep 08:54 ./
drwxr-xr-x 6 root wheel 192B 31 Dec 2017 ../
srwxrwxrwx 1 root wheel 0B 18 Sep 22:02 .dbfseventsd=
srwxrwxrwx 1 m wheel 0B 20 Sep 07:59 .s.PGSQL.5432=
-rw------- 1 m wheel 49B 20 Sep 07:59 .s.PGSQL.5432.lock
srwxr-xr-x 1 m wheel 0B 8 Sep 21:05 OSL_PIPE_501_SingleOfficeIPC_48607cb6b283d6f2d9ab5973acdb43c=
drwx------ 3 m wheel 96B 27 Aug 17:28 com.apple.launchd.9wuyYAXuof/
drwx------ 3 m wheel 96B 27 Aug 17:28 com.apple.launchd.v9lh33yWhI/
-rw-r--r-- 1 m wheel 0B 20 Sep 08:54 heroku.apache2_access.5000.log
-rw-r--r-- 1 m wheel 0B 20 Sep 08:54 heroku.apache2_error.5000.log
-rw-r--r-- 1 m wheel 0B 20 Sep 08:54 heroku.php-fpm.5000.log
-rw-r--r-- 1 m wheel 0B 20 Sep 08:54 heroku.php-fpm.5000.www.slowlog
-rw-r--r-- 1 m wheel 0B 20 Sep 08:54 heroku.php-fpm.www.5000.log
drwxr-xr-x 3 m wheel 96B 19 Sep 20:23 pear/
srwxrwxrwx 1 m staff 0B 19 Sep 22:11 php72-fpm.sock=
drwxr-xr-x 2 root wheel 64B 19 Sep 08:29 powerlog/
我还能做些什么来帮助Web进程加速?
更新-如何安装brew apache独占heroku local?
也许真正有用的是知道安装brew apache的步骤,因为它只用于heroku本地。是一些简单的brew命令并删除listen指令吗?我在这里很谨慎,因为我希望不损害我目前对内置apache的使用;我认为这些应该能够彼此并行运行,只是在我这样做之前需要合理地确定。
还有
Homebrew现在不再支持公式的选项,所以上面链接中给出的brew install homebrew/apache/httpd24 --with-mpm-event
似乎不再是一个选项了。有必要吗?正确的安装步骤是什么?
1条答案
按热度按时间rdrgkggo1#
我在这里发布了一个部分答案,我会在发现更多信息时更新,而不是将这些进一步的信息附加到问题本身。
我用brew apache得到了它,如下:
brew install httpd
编辑
/usr/local/etc/httpd/httpd.conf
:Listen 8080
LoadModule proxy_module lib/httpd/modules/mod_proxy.so
中的注解LoadModule proxy_fcgi_module lib/httpd/modules/mod_proxy_fcgi.so
中的注解ServerName localhost:5000
(这将抑制它将发出的投诉-这是ServerName的正确值吗?)编辑
/usr/local/etc/httpd/extra/httpd-ssl.conf
如下:Listen 8443
不要执行
brew services start httpd
,就像你通常对brew服务那样,这与我们无关。(现在我们注解掉了Listen指令,httpd无论如何都不会响应,直到heroku local启动它 * 并注入 * 一个Listen指令)。有一个地方我还没有完全理解。当我现在运行heroku local时,我可以在localhost:5000访问我的网站,但只有首页。点击任何子页面返回:
也许我们以后可以修正这个问题,但是现在让我们考虑一下php-fpm。
首先,我有一个很容易修复的错误,那就是heroku local使用的是mac osx的php-fpm(在我的High Sierra上是7.1版),我通过确保我的php7.2公式(仅适用于小桶;我将很快转移到php7.3)首先在路径中。现在
which php-fpm
返回/usr/local/opt/php@7.2/sbin/php-fpm
而不是/usr/sbin/php-fpm
(mac osx内置)。所以,现在我们使用我们想要的版本得到了它。小但重要的修复。然而,我们现在必须考虑当heroku local调用(即启动)php-fpm时会发生什么。传统上,我会执行
brew services start php@7.2
,它始终处于打开状态(守护进程)。然而,打开Activity Monitor,我看到heroku local生成了一个新的父进程和worker。也许这就是它应该的样子。它只是忽略了由brew services
运行的示例,并创建了自己的示例。当我按下Ctrl-C退出Heroku local时,问题就出现了。这是正确的退出方式吗?如果我按下Ctrl-C,我会得到命令提示符,但是,在Activity Monitor中查看派生的php-fpm进程,php-fpm示例不会终止。然后,如果我在第一次停止heroku local后第二次发出heroku local,我会得到这样的结果:
…这是可以理解的。这可以通过在活动监视器中手动终止进程来解决。然而,我想知道这里发生了什么;如何正确地终止heroku local?
具体来说,
Ctrl-C
退出了一个父进程为node的php进程,但没有退出五个php-fpm进程,其中一个进程是其他四个进程的父进程,而另一个进程的父进程是bash。所以,我们今天已经走了很长的路;剩下的问题似乎仍需改进:
1.如何正确地终止php-fpm进程(Ctrl-C不会这样做).另外,如果我有两个终端打开,其中一个以前运行heroku本地,我在另一个窗口中再次运行它,该窗口显示一个常规的命令提示符等待指令,突然跳回到生活,接收新的信息,这是一个但令人惊讶的,我想知道这是如何工作的,如果这被认为是正常的.
1.找出为什么apache不为上面提到的root以外的页面提供服务。
成功了!
我在
/usr/local/etc/httpd/httpd.conf
中忽略的一个重要更改是在行中注解:LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so
我使用的是laravel,它通过index.php为所有页面提供服务。这意味着你想重写不是index.php的每个页面请求回到index.php。因此,laravel中的默认.htaccess有一行
RewriteRule ^ index.php [L]
,它就是这样做的...现在唯一剩下的问题,我目前知道的是,Ctrl-C不会终止子进程......但首先我要设置我所有的本地应用程序使用fpm 7.3,因为我看到了一个参考,特别是在buildpack 7.3,所以想知道如果这可能有帮助......