我使用普通用户而非 root 用户运行 nginx。我在系统范围内安装了 nginx,但 HOME 中有 nginx.conf。
$HOME/nginx/nginx.conf
worker_processes 1;
error_log /home/worker/nginx/log/nginx/error.log warn;
pid /home/worker/nginx/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /home/worker/nginx/log/nginx/access.log;
server {
listen 8080;
root /home/worker/nginx/data;
}
}
启动 nginx
$ nginx -c /home/worker/nginx/nginx.conf
nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (13: Permission denied)
正如你在 nginx.conf 中看到的,我已经定义了error_log
,但仍然收到警告信息:
nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (13: Permission denied)
nginx 本身可以工作,只是想删除这个警告信息,我该怎么做?
答案1
最近(2020-11-19),-e
nginx 添加了一个新的选项,允许您覆盖已编译的错误日志路径。您可以使用该选项将 nginx 指向一个用户可写文件(或者可能是stderr
)。
看https://trac.nginx.org/nginx/changeset/f18db38a9826a9239feea43c95515bac4e343c59/nginx
答案2
我迟到了,但我因为其他原因遇到了这个问题。我只是为 nginx (www-data
在我的情况下是用户) 添加了对文件夹和文件的访问权限:
sudo chown -R www-data:www-data /var/log/nginx
我实际上删除了整个文件夹和日志文件并重新创建了它们:
sudo rm -rf /var/log/nginx
sudo mkdir /var/log/nginx
sudo touch /var/log/nginx/error.log
sudo chown -R www-data:www-data /var/log/nginx
也许有一个更优雅的解决方案。
答案3
显示此错误的原因是执行的用户nginx
无权查看 ngnix 进程创建的日志文件,该文件很可能归用户所有,www-data
而不是用户所有。如果可能,使用 sudo 运行该命令或授予用户查看错误日志的权限将消除显示的错误消息。
答案4
可以和 结合RUN ln -sf /dev/stdout/tmp/access.log \ &&ln -sf /dev/stderr/tmp/error.log
使用,打印出日志,另外由于自定义nginx是编译的,非root使用后会报日志无权查看,所以使用nginx -e
指定非root用户的nginx日志路径,注意nginx.conf需要你指定日志路径
FROM sec_demo:latest
ARG UID=101
ARG GID=101
RUN curl -k -O xxx/nginx-1.25.3.tar.gz && \
tar xf nginx-1.25.3.tar.gz
RUN groupadd --system --gid $GID nginx || true \
&& useradd --system --gid nginx --no-create-home --home /nonexistent --comment "nginx user" --shell /bin/false --uid $UID nginx || true
RUN mkdir -p /usr/local/nginx/conf \
&& cp -r nginx/conf /usr/local/nginx \
&& cp nginx/sbin/nginx /usr/bin \
&& cp -r nginx/html /usr/local/nginx \
&& mkdir -p /usr/local/nginx/conf.d \
&& mkdir -p /usr/local/nginx/ssl \
&& mkdir -p /usr/local/nginx/logs
RUN chown -R $UID:0 /usr/local/nginx \
&& chmod -R g+w /usr/local/nginx
RUN ln -sf /dev/stdout /usr/local/nginx/logs/access.log \
&& ln -sf /dev/stderr /usr/local/nginx/logs/error.log
STOPSIGNAL SIGQUIT
USER $UID
CMD ["nginx", "-c", "/usr/local/nginx/conf/nginx.conf","-e","/usr/local/nginx/logs/access.log","-g","daemon off;"]