nginx启动文件报grep错和 useradd错的问题处理

本文解决Nginx在家目录部署时遇到的问题,包括useradd权限不足及缺少必要目录等异常现象,通过调整启动脚本避免了不必要的系统账户创建。

场景

最近某客户有个要求,所有部署的不准运行在root下面,安装在/home/somebody下面(用户家目录),当对nginx进行普通用户运行的时候,会遇到各种各样的问题,比如文件路径不存在呀,权限不够呀等。

本文就是在修改nginx运行在家目录的时候遇到的最后一个问题,提示 useradd没有权限,以及运行的时候出现的异常现象。

$ ./nginx restart
ngx_http_fastdfs_set pid=5550
nginx: the configuration file /home/123/opt/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /home/123/opt/nginx/conf/nginx.conf test is successful
Stopping nginx:                                            [  OK  ]
grep: unrecognized option '--prefix=/home/123/opt/nginx'
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.
./nginx: line 34: /usr/sbin/useradd: Permission denied
Starting nginx: ngx_http_fastdfs_set pid=5582
                                                           [  OK  ]
touch: cannot touch `/home/123/opt/var/lock/subsys/nginx': No such file or directory

调查

  • 定位代码到如下函数
make_dirs() {
   # make required directories
   user=`$nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\
1/g' -`
   if [ -z "`grep $user /etc/passwd`" ]; then
       useradd -M -s /bin/nologin $user
   fi
   options=`$nginx -V 2>&1 | grep 'configure arguments:'`
   for opt in $options; do
       if [ `echo $opt | grep '.*-temp-path'` ]; then
           value=`echo $opt | cut -d "=" -f 2`
           if [ ! -d "$value" ]; then
               # echo "creating" $value
               mkdir -p $value && chown -R $user $value
           fi
       fi
   done
}

start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    make_dirs //调用函数
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}
可以看出,make_dirs会完成两个作用,一个是判断编译的时候的--user,如果系统中没有这个账户,那么就新建这个账户;另外一个是从options中提取temp-path变量,并创建该目录。对于我们当前的需求是不需要的,账户已经创建好了,temp-path没有,所以可以在start函数中,直接注释掉对make_dirs的调用。
要以 `nginx` 用户启动 Nginx,通常情况下无需额外配置,因为大多数 Linux 发行版默认已配置 Nginx 服务以 `nginx` 用户身份运行。以下是实现验证此行为的详细说明: Nginx 的主配置文件通常位于 `/etc/nginx/nginx.conf`,在该文件中可以通过 `user` 指令指定运行 Nginx 的用户。默认情况下,该指令设置为 `nginx`,即表示 Nginx 主进程及其子进程将以该用户身份运行[^1]。 ```nginx user nginx; ``` 如果系统中尚未创建 `nginx` 用户,可以使用以下命令手动添加: ```bash sudo useradd --system --no-create-home --shell /sbin/nologin nginx ``` 此命令将创建一个系统用户 `nginx`,并且该用户没有家目录以及无法登录系统,符合安全最佳实践。 Nginx 服务一般通过系统的初始化系统(如 systemd)管理。启动 Nginx 服务可使用以下命令: ```bash sudo systemctl start nginx ``` 检查 Nginx 服务状态以确认其是否正在以 `nginx` 用户身份运行: ```bash ps -ef | grep nginx ``` 输出结果应显示主进程由 `root` 启动,而工作进程则由 `nginx` 用户运行。 若需要对服务文件进行自定义(例如更改启动参数),可编辑 systemd 服务文件,通常位于 `/usr/lib/systemd/system/nginx.service` 或 `/etc/systemd/system/multi-user.target.wants/nginx.service`。确保 `[Service]` 部分包含以下内容: ```ini User=nginx Group=nginx ``` 完成修改后重新加载 systemd 配置: ```bash sudo systemctl daemon-reexec ``` 最后,为了保证服务开机自动启动,执行以下命令启用 Nginx: ```bash sudo systemctl enable nginx ``` 以上步骤确保了 Nginx 能够以非特权用户 `nginx` 的身份安全地运行,同时遵循了最小权限原则,提高了系统的安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值