阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

编译LNMP之Nginx+php-fpm

206次阅读
没有评论

共计 7563 个字符,预计需要花费 19 分钟才能阅读完成。

本文目录:
1 编译 nginx
2 编译 php
3 配置 nginx 和 php-fpm 交互

 

1. 编译 nginx

rpm 包格式的 nginx 地址:http://nginx.org/packages/
源码包下载地址:http://nginx.org/en/download.html。本文下载的是最新稳定版 nginx-1.12.1。

shell> groupadd -r nginx
shell> useradd -r -g nginx nginx
shell> wget http://nginx.org/download/nginx-1.12.1.tar.gz
shell> tar xf nginx-1.12.1.tar.gz
shell> cd nginx-1.12.1
shell> ./configure \
  --user=nginx \
  --group=nginx \
  --prefix=/usr/local/nginx-1.12.1 \
  --error-log-path=/var/log/nginx/error.log \
  --http-log-path=/var/log/nginx/access.log \
  --pid-path=/var/run/nginx/nginx.pid  \
  --lock-path=/var/lock/subsys/nginx \
  --with-http_ssl_module \
  --with-http_flv_module \
  --with-http_stub_status_module \
  --with-http_gzip_static_module \
  --with-pcre \
  --with-threads 

shell> make && make install
shell> ln -s /usr/local/nginx-1.12.0 /usr/local/nginx

./configure过程中,–with-XX_module 的表示启用某模块即功能,–without-XX_module 表示禁用模块即功能。在 ./configure --help 的结果中,出现 –with-XX_module 的表示 XX 模块默认是禁用的,需要手动启用,出现 –without-XX_module 表示 XX 模块默认是启用的,需要手动禁用。以下是一些常见选项的说明:

--prefix=/usr/local/nginx-1.12.0             # 定义安装路径,不写时默认为 /usr/local/nginx
--sbin-path=                                 # 定义应用程序存放路径,不写时默认为 <prefix>/sbin/nginx
--conf-path=                                 # 定义配置文件路径,不写时默认为 <prefix>/conf/nginx.conf
--error-log-path=/var/log/nginx/error.log    # 在配置文件中没有指定 error log 时的错误日志路径,不写时默认为 <prefix>/logs/error.log
--http-log-path=/var/log/nginx/access.log    # 在配置文件中没有指定 access log 时的访问日志路径, 不写时默认为 <prefix>/logs/access.log
--pid-path=/var/run/nginx/nginx.pid          # pid 文件路径,没指定时默认为 <prefix>/logs/nginx.pid
--lock-path=/var/lock/subsys/nginx           # 锁文件路径
--user=nginx                                 # 在配置文件中没有指定 user 指定时,worker 进程的运行身份, 不写时默认为 nobody
--group=nginx                                # 在配置文件中没有指定 user(不是 group,配置文件中没有 group 指令)指定时,worker 进程的运行组

--with-select_module       # 启用 select 方法模型,当找不到 epoll 时自动启用 select
--without-select_module   
--with-poll_module         # 启用 poll 方法模型,当找不到 epoll 时自动启用 poll
--without-poll_module  

--with-http_ssl_module            # 启用 ssl 功能
--with-http_flv_module            # 启用 flv 视频流功能
--with-http_stub_status_module    # 启用 nginx 状态监控功能,在启动后在浏览器使用 root/status 显示状态信息
--with-http_gzip_static_module    # 启用 gzip 压缩功能压缩 web 服务器响应客户端的响应报文
--http-client-body-temp-path=/var/tmp/nginx/client   # 定义客户端请求报文主体的临时文件存放路径,不写为 <prefix>/client_body_temp
--http-proxy-temp-path=/var/tmp/nginx/proxy          # 定义从代理服务器收到的临时文件存放路径,不写为 <prefix>/proxy_temp
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi         # 定义从 fastcgi 服务器收到的临时文件存放路径,不写为 <prefix>/fastcgi_temp
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi          # 定义从 uwsgi 服务器收到的临时文件存放路径,不写为 <prefix>/uwsgi_temp
--http-scgi-temp-path=/var/tmp/nginx/scgi            # 定义从 scgi 服务器收到的临时文件存放路径,不写为 <prefix>/scgi_temp
--with-pcre                                          # 设置 pcre 库的路径,yum 安装的 pcre-devel 可以不写路径
--with-threads                                       # 设置 nginx 支持多线程

在前面的编译选项中,安装路径使用了版本号,且未指定程序目录和配置文件路径,虽说提供了它们很方便,但是在升级 nginx 版本有些麻烦。所以,通过最后一步建立软链接的方式,让一切都变得简单,可以将新旧版本的 nginx 分离开来。这种方式安装 nginx,配置文件默认为 /conf/nginx.conf,应用程序路径为 /sbin/nginx。

提供服务管理脚本 /etc/rc.d/init.d/nginx。

#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig:   - 85 15
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
["$NETWORKING" = "no" ] && exit 0

nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)

sysconfig="/etc/sysconfig/$prog"
lockfile="/var/lock/subsys/nginx"
pidfile="/var/run/nginx/nginx.pid"

NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"

[-f $sysconfig ] && . $sysconfig


start() {[ -x $nginx ] || exit 5
    [-f $NGINX_CONF_FILE ] || exit 6
    echo -n $"Starting $prog:"
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [$retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {echo -n $"Stopping $prog:"
    killproc -p $pidfile $prog
    retval=$?
    echo
    [$retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {configtest_q || return 6
    stop
    start
}

reload() {configtest_q || return 6
    echo -n $"Reloading $prog:"
    killproc -p $pidfile $prog -HUP
    echo
}

configtest() {$nginx -t -c $NGINX_CONF_FILE
}

configtest_q() {$nginx -t -q -c $NGINX_CONF_FILE
}

rh_status() {status $prog
}

rh_status_q() {rh_status >/dev/null 2>&1
}

# Upgrade the binary with no downtime.
upgrade() {local oldbin_pidfile="${pidfile}.oldbin"

    configtest_q || return 6
    echo -n $"Upgrading $prog:"
    killproc -p $pidfile $prog -USR2
    retval=$?
    sleep 1
    if [[-f ${oldbin_pidfile} && -f ${pidfile} ]];  then
        killproc -p $oldbin_pidfile $prog -QUIT
        success $"$prog online upgrade"
        echo 
        return 0
    else
        failure $"$prog online upgrade"
        echo
        return 1
    fi
}

# Tell nginx to reopen logs
reopen_logs() {configtest_q || return 6
    echo -n $"Reopening $prog logs:"
    killproc -p $pidfile $prog -USR1
    retval=$?
    echo
    return $retval
}

case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest|reopen_logs)
        $1
        ;;
    force-reload|upgrade) 
        rh_status_q || exit 7
        upgrade
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    status|status_q)
        rh_$1
        ;;
    condrestart|try-restart)
        rh_status_q || exit 7
        restart
        ;;
    *)
        echo $"Usage: $0 {start|stop|reload|configtest|status|force-reload|upgrade|restart|reopen_logs}"
        exit 2
esac

如果是 systemd 管理,则提供 /usr/lib/systemd/system/nginx.service。

[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/var/run/nginx/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.RedHat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /var/run/nginx/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true

[Install]
WantedBy=multi-user.target

最后,将 nginx 命令加入环境变量。

shell> echo 'export PATH=/usr/local/nginx/sbin:$PATH' > /etc/profile.d/nginx.sh
shell> . /etc/profile.d/nginx.sh

 

2. 编译 PHP

此处只给编译步骤,具体编译细节和编译选项说明见:编译 php

yum install -y bzip2-level libmcrypt-devel openssl-devel libxml2-devel

tar xf php-5.5.38.tar.bz2 -C /tmp
cd /tmp/php-5.5.38
./configure --prefix=/usr/local/php --with-openssl --enable-mbstring --enable-sockets --with-freetype-dir --with-jpeg-dir --with-png-dir --with-libxml-dir=/usr --enable-xml --with-zlib --with-mcrypt --with-bz2 --with-mhash --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-MySQL=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --enable-fpm

make
make install

# 提供 php 配置文件
cp php.ini-production /etc/php.ini

# 提供 php-fpm 服务管理脚本
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpmd
chmod +x /etc/init.d/phpfpmd

# 提供 php-fpm 配置文件
cd /usr/local/php/
cp etc/php-fpm.conf.default etc/php-fpm.conf

# 修改 php-fpm 配置文件(做实验的话改不改随意)
vim etc/php-fpm.conf
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 8

# 启动 php-fpm
service php-fpmd start

 

3. 配置 nginx 和 php-fpm 交互

在 nginx 配置文件中加入类似如下 location 容器。

location ~ \.php$ {root           /php/;
    fastcgi_pass   192.168.100.16:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

该 location 表示当请求的 url 能匹配以.php 结尾时,将以该容器的指令进行处理。root 指令将此容器的 document_root 设置为 /php/,fastcgi_pass 指令表示将该 url 请求代理至 192.168.100.16 主机上运行的 php-fpm,由于此处设置了 SCRIPT_FILENAME,所以当请求的 uri 为 /a/a.php 时,$document_root=/php/,$fastcgi_script_name=/a/a.php,这表示转发请求至 192.168.100.16 主机上的 /php/a/a.php。所以,在 php-fpm 所在主机 192.168.100.16 上必须将 a.php 放在事先已创建好的 /php/ 目录下,这和 nginx 主机上是否有 /php/ 目录无关。

这里的 include 包含的文件都是一些 fastcgi_param 指令,fastcgi_param 指令是 nginx 将相关参数赋值给 php-fpm 所需变量,并将它们传递给 php-fpm,使得 php-fpm 知道处理哪个文件、如何处理、处理的环境是如何的。

此处额外定义了一个 php-fpm 所需的变量 SCRIPT_FILENAME,因为该变量没有包含在 fastcgi_params 文件中。如果是 rpm 包安装的 nginx,则在 fastcgi.conf 文件中已包含该变量,此时简写为如下配置即可:

location ~ \.php$ {root           /php/;
    fastcgi_pass   192.168.100.16:9000;
    fastcgi_index  index.php;
    include        fastcgi.conf;
}

还需注意,fastcgi_index 在此处是多余的。该指令表示的是当代理请求至 php-fpm 上时,如果 uri 以 ”/” 结尾(严格地说,是 $fastcgi_script_name 的值以斜线结尾),则自动添加上此处指定的 index.php。但注意,此处的 location 的匹配条件是以.php 结尾,是不可能匹配以斜线结尾的,因此此处的 fastcgi_index 指令是多余的。但如果修改为如下配置:

location ~ .*php {root           /php/;
    fastcgi_pass   192.168.100.16:9000;
    fastcgi_index  index.php;
    include        fastcgi.conf;
}

则 fastcgi_index 是能派上用场的,例如请求的 uri 为 ”/a/php/”,则将执行 192.168.100.16 上的 /php/a/php/index.php 文件。

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-10/147535.htm

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-21发表,共计7563字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中