以非root用户身份运行Nginx

时间:2017-02-19 15:47:14

标签: linux nginx centos7

我使用Ansible安装了Nginx。要在Centos7上安装,我使用了yum软件包,因此它默认以 root 用户身份运行。我希望它在Centos框中以不同的用户(例如 nginx 用户)启动和运行。当我尝试使用其他用户运行它时,我收到以下错误:

  

nginx.service的作业失败,因为控制进程已退出   错误代码。请参阅“systemctl status nginx.service”和“journalctl -xe”   详情。

我知道以root身份运行是不可取的。那么我该如何解决这个问题并以非root用户身份运行nginx。感谢

4 个答案:

答案 0 :(得分:16)

/etc/nginx/nginx.conf中添加/更改以下内容:

user nginx;

您应该以递归方式创建用户并授予webroot目录的权限。

这样,只有主进程以root运行。 因为:只有root进程才能侦听1024以下的端口.Web服务器通常在端口80和/或443上运行。这意味着它需要以root用户身份启动。

以非root用户身份运行主进程:

更改以下所有权:

  • error_log
  • 的access_log
  • PID
  • client_body_temp_path
  • fastcgi_temp_path
  • proxy_temp_path
  • scgi_temp_path
  • uwsgi_temp_path

将listen指令更改为1024以上的端口,以所需用户身份登录并按nginx -c /path/to/nginx.conf运行nginx

答案 1 :(得分:4)

为了帮助测试/调试,有时我会以非特权用户的身份在我的Debian(拉伸)笔记本电脑上运行nginx实例。

我使用像这样的最小配置文件:

worker_processes 1;
error_log stderr;
daemon off;
pid nginx.pid;

events {
  worker_connections  1024;
}

http {
  include             /etc/nginx/mime.types;
  default_type        application/octet-stream;

  sendfile on;

  keepalive_timeout   65;

  ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
  ssl_prefer_server_ciphers on;
  access_log access.log;
  server {
    listen            8080;
    server_name       localhost;

    location / {
      include /etc/nginx/uwsgi_params;
      uwsgi_pass localhost:8081;
    }
  }
}

然后我以以下方式开始该过程:

/usr/sbin/nginx -c nginx.conf -p $PWD

答案 2 :(得分:4)

以防万一,这有助于在2020年解决这个问题的人,这是我的最小nginx.conf,用于在端口8088上运行Web服务器,适用于非root用户。无需修改文件权限! (在Centos 7.4上使用nginx 1.16.1进行了测试)

    error_log /tmp/error.log;
    pid       /tmp/nginx.pid;
    
    events {
      # No special events for this simple setup
    }
    http {
      server {
        listen       8088;
        server_name  localhost;
    
        # Set a number of log, temp and cache file options that will otherwise
        # default to restricted locations accessible only to root.
        access_log /tmp/nginx_host.access.log;
        client_body_temp_path /tmp/client_body;
        fastcgi_temp_path /tmp/fastcgi_temp;
        proxy_temp_path /tmp/proxy_temp;
        scgi_temp_path /tmp/scgi_temp;
        uwsgi_temp_path /tmp/uwsgi_temp;
    
        # Serve local files
        location / {
          root /home/<your_user>/web;
          index  index.html index.htm;
          try_files $uri $uri/ /index.html;
        }
      }
    }

答案 3 :(得分:0)

为什么不使用无根 bitnami/nginx 图像:

$ docker run --name nginx bitnami/nginx:latest
  • 更多信息

要验证它不是以 root 身份运行而是以您的标准用户身份运行(属于 docker 组):

$ docker exec -it nginx id
uid=1**8 gid=0(root) groups=0(root)

并验证 Nginx 没有在内部侦听受 root 限制的端口 443:

$ docker ps -a | grep nginx
2453b37a9084   bitnami/nginx:latest                       "/opt/bitnami/script…"   4 minutes ago    Up 30 seconds                 8080/tcp, 0.0.0.0:8443->8443/tcp                  jenkins_nginx

它很容易配置(参见 docs),甚至可以在运行时定义的随机 UID 下运行(即没有在 Dockerfile 中硬编码)。事实上,这是 Bitnami 的政策,让他们的所有容器都无根并在运行时为 UID 更改做好准备,这就是为什么我们在非常注重安全的 Openshift 3.x (bitnami/nginx in特别是作为启用对 MLflow Web 应用程序进行身份验证所需的反向代理)。