各位做运维的小伙伴在日常工作中,可能都会习惯性的使用 root 超级用户来安装和运行 Nginx。但是,如果所在的公司有安全部门,他们就可能会强烈的建议你将 Nginx 的运行用户整改为普通用户,来提升系统的安全性。下面我来分享下自己整改的一个过程和细节经验。

Nginx 的安装是需要使用 root 超级用户的,但是我们可以在安装命令中添加参数,让Nginx 被安装到指定的用户和组(如 app 用户、app 组)目录下。

安装命令如下:

./configure --prefix=/data/nginx --user=app --group=appmakemake install

备注:如果之前已经安装过nginx,编译的参数建议和原先的参数(可以使用 ./nginx -V 命令来查看)保持一致,即在原参数的基础上增加 –user –group 参数。

安装完成以后,还需要将 nginx.conf 配置文件中的第一行设置为 app 用户和组,并将默认的 80 监听端口,修改为 1024 以上的端口(如下所示),否则使用普通启动 Nginx 时会报错、无法启动。

user app app;...http{...server{listen 1026;...}}

上面这种,是最简单的一种情况。

但是,如果当你的软负载环境使用了 Keepalived + Nginx 来实现双机主备,那整改起来就相对复杂一点了。因为 Keepalived 一般都是使用 root 超级用户来安装和运行的,而且我们还会将 Keepalived 注册为 Linux 系统的一个服务,即让 Keepalived 服务随操作系统一起停、启,来实现宕机后 Keepalived 服务的自动拉起。同时,我们还会在 Keepalived 的主配置里面设置自动监控 Nginx 进程的配置,即监测到Nginx 进程不存在,Keepalived 就会通过配置信息以及对应的脚本自动拉起 Nginx 进程。

这样就会带来一个问题,虽然我们已经将 Nginx 安装到了普通用户和组下了,但是 Keepalived 拉起后的 Nginx 进程会出现一个问题,即 master 进程是 root 超级用户,而 worker 进程是普通用户。另外, Nginx 的 pid 文件也会变成root 超级用户和组权限,而Nginx 的主执行程序是普通用户和组,就无法去执行配置校验和热加载。

这个时候,我们就需要对安装在普通用户和组下面的 Nginx 的主程序的权限进行改造,来让普通用户也有权限去执行配置校验和热加载。

上面这几段文字看起来有点绕,但是也是我们在生产环境比较常见的一种情况,希望各位小伙伴能耐心的看完,并且能理解其中的含义。

下面我们就需要对 Nginx 的主程序的权限进行改造,很简单的几行命令:

$ cd /data/nginx/sbin/// 设置nginx主程序的用户和组权限为root$ chown root:root ./nginx// 设置nginx主程序的权限为755# chmod 755 ./nginx// 设置nginx主程序在普通用户权限下具备执行root权限的功能$ chmod u+s ./nginx// 修改后的权限# ls -ltr /data/nginx/sbin/-rwsr-xr-x 1 root root 7145848 Feb 29 10:36 nginx

备注:这样整改以后,大家会发现使用netstat -tnlp| grep master_pid来查看端口,会发现没有数据返回了,这个时候就需要使用第一个 worker 进程的 pid 来匹配和查看即可,也就是所有代理的后端业务的应用端口都已经使用普通用户和组来运行了。