Linux nginx:Chroot(Jail)设置
您可以使用传统的 chroot 设置 nginx。我们的示例设置:
- 监狱目录:/nginx(D=/nginx)
- 测试平台:64 位 Linux 系统 (RHEL / CentOS / Fedora 等)
- Nginx 角色:SSL 和 HTTP 反向代理
- Nginx 64 位库路径:/lib64 和 /usr/lib64(对于 32 位系统使用 /lib 和 /usr/lib)
步骤#1:设置 Chroot 目录
首先,你需要定义一个 chroot 目录。输入以下命令:
# D=/nginx
# mkdir -p $D
步骤2:创建隔离环境
键入以下命令:
# mkdir -p $D/etc
# mkdir -p $D/dev
# mkdir -p $D/var
# mkdir -p $D/usr
# mkdir -p $D/usr/local/nginx
# mkdir -p $D/tmp
# chmod 1777 $D/tmp
# mkdir -p $D/var/tmp
# chmod 1777 $D/var/tmp
# mkdir -p $D/lib64
步骤#3:在$D/dev中创建所需设备
您需要创建以下三个设备条目,以便 nginx 在 jail 内正常运行:
# ls -l /dev/{null,random,urandom}
示例输出:
crw-rw-rw- 1 root root 1, 3 Apr 5 11:03 /dev/null crw-rw-rw- 1 root root 1, 8 Apr 5 11:03 /dev/random cr--r--r-- 1 root root 1, 9 Apr 5 11:03 /dev/urandom
需要使用mknod命令来创建块或字符特殊文件,输入:
# /bin/mknod -m 0666 $D/dev/null c 1 3
# /bin/mknod -m 0666 $D/dev/random c 1 8
# /bin/mknod -m 0444 $D/dev/urandom c 1 9
步骤#4:复制目录中的所有Nginx文件
需要将/usr/local/nginx/复制到$D/usr/local/nginx,输入:
# /bin/cp -farv /usr/local/nginx/* $D/usr/local/nginx
步骤#5:将所需库复制到 Jail
$D/usr/local/nginx/sbin/nginx 依赖于各种库,您需要将它们复制到 $D/lib64 和 $D/usr/lib64。要显示共享库依赖项,请输入:
# ldd /usr/local/nginx/sbin/nginx
示例输出:
libpcre.so.0 => /lib64/libpcre.so.0 (0x000000316b800000) libssl.so.6 => /lib64/libssl.so.6 (0x0000003170400000) libcrypto.so.6 => /lib64/libcrypto.so.6 (0x000000316d400000) libdl.so.2 => /lib64/libdl.so.2 (0x000000316b000000) libz.so.1 => /usr/lib64/libz.so.1 (0x000000316c400000) libc.so.6 => /lib64/libc.so.6 (0x000000316ac00000) libgssapi_krb5.so.2 => /usr/lib64/libgssapi_krb5.so.2 (0x000000316e400000) libkrb5.so.3 => /usr/lib64/libkrb5.so.3 (0x0000003170000000) libcom_err.so.2 => /lib64/libcom_err.so.2 (0x000000316ec00000) libk5crypto.so.3 => /usr/lib64/libk5crypto.so.3 (0x000000316f800000) /lib64/ld-linux-x86-64.so.2 (0x000000316a800000) libkrb5support.so.0 => /usr/lib64/libkrb5support.so.0 (0x000000316fc00000) libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x000000316f000000) libresolv.so.2 => /lib64/libresolv.so.2 (0x000000316d800000) libselinux.so.1 => /lib64/libselinux.so.1 (0x000000316c000000) libsepol.so.1 => /lib64/libsepol.so.1 (0x000000316bc00000)
您需要使用 cp 命令将上述所有文件复制到 $D,如下所示:
# cp /lib64/libsepol.so.1 $D/lib64
要自动执行此过程,请使用名为 n2chroot 的脚本:
编辑脚本并设置 BASE 目录:
最后,按如下方式运行它:
# cd /tmp
# wget http://bash.example.com/dl/527.sh.zip
# unzip 527.sh.zip
# mv 527.sh /usr/bin/n2chroot
# chmod +x /usr/bin/n2chroot
# vi /usr/bin/n2chroot
# n2chroot /usr/local/nginx/sbin/nginx
# /bin/cp -fv /lib64/* $D/lib64
步骤#6:将/etc 复制到 Jail
最后,将 /etc 复制到 $D,输入:
# cp -fv /etc/{group,prelink.cache,services,adjtime,shells,gshadow,shadow,hosts.deny,localtime,nsswitch.conf,nscd.conf,prelink.conf,protocols,hosts,passwd,ld.so.cache,ld.so.conf,resolv.conf,host.conf} $D/etc
还有一些目录:
# cp -avr /etc/{ld.so.conf.d,prelink.conf.d} $D/etc
如何启动 Chrooted nginx?
首先,终止现有的 nginx(如果正在运行):
# killall -9 nginx
要启动 chrooted nginx,请输入:
确保 nginx 在系统重启时启动:
# /usr/sbin/chroot /nginx /usr/local/nginx/sbin/nginx -t
# /usr/sbin/chroot /nginx /usr/local/nginx/sbin/nginx
# echo '/usr/sbin/chroot /nginx /usr/local/nginx/sbin/nginx' >> /etc/rc.local
如何重新加载 Chrooted nginx?
键入以下命令
# /usr/sbin/chroot /nginx /usr/local/nginx/sbin/nginx -s reload
如何编辑 Chrooted nginx 配置文件?
输入以下命令:
保存并关闭文件。测试并重新加载:
# cd /nginx/usr/local/nginx/conf/
# vi nginx.conf
# /usr/sbin/chroot /nginx /usr/local/nginx/sbin/nginx -t
# /usr/sbin/chroot /nginx /usr/local/nginx/sbin/nginx -s reload
- CentOS / Redhat Linux:安装 Keepalived 为 Web 集群提供 IP 故障转移
- CentOS / Redhat:安装 nginx 作为反向代理负载均衡器
- 使用 KeepAlived 处理 nginx 故障转移
- nginx:设置 SSL 反向代理(负载平衡 SSL 代理)
- mod_extforward:Lighttpsd 记录客户端在反向代理/负载均衡器后面的真实 IP
- 如何合并 Apache / Lighttpsd / Nginx 服务器日志文件
- Linux nginx:Chroot(Jail)设置
- 操作方法:SPDY SSL 安装和配置
- 在 CentOS/RHEL 上使用 Yum 命令安装 Nginx
- 在 Nginx 上创建自签名 SSL 证书