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. 安全加固补充

  1. 禁止目录列表:确保 Nginx 配置中关闭 autoindex

  2. SELinux 策略(如果启用):

sudo chcon -R -t httpd_sys_content_t /usr/local/nginx/html/
sudo chcon -R -t httpd_log_t /usr/local/nginx/logs/
  1. 防火墙规则:仅开放必要的端口(如80/443)。

关键原则

  • 最小权限nginxuser 仅能访问必需的目录(如 logs/html/),不能修改配置文件。

  • 隔离性:禁止该账户登录或执行无关命令。

  • 日志监控:定期检查 /usr/local/nginx/logs/error.log 是否有权限错误。

这样配置后,Nginx 将以低权限运行,即使被入侵也能限制影响范围。