【Nginx】使用普通用户安装和运行Nginx经验分享

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

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

安装命令如下:

objectivec 复制代码
./configure --prefix=/data/nginx --user=app --group=app
make
make 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 的主程序的权限进行改造,很简单的几行命令:

objectivec 复制代码
$ 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 来匹配和查看即可,也就是所有代理的后端业务的应用端口都已经使用普通用户和组来运行了。

相关推荐
愚公搬代码12 分钟前
【愚公系列】《Web应用安全》010-Repeater模块的使用
前端·安全
画中有画36 分钟前
自动化脚本中如何启动/打开app的某个页面
运维·自动化
qq_394308671 小时前
设备伤人多在检修时刻,设备安全目视化守住机械风险关口
安全·制造
Magic-ZYJ1 小时前
HarmonyOS Stage 模型实战:UIAbility 生命周期如何驱动页面安全状态
安全·华为·harmonyos·鸿蒙·移动端开发·独立开发者·心晴手记
我星期八休息1 小时前
Linux—五种IO模型与非阻塞IO
linux·运维·服务器·网络·数据库·网络协议
Sagittarius_A*1 小时前
【好靶场】PHP反序列化入门练习
安全·php·web·反序列化
hweiyu001 小时前
Linux命令:column
linux·运维·服务器
日常筹谋记2 小时前
ATS选不对运维两行泪:数据中心市电与柴发切换场景的双电源自动转换开关选型笔记
运维·数据库·笔记
绿蚁新亭2 小时前
Markdown Wiki 网页代码块复制至欧拉 Linux Shell 脚本隐形字符故障完整复盘
linux·运维·服务器
mengge.cloud2 小时前
LVS 小白完整教程(Linux虚拟服务器负载均衡)
linux·运维·服务器·负载均衡·lvs