为什么nginx + php程序不能写入文件?或者为什么在重新加载nginx / php7.0-fpm后没有反映源文件更改?

时间:2018-04-19 20:00:14

标签: php nginx

警告:我对PHP一无所知(我使用Python3和C#),而且我只使用过Apache。

TL; DR

我无法弄清楚为什么这个PHP代码拒绝写入血腥文件以及为什么重新加载nginx / php7.0-fpm不会反映对文件所做的更改。

背景

我一直都是天才"一个内部程序,用PHP7编写,运行在Nginx,Ubuntu 16.04.4(仅限终端)。该程序没有Web UI,只存在处理HTTP GET和PUT请求。所述程序没有按预期运行,我试图调试原因。但是,似乎我对PHP代码所做的任何更改都不会反映在行为中。

基本上我想设置某种日志记录 - 写入nginx日志,写入文件,发送电子邮件,任何东西 - 以便我可以找出失败的地方。然后,我可以向知道的人报告事情,而不是仅仅说“#34;程序没有工作。你解决了。"

详细

  • 服务器从/var/www/servername中的git checkout运行。
  • 要求是:nginx,nginx-extras(对于ngx_http_dav_module),php7.0,php7.0-sqlite3
  • 我的php上游是:upstream php { server unix:/run/php/php70-fpm.sock; }

nginx config:

server {
        server_name 192.168.11.80;
        root /var/www/servername/public/;

        rewrite ^/$ /index.php;
        rewrite ^/\$metadata$ /metadata.xml;
        rewrite ^/Search\(\)/\$count$ /count.php;
        rewrite ^/Search\(\)$ /search.php;
        rewrite ^/Packages\(\)$ /search.php;
        rewrite ^/Packages\(Id='([^']+)',Version='([^']+)'\)$ /findByID.php?id=$1&version=$2;
        rewrite ^/GetUpdates\(\)$ /updates.php;
        rewrite ^/FindPackagesById\(\)$ /findByID.php;

        rewrite ^//?download/([^/]+)/([^/]+)$ /download.php?id=$1&version=$2;
        rewrite ^/([^/]+)/([^/]+)$ /delete.php?id=$1&version=$2;


        rewrite ^/api/v2/package/$ /index.php;
        rewrite ^/api/v2/package/([^/]+)/([^/]+)$ /delete.php?id=$1&version=$2;

        location ~ \.php$ {
                include fastcgi_params;
                fastcgi_pass php;
        }

        location = /index.php {
                dav_methods PUT DELETE;
                include fastcgi_params;
                fastcgi_pass php;

                # PHP doesn't parse request body for PUT requests, so fake a POST.
                fastcgi_param REQUEST_METHOD POST;
                fastcgi_param HTTP_X_METHOD_OVERRIDE $request_method;
        }

        # Used with X-Accel-Redirect
        location /packagefiles {
                internal;
                root /var/www/servername/;
        }
}

我尝试了什么

我已尝试过以下所有项目,但似乎没有任何效果。

  • Writing directly to a file using file_put_contents。出于某种原因,这不起作用。
    • file_put_contents('php://stderr', 'TESTING');不会向nginx日志文件/var/log/nginx/[access|error].log
    • 附加任何内容
    • file_put_contents('/var/log/sns/debug.log, 'TESTING');也不会写入debug.log文件
      • /var/log/sns文件夹具有777权限。
      • 该文件具有0666权限。
  • 强制程序通过die()中止。
  • Editing the php-fpm pool config to catch workers output。似乎仍然没有做任何事情。
  • 有人建议我可能无法正确重启PHP-FPM。我使用此命令sudo service php7.0-fpm restart & sudo service nginx restart基于this answer
  • 检查其他预期的日志位置。
    • /var/log/php7.0-fpm.log只有启动/关闭通知(" fpm正在运行","读取处理连接","终止"等。 )
    • /var/log/nginx/access.log正确显示了所有GET和PUT请求,但没有其他内容
    • /var/log/nginx/error.log仅显示"使用共享内存的xKiB" (启动信息)。
  • 删除index.php,然后重新启动nginx& php7.0-fpm - 程序仍然有效!
  • 更改PHP代码(error_log('msg', 3 '/var/log/sns/debug.log')file_put_contents(...)die(),然后完全重新启动服务器。仍然没有写入文件。

那么我错过了什么极其基本的东西?

1 个答案:

答案 0 :(得分:0)

以调试模式启动nginx。

servie nginx调试启动。