照着一篇文档执行 nginx -p /data/nginx/,控制台直接甩出一行 nginx: [emerg] open() /data/nginx/logs/error.log failed,后面跟着 No such file or directory。目录明明存在,问题出在 -p 究竟改了什么。

-p 换的是路径基准

Nginx 编译时带一个 prefix,常见是 /usr/local/nginx 或 /etc/nginx。配置里所有相对路径都以它为基准,logs/error.log、conf/nginx.conf、client_body_temp 这些写法,拼出来的绝对路径都由 prefix 决定。-p 就是在启动那一刻把这个基准替换掉。

所以 -p /data/nginx/ 之后,日志会被找成 /data/nginx/logs/error.log。你只建了 /data/nginx,没建 logs 子目录,open 就失败了。mkdir -p /data/nginx/logs 补上,同样的命令立刻能起来。

和 -c 搭配才常见

只给 -p 不给 -c,Nginx 会去找 prefix 下面的 conf/nginx.conf。要用另一份配置就写全:nginx -p /data/nginx -c /data/nginx/conf/site.conf。-c 后面如果给的是相对路径,同样按 prefix 解析,这一点最容易记混。

改完先测再启:nginx -t -p /data/nginx -c /data/nginx/conf/site.conf。测试和启动必须带一模一样的参数,否则测的是另一份文件,等于白测。

权限与 systemd

worker 进程用 nobody 或 www-data 跑的时候,logs 目录和临时目录得让这个用户可写,chown 一次比事后排查半小时划算。用 systemd 托管,ExecStart 里要把 -p 和 -c 写全,WorkingDirectory 不能替代 prefix,两回事。

临时起个测试实例,-p 配合不同端口很方便,删掉目录就算清理干净。生产环境别依赖命令行参数,把路径写进配置或编译参数里,省得下次换个人启动就找不到日志。