受限环境下的 Nginx 安装
本文简述在受限环境下的 Nginx 安装,编译机为常规 Linux 机器,运行时为类似 Docker 的环境,较为受限,且运行时权限较低。
编译
依赖安装
# 安装 tengine 依赖
sudo yum install -y gcc openssl openssl-devel pcre-devel zlib-devel
编译&构建
--prefix
建议使用当前目录,否则相关构建的配置路径会有相对路径的问题,可能还会影响到运行时
# 下载、解压、编译、安装 tengine
wget https://tengine.taobao.org/download/tengine-2.3.3.tar.gz
tar -zxvf ./tengine-2.3.3.tar.gz
cd ./tengine-2.3.3
./configure --prefix=.
make && make install
动态库引用
- 由于构建时一般有相关动态库的依赖,但运行时可能没有,需要手动复制
- 通过
sudo find / -name libpcre.so.1
来查找相关的动态库文件
# 从编译机器上复制动态库到运行时
cp /usr/lib64/libpcre.so.1 .
cp /usr/lib64/libssl.so.10 .
cp /usr/lib64/libcrypto.so.10 .
打包
# 打包
zip -9 -r code.zip *
运行
配置
由于相关运行时的路径都是 readonly,所以,所有的日志,都需要写到 tmp 目录,相关配置如下:
error_log /dev/stderr;
pid /tmp/nginx.pid;
events {
}
http {
charset utf-8;
# 提交之后的目录权限,都会被复写为只读,所以不能在当前目录 CRUD
# drwxr-xr-x 2 root root 4096 Oct 28 12:46 logs
# 所以,所有的日志、缓存,都需要重定向
client_body_temp_path /tmp 1 2;
proxy_temp_path /tmp 1 2;
fastcgi_temp_path /tmp 1 2;
uwsgi_temp_path /tmp 1 2;
scgi_temp_path /tmp 1 2;
# 输出到标准输出,方便 fc 收集日志到 sls
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent $request_body "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /dev/stdout main;
server {
# server_name localhost;
listen 9000;
location / {
return 200 "home";
}
location /initialize {
return 200 "";
}
location /invoke {
return 200 "invoke";
}
}
}
运行
由于编译时,复制了动态库到当前路径,所以运行时的动态库链接,需要把当前目录加入去。
#!/bin/bash
# 获取当前路径
DIR=$(pwd)
# 添加动态库路径
export LD_LIBRARY_PATH=$DIR:$LD_LIBRARY_PATH
# 启动
$DIR/tengine-2.3.3/sbin/nginx -c $DIR/nginx.conf
小结
本文通过一个极为受限的运行时环境,对 nginx 做了相关构建和配置,理论上可以兼容其他更友好的环境。