Nginx编译安装脚本详解:安全配置与systemd服务集成
背景介绍
在Linux环境中部署Nginx服务时,合理设置用户权限是保证系统安全的关键环节。传统方式通常让Nginx以root身份运行,但这会带来严重的安全风险。本脚本通过创新性的权限配置方案,实现了:
- Master进程以root运行(允许绑定低端口)
- Worker进程以nginx用户运行(降低安全风险)
- 日志目录组写入权限配置
- systemd服务集成
脚本核心功能
- 依赖自动安装:自动检测并安装编译所需依赖
- 源码自动处理:自动查找并解压最新版Nginx源码
- 安全编译配置:编译时指定运行用户为nginx
- 权限精细控制:
- 主目录:root所有 + nginx组可读 (755)
- 日志目录:root所有 + nginx组可写 (775)
- systemd服务集成:创建服务文件并设置开机启动
使用说明
准备工作
- 下载Nginx源码包到
/usr/local/src
目录 - 确保系统有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服务集成,既保证了服务管理的便捷性,又确保了系统的安全性。实际使用中可根据需要调整编译参数和目录权限设置。
文章版权声明:除非注明,否则均为柳三千运维录原创文章,转载或复制请以超链接形式并注明出处。