1. 一个专用于Nginx进程且无法通过SSH登录的账户,并严格控制其权限:
sudo adduser --system --no-create-home --shell /sbin/nologin nginxuser
参数说明:
--system
: 创建系统账户--no-create-home
: 不创建家目录--shell /sbin/nologin
: 禁止登录shell
2. 设置账户密码为锁定状态(确保无法SSH登录)
# 锁定账户,禁止SSH登录 sudo passwd -l nginxuser
3. 配置Nginx使用该账户
# 编辑Nginx主配置文件: sudo vi /etc/nginx/nginx.conf # 找到或添加以下行: user nginxuser; worker_processes auto;
4. 设置文件和目录权限
根据 --prefix=/usr/local/nginx
的安装路径,调整关键目录的权限:确保Nginx相关文件和目录有适当权限:
(1)Nginx 程序文件
# 主程序需要可执行权限,但配置文件需只读 sudo chown -R root:root /usr/local/nginx/sbin/nginx # 二进制文件归root所有 sudo chmod 755 /usr/local/nginx/sbin/nginx # 允许nginxuser执行 # 配置文件目录(禁止修改) sudo chown -R root:nginxuser /usr/local/nginx/conf/ # root所有,nginxuser可读 sudo chmod 750 /usr/local/nginx/conf/ # 禁止其他用户访问
(2)日志目录
sudo chown -R nginxuser:nginxuser /usr/local/nginx/logs/ sudo chmod 750 /usr/local/nginx/logs/ # 仅nginxuser可读写
(3)网站根目录(假设为 /usr/local/nginx/html
)
sudo chown -R nginxuser:nginxuser /usr/local/nginx/html/ sudo chmod 750 /usr/local/nginx/html/ # 禁止其他用户访问
(4)临时文件目录(如 client_body_temp
)
sudo mkdir -p /usr/local/nginx/client_body_temp/ sudo chown -R nginxuser:nginxuser /usr/local/nginx/client_body_temp/ sudo chmod 750 /usr/local/nginx/client_body_temp/ sudo mkdir -p /usr/local/nginx/tmp/ sudo chown -R nginxuser:nginxuser /usr/local/nginx/tmp/ sudo chmod 750 /usr/local/nginx/tmp/ sudo mkdir -p /usr/local/nginx/fastcgi_temp/ sudo chown -R nginxuser:nginxuser /usr/local/nginx/fastcgi_temp/ sudo chmod 750 /usr/local/nginx/fastcgi_temp/ sudo mkdir -p /usr/local/nginx/proxy_temp/ sudo chown -R nginxuser:nginxuser /usr/local/nginx/proxy_temp/ sudo chmod 750 /usr/local/nginx/proxy_temp/ sudo mkdir -p /usr/local/nginx/scgi_temp/ sudo chown -R nginxuser:nginxuser /usr/local/nginx/scgi_temp/ sudo chmod 750 /usr/local/nginx/scgi_temp/ sudo mkdir -p /usr/local/nginx/uwsgi_temp/ sudo chown -R nginxuser:nginxuser /usr/local/nginx/uwsgi_temp/ sudo chmod 750 /usr/local/nginx/uwsgi_temp/
(5)验证权限
# 检查Nginx用户能否访问关键目录 sudo -u nginxuser ls -l /usr/local/nginx/conf/nginx.conf sudo -u nginxuser ls -l /usr/local/nginx/logs/ # 测试Nginx配置 sudo -u nginxuser /usr/local/nginx/sbin/nginx -t
5. 修改 Nginx 启动方式(通过 systemd)
sudo vi /etc/systemd/system/nginx.service # 内容如下 [Unit] Description=Nginx Web Server After=network.target [Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ExecStartPre=/usr/local/nginx/sbin/nginx -t # 启动前测试配置 ExecStart=/usr/local/nginx/sbin/nginx # 主进程以root启动 ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s quit PrivateTmp=true User=root # 主进程为root Group=root RuntimeDirectory=nginx Environment="NGINX_CONF_FILE=/usr/local/nginx/conf/nginx.conf" [Install] WantedBy=multi-user.target
6. 启用并启动nginx服务
sudo systemctl daemon-reload sudo systemctl start nginx sudo systemctl enable nginx
当 systemctl restart nginx
失败时,需要逐步排查问题。以下是详细的故障排除步骤:
sudo systemctl status nginx.service sudo journalctl -xe --no-pager | grep -A 20 "nginx"
重点关注:
红色错误提示(如权限拒绝、端口冲突、配置文件语法错误)
主进程崩溃原因
常见问题及解决方案
问题1:配置文件语法错误
# 手动测试配置文件 sudo /usr/local/nginx/sbin/nginx -
如果报错:根据提示修正
nginx.conf
或子配置文件中的语法错误。典型错误:
缺少分号
;
或括号}
无效路径(如
ssl_certificate
文件路径错误)问题2:端口冲突(如80/443已被占用)
sudo netstat -tulnp | grep -E ':80|:443'
问题3:权限不足
sudo chown -R nginxuser:nginxuser /usr/local/nginx/logs/ sudo chmod 750 /usr/local/nginx/logs/
关键目录权限检查:
logs/
:Nginx 用户需有写权限html/
:Nginx 用户需有读权限conf/
:Nginx 用户需有读权限
7.验证工作进程权限
ps aux | grep nginx # 输出应类似: root <PID> 0.0 0.1 ... master process /usr/local/nginx/sbin/nginx nginxuser <PID> 0.0 0.2 ... worker process # 主进程(master)为 root。 # 工作进程(worker)为 nginxuser。
6. 安全加固补充
禁止目录列表:确保 Nginx 配置中关闭
autoindex
。SELinux 策略(如果启用):
sudo chcon -R -t httpd_sys_content_t /usr/local/nginx/html/ sudo chcon -R -t httpd_log_t /usr/local/nginx/logs/
防火墙规则:仅开放必要的端口(如80/443)。
关键原则
最小权限:
nginxuser
仅能访问必需的目录(如logs/
、html/
),不能修改配置文件。隔离性:禁止该账户登录或执行无关命令。
日志监控:定期检查
/usr/local/nginx/logs/error.log
是否有权限错误。
这样配置后,Nginx 将以低权限运行,即使被入侵也能限制影响范围。