[suPHP] Apache-2.2 in mpm 'worker' mode
Jeremy Chadwick
suphp at jdc.parodius.com
Wed May 21 21:43:10 CEST 2008
Before we get into a discussion about this problem, I've two questions
and one comment:
Q1: What operating system are you seeing this behaviour on? It matters
greatly.
Q2: Can you please provide full version numbers of Apache and not "2.0"
and "2.2"?
C1: You want sigprocmask(), not sigsetmask(). POSIX == good, please
adhere to it. pthread_sigmask() also comes to mind.
--
| Jeremy Chadwick jdc at parodius.com |
| Parodius Networking http://www.parodius.com/ |
| UNIX Systems Administrator Mountain View, CA, USA |
| Making life hard for others since 1977. PGP: 4BD6C0CB |
On Wed, May 21, 2008 at 01:31:08PM -0500, Davy Durham wrote:
> Hi,
> I've found an issue when using mod_suphp with apache-2.2 when it's using
> it's newer "threaded" mode (as I understand it, it's called "mpm worker"),
> as opposed to the "forked" mode (called "mpm prefork").
>
> If you're not familiar, when you have a threaded application, and you send
> it a signal, you're not quite sure which thread will receive the signal.
> The thread that happens to be running at the time that it was raised will
> receive it.. so it's pretty much random. However, while all threads in a
> process share the same signal handlers, they all have their own signal
> masks. So if you want to ensure that a particular thread receive a signal,
> then you mask it out on all other threads.
>
> Apache 2.2 (when using the *threaded* "worker" mpm) has (understandibly)
> masked a lot of signals out on all the worker threads which allows the
> controller thread to receive all these signals. The problem is when a
> worker thread forks and executes something (such as suphp), the child
> process inherits the signal mask. This mask continues to get inherited by
> further children unless one of them resets the mask to 0.
>
> ==
>
> In my particular application, I'm using suphp to run a php script that
> eventually shells and does an arping. The arping hangs indefinately
> because it inherited a signal mask that blocks some signal that arping is
> expect. Granted this may be considered a bug in arping not setting the
> signal mask as it should, but the you can see the problem I hope.
>
> And I was also seeing the same type problem when my application shells out
> to several other scripts within /etc/init.d/...
>
> ==
>
> While trying to diagnose this problem I was having after upgrading from
> apache 2.0, I dug around and noticed that the signal mask of my php process
> was 0x0 when using apache 2.0, and 0xa207 when running on apache 2.2.
> This prompted me to write a little C application that simply calls
> "sigsetmask(0);" and then execs the command I want to run. The problem
> with arping and the rest was immediately fixed.
>
> So only then did I realize I was using the threaded apache mode, and so I
> recompiled apache to use "mpm prefork" which is not threaded and everything
> worked as well as it did under apache 2.0.
>
> I'm guessing somewhere in the 2.2 module developers guide, it specifies
> that modules that are going to fork and exec something will want to reset
> the signal mask to 0, but I have not looked.
> Anyway, it seems as though mod_suphp really needs to call "sigsetmask(0);"
> before executing the php interpreter so that the child process is not
> inheriting a signal mask that blocks bunch of signals.
>
> For now, I'm just going to use the prefork mode, but other's will likely
> run into the same problem I was having before too long. I'd probably
> switch back to the more efficient threaded mode if suphp were modified.
>
> How does this sound? I can provide the 2 line patch if you need me to.
> Let me know.
>
>
> Thanks,
> Davy
> _______________________________________________
> suPHP mailing list
> suPHP at lists.marsching.biz
> http://lists.marsching.com/mailman/listinfo/suphp
More information about the suPHP
mailing list