目录
首先是说明配置的方式和原因:
1. 下载源码包编译安装
2. 版本的指定和更新: 经常更新软件, 我会遇到以下问题:
前提描述完毕, 下面是版本选择:
1. 编译 Redis 2.8.17
2. 编译 LuaJIT
3. 编译 nginx
总结源码编译服务工具的思路:
题外话:
首页 数据库 mysql教程 Nginx + LuaJIT + Redis 编译配置教程

Nginx + LuaJIT + Redis 编译配置教程

Jun 07, 2016 pm 04:39 PM
nginx redis 教程 编译 配置

最近工作上需要本地开发机模拟服务器的环境, 最初的需求考虑是 需要搭建 Nginx + Luajit + Redis 组合的配置, 因为本博客所在主机 中使用的是一样的方式配置, 当时就直接参考自己的操作笔记, 重新 搭建一套在开发机上. 因为这些都是基础的系统配置信息,干脆

最近工作上需要本地开发机模拟服务器的环境, 最初的需求考虑是
需要搭建 Nginx + Luajit + Redis 组合的配置, 因为本博客所在主机
中使用的是一样的方式配置, 当时就直接参考自己的操作笔记, 重新
搭建一套在开发机上. 因为这些都是基础的系统配置信息,干脆分享
出来,也希望从读者中收获建议和改善的方案 :)

首先是说明配置的方式和原因:

其实是选择最终二进制文件部署的路径,
我选择的是 /opt/下:
eg:
/opt/nginx /opt/redis /opt/luajit 部署的详情

1. 下载源码包编译安装

Makefile 及脚本里通常的 PREFIX 变量(编译后的路径)
在/usr/local/下,因为我经常更新自己使用的工具或者依赖库(非系统命令安装),
所以我选择在 /opt/下统一放置.
例如工具类: nginx ffmpeg redis mysql luajit lua
他们的配置是
/opt/nginx /opt/ffmpeg /opt/redis
/opt/mysql /opt/luajit /opt/lua

如果是纯库文件 (lib) 例如: boost libevent libev
那么统一放在 /opt/libs/ 下:
/opt/libs/boost /opt/libs/libevent /opt/libs/libev

2. 版本的指定和更新: 经常更新软件, 我会遇到以下问题:

开发项目A依赖 redis 2.6
开发项目B依赖 redis 3.0
其他项目多数依赖 redis 2.8
版本需求不一样, 那么可以这么玩:
/opt/redis/2.6.0
/opt/redis/3.0.0
/opt/redis/2.8.0 同时在 /opt/redis/ 下做一个软链接
即 default -> 2.8.0:
cd /opt/redis
ln -sfn 2.8.0 default Note: ln 参数 n 是在文件夹软链重定向时生效, 否则链接失败

/etc/profile 下定义工具的环境变量
/etc/ld.so.conf.d/ 文件下定义依赖库的路径
基本上是公式化的:
eg:
/opt/nginx/default
/opt/redis/default
/opt/libs/libev/default
/opt/libs/boost/default
default 其实是具体编译版本的文件夹软链接


前提描述完毕, 下面是版本选择:

Nginx 1.6.2
Redis 2.8.17
LuaJIT 2.0.3

Ubuntu 14.04
需要提前安装的库有:
pcre zlib openssl build-essential

1. 编译 Redis 2.8.17

mkdir -p /opt/redis/2.8.17 # 先定义好编译后的路径

进入源码目录

cd redis-2.8.17 make && make install

将 源码目录下编译生成的 src/redis-server src/redis-client
放置在 /opt/redis/2.8.17 下, 其他的辅助工具根据需求配置
(如 redis-benchmark)

cd /opt/redis/
sudo ln -sfn 2.8.17 default

/opt/redis 下定义启动脚本

mkdir init
添加 init/redis-server 脚本 脚本内容看 [gist 传送门] 做 init 脚本软连接到 /etc/init.d
因为 service 命令寻找的是 /etc/init.d 下的脚本名字:
ln -sf /opt/redis/init/redis-server /etc/init.d/

2. 编译 LuaJIT

cd LuaJIT-2.0.3
vim Makefile # 修改
内容如下:
export PREFIX= /opt/luajit/2.0.3
保存退出编译
make
sudo make install
cd /opt/luajit/
ln -sfn 2.0.3 default # 建立软链接

3. 编译 nginx

cd /your_build_path/ # 找一个用于编译工作的目录
1) 首先下载nginx 第三方模块
nginx 开发模块, 目录名是 ngx_devel_kit

git clone https://github.com/simpl/ngx_devel_kit.git
nginx lua 模块, 目录名是 lua-nginx-modul

git clone https://github.com/chaoslawful/lua-nginx-module.git
nginx lua调用的 redis 接口脚本, 目录名是 lua-resty-redis

git clone https://github.com/agentzh/lua-resty-redis.git
nginx lua调用的上传模块脚本, 目录名是 lua-resty-upload

git clone https://github.com/openresty/lua-resty-upload.git
mkdir -p /opt/nginx/1.6.2

放置 init 脚本的路径, 稍后会做软链接
mkdir -p /opt/nginx/init

放置 pid 文件, init 脚本判断状态阅读需要
mkdir -p /opt/nginx/run

daemon 模式时, init 脚本以文件方式上锁, 防止重复 start 进程
mkdir -p /opt/nginx/lock

tmp 文件, nginx client buffer 缓存文件会在这里生成,
以及进程产生的临时文件
mkdir -p /opt/nginx/tmp/client
mkdir -p /opt/nginx/tmp/proxy
mkdir -p /opt/nginx/tmp/fcgi

nginx 启动时加载配置文件 /opt/nginx/default/conf/nginx.conf
里面会调用 include 语法, 加载指定的配置文件, 为了方便管理和规划,
建议自己自定义文件统一放在规划目录下:
eg:
nginx.conf 里配置: include /opt/nginx/sites-available/*.conf;

存放合法的配置文件或者生效的
mkdir /opt/nginx/sites-available

存放暂时不需要的或者已经废弃的配置(可做备份)
mkdir -p /opt/nginx/sites-disable

存放 Lua 依赖脚本的路径
mkdir -p /opt/nginx/lua/share
存放 Lua c lib
mkdir -p /opt/nginx/lua/lib
存放业务的lua脚本(开发人员自己编写的)
mkdir -p /opt/nginx/lua/app

因此在 nginx conf 配置文件中, http 模块或者 server 模块
添加上如下配置信息(Lua 依赖的路径, 假设 Lua5.1版本):
lua_package_path “/opt/nginx/lua/share/?.lua;”;
lua_package_cpath “/opt/nginx/lua/lib/?.so;/opt/luajit/default/lib/lua/5.1/?.so;”;
而在location 块中执行的 Lua 脚本, 出现 content_by_lua_file 语法,
则可以指定执行的脚本存在 /opt/nginx/lua/app 路径下

日志路径
mkdir -p /var/log/nginx

下载的源码包也在与上面模块一样的根目录下, 然后解压, 进入源码文件夹:
cd nginx-1.6.2
configure 编译:

# configure 编译  
./configure \
    --prefix=/opt/nginx/1.6.2/ \
    --error-log-path=/var/log/nginx/error.log \
    --pid-path=/opt/nginx/run/nginx.pid  \
    --lock-path=/opt/nginx/lock/nginx.lock \
    --user=nginx \
    --group=nginx \
    --with-http_ssl_module \
    --with-http_realip_module \
    --with-http_flv_module \
    --with-http_gzip_static_module \
    --http-log-path=/var/log/nginx/access.log \
    --http-client-body-temp-path=/opt/nginx/tmp/client/ \
    --http-proxy-temp-path=/opt/nginx/tmp/proxy/ \
    --http-fastcgi-temp-path=/opt/nginx/tmp/fcgi/ \
    --add-module=../ngx_devel_kit \
    --add-module=../lua-nginx-module 
登录后复制

编译执行:
make && sudo make install

部署 Lua 依赖脚本:
mkdir /opt/nginx/lua/share/restry
cp lua-restry-redis/lib/restry/redis.lua /opt/nginx/lua/share/restry/
cp lua-restry-upload/lib/restry/upload.lua /opt/nginx/lua/share/restry/

在 /opt/nginx/default/conf/nginx.conf 里配置的例子:

# 主配置文件的参数例子
# 进程数设置是 cpu核数-2, nginx master 进程只accept连接
# 例如4cpu, processes 数3
worker_processes  3; 
# 根据生产服务场景设置, 基于 LuaJIT 的nginx, lua vm 内存最大承载 1G, 
# 占用内存有限, 连接数尽量设置在合理范围之内, 待测试
events {
 worker_connections  1024;   
}
# http 块设置
http {
    lua_code_cache on; # debug 情况下 off, 方便调试
    lua_package_path "/opt/nginx/lua/share/?.lua;";
    # 如果有luajit支持,需要添加该路径
    lua_package_cpath "/opt/nginx/lua/lib/?.so;/opt/luajit/default/lib/lua/5.1/?.so;"; 
    server_tokens off; # 关闭 nginx 的版本信息(对外)
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    error_log /var/log/nginx/error.log error;
    sendfile off; #
    # 禁止了nagle算法, 即数据即时发送出去, 而不是刻意控制拥塞
    tcp_nopush off; 
    keepalive_timeout 65;
    
    gzip on;
    
    # 业务配置
    include /opt/nginx/sites-available/*.conf;
}  
登录后复制

nginx 服务的启动文件 [gist 传送门] 存放在 /opt/nginx/init/nginx
做软链接:
ln -sf /opt/nginx/init/nginx /etc/init.d/

Nginx + LuaJIT + Redis 的配置大致的手工流程描述完毕.

总结源码编译服务工具的思路:

1. 了解 Makefile 里通常会有 PREFIX 这样的关键字,
它定义了最终的编译生成路径, 无论是 configure 指定 –prefix 参数
还是Makefile 里直接修改都是可以的.

2. 尽量不安装在默认的 /usr/local/ 下, 建议选择 /opt/ 或者
/your_self_define/ 自定义的路径, 统一放置, 无论是开发环境还是
生产环境, 干净的依赖环境有利于调试和部署.

3. 工具版本的依赖里定义一个 default 软链接, 以方便版本切换, 这是一个建议习惯.


题外话:

0. 今年4月份 曾经在自己主机上 Nginx + Lua + Redis, Lua基于
LuaJIT解释器, 使用apache jmeter做并发连接测试, 在 512M内存的虚拟主机
同时 1000的连接, 每个连接一次请求对主机的cpu也只是瞬时的90%, 而所有请求都
正常返回结果, 承载高并发的 http 短连接请求稳定性在主机上测试还是可靠的, 而用
Node.js 跑了同样的服务, 会发生请求失败, 失败次数在5%左右. 当然, 测试的
环境条件也有其他影响, 比如 js的代码和依赖的库相比于 Lua的代码复杂. 如果
业务简单, 使用 Node.js + Redis 是成本最低的解决方案. 而 Nginx
方案主要在配置精力上和迁移性(Nginx bin文件, LuaJIT解释器), 做 Demo
或者需求经常变化的场景, Node.js 的部署是较为方便的.

1. 部署工具在不断更新, 也有了 Docker 这样的工具, 减少了开发者了解发行版
之间的差异的成本, 运维工程师这个职业也会有新的挑战和认识, 也许会转向更
后台和底层的方向发展, 或者以 DevOps 的方式出现.

2. 互联网行业创业是一个流行的活动, 以开发工程师为主的初创团队在运维上
经验不足, 在人力成本和招人困难的情况下会优先选择对开发者友好的开源运维
工具. 例如常用的运维开源工具就有:
部署工具 SaltStack, Puppet, Jenkins
监测工具 Nagios Zabbix
日志收集 Logstash
进程管理工具 Supervisor
然而这并不表示不需要合格的运维工程师, 或者是为开发者服务的工程师. 至于
需要的程度, 每一位开发者都会根据自己的工作经历和体会去感受 :)

原创文章,转载请注明: 转载自kaka_ace's blog

本文链接地址: Nginx + LuaJIT + Redis 编译配置教程

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1664
14
CakePHP 教程
1423
52
Laravel 教程
1317
25
PHP教程
1268
29
C# 教程
1246
24
docker怎么启动容器 docker怎么启动容器 Apr 15, 2025 pm 12:27 PM

Docker 容器启动步骤:拉取容器镜像:运行 "docker pull [镜像名称]"。创建容器:使用 "docker create [选项] [镜像名称] [命令和参数]"。启动容器:执行 "docker start [容器名称或 ID]"。检查容器状态:通过 "docker ps" 验证容器是否正在运行。

docker容器名称怎么查 docker容器名称怎么查 Apr 15, 2025 pm 12:21 PM

可以通过以下步骤查询 Docker 容器名称:列出所有容器(docker ps)。筛选容器列表(使用 grep 命令)。获取容器名称(位于 "NAMES" 列中)。

docker怎么创建容器 docker怎么创建容器 Apr 15, 2025 pm 12:18 PM

在 Docker 中创建容器: 1. 拉取镜像: docker pull [镜像名] 2. 创建容器: docker run [选项] [镜像名] [命令] 3. 启动容器: docker start [容器名]

如何利用Redis缓存方案高效实现产品排行榜列表的需求? 如何利用Redis缓存方案高效实现产品排行榜列表的需求? Apr 19, 2025 pm 11:36 PM

Redis缓存方案如何实现产品排行榜列表的需求?在开发过程中,我们常常需要处理排行榜的需求,例如展示一个�...

centos redis如何配置慢查询日志 centos redis如何配置慢查询日志 Apr 14, 2025 pm 04:54 PM

在CentOS系统上启用Redis慢查询日志,提升性能诊断效率。以下步骤将指导您完成配置:第一步:定位并编辑Redis配置文件首先,找到Redis配置文件,通常位于/etc/redis/redis.conf。使用以下命令打开配置文件:sudovi/etc/redis/redis.conf第二步:调整慢查询日志参数在配置文件中,找到并修改以下参数:#慢查询阈值(毫秒)slowlog-log-slower-than10000#慢查询日志最大条目数slowlog-max-len

centos7 如何安装redis centos7 如何安装redis Apr 14, 2025 pm 08:21 PM

从 Redis 官方源下载源码包编译安装,保证最新稳定版本,可个性化定制。具体步骤如下:更新软件包列表创建 Redis 目录下载 Redis 源码包解压源码包编译安装配置并修改 Redis 配置启动 Redis检查启动状态

在Nginx和Apache之间进行选择:适合您的需求 在Nginx和Apache之间进行选择:适合您的需求 Apr 15, 2025 am 12:04 AM

NGINX和Apache各有优劣,适合不同场景。1.NGINX适合高并发和低资源消耗场景。2.Apache适合需要复杂配置和丰富模块的场景。通过比较它们的核心特性、性能差异和最佳实践,可以帮助你选择最适合需求的服务器软件。

REDIS的角色:探索数据存储和管理功能 REDIS的角色:探索数据存储和管理功能 Apr 22, 2025 am 12:10 AM

Redis在数据存储和管理中扮演着关键角色,通过其多种数据结构和持久化机制成为现代应用的核心。1)Redis支持字符串、列表、集合、有序集合和哈希表等数据结构,适用于缓存和复杂业务逻辑。2)通过RDB和AOF两种持久化方式,Redis确保数据的可靠存储和快速恢复。

See all articles