本文简述在受限环境下的 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 做了相关构建和配置,理论上可以兼容其他更友好的环境。