Nginx 一键部署安装手册

柳三千

Nginx编译安装脚本详解:安全配置与systemd服务集成

背景介绍

在Linux环境中部署Nginx服务时,合理设置用户权限是保证系统安全的关键环节。传统方式通常让Nginx以root身份运行,但这会带来严重的安全风险。本脚本通过创新性的权限配置方案,实现了:

  • Master进程以root运行(允许绑定低端口)
  • Worker进程以nginx用户运行(降低安全风险)
  • 日志目录组写入权限配置
  • systemd服务集成

脚本核心功能

  1. 依赖自动安装:自动检测并安装编译所需依赖
  2. 源码自动处理:自动查找并解压最新版Nginx源码
  3. 安全编译配置:编译时指定运行用户为nginx
  4. 权限精细控制
    • 主目录:root所有 + nginx组可读 (755)
    • 日志目录:root所有 + nginx组可写 (775)
  5. systemd服务集成:创建服务文件并设置开机启动

使用说明

准备工作

  1. 下载Nginx源码包到/usr/local/src目录
  2. 确保系统有curl或wget工具
# 下载最新稳定版Nginx(示例)
cd /usr/local/src
curl -O https://nginx.org/download/nginx-1.24.0.tar.gz

执行安装

chmod +x install_nginx.sh
sudo ./install_nginx.sh

验证安装

systemctl status nginx
curl -I http://localhost

权限配置解析

为什么这样设置权限?

目录 权限 用户:组 安全考虑
安装目录 755 root:nginx 防止nginx用户修改二进制文件
日志目录 775 root:nginx 允许nginx写入日志,阻止其他用户访问
配置文件 644 root:root 防止意外修改

systemd服务关键配置

[Service]
Type=forking
User=root       # Master进程以root运行
Group=root
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx

注意:虽然服务以root身份运行,但Worker进程会通过nginx.conf中的user nginx指令降权运行。

完整安装脚本

#!/bin/bash

# Nginx自动编译安装并配置systemd服务脚本 (安全权限版)
# 需提前将nginx源码包放在/usr/local/src目录
# 使用:sudo ./install_nginx.sh

set -e  # 遇到错误立即退出

NGINX_SRC_DIR="/usr/local/src"
NGINX_PREFIX="/usr/local/nginx"
SYSTEMD_SERVICE="/lib/systemd/system/nginx.service"
LOG_DIR="$NGINX_PREFIX/logs"
PID_FILE="$LOG_DIR/nginx.pid"

# 检查是否为root用户
if [ "$(id -u)" != "0" ]; then
   echo "错误:此脚本必须使用root权限运行" 
   exit 1
fi

# 检查并安装依赖
install_dependencies() {
    if command -v apt-get &>/dev/null; then
        # Debian/Ubuntu
        apt-get update
        apt-get install -y build-essential libpcre3 libpcre3-dev zlib1g-dev libssl-dev
    elif command -v yum &>/dev/null; then
        # CentOS/RHEL
        yum groupinstall -y "Development Tools"
        yum install -y pcre pcre-devel zlib zlib-devel openssl openssl-devel
    else
        echo "不支持的包管理器,请手动安装依赖"
        exit 1
    fi
}

# 检查编译依赖
if ! command -v make &>/dev/null || ! command -v gcc &>/dev/null || ! pcre-config --version &>/dev/null; then
    echo "安装编译依赖..."
    install_dependencies
fi

# 进入源码目录
cd "$NGINX_SRC_DIR" || { echo "无法进入 $NGINX_SRC_DIR 目录"; exit 1; }

# 查找nginx源码包
NGINX_TAR=$(ls nginx-*.tar.gz 2>/dev/null | sort -V | tail -n1)

if [ -z "$NGINX_TAR" ]; then
    echo "错误:在 $NGINX_SRC_DIR 中未找到nginx源码包"
    exit 1
fi

# 解压源码包
echo "解压 $NGINX_TAR..."
tar -xzf "$NGINX_TAR"
NGINX_DIR="${NGINX_TAR%.tar.gz}"
cd "$NGINX_DIR" || { echo "无法进入解压目录"; exit 1; }

# 配置编译选项(保留nginx用户配置)
echo "配置Nginx..."
./configure \
    --prefix="$NGINX_PREFIX" \
    --user=nginx \
    --group=nginx \
    --with-http_ssl_module \
    --with-http_stub_status_module \
    --with-threads \
    --with-file-aio \
    --with-http_realip_module

# 编译安装
echo "编译安装Nginx..."
make -j$(nproc)
make install

# 创建nginx用户
if ! id nginx &>/dev/null; then
    useradd -r -s /usr/sbin/nologin nginx
fi

# 设置目录权限
echo "设置目录权限..."
# 主目录设为root:nginx
chown -R root:nginx "$NGINX_PREFIX"
chmod -R 755 "$NGINX_PREFIX"

# 单独设置logs目录权限(允许root和nginx组写入)
mkdir -p "$LOG_DIR"
chown root:nginx "$LOG_DIR"
chmod 775 "$LOG_DIR"

# 创建systemd服务文件(使用root用户运行)
echo "创建systemd服务..."
cat > "$SYSTEMD_SERVICE" <<EOF
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target

[Service]
Type=forking
User=root
Group=root
PIDFile=$PID_FILE
ExecStartPre=$NGINX_PREFIX/sbin/nginx -t
ExecStart=$NGINX_PREFIX/sbin/nginx
ExecReload=$NGINX_PREFIX/sbin/nginx -s reload
ExecStop=$NGINX_PREFIX/sbin/nginx -s quit
PrivateTmp=true
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target
EOF

# 重新加载systemd并启动服务
echo "启动Nginx服务..."
systemctl daemon-reload
systemctl enable nginx
systemctl start nginx

# 验证安装
if systemctl is-active --quiet nginx; then
    echo -e "\n\033[32mNginx 安装成功!\033[0m"
    echo "安装目录: $NGINX_PREFIX"
    echo "服务状态: systemctl status nginx"
    echo "访问地址: http://$(hostname -I | awk '{print $1}')"
    echo -e "\nNginx版本信息:"
    $NGINX_PREFIX/sbin/nginx -v
else
    echo -e "\n\033[31mNginx 启动失败,请检查错误\033[0m"
    journalctl -xe --no-pager -u nginx
    exit 1
fi

常见问题解决

端口占用问题

# 查看80端口占用
ss -tulpn | grep ':80'

# 停止占用进程(示例)
systemctl stop apache2

权限错误排查

# 检查Nginx错误日志
tail -f /usr/local/nginx/logs/error.log

# 验证目录权限
namei -l /usr/local/nginx/logs

自定义编译参数

修改脚本中的./configure部分,添加所需模块:

./configure \
    ...原有参数...
    --with-http_gzip_static_module \
    --with-http_v2_module

总结

该脚本实现了Nginx的安全安装部署,通过合理的权限分离和systemd服务集成,既保证了服务管理的便捷性,又确保了系统的安全性。实际使用中可根据需要调整编译参数和目录权限设置。

文章版权声明:除非注明,否则均为柳三千运维录原创文章,转载或复制请以超链接形式并注明出处。

取消
微信二维码
微信二维码
支付宝二维码