2

I need to define an environment variable named SQLANY17 and this variable should be available in PHP (i.e. under "Environment" in the standard phpinfo() page). PHP is executed via FastCGI and I'm running CentOS 7 x64, Apache 2.4.6 and PHP 5.5.30.

I've edited /etc/httpd/conf.d/fcgid.conf which already exists in my distribution. According to the documentation an environment can be defined using FcgidInitialEnv.

<IfModule mod_fcgid.c>
  # ...
  FcgidInitialEnv SQLANY17 /opt/sqlanywhere17
</IfModule>

However this doesn't work, even after a full machine reboot. Any ideas? I'm sure the fcgid.conf is correcly parsed because typing some random chars prevent the Apache server restart.

enter image description here

In my setup Nginx proxies requests to Apache This is nginx.conf for host example.com:

server {
    listen 192.168.1.131:80;

    server_name example.com;
    server_name www.example.com;
    server_name ipv4.example.com;

    client_max_body_size 128m;

    root "/var/www/vhosts/example.com/httpdocs";
    access_log "/var/www/vhosts/system/example.com/logs/proxy_access_log";
    error_log "/var/www/vhosts/system/example.com/logs/proxy_error_log";

    if ($host ~* ^www.example.com$) {
        rewrite ^(.*)$ http://example.com$1 permanent;
    }

    location / {
        proxy_pass http://192.168.1.131:7080;
        proxy_set_header Host             $host;
        proxy_set_header X-Real-IP        $remote_addr;
        proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header X-Accel-Internal /internal-nginx-static-location;
        access_log off;
    }
}

And this is httpd.conf for the same host:

<VirtualHost 192.168.1.131:7080 >
    ServerName "example.com:80"
    ServerAlias "www.example.com"
    ServerAlias "ipv4.example.com"
    ServerAdmin "[email protected]"
    UseCanonicalName Off

    DocumentRoot "/var/www/vhosts/example.com/httpdocs"
    CustomLog /var/www/vhosts/system/example.com/logs/access_log
    ErrorLog "/var/www/vhosts/system/example.com/logs/error_log"

    <IfModule mod_suexec.c>
        SuexecUserGroup "example" "psacln"
    </IfModule>

    <IfModule mod_fcgid.c>
        FcgidInitialEnv PP_CUSTOM_PHP_INI /var/www/vhosts/system/example.com/etc/php.ini
        FcgidInitialEnv PP_CUSTOM_PHP_CGI_INDEX plesk-php55-fastcgi
        FcgidMaxRequestLen 134217728
    </IfModule>

    <Directory /var/www/vhosts/example.com/httpdocs>
        <IfModule mod_fcgid.c>
            <Files ~ (\.php$)>
                SetHandler fcgid-script
                FCGIWrapper /var/www/cgi-bin/cgi_wrapper/cgi_wrapper .php
                Options +ExecCGI
            </Files>
        </IfModule>

        Options -Includes -ExecCGI
    </Directory>

    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{HTTP_HOST} ^www.example.com$ [NC]
        RewriteRule ^(.*)$ http://example.com$1 [L,R=301]
    </IfModule>
</VirtualHost>

1 Answer 1

1

First, you need to make sure the module is loaded. Are you sure it is?

PHP applications are usually configured using the FcgidWrapper directive and a corresponding wrapper script. The wrapper script can be an appropriate place to define any environment variables required by the application, such as PHP_FCGI_MAX_REQUESTS or anything else. (Environment variables can also be set with FcgidInitialEnv, but they then apply to all applications.)

Here is an example that uses a wrapper script to invoke PHP:

PHP application - /usr/local/phpapp/phpinfo.php

<?php
phpinfo();
?>

Configuration directives

# FcgidMaxRequestsPerProcess should be <= PHP_FCGI_MAX_REQUESTS
# The example PHP wrapper script overrides the default PHP setting.
FcgidMaxRequestsPerProcess 10000

# Uncomment the following line if cgi.fix_pathinfo is set to 1 in
# php.ini:
# FcgidFixPathinfo 1

Alias /phpapp/ /usr/local/phpapp/
<Location /phpapp/>
AddHandler fcgid-script .php
Options +ExecCGI
FcgidWrapper /usr/local/bin/php-wrapper .php

# Customize the next two directives for your requirements.
Order allow,deny
Allow from all
</Location>

PHP wrapper script - /usr/local/bin/php-wrapper

#!/bin/sh
# Set desired PHP_FCGI_* environment variables.
# Example:
# PHP FastCGI processes exit after 500 requests by default.
PHP_FCGI_MAX_REQUESTS=10000
export PHP_FCGI_MAX_REQUESTS

# Replace with the path to your FastCGI-enabled PHP executable
exec /usr/local/bin/php-cgi

Referenced: http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html

Sign up to request clarification or add additional context in comments.

3 Comments

Hi there, thanks for helping. I want to define that environment variable for all applications: server is a virtual host managed using Plesk and without that enviroment variable PHP would fail loading an extension (that is SQL Anywhere) and, in turn, crash other Plesk processes. In my system the php-wrapper is already set by Plesk and it's a binary, not a shell script (/var/www/cgi-bin/cgi_wrapper/cgi_wrapper). I can't use your solution. Any idea why mine isn't working?
Are you sure the module is loaded? Based on what you've posted, it looks like it is not actually loaded. You need to post your entire httpd configuration, otherwise, but make sure you are actually loading the fastcgi module somewhere
FastCGI is working. I've updated my question with the full configuration and as you can see Nnginx act as a proxy in front of Apache which in turn uses FastCGI.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.