在使用 Nginx 和 PHP 组合构建网站的时候,我们很可能会遇到 500 错误,这个错误信息有时候并不能清楚的帮助你解决问题。那么,我们应该如何来定位错误呢?
首先,我们应该检查 Nginx 的错误日志,一般情况下是 /var/log/nginx/error.log。查看这个文件,你可以看到类似下面的信息:
```
2022/07/05 10:24:17 [error] 12345#12345: *12345 FastCGI sent in stderr: "PHP message: PHP Parse error: syntax error, unexpected ')', expecting variable (T_VARIABLE) in /path/to/file.php on line 10" while reading response header from upstream, client: 127.0.0.1, server: example.com, request: "GET /path/to/page HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fpm.sock:", host: "example.com"
```
这个错误告诉我们出错了,但是出错的原因是因为在 PHP 文件的第 10 行出现了一个语法错误,缺少了一个变量的名称。我们可以通过检查文件的代码,定位错误并修复它。
另外,我们还可以检查 PHP-FPM 的错误日志,一般情况下是 /var/log/php-fpm/error.log。查看这个文件,你可以看到类似下面的信息:
```
[05-Jul-2022 10:24:17] ERROR: An another FPM instance seems to already listen on /var/run/php-fpm.sock
[05-Jul-2022 10:24:17] ERROR: FPM initialization failed
```
这个错误告诉我们另外一个 PHP-FPM 进程已经在监听 /var/run/php-fpm.sock,并且目前的 PHP-FPM 无法启动。我们可以通过检查运行中的进程列表并杀死冲突的进程来解决这个问题。
除此之外,我们还可以在 Nginx 的配置文件中增加一些调试选项,例如把以下内容加入到 http 或者 server 段中:
```
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_param REDIRECT_STATUS 200;
```
这个配置将会启用 FastCGI 的标准环境变量,并允许我们在 PHP 中输出更多的调试信息。例如我们可以在 PHP 的代码中增加以下内容:
```