在使用 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 的代碼中增加以下內容:
```
網站導航
- zblogPHP模板zbpkf
- zblog免費模板zblogfree
- zblog模板學習zblogxuexi
- zblogPHP仿站zbpfang