碳基体

奋斗在产品安全第一线的安全妹子

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/nginx


2.安装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来管理fastcig

apt-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

(2)如果选择php-fpm来管理fastcgi

/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

https://nginx.org

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. 关闭nginx

ps -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

来源:碳基体

评论