Want to subscribe to topics you're interested in?
Become a Member

Wordpress PHP error_log entries being sent to the wrong log file

Discussion in 'Blogs & CMS usage' started by ct_roy, Jun 23, 2024.

  1. ct_roy

    ct_roy Premium Member Premium Member

    55
    9
    8
    Jun 21, 2020
    Ratings:
    +17
    Local Time:
    11:39 PM
    1.17.10
    10.3.22
    I'm attempting to divert php error logs to a custom error log file in
    /home/nginx/domins/mydomain.com/logs/php_error.log


    to do this I've made the following changes:
    1.) add a .user.ini to
    /home/nginx/domins/mydomain.com/public
    which contains:
    Code:
    error_log = /home/nginx/domains/mydomain.com/log/php_error.log
    2.) in /usr/local/etc/php-fpm.conf - I commented out
    Code:
    ;php_admin_value[error_log] = /var/log/php-fpm/www-php.error.log
    running phpinfo(); I can see that the custom php_error.log is being picked up correctly, but errors are now being sent to the nginx error.log in /home/nginx/domains/mydomain.com/log/error.log

    Code:
    PHP message: line xxxxxxxxxxxxxxxxxxxx" while reading response header from upstream
    I thought there might be permissions errors with the file, but I ensured they matched the main www-php.error.log permissions.

    For the heck of it I tried switching the error_log value in .user.ini to point to /var/log/php-fpm/www-php.error.log and it STILL sends the PHP errors back to the nginx error log.

    I also tried setting this in /usr/local/etc/php-fpm.conf so there was at least a default value in place:
    php_value[error_log] = /var/log/php-fpm/www-php.error.log

    I must be missing something very basic here!
     
  2. eva2000

    eva2000 Administrator Staff Member

    54,519
    12,211
    113
    May 24, 2014
    Brisbane, Australia
    Ratings:
    +18,780
    Local Time:
    9:39 AM
    Nginx 1.27.x
    MariaDB 10.x/11.4+
    That's interesting one. Trying to replicate this on my end but seems it's working for me as long as .user.ini is present in your nginx vhost web root. For nginx vhosts without .user.ini in their respective web root, it seems nginx now logs to nginx error log /home/nginx/domains/domain.com/log/error.log if you make the .user.ini changes

    Code (Text):
    # create /home/nginx/domains/domain.com/public/.user.ini
    touch /home/nginx/domains/domain.com/public/.user.ini
    chown nginx /home/nginx/domains/domain.com/public/.user.ini
    echo 'error_log = /home/nginx/domains/domain.com/log/php_error.log' >> /home/nginx/domains/domain.com/public/.user.ini
    
    # disable php_admin_value[error_log] in /usr/local/etc/php-fpm.conf
    sed -i 's|^php_admin_value\[error_log\]|;php_admin_value\[error_log\]|' /usr/local/etc/php-fpm.conf
    
    # create initial log /home/nginx/domains/domain.com/log/php_error.log
    touch /home/nginx/domains/domain.com/log/php_error.log
    chown nginx /home/nginx/domains/domain.com/log/php_error.log
    
    # optional change global error_log in /usr/local/etc/php-fpm.conf
    # so nginx vhosts that do not have .user.ini fallback to
    # /var/log/php-fpm/www-php.error.log where folks expect documented php
    # errors to be
    sed -i 's|^error_log = /var/log/php-fpm/www-error.log|error_log = /var/log/php-fpm/www-php.error.log|' /usr/local/etc/php-fpm.conf
    
    # restart nginx and php-fpm services
    nprestart
    

    Create a temporary /home/nginx/domains/domain.com/public/phpinfo.php file at with
    Code (Text):
    <?php
    phpinfo();
    


    verify user.ini is working and see error_log is set to /home/nginx/domains/domain.com/log/php_error.log
    Code (Text):
    curl -sk https://domain.com/phpinfo.php | egrep 'user.ini|error_log'

    Code (Text):
    curl -sk https://domain.com/phpinfo.php | egrep 'user.ini|error_log'
    <tr><td class="e">error_log</td><td class="v">/home/nginx/domains/domain.com/log/php_error.log</td><td class="v"><i>no value</i></td></tr>
    <tr><td class="e">user_ini.cache_ttl</td><td class="v">300</td><td class="v">300</td></tr>
    <tr><td class="e">user_ini.filename</td><td class="v">.user.ini</td><td class="v">.user.ini</td></tr>
    <tr><td class="e">opcache.error_log</td><td class="v"><i>no value</i></td><td class="v"><i>no value</i></td></tr>
    


    verify custom user.ini set PHP error log is logging entries by editing /home/nginx/domains/domain.com/public/phpinfo.php and typing a word after

    Code (Text):
    <?php
    phpinfo();
    y
    

    restart nginx and php-fpm
    Code (Text):
    nprestart


    now call the phpinfo.php to trigger an error
    Code (Text):
    curl -sk https://domain.com/phpinfo.php | egrep 'user.ini|error_log'


    inspect custom user.ini error log which you can see is complaining about line 4 of phpinfo.php where i introduced an error so .user.ini was setup correctly
    Code (Text):
    cat /home/nginx/domains/domain.com/log/php_error.log
    [22-Jun-2024 21:04:58 UTC] PHP Parse error:  syntax error, unexpected end of file in /home/nginx/domains/domain.com/public/phpinfo.php on line 4
    


    but simulating other nginx vhosts that do not have a custom .user.ini but above changes made by removing .user.ini
    Code (Text):
    mv .user.ini disable.user.ini
    nprestart
    


    call the phpinfo.php to trigger an error again
    Code (Text):
    curl -sk https://domain.com/phpinfo.php | egrep 'user.ini|error_log'


    now, /home/nginx/domains/domain.com/log/php_error.log doesn't log the error and neither does /var/log/php-fpm/www-php.error.log for global error_log. Instead nginx error log at /home/nginx/domains/domain.com/log/error.log logs it despite default /usr/local/nginx/conf/php.conf setting this setting to off
    Code (Text):
    fastcgi_intercept_errors off;
    

    Module ngx_http_fastcgi_module

    The triggered phpinfo.php error was a HTTP 500 status code
    Code (Text):
    cat /home/nginx/domains/domain.com/log/access.log | tail -1
    192.168.122.53 - - [22/Jun/2024:21:08:50 +0000] "GET /phpinfo.php HTTP/2.0" 500 0 "-" "curl/8.9.0-DEV"
    


    inspecting nginx vhost error log /home/nginx/domains/domain.com/log/error.log shows the error entry if .user.ini doesn't exist and above changes are made to /usr/local/etc/php-fpm.conf
    Code (Text):
    cat /home/nginx/domains/domain.com/log/error.log
    2024/06/22 21:08:50 [error] 1412559#1412559: *1 FastCGI sent in stderr: "PHP message: PHP Parse error:  syntax error, unexpected end of file in /home/nginx/domains/domain.com/public/phpinfo.php on line 4" while reading response header from upstream, client: 192.168.122.53, server: domain.com, request: "GET /phpinfo.php HTTP/2.0", upstream: "fastcgi://127.0.0.1:9000", host: "domain.com"
    


    So seems if above changes are made to /usr/local/etc/php-fpm.conf, then every Nginx vhost needs to have their own .user.ini in /home/nginx/domains/theirdomain.com/public/.user.ini with defined error_log for it to work for some reason.
     
  3. eva2000

    eva2000 Administrator Staff Member

    54,519
    12,211
    113
    May 24, 2014
    Brisbane, Australia
    Ratings:
    +18,780
    Local Time:
    9:39 AM
    Nginx 1.27.x
    MariaDB 10.x/11.4+
    If that is the case, I whipped up a create_user_ini.sh shell script that you can test first (I'll add it to Centmin Mod 130.00beta01 if it works well). To test download it
    Code (Text):
    wget https://gist.github.com/centminmod/80fbeca061cc2070f0b9e7e746fc106e/raw/create_user_ini.sh -O create_user_ini.sh
    chmod +x create_user_ini.sh
    

    has 5 argument options to setup .user.ini in each nginx vhost's web root public/.user.ini and to remove it, to disable it and re-enable it and list them
    Code (Text):
    ./create_user_ini.sh
    Usage: ./create_user_ini.sh {setup|remove|disable|enable|list}
    

    Setup
    Code (Text):
    ./create_user_ini.sh setup
    Created /home/nginx/domains/demodomain.com/public/.user.ini with error_log directive set to /home/nginx/domains/demodomain.com/log/php_error.log
    Created /home/nginx/domains/demodomain.com/log/php_error.log and set ownership to nginx
    Created /home/nginx/domains/domain.com/public/.user.ini with error_log directive set to /home/nginx/domains/domain.com/log/php_error.log
    Created /home/nginx/domains/domain.com/log/php_error.log and set ownership to nginx
    Disable php_admin_value[error_log] in /usr/local/etc/php-fpm.conf
    Change to error_log = /var/log/php-fpm/www-php.error.log in /usr/local/etc/php-fpm.conf
    Redirecting to /bin/systemctl restart nginx.service
    Restarting php-fpm (via systemctl) [  OK  ]
    Setup completed.
    


    Remove
    Code (Text):
    ./create_user_ini.sh remove
    Removed /home/nginx/domains/demodomain.com/public/.user.ini
    Removed /home/nginx/domains/demodomain.com/log/php_error.log
    Removed /home/nginx/domains/domain.com/public/.user.ini
    Removed /home/nginx/domains/domain.com/log/php_error.log
    Enable php_admin_value[error_log] in /usr/local/etc/php-fpm.conf
    Change to error_log = /var/log/php-fpm/www-error.log in /usr/local/etc/php-fpm.conf
    Redirecting to /bin/systemctl restart nginx.service
    Restarting php-fpm (via systemctl) [  OK  ]
    Removal completed.
    

    Disable
    Code (Text):
    ./create_user_ini.sh disable
    Renamed /home/nginx/domains/demodomain.com/public/.user.ini to /home/nginx/domains/demodomain.com/public/.disable.user.ini
    Renamed /home/nginx/domains/domain.com/public/.user.ini to /home/nginx/domains/domain.com/public/.disable.user.ini
    Enable php_admin_value[error_log] in /usr/local/etc/php-fpm.conf
    Change to error_log = /var/log/php-fpm/www-error.log in /usr/local/etc/php-fpm.conf
    Redirecting to /bin/systemctl restart nginx.service
    Restarting php-fpm (via systemctl) [  OK  ]
    Disabling completed.
    

    Enable
    Code (Text):
    ./create_user_ini.sh enable
    Renamed /home/nginx/domains/demodomain.com/public/.disable.user.ini to /home/nginx/domains/demodomain.com/public/.user.ini
    Renamed /home/nginx/domains/domain.com/public/.disable.user.ini to /home/nginx/domains/domain.com/public/.user.ini
    Disable php_admin_value[error_log] in /usr/local/etc/php-fpm.conf
    Change to error_log = /var/log/php-fpm/www-php.error.log in /usr/local/etc/php-fpm.conf
    Redirecting to /bin/systemctl restart nginx.service
    Restarting php-fpm (via systemctl) [  OK  ]
    Enabling completed.
    

    List
    Code (Text):
    ./create_user_ini.sh list
    Found /home/nginx/domains/demodomain.com/public/.user.ini
    -rw-r--r-- 1 nginx nginx 65 Jun 22 21:50 /home/nginx/domains/demodomain.com/public/.user.ini
    Contents of /home/nginx/domains/demodomain.com/public/.user.ini:
    error_log = /home/nginx/domains/demodomain.com/log/php_error.log
    Checking path to custom PHP error log:
    Log file exists at /home/nginx/domains/demodomain.com/log/php_error.log
    -rw-r--r-- 1 nginx nginx 0 Jun 22 21:50 /home/nginx/domains/demodomain.com/log/php_error.log
    ----------------------------------------------------------------------
    Found /home/nginx/domains/domain.com/public/.user.ini
    -rw-r--r-- 1 nginx nginx 61 Jun 22 21:50 /home/nginx/domains/domain.com/public/.user.ini
    Contents of /home/nginx/domains/domain.com/public/.user.ini:
    error_log = /home/nginx/domains/domain.com/log/php_error.log
    Checking path to custom PHP error log:
    Log file exists at /home/nginx/domains/domain.com/log/php_error.log
    -rw-r--r-- 1 nginx nginx 0 Jun 22 21:50 /home/nginx/domains/domain.com/log/php_error.log
    ----------------------------------------------------------------------
    Listing completed.
    
     
  4. ct_roy

    ct_roy Premium Member Premium Member

    55
    9
    8
    Jun 21, 2020
    Ratings:
    +17
    Local Time:
    11:39 PM
    1.17.10
    10.3.22
    @eva2000 once again going above and beyond the call of duty! thanks a million for this. I'll take it for a spin early next week.