Web Hosting Talk







View Full Version : apache 2.2 + suexec + mod_fastcgi (RedHat only)


ServerSurgeon John
01-03-2007, 02:43 PM
First uninstall your existing PHP.
Install httpd-devel

Second compile a new PHP with support of cgi/fcgi:

./configure --prefix=/usr/local/php-fcgi --enable-fastcgi --enable-memory-limit --with-mysql=shared,/usr --enable-discard-path --enable-force-cgi-redirect --with-imap=shared,/usr --with-gd=shared,/usr --with-libxml=shared,/usr --with-mbstring=shared --with-freetype-dir=/usr --with-jpeg-dir=/usr --with-png-dir=/usr --with-zlib-dir=/usr --with-kerberos --with-imap-ssl

make

make install

To solve the errors during configure problems take a look at this:
http://www.root0.net/php/compilation_php.html

Next you'll need to download/install fcgid:
wget http://www.fastcgi.com/dist/fcgi-2.4.1-SNAP-0311112127.tar.gz
tar xfvz fcgi-2.4.1-SNAP-0311112127.tar.gz
cd fcgi-2.4.1-SNAP-0311112127
./configure
make
make install

Next you'll need to compile/install mod_fastcgi for Apache 2.2.2:

wget http://www.fastcgi.com/dist/mod_fastcgi-SNAP-0404142202.tar.gz
tar xfvz mod_fastcgi-SNAP-0404142202.tar.gz
cd fcgi-2.4.1-SNAP-0311112127


Now we need to apply a patch so mod_fastcgi compiles with Apache 2.2. Put the following into a file:


diff -ruN mod_fastcgi-2.4.2/Makefile.AP2 mod_fastcgi-2.4.2.for22/Makefile.AP2
--- mod_fastcgi-2.4.2/Makefile.AP2 Mon Jul 29 03:36:34 2002
+++ mod_fastcgi-2.4.2.for22/Makefile.AP2 Mon Dec 5 13:05:21 2005
@@ -20,8 +20,6 @@

all: local-shared-build

-install: install-modules
-
clean:
-rm -f *.o *.lo *.slo *.la

diff -ruN mod_fastcgi-2.4.2/fcgi_buf.c mod_fastcgi-2.4.2.for22/fcgi_buf.c
--- mod_fastcgi-2.4.2/fcgi_buf.c Tue Feb 4 00:07:37 2003
+++ mod_fastcgi-2.4.2.for22/fcgi_buf.c Mon Dec 5 12:59:01 2005
@@ -50,7 +50,7 @@
{
Buffer *buf;

- buf = (Buffer *)ap_pcalloc(p, sizeof(Buffer) + size);
+ buf = (Buffer *)apr_pcalloc(p, sizeof(Buffer) + size);
buf->size = size;
fcgi_buf_reset(buf);
return buf;
@@ -487,7 +487,7 @@
char *new_elts;
int new_nalloc = (arr->nalloc <0>nelts + n;

- new_elts = ap_pcalloc(arr->pool, arr->elt_size * new_nalloc);
+ new_elts = apr_pcalloc(arr->pool, arr->elt_size * new_nalloc);
memcpy(new_elts, arr->elts, arr->nelts * arr->elt_size);

arr->elts = new_elts;
diff -ruN mod_fastcgi-2.4.2/fcgi_config.c mod_fastcgi-2.4.2.for22/fcgi_config.c
--- mod_fastcgi-2.4.2/fcgi_config.c Thu Oct 30 02:08:34 2003
+++ mod_fastcgi-2.4.2.for22/fcgi_config.c Mon Dec 5 12:59:01 2005
@@ -50,7 +50,7 @@
/* Convert port number */
tmp = (u_short) strtol(portStr, &cvptr, 10);
if (*cvptr != '\0' || tmp <1> USHRT_MAX)
- return ap_pstrcat(p, "bad port number \"", portStr, "\"", NULL);
+ return apr_pstrcat(p, "bad port number \"", portStr, "\"", NULL);

*port = (unsigned short) tmp;

@@ -75,11 +75,11 @@
tmp = strtol(txt, &ptr, 10);

if (*ptr != '\0') {
- return ap_pstrcat(p, "\"", txt, "\" must be a positive integer", NULL);
+ return apr_pstrcat(p, "\"", txt, "\" must be a positive integer", NULL);
}

if (tmp <min> USHRT_MAX) {
- return ap_psprintf(p, "\"%u\" must be >= %u and <u>= %u and <u cp='\0'>= %d", *num, min);
+ return apr_psprintf(p, "\"%d\" must be >= %d", *num, min);
}

return NULL;
@@ -126,9 +126,9 @@
*num = (u_int)strtol(val, &ptr, 10);

if (*ptr != '\0')
- return ap_pstrcat(p, "\"", val, "\" must be a positive integer", NULL);
+ return apr_pstrcat(p, "\"", val, "\" must be a positive integer", NULL);
else if (*num < min)
- return ap_psprintf(p, "\"%u\" must be >= %u", *num, min);
+ return apr_psprintf(p, "\"%u\" must be >= %u", *num, min);
return NULL;
}

@@ -147,9 +147,9 @@
*num = (float) strtod(val, &ptr);

if (*ptr != '\0')
- return ap_pstrcat(p, "\"", val, "\" is not a floating point number", NULL);
+ return apr_pstrcat(p, "\"", val, "\" is not a floating point number", NULL);
if (*num <min> max)
- return ap_psprintf(p, "\"%f\" is not between %f and %f", *num, min, max);
+ return apr_psprintf(p, "\"%f\" is not between %f and %f", *num, min, max);
return NULL;
}

@@ -160,7 +160,7 @@
}

if (strchr(var, '=') == NULL) {
- *(envp + *envc) = ap_pstrcat(p, var, "=", getenv(var), NULL);
+ *(envp + *envc) = apr_pstrcat(p, var, "=", getenv(var), NULL);
}
else {
*(envp + *envc) = var;
@@ -191,10 +191,10 @@
const char **header;

if (!*array) {
- *array = ap_make_array(p, 10, sizeof(char*));
+ *array = apr_array_make(p, 10, sizeof(char*));
}

- header = (const char **)ap_push_array(*array);
+ header = (const char **)apr_array_push(*array);
*header = ap_getword_conf(p, arg);

return header ? NULL : "\"\"";
@@ -206,7 +206,7 @@
static const char *invalid_value(pool *p, const char *cmd, const char *id,
const char *opt, const char *err)
{
- return ap_psprintf(p, "%s%s%s: invalid value for %s: %s",
+ return apr_psprintf(p, "%s%s%s: invalid value for %s: %s",
cmd, id ? " " : "", id ? id : "", opt, err);
}

@@ -334,7 +334,7 @@
if (mkdir(path, S_IRWXU) != 0)
#endif
{
- return ap_psprintf(tp,
+ return apr_psprintf(tp,
"doesn't exist and can't be created: %s",
strerror(errno));
}
@@ -342,7 +342,7 @@
#ifndef WIN32
/* If we're root, we're gonna setuid/setgid so we need to chown */
if (geteuid() == 0 && chown(path, ap_user_id, ap_group_id) != 0) {
- return ap_psprintf(tp,
+ return apr_psprintf(tp,
"can't chown() to the server (uid %ld, gid %ld): %s",
(long)ap_user_id, (long)ap_group_id, strerror(errno));
}
@@ -361,7 +361,7 @@
fcgi_user_id, fcgi_group_id);
#endif
if (err != NULL) {
- return ap_psprintf(tp,
+ return apr_psprintf(tp,
"access for server (uid %ld, gid %ld) failed: %s",
(long)fcgi_user_id, (long)fcgi_group_id, err);
}
@@ -379,10 +379,10 @@
const char *err;
pool *tp;

- fcgi_dynamic_dir = ap_pstrcat(p, fcgi_socket_dir, "/dynamic", NULL);
+ fcgi_dynamic_dir = apr_pstrcat(p, fcgi_socket_dir, "/dynamic", NULL);

if ((err = fcgi_config_make_dir(p, fcgi_dynamic_dir)))
- return ap_psprintf(p, "can't create dynamic directory \"%s\": %s", fcgi_dynamic_dir, err);
+ return apr_psprintf(p, "can't create dynamic directory \"%s\": %s", fcgi_dynamic_dir, err);

/* Don't step on a running server unless its OK. */
if (!wax)
@@ -419,8 +419,8 @@

dp = ap_popendir(tp, fcgi_dynamic_dir);
if (dp == NULL) {
- ap_destroy_pool(tp);
- return ap_psprintf(p, "can't open dynamic directory \"%s\": %s",
+ apr_pool_destroy(tp);
+ return apr_psprintf(p, "can't open dynamic directory \"%s\": %s",
fcgi_dynamic_dir, strerror(errno));
}

@@ -431,13 +431,13 @@
if (strcmp(dirp->d_name, ".") == 0 || strcmp(dirp->d_name, "..") == 0)
continue;

- unlink(ap_pstrcat(tp, fcgi_dynamic_dir, "/", dirp->d_name, NULL));
+ unlink(apr_pstrcat(tp, fcgi_dynamic_dir, "/", dirp->d_name, NULL));
}
}

#endif /* !APACHE2 */

- ap_destroy_pool(tp);
+ apr_pool_destroy(tp);

return NULL;
}
@@ -461,27 +461,27 @@
}

if (fcgi_socket_dir) {
- return ap_psprintf(tp, "%s %s: already defined as \"%s\"",
+ return apr_psprintf(tp, "%s %s: already defined as \"%s\"",
name, arg, fcgi_socket_dir);
}

err = fcgi_config_set_fcgi_uid_n_gid(1);
if (err != NULL)
- return ap_psprintf(tp, "%s %s: %s", name, arg, err);
+ return apr_psprintf(tp, "%s %s: %s", name, arg, err);

if (fcgi_servers != NULL) {
- return ap_psprintf(tp,
+ return apr_psprintf(tp,
"The %s command must preceed static FastCGI server definitions",
name);
}

- arg_nc = ap_pstrdup(cmd->pool, arg);
+ arg_nc = apr_pstrdup(cmd->pool, arg);

#ifndef WIN32

#ifdef APACHE2
if (apr_filepath_merge(&arg_nc, "", arg, 0, cmd->pool))
- return ap_psprintf(tp, "%s %s: invalid filepath", name, arg);
+ return apr_psprintf(tp, "%s %s: invalid filepath", name, arg);
#else
arg_nc = ap_os_canonical_filename(cmd->pool, arg_nc);
#endif
@@ -491,22 +491,22 @@
#else /* WIN32 */

if (strncmp(arg_nc, "\\\\.\\pipe\\", 9) != 0)
- return ap_psprintf(tp, "%s %s is invalid format",name, arg_nc);
+ return apr_psprintf(tp, "%s %s is invalid format",name, arg_nc);

#endif

fcgi_socket_dir = arg_nc;

#ifdef WIN32
- fcgi_dynamic_dir = ap_pstrcat(cmd->pool, fcgi_socket_dir, "dynamic", NULL);
+ fcgi_dynamic_dir = apr_pstrcat(cmd->pool, fcgi_socket_dir, "dynamic", NULL);
#else
err = fcgi_config_make_dir(tp, fcgi_socket_dir);
if (err != NULL)
- return ap_psprintf(tp, "%s %s: %s", name, arg_nc, err);
+ return apr_psprintf(tp, "%s %s: %s", name, arg_nc, err);

err = fcgi_config_make_dynamic_dir(cmd->pool, 0);
if (err != NULL)
- return ap_psprintf(tp, "%s %s: %s", name, arg_nc, err);
+ return apr_psprintf(tp, "%s %s: %s", name, arg_nc, err);
#endif

return NULL;
@@ -519,7 +519,7 @@
const char *fcgi_config_set_wrapper(cmd_parms *cmd, void *dummy, const char *arg)
{
#ifdef WIN32
- return ap_psprintf(cmd->temp_pool,
+ return apr_psprintf(cmd->temp_pool,
"the %s directive is not supported on WIN", cmd->cmd->name);
#else

@@ -536,16 +536,16 @@

if (fcgi_wrapper)
{
- return ap_psprintf(tp, "%s was already set to \"%s\"",
+ return apr_psprintf(tp, "%s was already set to \"%s\"",
name, fcgi_wrapper);
}

err = fcgi_config_set_fcgi_uid_n_gid(1);
if (err != NULL)
- return ap_psprintf(tp, "%s %s: %s", name, arg, err);
+ return apr_psprintf(tp, "%s %s: %s", name, arg, err);

if (fcgi_servers != NULL) {
- return ap_psprintf(tp,
+ return apr_psprintf(tp,
"The %s command must preceed static FastCGI server definitions", name);
}

@@ -562,7 +562,7 @@
{
#ifdef APACHE2
if (apr_filepath_merge(&wrapper, "", arg, 0, cmd->pool))
- return ap_psprintf(tp, "%s %s: invalid filepath", name, arg);
+ return apr_psprintf(tp, "%s %s: invalid filepath", name, arg);
#else
wrapper = ap_os_canonical_filename(cmd->pool, (char *) arg);
#endif
@@ -573,7 +573,7 @@
err = fcgi_util_check_access(tp, wrapper, NULL, X_OK, fcgi_user_id, fcgi_group_id);
if (err)
{
- return ap_psprintf(tp, "%s: \"%s\" execute access for server "
+ return apr_psprintf(tp, "%s: \"%s\" execute access for server "
"(uid %ld, gid %ld) failed: %s", name, wrapper,
(long) fcgi_user_id, (long) fcgi_group_id, err);
}
@@ -596,7 +596,7 @@
const char *option, *err;

/* Allocate temp storage for the array of initial environment variables */
- char **envp = ap_pcalloc(tp, sizeof(char *) * (MAX_INIT_ENV_VARS + 3));
+ char **envp = apr_pcalloc(tp, sizeof(char *) * (MAX_INIT_ENV_VARS + 3));
unsigned int envc = 0;

#ifdef WIN32
@@ -613,11 +613,11 @@
return "AppClass requires a pathname!?";

if ((err = fcgi_config_set_fcgi_uid_n_gid(1)) != NULL)
- return ap_psprintf(tp, "%s %s: %s", name, fs_path, err);
+ return apr_psprintf(tp, "%s %s: %s", name, fs_path, err);

#ifdef APACHE2
if (apr_filepath_merge(&fs_path, "", fs_path, 0, p))
- return ap_psprintf(tp, "%s %s: invalid filepath", name, fs_path);
+ return apr_psprintf(tp, "%s %s: invalid filepath", name, fs_path);
#else
fs_path = ap_os_canonical_filename(p, fs_path);
#endif
@@ -631,14 +631,14 @@
fcgi_util_get_server_gid(cmd->server));
if (s != NULL) {
if (fcgi_wrapper) {
- return ap_psprintf(tp,
+ return apr_psprintf(tp,
"%s: redefinition of a previously defined FastCGI "
"server \"%s\" with uid=%ld and gid=%ld",
name, fs_path, (long) fcgi_util_get_server_uid(cmd->server),
(long) fcgi_util_get_server_gid(cmd->server));
}
else {
- return ap_psprintf(tp,
+ return apr_psprintf(tp,
"%s: redefinition of a previously defined FastCGI server \"%s\"",
name, fs_path);
}
@@ -646,7 +646,7 @@

err = fcgi_util_fs_is_path_ok(tp, fs_path, NULL);
if (err != NULL) {
- return ap_psprintf(tp, "%s: \"%s\" %s", name, fs_path, err);
+ return apr_psprintf(tp, "%s: \"%s\" %s", name, fs_path, err);
}

s = fcgi_util_fs_new(p);
@@ -672,7 +672,7 @@

SetHandleInformation(mutex, HANDLE_FLAG_INHERIT, TRUE);

- s->mutex_env_string = ap_psprintf(p, "_FCGI_MUTEX_=%ld", mutex);
+ s->mutex_env_string = apr_psprintf(p, "_FCGI_MUTEX_=%ld", mutex);

#endif

@@ -730,7 +730,7 @@
}
else if (strcasecmp(option, "-user") == 0) {
#ifdef WIN32
- return ap_psprintf(tp,
+ return apr_psprintf(tp,
"%s %s: the -user option isn't supported on WIN", name, fs_path);
#else
s->user = ap_getword_conf(tp, &arg);
@@ -740,7 +740,7 @@
}
else if (strcasecmp(option, "-group") == 0) {
#ifdef WIN32
- return ap_psprintf(tp,
+ return apr_psprintf(tp,
"%s %s: the -group option isn't supported on WIN", name, fs_path);
#else
s->group = ap_getword_conf(tp, &arg);
@@ -749,7 +749,7 @@
#endif
}
else {
- return ap_psprintf(tp, "%s %s: invalid option: %s", name, fs_path, option);
+ return apr_psprintf(tp, "%s %s: invalid option: %s", name, fs_path, option);
}
} /* while */

@@ -758,12 +758,12 @@
{
if (s->group == NULL)
{
- s->group = ap_psprintf(tp, "#%ld", fcgi_util_get_server_gid(cmd->server));
+ s->group = apr_psprintf(tp, "#%ld", fcgi_util_get_server_gid(cmd->server));
}

if (s->user == NULL)
{
- s->user = ap_psprintf(p, "#%ld", fcgi_util_get_server_uid(cmd->server));
+ s->user = apr_psprintf(p, "#%ld", fcgi_util_get_server_uid(cmd->server));
}

s->uid = ap_uname2id(s->user);
@@ -777,19 +777,19 @@

if ((err = fcgi_util_fs_set_uid_n_gid(p, s, s->uid, s->gid)))
{
- return ap_psprintf(tp,
+ return apr_psprintf(tp,
"%s %s: invalid user or group: %s", name, fs_path, err);
}
#endif /* !WIN32 */

if (s->socket_path != NULL && s->port != 0) {
- return ap_psprintf(tp,
+ return apr_psprintf(tp,
"%s %s: -port and -socket are mutually exclusive options",
name, fs_path);
}

/* Move env array to a surviving pool */
- s->envp = (char **)ap_pcalloc(p, sizeof(char *) * (envc + 4));
+ s->envp = (char **)apr_pcalloc(p, sizeof(char *) * (envc + 4));
memcpy(s->envp, envp, sizeof(char *) * envc);

/* Initialize process structs */
@@ -800,12 +800,12 @@
err = fcgi_util_socket_make_inet_addr(p, (struct sockaddr_in **)&s->socket_addr,
&s->socket_addr_len, NULL, s->port);
if (err != NULL)
- return ap_psprintf(tp, "%s %s: %s", name, fs_path, err);
+ return apr_psprintf(tp, "%s %s: %s", name, fs_path, err);
#ifdef WIN32
err = fcgi_util_socket_make_inet_addr(p, (struct sockaddr_in **)&s->dest_addr,
&s->socket_addr_len, "localhost", s->port);
if (err != NULL)
- return ap_psprintf(tp, "%s %s: %s", name, fs_path, err);
+ return apr_psprintf(tp, "%s %s: %s", name, fs_path, err);
#endif
} else {
if (s->socket_path == NULL)
@@ -825,7 +825,7 @@
err = fcgi_util_socket_make_domain_addr(p, (struct sockaddr_un **)&s->socket_addr,
&s->socket_addr_len, s->socket_path);
if (err != NULL)
- return ap_psprintf(tp, "%s %s: %s", name, fs_path, err);
+ return apr_psprintf(tp, "%s %s: %s", name, fs_path, err);
#endif
}

@@ -853,12 +853,12 @@
}

if (!*fs_path) {
- return ap_pstrcat(tp, name, " requires a path and either a -socket or -host option", NULL);
+ return apr_pstrcat(tp, name, " requires a path and either a -socket or -host option", NULL);
}

#ifdef APACHE2
if (apr_filepath_merge(&fs_path, "", fs_path, 0, p))
- return ap_psprintf(tp, "%s %s: invalid filepath", name, fs_path);
+ return apr_psprintf(tp, "%s %s: invalid filepath", name, fs_path);
#else
fs_path = ap_os_canonical_filename(p, fs_path);
#endif
@@ -873,7 +873,7 @@
fcgi_util_get_server_gid(cmd->server));
if (s != NULL) {
if (fcgi_wrapper) {
- return ap_psprintf(tp,
+ return apr_psprintf(tp,
"%s: redefinition of a previously defined class \"%s\" "
"with uid=%ld and gid=%ld",
name, fs_path, (long) fcgi_util_get_server_uid(cmd->server),
@@ -881,7 +881,7 @@
}
else
{
- return ap_psprintf(tp,
+ return apr_psprintf(tp,
"%s: redefinition of previously defined class \"%s\"", name, fs_path);
}
}
@@ -920,7 +920,7 @@
}
else if (strcasecmp(option, "-user") == 0) {
#ifdef WIN32
- return ap_psprintf(tp,
+ return apr_psprintf(tp,
"%s %s: the -user option isn't supported on WIN", name, fs_path);
#else
s->user = ap_getword_conf(tp, &arg);
@@ -930,7 +930,7 @@
}
else if (strcasecmp(option, "-group") == 0) {
#ifdef WIN32
- return ap_psprintf(tp,
+ return apr_psprintf(tp,
"%s %s: the -group option isn't supported on WIN", name, fs_path);
#else
s->group = ap_getword_conf(tp, &arg);
@@ -939,7 +939,7 @@
#endif
}
else {
- return ap_psprintf(tp, "%s %s: invalid option: %s", name, fs_path, option);
+ return apr_psprintf(tp, "%s %s: invalid option: %s", name, fs_path, option);
}
} /* while */

@@ -949,12 +949,12 @@
{
if (s->group == NULL)
{
- s->group = ap_psprintf(tp, "#%ld", fcgi_util_get_server_gid(cmd->server));
+ s->group = apr_psprintf(tp, "#%ld", fcgi_util_get_server_gid(cmd->server));
}

if (s->user == NULL)
{
- s->user = ap_psprintf(p, "#%ld", fcgi_util_get_server_uid(cmd->server));
+ s->user = apr_psprintf(p, "#%ld", fcgi_util_get_server_uid(cmd->server));
}

s->uid = ap_uname2id(s->user);
@@ -968,19 +968,19 @@

if ((err = fcgi_util_fs_set_uid_n_gid(p, s, s->uid, s->gid)))
{
- return ap_psprintf(tp,
+ return apr_psprintf(tp,
"%s %s: invalid user or group: %s", name, fs_path, err);
}
#endif /* !WIN32 */

/* Require one of -socket or -host, but not both */
if (s->socket_path != NULL && s->port != 0) {
- return ap_psprintf(tp,
+ return apr_psprintf(tp,
"%s %s: -host and -socket are mutually exclusive options",
name, fs_path);
}
if (s->socket_path == NULL && s->port == 0) {
- return ap_psprintf(tp,
+ return apr_psprintf(tp,
"%s %s: -socket or -host option missing", name, fs_path);
}

@@ -989,7 +989,7 @@
err = fcgi_util_socket_make_inet_addr(p, (struct sockaddr_in **)&s->socket_addr,
&s->socket_addr_len, s->host, s->port);
if (err != NULL)
- return ap_psprintf(tp, "%s %s: %s", name, fs_path, err);
+ return apr_psprintf(tp, "%s %s: %s", name, fs_path, err);
} else {

if (fcgi_socket_dir == NULL)
@@ -1006,7 +1006,7 @@
err = fcgi_util_socket_make_domain_addr(p, (struct sockaddr_un **)&s->socket_addr,
&s->socket_addr_len, s->socket_path);
if (err != NULL)
- return ap_psprintf(tp, "%s %s: %s", name, fs_path, err);
+ return apr_psprintf(tp, "%s %s: %s", name, fs_path, err);
#endif
}

@@ -1037,7 +1037,7 @@

/* Allocate temp storage for an initial environment */
unsigned int envc = 0;
- char **envp = (char **)ap_pcalloc(tp, sizeof(char *) * (MAX_INIT_ENV_VARS + 3));
+ char **envp = (char **)apr_pcalloc(tp, sizeof(char *) * (MAX_INIT_ENV_VARS + 3));

err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
if (err)
@@ -1131,20 +1131,20 @@
dynamicFlush = TRUE;
}
else {
- return ap_psprintf(tp, "%s: invalid option: %s", name, option);
+ return apr_psprintf(tp, "%s: invalid option: %s", name, option);
}
} /* while */

if (dynamicProcessSlack >= dynamicMaxProcs + 1) {
/* the kill policy would work unexpectedly */
- return ap_psprintf(tp,
+ return apr_psprintf(tp,
"%s: processSlack (%u) must be less than maxProcesses (%u) + 1",
name, dynamicProcessSlack, dynamicMaxProcs);
}

/* Move env array to a surviving pool, leave 2 extra slots for
* WIN32 _FCGI_MUTEX_ and _FCGI_SHUTDOWN_EVENT_ */
- dynamicEnvp = (char **)ap_pcalloc(p, sizeof(char *) * (envc + 4));
+ dynamicEnvp = (char **)apr_pcalloc(p, sizeof(char *) * (envc + 4));
memcpy(dynamicEnvp, envp, sizeof(char *) * envc);

return NULL;
@@ -1152,7 +1152,7 @@

void *fcgi_config_create_dir_config(pool *p, char *dummy)
{
- fcgi_dir_config *dir_config = ap_pcalloc(p, sizeof(fcgi_dir_config));
+ fcgi_dir_config *dir_config = apr_pcalloc(p, sizeof(fcgi_dir_config));

dir_config->authenticator_options = FCGI_AUTHORITATIVE;
dir_config->authorizer_options = FCGI_AUTHORITATIVE;
@@ -1171,7 +1171,7 @@

#ifdef APACHE2
if (apr_filepath_merge(&auth_server, "", fs_path, 0, cmd->pool))
- return ap_psprintf(tp, "%s %s: invalid filepath", cmd->cmd->name, fs_path);
+ return apr_psprintf(tp, "%s %s: invalid filepath", cmd->cmd->name, fs_path);
#else
auth_server = (char *) ap_os_canonical_filename(cmd->pool, fs_path);
#endif
@@ -1184,11 +1184,11 @@
{
const char *err = fcgi_util_fs_is_path_ok(tp, auth_server, NULL);
if (err)
- return ap_psprintf(tp, "%s: \"%s\" %s", cmd->cmd->name, auth_server, err);
+ return apr_psprintf(tp, "%s: \"%s\" %s", cmd->cmd->name, auth_server, err);
}

if (compat && strcasecmp(compat, "-compat"))
- return ap_psprintf(cmd->temp_pool, "%s: unknown option: \"%s\"", cmd->cmd->name, compat);
+ return apr_psprintf(cmd->temp_pool, "%s: unknown option: \"%s\"", cmd->cmd->name, compat);

switch((int)cmd->info) {
case FCGI_AUTH_TYPE_AUTHENTICATOR:
diff -ruN mod_fastcgi-2.4.2/fcgi_pm.c mod_fastcgi-2.4.2.for22/fcgi_pm.c
--- mod_fastcgi-2.4.2/fcgi_pm.c Thu Oct 30 02:08:34 2003
+++ mod_fastcgi-2.4.2.for22/fcgi_pm.c Mon Dec 5 12:59:01 2005
@@ -225,7 +225,7 @@
#ifdef WIN32
errno = WSAGetLastError();
#endif
- ap_snprintf(port, sizeof(port), "port=%d",
+ apr_snprintf(port, sizeof(port), "port=%d",
((struct sockaddr_in *)fs->socket_addr)->sin_port);

ap_log_error(FCGI_LOG_CRIT_ERRNO, fcgi_apache_main_server,
@@ -365,7 +365,7 @@
if (dnEnd == NULL) {
dirName = "./";
} else {
- dirName = ap_pcalloc(fcgi_config_pool, dnEnd - fs->fs_path + 1);
+ dirName = apr_pcalloc(fcgi_config_pool, dnEnd - fs->fs_path + 1);
dirName = memcpy(dirName, fs->fs_path, dnEnd - fs->fs_path);
}
if (chdir(dirName) <0>terminationEvent, HANDLE_FLAG_INHERIT, TRUE);

- termination_env_string = ap_psprintf(tp,
+ termination_env_string = apr_psprintf(tp,
"_FCGI_SHUTDOWN_EVENT_=%ld", process->terminationEvent);

while (fs->envp[i]) i++;
@@ -576,7 +576,7 @@
fs->envp[i - 1] = NULL;
}

- ap_destroy_pool(tp);
+ apr_pool_destroy(tp);

return proc.pid;

@@ -614,7 +614,7 @@
}
SetHandleInformation(process->terminationEvent, HANDLE_FLAG_INHERIT, TRUE);

- termination_env_string = ap_psprintf(tp,
+ termination_env_string = apr_psprintf(tp,
"_FCGI_SHUTDOWN_EVENT_=%ld", process->terminationEvent);

if (fs->socket_path)
@@ -659,7 +659,7 @@
"FastCGI: %s is not executable; ensure interpreted scripts have "
"\"#!\" as their first line",
fs->fs_path);
- ap_destroy_pool(tp);
+ apr_pool_destroy(tp);
goto CLEANUP;
}

@@ -668,9 +668,9 @@
* the arguments (if there are any).
* Build the command string to pass to CreateProcess.
*/
- quoted_filename = ap_pstrcat(tp, "\"", fs->fs_path, "\"", NULL);
+ quoted_filename = apr_pstrcat(tp, "\"", fs->fs_path, "\"", NULL);
if (interpreter && *interpreter) {
- pCommand = ap_pstrcat(tp, interpreter, " ", quoted_filename, NULL);
+ pCommand = apr_pstrcat(tp, interpreter, " ", quoted_filename, NULL);
}
else {
pCommand = quoted_filename;
@@ -704,7 +704,7 @@
iEnvBlockLen += strlen(termination_env_string) + 1;
iEnvBlockLen += strlen(fs->mutex_env_string) + 1;

- pEnvBlock = (char *) ap_pcalloc(tp, iEnvBlockLen);
+ pEnvBlock = (char *) apr_pcalloc(tp, iEnvBlockLen);

i = 0;
pNext = pEnvBlock;
@@ -744,7 +744,7 @@
CloseHandle(listen_handle);
}

- ap_destroy_pool(tp);
+ apr_pool_destroy(tp);

return pid;

@@ -1071,10 +1071,10 @@
s->flush = dynamicFlush;

#ifdef WIN32
- s->mutex_env_string = ap_psprintf(sp, "_FCGI_MUTEX_=%ld", mutex);
- s->fs_path = ap_pstrdup(sp, cjob->fs_path);
+ s->mutex_env_string = apr_psprintf(sp, "_FCGI_MUTEX_=%ld", mutex);
+ s->fs_path = apr_pstrdup(sp, cjob->fs_path);
#else
- s->fs_path = ap_pstrdup(sp, execName);
+ s->fs_path = apr_pstrdup(sp, execName);
#endif
ap_getparents(s->fs_path);
ap_no2slash(s->fs_path);
@@ -1094,7 +1094,7 @@
s->socket_path = fcgi_util_socket_make_path_absolute(sp, s->socket_path, 1);

/* Create sockaddr, prealloc it so it won't get created in tp */
- s->socket_addr = ap_pcalloc(sp, sizeof(struct sockaddr_un));
+ s->socket_addr = apr_pcalloc(sp, sizeof(struct sockaddr_un));
err = fcgi_util_socket_make_domain_addr(tp, (struct sockaddr_un **)&s->socket_addr,
&s->socket_addr_len, s->socket_path);
if (err) {
@@ -1120,11 +1120,11 @@
goto BagNewServer;
}
s->uid = pw->pw_uid;
- s->user = ap_pstrdup(sp, user);
+ s->user = apr_pstrdup(sp, user);
s->username = s->user;

s->gid = pw->pw_gid;
- s->group = ap_psprintf(sp, "%ld", (long)s->gid);
+ s->group = apr_psprintf(sp, "%ld", (long)s->gid);
}
else {
struct passwd *pw;
@@ -1137,11 +1137,11 @@
execName, (long)s->uid);
goto BagNewServer;
}
- s->user = ap_pstrdup(sp, user);
- s->username = ap_pstrdup(sp, pw->pw_name);
+ s->user = apr_pstrdup(sp, user);
+ s->username = apr_pstrdup(sp, pw->pw_name);

s->gid = (gid_t)atol(group);
- s->group = ap_pstrdup(sp, group);
+ s->group = apr_pstrdup(sp, group);
}
}
#else
@@ -1340,7 +1340,7 @@
continue;

BagNewServer:
- if (sp) ap_destroy_pool(sp);
+ if (sp) apr_pool_destroy(sp);

#ifdef WIN32
free(cjob->fs_path);
@@ -1362,7 +1362,7 @@
}
#endif

- ap_destroy_pool(tp);
+ apr_pool_destroy(tp);
}

/*
diff -ruN mod_fastcgi-2.4.2/fcgi_protocol.c mod_fastcgi-2.4.2.for22/fcgi_protocol.c
--- mod_fastcgi-2.4.2/fcgi_protocol.c Mon Feb 3 23:59:01 2003
+++ mod_fastcgi-2.4.2.for22/fcgi_protocol.c Mon Dec 5 12:59:01 2005
@@ -110,21 +110,21 @@
char *first, *last;

if (r->the_request == NULL)
- return (char *) ap_pcalloc(r->pool, 1);
+ return (char *) apr_pcalloc(r->pool, 1);

first = r->the_request; /* use the request-line */

- while (*first && !ap_isspace(*first))
+ while (*first && !apr_isspace(*first))
++first; /* skip over the method */

- while (ap_isspace(*first))
+ while (apr_isspace(*first))
++first; /* and the space(s) */

last = first;
- while (*last && !ap_isspace(*last))
+ while (*last && !apr_isspace(*last))
++last; /* end at next whitespace */

- return ap_pstrndup(r->pool, first, last - first);
+ return apr_pstrndup(r->pool, first, last - first);
}

/* Based on Apache's ap_add_cgi_vars() in util_script.c.
@@ -135,18 +135,18 @@
{
table *e = r->subprocess_env;

- ap_table_setn(e, "GATEWAY_INTERFACE", "CGI/1.1");
- ap_table_setn(e, "SERVER_PROTOCOL", r->protocol);
- ap_table_setn(e, "REQUEST_METHOD", r->method);
- ap_table_setn(e, "QUERY_STRING", r->args ? r->args : "");
- ap_table_setn(e, "REQUEST_URI", apache_original_uri(r));
+ apr_table_setn(e, "GATEWAY_INTERFACE", "CGI/1.1");
+ apr_table_setn(e, "SERVER_PROTOCOL", r->protocol);
+ apr_table_setn(e, "REQUEST_METHOD", r->method);
+ apr_table_setn(e, "QUERY_STRING", r->args ? r->args : "");
+ apr_table_setn(e, "REQUEST_URI", apache_original_uri(r));

/* The FastCGI spec precludes sending of CONTENT_LENGTH, PATH_INFO,
* PATH_TRANSLATED, and SCRIPT_NAME (for some reason?). PATH_TRANSLATED we
* don't have, its the variable that causes Apache to break trying to set
* up (and thus the reason this fn exists vs. using ap_add_cgi_vars()). */
if (compat) {
- ap_table_unset(e, "CONTENT_LENGTH");
+ apr_table_unset(e, "CONTENT_LENGTH");
return;
}

@@ -155,17 +155,17 @@
* args and path_info of the original request, and not any that may have
* come with the script URI in the include command. Ugh. */
if (!strcmp(r->protocol, "INCLUDED")) {
- ap_table_setn(e, "SCRIPT_NAME", r->uri);
+ apr_table_setn(e, "SCRIPT_NAME", r->uri);
if (r->path_info && *r->path_info)
- ap_table_setn(e, "PATH_INFO", r->path_info);
+ apr_table_setn(e, "PATH_INFO", r->path_info);
}
else if (!r->path_info || !*r->path_info)
- ap_table_setn(e, "SCRIPT_NAME", r->uri);
+ apr_table_setn(e, "SCRIPT_NAME", r->uri);
else {
int path_info_start = ap_find_path_info(r->uri, r->path_info);

- ap_table_setn(e, "SCRIPT_NAME", ap_pstrndup(r->pool, r->uri, path_info_start));
- ap_table_setn(e, "PATH_INFO", r->path_info);
+ apr_table_setn(e, "SCRIPT_NAME", apr_pstrndup(r->pool, r->uri, path_info_start));
+ apr_table_setn(e, "PATH_INFO", r->path_info);
}
}

@@ -178,9 +178,9 @@
int i = ph->nelts;

for ( ; i; --i, ++elt) {
- const char *val = ap_table_get(fr->r->headers_in, *elt);
+ const char *val = apr_table_get(fr->r->headers_in, *elt);
if (val) {
- ap_table_setn(fr->r->subprocess_env, *elt, val);
+ apr_table_setn(fr->r->subprocess_env, *elt, val);
}
}
}
@@ -373,7 +373,7 @@

if (fr->fs_stderr == NULL)
{
- fr->fs_stderr = ap_palloc(p, FCGI_SERVER_MAX_STDERR_LINE_LEN + 1);
+ fr->fs_stderr = apr_palloc(p, FCGI_SERVER_MAX_STDERR_LINE_LEN + 1);
}

/* We're gonna consume all thats here */
diff -ruN mod_fastcgi-2.4.2/fcgi_util.c mod_fastcgi-2.4.2.for22/fcgi_util.c
--- mod_fastcgi-2.4.2/fcgi_util.c Thu Oct 30 02:08:34 2003
+++ mod_fastcgi-2.4.2.for22/fcgi_util.c Mon Dec 5 12:59:01 2005
@@ -55,7 +55,7 @@
fcgi_util_socket_hash_filename(pool *p, const char *path,
const char *user, const char *group)
{
- char *buf = ap_pstrcat(p, path, user, group, NULL);
+ char *buf = apr_pstrcat(p, path, user, group, NULL);

/* Canonicalize the path (remove "//", ".", "..") */
ap_getparents(buf);
@@ -77,13 +77,13 @@
x = strlen(src1);

if (x == 0) {
- p = ap_pstrcat(a, "\\", src2, NULL);
+ p = apr_pstrcat(a, "\\", src2, NULL);
}
else if (src1[x - 1] != '\\' && src1[x - 1] != '/') {
- p = ap_pstrcat(a, src1, "\\", src2, NULL);
+ p = apr_pstrcat(a, src1, "\\", src2, NULL);
}
else {
- p = ap_pstrcat(a, src1, src2, NULL);
+ p = apr_pstrcat(a, src1, src2, NULL);
}

q = p ;
@@ -137,12 +137,12 @@
int socket_pathLen = strlen(socket_path);

if (socket_pathLen >= sizeof((*socket_addr)->sun_path)) {
- return ap_pstrcat(p, "path \"", socket_path,
+ return apr_pstrcat(p, "path \"", socket_path,
"\" is too long for a Domain socket", NULL);
}

if (*socket_addr == NULL)
- *socket_addr = ap_pcalloc(p, sizeof(struct sockaddr_un));
+ *socket_addr = apr_pcalloc(p, sizeof(struct sockaddr_un));
else
memset(*socket_addr, 0, sizeof(struct sockaddr_un));

@@ -194,7 +194,7 @@
int *socket_addr_len, const char *host, unsigned short port)
{
if (*socket_addr == NULL)
- *socket_addr = ap_pcalloc(p, sizeof(struct sockaddr_in));
+ *socket_addr = apr_pcalloc(p, sizeof(struct sockaddr_in));
else
memset(*socket_addr, 0, sizeof(struct sockaddr_in));

@@ -204,7 +204,7 @@
/* Get an in_addr represention of the host */
if (host != NULL) {
if (convert_string_to_in_addr(host, &(*socket_addr)->sin_addr) != 1) {
- return ap_pstrcat(p, "failed to resolve \"", host,
+ return apr_pstrcat(p, "failed to resolve \"", host,
"\" to exactly one IP address", NULL);
}
} else {
@@ -227,7 +227,7 @@

if (statBuf == NULL) {
if (stat(path, &myStatBuf) <0>next) {
@@ -343,7 +343,7 @@
char path[FCGI_MAXPATH];
fcgi_server *s;

- ap_cpystrn(path, ePath, FCGI_MAXPATH);
+ apr_cpystrn(path, ePath, FCGI_MAXPATH);
ap_no2slash(path);

for (s = fcgi_servers; s != NULL; s = s->next) {
@@ -367,21 +367,21 @@
const char *err;

if (finfo == NULL) {
- finfo = (struct stat *)ap_palloc(p, sizeof(struct stat));
+ finfo = (struct stat *)apr_palloc(p, sizeof(struct stat));
if (stat(fs_path, finfo) <0>saved_subprocess_env = ap_copy_table(r->pool, r->subprocess_env);
+ fr->saved_subprocess_env = apr_table_copy(r->pool, r->subprocess_env);

- ap_table_setn(r->subprocess_env, "REMOTE_PASSWD", password);
- ap_table_setn(r->subprocess_env, "FCGI_APACHE_ROLE", "AUTHENTICATOR");
+ apr_table_setn(r->subprocess_env, "REMOTE_PASSWD", password);
+ apr_table_setn(r->subprocess_env, "FCGI_APACHE_ROLE", "AUTHENTICATOR");

/* The FastCGI Protocol doesn't differentiate authentication */
fr->role = FCGI_AUTHORIZER;
@@ -2697,7 +2705,7 @@
post_process_auth(fr, authenticated);

/* A redirect shouldn't be allowed during the authentication phase */
- if (ap_table_get(r->headers_out, "Location") != NULL) {
+ if (apr_table_get(r->headers_out, "Location") != NULL) {
ap_log_rerror(FCGI_LOG_ERR_NOERRNO, r,
"FastCGI: FastCgiAuthenticator \"%s\" redirected (not allowed)",
dir_config->authenticator);
@@ -2746,9 +2754,9 @@
}

/* Save the existing subprocess_env, because we're gonna muddy it up */
- fr->saved_subprocess_env = ap_copy_table(r->pool, r->subprocess_env);
+ fr->saved_subprocess_env = apr_table_copy(r->pool, r->subprocess_env);

- ap_table_setn(r->subprocess_env, "FCGI_APACHE_ROLE", "AUTHORIZER");
+ apr_table_setn(r->subprocess_env, "FCGI_APACHE_ROLE", "AUTHORIZER");

fr->role = FCGI_AUTHORIZER;

@@ -2762,7 +2770,7 @@
post_process_auth(fr, authorized);

/* A redirect shouldn't be allowed during the authorization phase */
- if (ap_table_get(r->headers_out, "Location") != NULL) {
+ if (apr_table_get(r->headers_out, "Location") != NULL) {
ap_log_rerror(FCGI_LOG_ERR_NOERRNO, r,
"FastCGI: FastCgiAuthorizer \"%s\" redirected (not allowed)",
dir_config->authorizer);
@@ -2806,9 +2814,9 @@
}

/* Save the existing subprocess_env, because we're gonna muddy it up */
- fr->saved_subprocess_env = ap_copy_table(r->pool, r->subprocess_env);
+ fr->saved_subprocess_env = apr_table_copy(r->pool, r->subprocess_env);

- ap_table_setn(r->subprocess_env, "FCGI_APACHE_ROLE", "ACCESS_CHECKER");
+ apr_table_setn(r->subprocess_env, "FCGI_APACHE_ROLE", "ACCESS_CHECKER");

/* The FastCGI Protocol doesn't differentiate access control */
fr->role = FCGI_AUTHORIZER;
@@ -2823,7 +2831,7 @@
post_process_auth(fr, access_allowed);

/* A redirect shouldn't be allowed during the access check phase */
- if (ap_table_get(r->headers_out, "Location") != NULL) {
+ if (apr_table_get(r->headers_out, "Location") != NULL) {
ap_log_rerror(FCGI_LOG_ERR_NOERRNO, r,
"FastCGI: FastCgiAccessChecker \"%s\" redirected (not allowed)",
dir_config->access_checker);


Then:


patch -p1 < patch-file
cp Makefile.AP2 Makefile
Edit Makefile and change: top_dir to be /usr/lib/httpd
make
make install



This will get mod_fastcgi installed and added to /etc/httpd/conf/httpd.conf

The last step:
Edit /etc/httpd/conf/httpd.conf and right after the LoadModule fastcgi_module modules/mod_fastcgi.so add:

<IfModule>
FastCgiIpcDir /tmp/fcgi_ipc/
AddHandler fastcgi-script .fcgi
FastCgiSuexec /usr/sbin/suexec
FastCgiConfig -singleThreshold 100 -killInterval 300 -autoUpdate -idle-timeout 240 -pass-header HTTP_AUTHORIZATION
</IfModule>
<Location>
Options ExecCGI
SetHandler fastcgi-script
</Location>

mkdir -p /tmp/fcgi_ipc/dynamic
chmod -R 777 /tmp/fcgi_ipc/


For the Virtual Hosts do the following:


mkdir /path/to/vhost/docroot/php-fastcgi
add to /path/to/vhost/docroot/php-fastcgi/php-fcgi:
#!/bin/sh
PHPRC="/usr/local/php-fcgi/etc"
export PHPRC
PHP_FCGI_CHILDREN=8
export PHP_FCGI_CHILDREN
PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_MAX_REQUESTS
exec /usr/local/php-fcgi/bin/php

add to the Virtual Host config:
ScriptAlias /php-fastcgi/ /path/to/vhost/docroot/php-fastcgi/
AddType application/x-httpd-fastphp .php
Action application/x-httpd-fastphp /php-fastcgi/php-fcgi

change SuExecUserGroup to the User/Group you want the vhost to run

chmod 755 /path/to/vhost/docroot/php-fastcgi/php-fcgi
chown -R suexecUser:suexecGroup /path/to/vhost/docroot/php-fastcgi/


Restart Apache and you're done.

ServerSurgeon John
01-03-2007, 03:02 PM
Correction:

wget http://www.fastcgi.com/dist/mod_fastcgi-SNAP-0404142202.tar.gz
tar xfvz mod_fastcgi-SNAP-0404142202.tar.gz
cd fcgi-2.4.1-SNAP-0311112127

should be:

wget http://www.fastcgi.com/dist/mod_fastcgi-SNAP-0404142202.tar.gz
tar xfvz mod_fastcgi-SNAP-0404142202.tar.gz
cd mod_fastcgi-SNAP-0404142202

voipfc
01-21-2007, 05:55 PM
In looking at your patch and it appears to be the same one reported in this article concerning a patch required for fastcgi to work with Apache 2.2.2. http://www.fastcgi.com/archives/fastcgi-developers/2005-December/004060.html.

I am not familiar with patch and it appears quite different to me.

Do you make other changes besides those in that email?