我最近将我的 CentOS 7 机器从 Apache 移到了 nginx,我仍在研究两者的区别。我注意到只有一个服务器块存在一个问题,即访问和错误日志文件实际上没有被记录,这使得解决潜在问题变得困难。
我的网站的服务器块如下所示:
server {
listen 80;
server_name example.com;
root /var/www/example.com/public_html;
index index.php;
access_log /var/www/example.com/logs/example.com_access.log;
error_log /var/www/example.com/logs/example.com_error.log error;
location / {
index index.php index.html;
}
location /reports {
autoindex on;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
error_page 404 /var/www/html/404.html;
error_page 500 502 503 504 /var/www/html/50x.html;
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
location /robots.txt {
#access_log off;
#log_not_found off;
}
location ~ /\.ht {
deny all;
}
}
我不确定为什么日志不会被保留。我比较了服务器块之间的文件权限,它们都共享相同的权限。
-rw-r--r--. 1 nginx root 0 Nov 7 02:54 example.com_access.log
-rw-r--r--. 1 nginx root 0 Nov 7 02:54 example.com_error.log
日志未被存储可能存在哪些问题?
答案1
此处的 Nginx 语法是正确的,因此问题与服务器环境有关。您可以采取以下措施来调试它。
模拟 Web 服务器将执行的操作。尝试使用 Web 服务器将使用的同一用户写入文件。如果 Web 服务器用户是 nginx,则尝试以 root 身份执行此操作:
su -m nginx -c 'echo "testing">>/var/www/example.com/logs/example.com_error.log'
观察 Web 服务器正在做什么。作为临时调试措施,在 Nginx 配置的顶层添加
daemon off
。然后停止 Nginx 并启动它strace nginx | tee nginx-output.txt
。然后它将在前台运行并将其进行的所有系统调用输出到 STDOUT,这也将在 nginx-output.txt 中捕获。执行某些操作以触发错误,然后您可以停止 Nginx,删除“守护进程”行并在查看调试日志时正常启动它。在其中搜索相关文件名的提及。也许您会在那里找到它,并显示尝试访问该文件的系统调用返回的错误。
另一种可能性是,您不同意 Nginx 关于错误日志中应显示的内容。如果nginx -V | grep debug
得到结果,则可以将最后一个参数更改为error_log
从error
到。重新加载 Nginx 并点击域中不存在的 URL,这应该会生成大量日志记录。完成后debug
关闭日志记录。debug