Debian上搭建Nginx+LUA+PHP+PHP-FPM+MySQL环境
随着Nginx服务器变得炙手可热,个人免费网站的LAMP(linux+apache2+mysql+php)架构逐渐转变为了LNMP(linux+nginx+mysql+php)架构。当然也有多种服务器混用的情况,例如用nginx+lua做前端服务器,apache做后端服务器,lighttpd做图片服务器。
本文介绍两种搭建Nginx环境的方法。如果只是简单的使用nginx的web server功能(简单的搭建一个LNMP网站),可以采用软件包的安装方式。如果需要对Nginx进行二次开发,则建议采用手动编译的方式。
下面以Debian环境为例。详细介绍两种方法。
一、软件包安装
1. 安装Nginx
sudo apt-get install nginx
Nginx重要文件路径:配置文件 /etc/nginx/nginx.conf
虚拟主机的配置在:/etc/nginx/sites-available/
默认web根目录 /usr/share/nginx/www/default
日志/var/log/nginx2.安装PHP,MySQL,CGI相关模块
(1)安装php,mysql
apt-get install php5 php5-cli php5-cgi php5-dev mysql-server php5-mysql php5-gd php5-mcrypt php5-curl
PHP重要文件路径:/etc/php5/cgi/php.ini
/usr/bin/php5-cgi
(2)安装fastcgi管理模块
nginx采用fastcgi的模式运行php,一般有两种搭配
ngix + php+ spawn-fcgi
ngix + php + PHP-FPM(主流)
补充知识:PHP在不同web服务器上的运行模式常用搭配
a)Apache+mod_php5
b)Lighttp+spawn-fcgi
c)Nginx+PHP-FPM
如果选择spawn-fcgi来管理fastcgi
apt-get install spawn-fcgi
如果选择php-fpm来管理fastcigapt-get install php5-fpm
3. 配置nginx
vim /etc/nginx/sites-available/default
server{
listen 80;
server_name localhost;
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/$fastcgi_script_name;
}
4. 启动fastcgi
(1)如果选择spawn-fcgi来管理fastcgi
配置为开机自动运行
vim /etc/rc.local
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u www-data -g www-data -f /usr/bin/php-cgi
/etc/init.d/php5-fpm start
5.启动nginx测试nginx配置文件是否正确
nginx -t -c /etc/nginx/nginx.conf或者 service nginx configtest
启动nginx -c /etc/nginx/nginx.conf
service nginx start
二、手动编译安装
1. Nginx安装前准备
(1)编译环境
aptitude install gcc g++ autoconf automake build-essential
(2)模块依赖
zlib(gzip模块)
aptitude install zlib1g-dev
pcre(rewrite模块)下载pcre
https://sourceforge.net/projects/pcre/files/pcre/(参考https://www.pcre.org/)
cd /root/nginx
下载pcre源码包
tar zxvf pcre-8.33.tar.gz
openssl(ssl模块)
aptitude install libssl-dev
2. 安装luaJIT及相关模块
(1)安装luajit
cd /root/nginx
wget https://luajit.org/download/LuaJIT-2.0.2.tar.gz
tar zvxf LuaJIT-2.0.2.tar.gz
cd LuaJIT-2.0.2
make
make install PREFIX=/opt/tanjiti/luajit #PREFIX指定luajit的安装路径,默认安装在/usr/local下
安装成功后会生成以下文件
可执行文件/opt/tanjiti/luajit/bin/
库文件 /opt/tanjiti/luajit/lib/
共享文件/opt/tanjiti/luajit/share/
头文件/opt/tanjiti/luajit/include/
(2)安装lua常用模块——lua-csjon (lua5.1) (cjson处理库)
https://www.kyne.com.au/~mark/software/lua-cjson.php
https://github.com/efelix/lua-cjson
cd /root/nginx
wget https://www.kyne.com.au/~mark/software/download/lua-cjson-2.1.0.tar.gz
tar zxvf lua-cjson-2.1.0.tar.gz
cd lua-cjson-2.1.0
make install PREFIX=/opt/tanjiti/luajit LUA_INCLUDE_DIR=/opt/tanjiti/luajit/include/luajit-2.0/
#PREFIX指定lua-cjson的安装路径,默认安装在/usr/local下
安装成功后会生成以下文件/opt/tanjiti/luajit//lib/lua/5.1/cjson.so
(3)安装lua常用模块——sha2 (lua5.1)
https://code.google.com/p/sha2/
cd /root/nginx
git clone https://code.google.com/p/sha2/
cd sha2/
gcc -L /opt/tanjiti/luajit/lib/ -I /opt/tanjiti/luajit/include/luajit-2.0/ -I. sha2.c sha2lib.c -DSHA2_USE_INTTYPES_H -DBYTE_ORDER -DLITTLE_ENDIAN -shared -fPIC -o /opt/tanjiti/luajit/lib/lua/5.1/sha2.so
安装成功后会生成以下文件
/opt/tanjiti/luajit//lib/lua/5.1/sha2.so
(4)安装lua常用模块——lua-iconv (字符转换库)
https://ittner.github.io/lua-iconv
cd /root/nginx
wget https://github.com/downloads/ittner/lua-iconv/lua-iconv-7.tar.gz
tar zxvf lua-iconv-7.tar.gz
cd lua-iconv-7
make install CFLAGS="-I/opt/tanjiti/luajit/include/luajit-2.0 -O3 -Wall -fPIC" LFLAGS="-shared" INSTALL_PATH="/opt/tanjiti/luajit/lib/lua/5.1"
CFLAGS 指定头文件的路径
LFLAGS 指定库文件编译选项
INSTALL_PATH指定库文件安装位置
安装成功后会生成以下文件
/opt/tanjiti/luajit//lib/lua/5.1/iconv.so
(5)安装lua常用模块——luasocket(网络通信库)
https://w3.impa.br/~diego/software/luasocket/
https://files.luaforge.net/releases/luasocket/luasocket
cd /root/nginx
wget https://files.luaforge.net/releases/luasocket/luasocket/luasocket-2.0.2/luasocket-2.0.2.tar.gz
tar zxvf luasocket-2.0.2.tar.gz
cd luasocket-2.0.2
make LUAINC="-I/opt/tanjiti/luajit/include/luajit-2.0"
make install INSTALL_TOP_SHARE=/opt/tanjiti/luajit/share/luajit-2.0.2/ INSTALL_TOP_LIB=/opt/tanjiti/luajit/lib/lua/5.1/
LUAINC指定头文件的路径INSTALL_TOP_SHARE指定共享文件安装位置
INSTALL_TOP_LIB指定库文件安装位置
安装成功后会生成以下文件
/opt/tanjiti/luajit/lib/lua/5.1/socket/core.so
/opt/tanjiti/luajit/lib/lua/5.1/mine/core.so
/opt/tanjiti/luajit/share/luajit-2.0.2/ltn12.lua
/opt/tanjiti/luajit/share/luajit-2.0.2/mime.lua
/opt/tanjiti/luajit/share/luajit-2.0.2/socket.lua
/opt/tanjiti/luajit/share/luajit-2.0.2/socket/
3. 安装Nginx及相关模块
(1)下载nginx
cd /root/nginx
wget https://nginx.org/download/nginx-1.4.4.tar.gz
tar zxvf nginx-1.4.4.tar.gz
(2)下载ngx_devel_kit (nginx开发包)
参考https://github.com/simpl/ngx_devel_kit
git clone https://github.com/simpl/ngx_devel_kit.git
(3)下载 lua-nginx-module (nginx lua扩展模块)
参考 https://github.com/chaoslawful/lua-nginx-module
git clone https://github.com/chaoslawful/lua-nginx-module.git
(4)下载echo-nginx-module(提供直接在 Nginx 配置使用包括 "echo", "sleep", "time" 等指令)
https://github.com/agentzh/echo-nginx-module#installation
git clone https://github.com/agentzh/echo-nginx-module.git
(5) 下载ngx_pagespeed (nginx PageSpeed模块,注意:启用pagespeed模块,需要足够的memory)
https://github.com/pagespeed/ngx_pagespeed
wget https://github.com/pagespeed/ngx_pagespeed/archive/v1.7.30.3-beta.zip
unzip v1.7.30.3-beta.zip
cd ngx_pagespeed-1.7.30.3-beta/
wget https://dl.google.com/dl/page-speed/psol/1.7.30.3.tar.gz
tar zxvf 1.7.30.3.tar.gz
(6)编译Nginx
cd nginx-1.4.4/
./configure \
> --prefix=/opt/tanjiti/nginx \ #指向安装目录
> --with-debug \ #启用debug日志
> --with-pcre=../pcre-8.33/ \ #指向pcre库文件目录
> --with-pcre-jit \#编译PCRE包含“just-in-time compilation”
> --with-http_stub_status_module \ #启用ngx_http_stub_status_module支持(获取nginx自上次启动以来的工作状态)
> --with-http_gunzip_module \ #ngx_http_gunzip_module是个过滤模块,这个模块为那些不支持gzip模块的客户端解压缩gzip格式相应的相应
> --with-http_gzip_static_module \ #启用ngx_http_gzip_static_module支持(在线实时压缩输出数据流)
> --with-http_ssl_module \ # 启用ngx_http_ssl_module支持(使支持https请求,需已安装openssl)
> --add-module=../ngx_devel_kit/ \ #启用外部模块
> --add-module=../lua-nginx-module/ \ #启用外部模块
> --add-module=../echo-nginx-module/ \ #启用外部模块
> --add-module=../ngx_pagespeed-1.7.30.3-beta/ \ #启用外部模块
> --without-http_uwsgi_module \ #禁用ngx_http_uwsgi_module支持(该模块用来医用uwsgi协议,uWSGI服务器相关)
> --without-http_scgi_module \ #禁用ngx_http_scgi_module支持(该模块用来启用SCGI协议支持,SCGI协议是CGI协议的替代。它是一种应用程序与HTTP服务接口标准。它有些像FastCGI但他的设计 更容易实现。)
> --with-ld-opt="-Wl,-rpath,/opt/tanjiti/luajit/lib/" #设置连接文件参数
make -j2
make install
安装成功后会生成以下文件
nginx可执行文件: "/opt/tanjiti/nginx/sbin/nginx"
nginx 配置文件夹: "/opt/tanjiti/nginx/conf/nginx.conf"
nginx pid文件: "/opt/tanjiti/nginx/logs/nginx.pid"
nginx 错误日志文件: "/opt/tanjiti/nginx/logs/error.log"
nginx 访问日志文件: "/opt/tanjiti/nginx/logs/access.log"
编译中可能遇到的错误
1.中途如果报错:configure: error: You need a C++ compiler for C++ support
需要安装g++
aptitude install g++
2.中途如果报错:collect2: error: ld terminated with signal 9 [Killed]
原因:编译阶段内存占用过多,内存不足,或者是没有设置足够的swap空间
解决办法:加内存条。。。
更多的编译选项参考https://www.ttlsa.com/nginx/nginx-configure-descriptions/
4. 测试是否成功
vim /opt/tanjiti/nginx/conf/nginx.conf
添加
location /hello {
default_type "text/plain";
content_by_lua 'ngx.say("hello,lua,TANJITI")';
}
curl 127.0.1/hello
hello,lua,TANJITI
三、nginx常用命令
1. 使用信号控制nginx的启动
(1)TERM, INT 快速关闭
kill -TERM `cat /opt/tanjiti/nginx/logs/nginx.pid`
或者
kill -INT `cat /opt/tanjiti/nginx/logs/nginx.pid`
(2)QUIT 从容关闭
kill -QUIT `cat /opt/tanjiti/nginx/logs/nginx.pid`
(3) HUP 平滑重启,重新加载配置文件
kill -HUP `cat /opt/tanjiti/nginx/logs/nginx.pid`
(4)USR1 重新打开日志文件,在切割日志时用途较大
kill -USR1 `cat /opt/tanjiti/nginx/logs/nginx.pid`
(5)USR2 平滑升级可执行文件
kill -USR2 `cat /opt/tanjiti/nginx/logs/nginx.pid`
(6)WINCH 从容关闭工作进程
2. 测试配置文件语法是否通过
/opt/tanjiti/nginx/sbin/nginx -t -c /opt/tanjiti/nginx/conf/nginx.conf
3. 启动nginx/opt/tanjiti/nginx/sbin/nginx -c /opt/tanjiti/nginx/conf/nginx.conf
4. 重新加载配置文件/opt/tanjiti/nginx/sbin/nginx -s reload
5. 关闭nginxps -ef | grep nginx | awk '{print $2}' | xargs kill -9
或者
pkill nginx
或者
/opt/tanjiti/nginx/sbin/nginx -s stop
四、日志管理
1. 日志格式设置
参考https://danqingdani.blog.163.com/blog/static/186094195201402743852655/ 二、Nginx部分
2. 日志管理
(1)方法一:手动编写脚本,以下示例是按天切割
cd /usr/local/nginx/sbin/
vim cut_nginx_log.sh
#!/bin/bash
logs_path="/usr/local/nginx/logs/"
mkdir -p ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/
mv ${logs_path}tanjiti.access.log ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/tanjiti.access_$(date -d "yesterday" +"%Y%m%d").log
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
配置为每天0点定时执行
chmod +x cut_nginx_log.sh
crontab -e
添加
00 00 * * * /bin/bash /usr/local/nginx/sbin/cut_nginx_log.sh
(2)方法二:使用成熟的日志管理工具
以logrotate为例
apt-get install logrotate
vim /etc/logrotate.d/nginx_logcut
/usr/local/nginx/logs/*.log {
hourly #转储周期为每天
rotate 4 # 指定日志文件删除之前转储的次数
copytruncate #用于还在打开中的日志文件,把当前日志备份并截断
nocompress #不需要压缩时,用这个参数
missingok #表示找不到log文件也没关系
#postrotate script run once
sharedscripts #有的日志文件都轮转完毕后统一执行一次脚本
postrotate
if [ -f /usr/local/nginx/logs/nginx.pid ];then
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
fi
endscript
}
crontab执行logrotate,按小时执行
0 * * * * /usr/sbin/logrotate -f /etc/logrotate.d/nginx
来源:碳基体
评论