共计 5722 个字符,预计需要花费 15 分钟才能阅读完成。
前面一节中,我们初体验了 Nginx 的安装以及使用浏览器访问自己的 html 页面,Nginx 作为一个优秀的 WEB 服务器,如果只是支持静态页面,那么整个互联网数据就没法和用户进行沟通。那么有童鞋就问了,为什么静态页面就没法和用户沟通了?
因为一个网站如果要想和用户沟通,那么就必须允许用户进行数据的输入与提交,从技术角度来讲,就是我们常说的动态网页,除了动态网页还不够,我们还必须存储用户提交的数据,比如:评论、留言等。那么这些就是我们今天要讲的一个后台 Service,LNMP 架构的实现,即 Linux+Nginx+Mysql+PHP,其中 PHP 就是一种网页制作动态语言,当然除了它,我们还有 Perl、Python、Jsp、Asp 等动态网页脚本语言,而 LNMP 架构是当前互联网中使用最广泛的架构之一。
今天我们要讲的与网上绝大多数的 LNMP 架构搭建可能都不太一样,网上绝大多数文章一上来就是使用源码,各种编译,各种找编译问题,想要看源码编译折腾的童鞋可以看我另外一篇文章:https://www.guoziweb.com/?p=748 而本文中,我尽量以一种简洁快速的方式让大家轻松实现,到底有多简洁呢?请看下文。
1、安装 PHP-FPM 和 MYSQL
在 CentOS 系统中,很容易安装这两样服务,那么为什么是安装 PHP-FPM 而不是 PHP 呢?
PHP-FPM 其实是 PHP 的 5.3 版本就内置添加进来的一个第三方插件,现在既然是内置了,那么就不存在第三方的说法了,直接变成私有的东西。它的存在就是为了作为 FCGI 技术解决 Nginx 本身不能解析 PHP 脚本设计,并不是说 Nginx 做得不够强大,而是它做得足够灵活,它能提供各种第三方接口,以体现其强大的灵活性。
关于 FCGI 技术的解释这里就不作多写了,有兴趣的童鞋可以自行上百度或谷歌查阅。好了,安装我们还是使用 yum 在线安装的方式,这就是前面我们提到的简洁的方式(其实我们 Nginx 也可以使用 yum 在线安装方式,只是因为我们后面会涉及到开发 Nginx 模块,所以使用了源码编译的方式,让大家深入了解下)。
yum -y install php-fpm php-* mysql-server
怎么样?是不是很简单,我们安装了 php-fpm 模块,为了避免少 PHP 扩展库,我们把所有的 php 扩展库都安装上了,同时也安装好了 mysql 的 server 端。我们可以使用如下命令继续查看 php-fpm 安装的具体位置:
[root@localhost ~]# rpm -qa | grep php-fpm
php-fpm-5.3.3-46.el6_6.x86_64
[root@localhost ~]# rpm -ql php-fpm-5.3.3-46.el6_6.x86_64
/etc/logrotate.d/php-fpm
/etc/php-fpm.conf
/etc/php-fpm.d
/etc/php-fpm.d/www.conf
/etc/rc.d/init.d/php-fpm
/etc/sysconfig/php-fpm
/usr/sbin/php-fpm
/usr/share/doc/php-fpm-5.3.3
/usr/share/doc/php-fpm-5.3.3/LICENSE
/usr/share/doc/php-fpm-5.3.3/php-fpm.conf.default
/usr/share/fpm/status.html
/usr/share/man/man8/php-fpm.8.gz
/var/log/php-fpm
/var/run/php-fpm
2、开始配置
我们先把 /etc/php-fpm.conf 备份下,同时去掉所有注释和空行语句:
cp /etc/php-fpm.conf /etc/php-fpm.conf.bak
grep -Ev '^(;|$)' /etc/php-fpm.conf.bak >/etc/php-fpm.conf
查看下该配置文件内容如下:
include=/etc/php-fpm.d/*.conf
[global]
pid = /var/run/php-fpm/php-fpm.pid
error_log = /var/log/php-fpm/error.log
daemonize = no
这时,我们在 /etc/php-fpm.d/ 目录下会发现有一个 www.conf 文件,我们如法炮制:
cd /etc/php-fpm.d
cp www.conf www.conf.bak
grep -Ev '^(;|$)' www.conf.bak > www.conf
从现在开始,我们下面的配置字段将都不做解释,你只管按我的配置好就行了,随着学习的慢慢深入,我们后面会接触到。
我们将其中的 user 和 group 字段值修改成 www,listen 字段值修改成 /tmp/php-fcgi.sock,为了和 Nginx 接口进行对接,修改了一些参数,最后的内容如下:
[www]
listen = /tmp/php-fcgi.sock
listen.allowed_clients = 127.0.0.1
user = www
group = www
pm = dynamic
pm.max_children = 5
pm.start_servers = 3
pm.min_spare_servers = 1
pm.max_spare_servers = 3
slowlog = /var/log/php-fpm/www-slow.log
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/sessionchroot = /var/www/html
注意,这里边增加了一行配置 chroot = /var/www/html 这是后面我们 WEB 目录配置的根目录。
上一节中,我们将 Nginx 的配置文件放在:/usr/local/nginx/nginx.conf,我们修改 nginx.conf 的内容修改成如下(你现在不需要懂这些配置,我们先只管运行起来再说,透过现象看本质):
worker_processes 1;
user www www;
error_log logs/error.log;
events {worker_connections 1024;}
http {
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"';
access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
gzip on;
server {
listen 80;
server_name localhost;
charset utf-8;
location / {
root /var/www/html;
index index.html index.htm index.php;
if (!-e $request_filename) {rewrite ^/(.*)$ /index.php/$1 last;
break;
}
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {root /var/www/html;}
location ~ \.php($|/) {
set $script $uri;
set $path_info "/";
if ($uri ~ "^(.+\.php)(/.+)") {
set $script $1;
set $path_info $2;
}
fastcgi_pass unix:/tmp/php-fcgi.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param PATH_INFO $path_info;
fastcgi_param SCRIPT_FILENAME $document_root$script;
}
}
}
到目前为止,我们还缺少一个 nginx 的启动脚本,这里我也写好了,直接粘贴放到 /etc/init.d/nginx 文件中即可:
#! /bin/sh
# chkconfig: 2345 55 25
# Description: Startup script for nginx webserver on Debian. Place in /etc/init.d and
# run 'update-rc.d -f nginx defaults', or use the appropriate command on your
# distro. For CentOS/Redhat run: 'chkconfig --add nginx'
### BEGIN INIT INFO
# Provides: nginx
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts the nginx web server
# Description: starts nginx using start-stop-daemon
### END INIT INFO
# Author: guozi
# website: http://lnmp.org
. /etc/init.d/functions
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
NAME=nginx
NGINX_BIN=/usr/local/nginx/sbin/$NAME
CONFIGFILE=/usr/local/nginx/$NAME.conf
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
case "$1" in
start)
echo -n "Starting $NAME... "
if netstat -tnpl | grep -q nginx;then
echo "$NAME (pid `pidof $NAME`) already running."
exit 1
fi
$NGINX_BIN -c $CONFIGFILE
if ["$?" != 0] ; then
echo " failed"
exit 1
else
echo " done"
fi
;;
stop)
echo -n "Stoping $NAME... "
if ! netstat -tnpl | grep -q nginx; then
echo "$NAME is not running."
exit 1
fi
$NGINX_BIN -s stop
for nid in `ps aux | grep "nginx:" | grep -v grep | awk '{print $1}'`
do
kill -9 $nid >/dev/null 2>&1
done
if ["$?" != 0] ; then
echo " failed. Use force-quit"
exit 1
else
echo " done"
fi
;;
status)
if netstat -tnpl | grep -q nginx; then
PID=`pidof nginx`
echo "$NAME (pid $PID) is running..."
else
echo "$NAME is stopped"
exit 0
fi
;;
force-quit)
echo -n "Terminating $NAME... "
if ! netstat -tnpl | grep -q nginx; then
echo "$NAME is not running."
exit 1
fi
kill `pidof $NAME`
if ["$?" != 0] ; then
echo " failed"
exit 1
else
echo " done"
fi
;;
restart)
$SCRIPTNAME stop
sleep 1
$SCRIPTNAME start
;;
reload)
echo -n "Reload service $NAME... "
if netstat -tnpl | grep -q nginx; then
$NGINX_BIN -s reload
echo " done"
else
echo "$NAME is not running, can't reload."
exit 1
fi
;;
configtest)
echo -n "Test $NAME configure files... "
$NGINX_BIN -t
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|force-quit|restart|reload|status|configtest}"
exit 1
;;
esac
接着再对 /etc/init.d/nginx 赋与可执行权限并添加到开机启动项中:
chmod a+x /etc/init.d/nginx
chkconfig nginx on
3、启动所有服务
/etc/init.d/php-fpm start
/etc/init.d/nginx start
4、测试一下
我们在 /var/www/html 目录中创建一个 1.php 文件,内容如下:
<?php
echo phpinfo();
?>
接着在网页中访问链接:http://192.168.128.7/1.php 效果如下图:
好了,今天就至此为止了,大家有任何疑问都可以给我留言哦
如果需要一键安装脚本,请访问我的 github 链接:
