Linux实战教学笔记28:企业级LNMP环境应用实践

一,LNMP应用环境

1.1 LNMP介绍

大约在2010年之前,互联网公司最经常使用的经典Web服务环境组合就是LAMP(即Linux,Apache,MySQL,PHP),近几年随着Nginx Web服务的逐渐流行,又出现了新的Web服务环境组合--LNMP或LEMP,其中LNMP为Linux,Nginx,MySQL,PHP等首字母的缩写,而LEMP中的E则表示Nginx,它取自Nginx名字的发音(engine x)。如今,LNMP已经逐渐成为国内大中型互联网公司网站的主流组合环境,所以,咱们必须熟练掌握LNMP环境的搭建,优化及维护方法。php

1.2 LNMP组合工做流程

在深刻学习LNMP组合以前,有必要先来了解如下LNMP环境组合的基本原理,也就是它们之间究竟是怎样互相调度的?
在LNMP组合工做时,首先是用户经过浏览器输入域名请求Nginx Web服务,若是请求是静态资源,则由Nginx解析返回给用户;若是是动态请求(.php结尾),那么Nginx就会把它经过FastCGI接口(生产经常使用方法)发送给PHP引擎服务(FastCGI进程php-fpm)进行解析,若是这个动态请求要读取数据库数据,那么PHP就会继续向后请求MySQL数据库,以读取须要的数据,并最终经过Nginx服务把获取的数据返回给用户,这就是LNMP环境的基本请求顺序流程。这个请求流程是企业使用LNMP环境的经常使用流程。html

屏幕快照 2017-07-12 下午10.13.49.png-344.1kB

二,LNMP之MySQL数据库

2.1 MySQL数据库介绍

MySQL是互联网领域里很是重要的,深受广大用户欢迎的一款开源关系型数据库软件,由瑞典MySQL AB公司开发与维护。2006年,MySQL AB公司被SUN公司收购,2008年,SUN公司又被传统数据数据库领域大佬甲骨文(Oracle)公司收购。所以,MySQL数据库软件目前属于Oracle公司,但扔是开源的,Oracle公司收购MySQL的战略意图显而易见,其自身的Oracle数据库继续服务于传统大中型企业,而利用收购的MySQL抢占互联网领域数据库份额,完成其战略布局。
MySQL是一种关系型数据库管理软件,关系型数据库的特色是将数据保存在不一样的二维表中,而且将这些表放入不一样的数据库中,而不是把全部数据统一放在一个大仓库里,这样的设计增长了MySQL的读取速度,灵活性和可管理性也获得了很大提升。访问及管理MySQL数据库的最经常使用标准化语言为SQL结构化查询语言。python

2.2 为何选择MySQL数据库

目前,绝大多数使用Linux操做系统的互联网企业都使用MySQL做为后端的数据库,从大型的BAT门户,到电商门户平台,分类门户平台等无一例外。那么,MySQL数据库到底有哪些优点和特色,让你们绝不犹豫的选择它呢?mysql

缘由可能有如下几点linux

  1. 性能卓越,服务稳定,不多出现异常宕机。
  2. 开放源代码且无版权制约,自主性强,使用成本低。
  3. 历史悠久,社区及用户很是活跃,遇到问题,能够很快获取到帮助。
  4. 软件体积小,安装使用简单,而且易于维护,安装及维护成本低。
  5. 支持多种操做系统,提供多种API接口,支持多种开发语言,特别是对流行的PHP语言无缝支持。
  6. 品牌口碑效应,使得企业无需考虑就直接用之。

2.3 安装MySQL数据库

2.3.1 安装概览

MySQL有几种不一样的产品线,且每种产品线又有不少不一样的版本,这里选择当前企业使用最广的社区版MySQL5.5系列做为LNMP的组合环境数据库平台。
MySQL的安装方法也有不少,常见的方法以下图所示:nginx

屏幕快照 2017-07-14 上午10.45.30.png-854.4kB

备注:安装MySQL的注意事项以下:
(1)建议和以前介绍的Nginx服务安装在同一台机器上。
(2)重视操做过程的报错输出,有错误要解决掉再继续,不能忽略编译中的错误。sql

2.3.2 安装步骤介绍

本例采用MySQL二进制安装包进行安装演示数据库

(1) 建立mysql用户的帐号vim

[root@localhost ~]# groupadd mysql
[root@localhost ~]# useradd -s /sbin/nologin -g mysql -M mysql
[root@localhost ~]# tail -1 /etc/passwd
mysql:x:501:501::/home/mysql:/sbin/nologin
[root@localhost ~]# id mysql
uid=501(mysql) gid=501(mysql) groups=501(mysql)

(2)获取MySQL二进制软件包后端

百度云盘:http://pan.baidu.com/s/1hrBCzsC
提取码:4yjf

屏幕快照 2017-07-14 上午11.09.14.png-184.9kB

(3) 采用二进制方式安装MySQL

[root@localhost ~]# tar xf mysql-5.5.32-linux2.6-x86_64.tar.gz -C /usr/local/
[root@localhost ~]# cd /usr/local/
[root@localhost local]# mv mysql-5.5.32-linux2.6-x86_64 mysql-5.5.32
[root@localhost local]# ln -s mysql-5.5.32 mysql
[root@localhost local]# ls
bin  games    lib    libexec  mysql-5.5.32  nginx-1.10.2  share
etc  include  lib64  mysql    nginx         sbin          src
[root@localhost local]# cd /usr/local/mysql
[root@localhost mysql]# ls
bin      data  include         lib  mysql-test  scripts  sql-bench
COPYING  docs  INSTALL-BINARY  man  README      share    support-files

#提示:
二进制安装包,仅须要解压就能够了,不须要执行cmake/configure,make,make install等过程
  • [x] :当安装LNMP一体化环境时,MySQL数据库要装在Nginx所在的机器上。若是MySQL和Nginx不在一台机器上,那么,Nginx服务器上的MySQL数据库软件包只要解压移动到/usr/local/目录,更名为mysql就能够了,不须要进行后面的初始化配置。
  • [x] :在非一体的LNMP环境(Nginx和MySQL不在一台机器上),编译PHP环境时,也是须要MySQL数据库环境的,可是高版本的PHP,例如5.3版本以上,内置了PHP须要的MySQL程序,所以,对于此类版本就不须要在Nginx服务器上安装MySQL软件了,只须要在编译PHP时指定相关参数便可。这个PHP的编译参数为--with-mysql=mysqld,表示PHP程序在编译时会调用内置的MySQL的库。

(4)初始化MySQL配置文件my.cnf

命令以下:

[root@localhost ~]# cd /usr/local/mysql
[root@localhost mysql]# ls -l support-files/*.cnf
-rw-r--r--. 1 7161 wheel  4691 Jun 19  2013 support-files/my-huge.cnf
-rw-r--r--. 1 7161 wheel 19759 Jun 19  2013 support-files/my-innodb-heavy-4G.cnf
-rw-r--r--. 1 7161 wheel  4665 Jun 19  2013 support-files/my-large.cnf
-rw-r--r--. 1 7161 wheel  4676 Jun 19  2013 support-files/my-medium.cnf
-rw-r--r--. 1 7161 wheel  2840 Jun 19  2013 support-files/my-small.cnf
[root@localhost mysql]# /bin/cp support-files/my-small.cnf /etc/my.cnf

提示:

  • support-files下有my.cnf的各类配置样例。
  • 使用cp全路径/bin/cp,可实现拷贝而不出现替换提示,即若是有重名文件会直接覆盖
  • 本例为测试安装环境,所以选择参数配置小的my-small.cnf配置模版,若是是生产环境能够根据硬件选择更高级的配置文件,上述配置文件模版对硬件的要求从低到高依次为:
my-medium.cnf (最低)
my-small.cnf
my-large.cnf
my-huge.cnf
my-innodb-heavy-4G.cnf(最高)

(5)初始化MySQL数据库文件

初始化命令以下:

[root@localhost ~]# mkdir -p /usr/local/mysql/data #创建MySQL数据文件目录
[root@localhost ~]# chown -R mysql.mysql /usr/local/mysql #受权mysql用户管理MySQL的安装目录
[root@localhost ~]# yum -y install libaio #光盘源安装依赖包,不然下一步的编译会报错
[root@localhost ~]# /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
#初始化MySQL数据库文件,会有不少信息提示,若是没有ERROR级别的错误,会有两个OK的字样,表示初始化成功,不然就要解决初始化的问题

初始化内容以下:
Installing MySQL system tables...
OK
Filling help tables...
OK

To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system

PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:

/usr/local/mysql/bin/mysqladmin -u root password 'new-password'
/usr/local/mysql/bin/mysqladmin -u root -h localhost password 'new-password'

Alternatively you can run:
/usr/local/mysql/bin/mysql_secure_installation

which will also give you the option of removing the test
databases and anonymous user created by default.  This is
strongly recommended for production servers.

See the manual for more instructions.

You can start the MySQL daemon with:
cd /usr/local/mysql ; /usr/local/mysql/bin/mysqld_safe &

You can test the MySQL daemon with mysql-test-run.pl
cd /usr/local/mysql/mysql-test ; perl mysql-test-run.pl

Please report any problems with the /usr/local/mysql/scripts/mysqlbug script!

以上的命令主要做用是生成以下数据库文件

[root@localhost ~]# tree /usr/local/mysql/data/
/usr/local/mysql/data/
├── mysql
│   ├── columns_priv.frm
│   ├── columns_priv.MYD
│   ├── columns_priv.MYI
│   ├── db.frm
│   ├── db.MYD
│   ├── db.MYI
│   ├── event.frm
│   ├── event.MYD
│   ├── event.MYI
│   ├── func.frm
│   ├── func.MYD
│   ├── func.MYI
│   ├── general_log.CSM
│   ├── general_log.CSV
│   ├── general_log.frm
│   ├── help_category.frm
│   ├── help_category.MYD
│   ├── help_category.MYI
│   ├── help_keyword.frm

...如下省略若干...

这些MySQL数据文件是MySQL正确运行所必需的基本数据库文件,其功能是对MySQL权限,状态等进行管理。

2.3.3 初始化故障排错集锦

错误示例1:

usr/local/mysql/bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared ob

#错误缘由是没有libaio函数库的支持。须要
yum -y install libaio

错误示例2:

WARNING:The host'mysql'could not be looked up with resolveip

#须要修改主机名解析,使其和uname -n同样,修改后的结果以下:
[root@localhost ~] # grep `uname -n` /etc/hosts

错误示例3:

ERROR:1004Can't create file '/tmp/#sql300e_1_o.frm'(errno:13)

#缘由是/tmp目录的权限有问题。
解决办法为处理/tmp目录,以下:

[root@localhost ~]# ls -ld /tmp
drwxrwxrwt. 3 root root 4096 Jul 14 07:56 /tmp
[root@localhost ~]# chmod -R 1777 /tmp/

此故障必须解除,不然,后面会出现登录不了数据库等问题。

2.4 配置并启动MySQL数据库

(1)设置MySQL启动脚本,命令以下:

[root@localhost mysql]# cp support-files/mysql.server /etc/init.d/mysqld
#拷贝MySQL启动脚本到MySQL的命令路径
[root@localhost mysql]# chmod +x /etc/init.d/mysqld 
#使脚本可执行

(2)MySQL二进制默认安装路径是/usr/local/mysql,启动脚本里是/usr/local/mysql。若是安装路径不一样,那么脚本里路径等都须要替换

(3)启动MySQL数据库,命令以下:

[root@localhost mysql]# /etc/init.d/mysqld start
Starting MySQL.. SUCCESS!

以上是启动数据库的规范方法之一,但还能够用以下方式启动,
/usr/local/mysql/bin/mysqld_safe --user=mysql &
这个命令结尾的“&”符号,做用是在后台执行MySQL服务,命令执行完还须要按下回车才能进入命令行状态。

(4)检查MySQL数据库是否启动,命令以下:

[root@localhost mysql]# netstat -antup | grep mysql
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      1702/mysqld

若是发现3306端口没起来,请tail -100 /usr/local/mysql/data/主机名.err查看日志信息,看是否有报错信息,而后根据相关错误提示进行调试。常常查看服务运行日志是个很好的习惯,也是高手的习惯。

(5)查看MySQL数据库启动结果日志,命令以下:

[root@localhost mysql]# tail -10 /usr/local/mysql/data/localhost.err 
InnoDB: Creating foreign key constraint system tables
InnoDB: Foreign key constraint system tables created
170714  8:33:47  InnoDB: Waiting for the background threads to start
170714  8:33:48 InnoDB: 5.5.32 started; log sequence number 0
170714  8:33:48 [Note] Server hostname (bind-address): '0.0.0.0'; port: 3306
170714  8:33:48 [Note]   - '0.0.0.0' resolves to '0.0.0.0';
170714  8:33:48 [Note] Server socket created on IP: '0.0.0.0'.
170714  8:33:49 [Note] Event Scheduler: Loaded 0 events
170714  8:33:49 [Note] /usr/local/mysql/bin/mysqld: ready for connections.
Version: '5.5.32'  socket: '/tmp/mysql.sock'  port: 3306  MySQL Community Server (GPL)

(6)设置MySQL开机自启动,命令以下:

[root@localhost mysql]# chkconfig --add mysqld
[root@localhost mysql]# chkconfig mysqld on
[root@localhost mysql]# chkconfig --list mysqld
mysqld         	0:off	1:off	2:on	3:on	4:on	5:on	6:off

提示:也能够将启动命令/etc/init.d/mysqld start 放到/etc/rc.local里面

(7)配置mysql命令的全局使用路径,命令以下:

[root@localhost mysql]# ln -s /usr/local/mysql/bin/* /usr/local/bin/
[root@localhost mysql]# which mysqladmin
/usr/local/bin/mysqladmin

(8)登录MySQL测试,命令以下:

[root@localhost mysql]# mysql   #直接输入命令便可登录
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.32 MySQL Community Server (GPL)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;    #查看当前全部的数据库
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)

mysql> select user();   #查看当前的登录用户
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

mysql> quit
Bye

提示:
MySQL安装完成之后,默认状况下,root帐户是无密码的,这个必需要设置。

2.5 MySQL安全配置

(1)为MySQL的root用户设置密码,命令以下:

[root@localhost mysql]# mysqladmin -u root password '123123' #设置密码
[root@localhost mysql]# mysql   #没法直接登录了
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
[root@localhost mysql]# mysql -uroot -p  #新的登录方式
Enter password:                 #输入设置的密码
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.5.32 MySQL Community Server (GPL)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

(2)清理无用的MySQL用户及库,命令以下:

mysql> select user,host from mysql.user;
+------+-----------+
| user | host      |
+------+-----------+
| root | 127.0.0.1 |
| root | ::1       |
|      | localhost |
| root | localhost |
+------+-----------+
4 rows in set (0.00 sec)

mysql> drop user "root"@"::1";
Query OK, 0 rows affected (0.00 sec)

mysql> drop user ""@"localhost";
Query OK, 0 rows affected (0.00 sec)

mysql> select user,host from mysql.user;
+------+-----------+
| user | host      |
+------+-----------+
| root | 127.0.0.1 |
| root | localhost |
+------+-----------+
2 rows in set (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

三,FastCGI介绍

3.1 什么是CGI

  • CGI的全称为“通用网关接口”(Common Gateway Interface),为HTTP服务器与其余机器上的程序服务通讯交流的一种工具,CGI程序须运行在网络服务器上。
  • 传统CGI接口方式的主要缺点是性能较差,由于每次HTTP服务器遇到动态程序时都须要从新启动解析器来执行解析,以后结果才会被返回给HTTP服务器。这在处理高并发访问时几乎是不可用的,所以就诞生了FastCGI。另外,传统的CGI接口方式安全性也不好,故而如今已经不多被使用了。

3.2 什么是FastCGI

FastCGI是一个可伸缩的,高速地在HTTP服务器和动态脚本语言间通讯的接口(在Linux下,FastCGI接口即为socket,这个socket能够是文件socket,也能够是IP socket),主要优势是把动态语言和HTTP服务器分离出来。多数流行的HTTP服务器都支持FastCGI,包括Apache,Nginx和Lighttpd等。
同时,FastCGI也被许多脚本语言所支持,例如当前比较流程的脚本语言PHP。FastCGI接口采用的是C/S架构,它能够将HTTP服务器和脚本解析服务器分开,同时还能在脚本解析服务器上启动一个或多个脚原本解析守护进程。当HTTP服务器遇到动态程序时,能够将其直接交付给FastCGI进程来执行,而后将获得的结果返回给浏览器。这种方式可让HTTP服务器专注地处理静态请求,或者将动态脚本服务器的结果返回给客户端,这在很大程度上提升了整个应用系统的性能。

FastCGI的重要特色以下:

  • HTTP服务器和动态脚本语言间通讯的接口或工具。
  • 可把动态语言解析和HTTP服务器分离开。
  • Nginx,Apache,Lighttpd,以及多数动态语言都支持FastCGI。
  • FastCGI接口方式采用C/S结构,分为客户端(HTTP服务器)和服务器端(动态语言解析服务器)
  • PHP动态语言服务器端能够启动多个FastCGI的守护进程(例如php-fpm(fcgi process mangement))
  • HTTP服务器经过(例如Nginx fastcgi_pass)FastCGI客户端和动态语言FastCGI服务器端通讯(例如php-fpm)

3.3 Nginx FastCGI的运行原理

Nginx不支持对外部动态程序的直接调用或者解析,全部的外部程序(包括PHP)必须经过FastCGI接口来调用。FastCGI接口在Linux下是socket,为了调用CGI程序,还须要一个FastCGI的wrapper(能够理解为用于启动另外一个程序的程序),这个wrappper绑定在某个固定的socket上,如端口或文件socket。当Nginx将CGI请求发送给这个socket的时候,经过FastCGI接口,wrapper接收到请求,而后派生出一个新的线程,这个线程调用解释器或外部程序处理脚原本读取返回的数据;接着,wrapper再将返回的数据经过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整个运做过程。

屏幕快照 2017-07-13 下午9.09.02.png-535.6kB

FastCGI的主要优势是把动态语言和HTTP服务器分离开来,使Nginx专门处理静态请求及向后转发的动态请求,而PHP/PHP-FPM服务器则专门解析PHP动态请求。

3.4 LNMP之PHP(FastCGI方式)服务的安装和准备

3.4.1 检查Nginx及MySQL的安装状况

(1)检查确认Nginx及MySQL的安装路径,命令以下:

[root@localhost ~]# ls -ld /usr/local/nginx
lrwxrwxrwx. 1 root root 24 Jul  9 14:31 /usr/local/nginx -> /usr/local/nginx-1.10.2/
[root@localhost ~]# ls -ld /usr/local/mysql
lrwxrwxrwx. 1 mysql mysql 12 Jul 14 07:13 /usr/local/mysql -> mysql-5.5.32

(2)检查端口及启动状况,命令以下:

[root@localhost ~]# netstat -antup | grep -E "80|3306"
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      1193/nginx          
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      1702/mysqld

(3)测试访问Nginx及MySQL是否OK,命令以下:

[root@localhost ~]# wget 127.0.0.1    #测试Nginx
--2017-07-14 09:54:12--  http://127.0.0.1/
Connecting to 127.0.0.1:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 624 [text/html]
Saving to: “index.html”

100%[=========================================================================================>] 624         --.-K/s   in 0s      

2017-07-14 09:54:12 (2.12 MB/s) - “index.html” saved [624/624]

[root@localhost ~]# mysql -uroot -p    #测试MySQL
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.5.32 MySQL Community Server (GPL)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> quit
Bye

若是访问结果和上述一致,就代表Nginx及MySQL的安装一切正常

3.4.2 检查安装PHP所需的lib库

PHP程序在开发及运行时会调用一些诸如zlib,gd等函数库,所以须要确认lib库是否已经安装,执行过程以下:

[root@localhost ~]# rpm -qa zlib-devel libxml2-devel libjpeg-devel libjpeg-turbo-devel libiconv-devel
zlib-devel-1.2.3-29.el6.x86_64
[root@localhost ~]# rpm -qa freetype-devel libpng-devel gd libcurl-devel libxslt-devel

提示:

  • [x] :每一个lib通常都会存在对应的以“*-devel”命名的包,安装lib对应的-devel包后,对应的lib包就会自动安装好,例如安装gd-devel时就会安装gd。
  • [x] :这些lib库不是必须安装的,可是目前的企业环境下通常都须要安装。不然,PHP程序运行时会出现问题,例如验证码没法显示等。

执行下面命令安装相关的lib软件包

[root@localhost ~]# yum -y install zlib-devel libxml2-devel libjpeg-devel libjpeg-turbo-devel libiconv-devel
[root@localhost ~]# yum -y install freetype-devel libpng-devel gd libcurl-devel libxslt-devel

安装后的结果以下:

[root@localhost ~]# rpm -qa zlib-devel libxml2-devel libjpeg-devel libjpeg-turbo-devel libiconv-devel
zlib-devel-1.2.3-29.el6.x86_64
libxml2-devel-2.7.6-14.el6.x86_64
libjpeg-turbo-devel-1.2.1-1.el6.x86_64
#这里仅缺乏libiconv-devel包
[root@localhost ~]# rpm -qa freetype-devel libpng-devel gd libcurl-devel libxslt-devel
freetype-devel-2.3.11-14.el6_3.1.x86_64
libpng-devel-1.2.49-1.el6_2.x86_64
libcurl-devel-7.19.7-37.el6_4.x86_64
libxslt-devel-1.1.26-2.el6_3.1.x86_64
gd-2.0.35-11.el6.x86_64

从以上结果看出,仅有libiconv-devel这个包没有安装,由于默认的yum源没有此包,后面会编译安装。

3.4.3 安装yum没法安装的libiconv库

[root@localhost ~]# wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
[root@localhost ~]# ls
anaconda-ks.cfg  install.log         libiconv-1.14.tar.gz                 nginx-1.10.2.tar.gz
index.html       install.log.syslog  mysql-5.5.32-linux2.6-x86_64.tar.gz
[root@localhost ~]# tar xf libiconv-1.14.tar.gz -C /usr/src/
[root@localhost ~]# cd /usr/src/libiconv-1.14/
[root@localhost libiconv-1.14]# ./configure --prefix=/usr/local/libiconv && make && make install

3.4.4 安装libmcrypt库

推荐使用简单的在线yum的方式安装:wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
编译安装过程略
[root@localhost yum.repos.d]# yum -y install libmcrypt-devel

3.4.5 安装mhash加密扩展库

推荐使用简单的在线yum的方式安装:wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
编译安装过程略
[root@localhost yum.repos.d]# yum -y install mhash

3.4.6 安装mcrvpt加密扩展库

推荐使用简单的在线yum的方式安装:wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
编译安装过程略
[root@localhost yum.repos.d]# yum -y install mcrypt

3.5 开始安装PHP(FastCGI方式)服务

3.5.1 获取PHP软件包

[root@localhost ~]# wget http://cn2.php.net/get/php-5.3.28.tar.gz/from/this/mirror

3.5.2 解压配置PHP

[root@localhost ~]# tar xf php-5.3.28.tar.gz -C /usr/src/
[root@localhost ~]# cd /usr/src/php-5.3.28/
[root@localhost php-5.3.28]# ./configure \
> --prefix=/usr/local/php5.3.28 \
> --with-mysql=/usr/local/mysql \
> --with-iconv-dir=/usr/local/libiconv \
> --with-freetype-dir \
> --with-jpeg-dir \
> --with-png-dir \
> --with-zlib \
> --with-libxml-dir=/usr \
> --enable-xml \
> --disable-rpath \
> --enable-safe-mode \
> --enable-bcmath \
> --enable-shmop \
> --enable-sysvsem \
> --enable-inline-optimization \
> --with-curl \
> --with-curlwrappers \
> --enable-mbregex \
> --enable-fpm \
> --enable-mbstring \
> --with-mcrypt \
> --with-gd \
> --enable-gd-native-ttf \
> --with-openssl \
> --with-mhash \
> --enable-pcntl \
> --enable-sockets \
> --with-xmlrpc \
> --enable-zip \
> --enable-soap \
> --enable-short-tags \
> --enable-zend-multibyte \
> --enable-static \
> --with-xsl \
> --with-fpm-user=www \
> --with-fpm-group=www \
> --enable-ftp

#特别强调:上述每行结尾的换行符反斜线(\)以后不能再有任何字符包括空格

执行上述命令后,最后的正确输出提示为下图

屏幕快照 2017-07-14 下午11.18.06.png-71.5kB

对于上面命令,部分参数说明以下:

  • [x] :--prefix=/usr/local/php5.2.28

表示指定PHP的安装路径为/usr/local/php5.3.28

  • [x] :--with-mysql=/usr/local/mysql

表示须要指定MySQL的安装路径,安装PHP须要的MySQL相关内容。固然,若是没有MySQL软件包,也能够不单独安装,这样的状况可以使用--with-mysql=mysqlnd替代--with-mysql=/usr/local/mysql,由于PHP软件里已经自带了链接MySQL的客户端工具。

  • [x] :--with-fpm-user=www

nginx表示指定PHP-FPM进程管理的用户为www,此处最好和Nginx服务用户统一

  • [x] : --with-fpm-group=www

表示指定PHP-FPM进程管理的组为www,此处最好与Nginx服务用户组统一。

  • [x] :--enable-fpm

表示激活PHP-FPM方式服务,即以FastCGIF方式运行PHP服务。

3.5.3 编译PHP

正确执行前文配置PHP软件的./configure系列命令后,就能够编译PHP软件了,具体操做过程以下:

[root@localhost php-5.3.28]# ln -s /usr/local/mysql/lib/libmysqlclient.so.18
libmysqlclient.so.18      libmysqlclient.so.18.0.0  
[root@localhost php-5.3.28]# ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib64/
[root@localhost php-5.3.28]# touch ext/phar/phar.phar
[root@localhost php-5.3.28]# make

#make最后的正确提示
Build complete.
Don't forget to run 'make test'.

3.5.4 安装PHP生成文件到系统

[root@localhost php-5.3.28]# make install

3.5.5 配置PHP引擎配置文件php.ini

(1)设置软连接以方便访问,命令以下:

[root@localhost ~]# ln -s /usr/local/php5.3.28/ /usr/local/php
[root@localhost ~]# ls -l /usr/local/php
lrwxrwxrwx. 1 root root 21 Jul 14 13:06 /usr/local/php -> /usr/local/php5.3.28/

(2)查看PHP配置默认模版文件,命令以下:

[root@localhost ~]# cd /usr/src/php-5.3.28/
[root@localhost php-5.3.28]# ls php.ini*
php.ini-development  php.ini-production

请注意以上两文件的异同之处,可经过diff或vimdiff命令比较,以下图所示:

屏幕快照 2017-07-15 下午6.08.40.png-802.5kB

从对比结果能够看出,开发环境更多的是开启日志,调试信息,而生产环境都是关闭状态

(3)拷贝PHP配置文件到PHP默认目录,并更改文件名称为php.ini,命令以下:

[root@localhost php-5.3.28]# cp php.ini-production /usr/local/php/lib/php.ini
[root@localhost php-5.3.28]# ls -l /usr/local/php/lib/php.ini 
-rw-r--r--. 1 root root 69627 Jul 14 13:25 /usr/local/php/lib/php.ini

3.5.6 配置PHP(FastCGI方式)的配置文件php-fpm.conf

[root@localhost php-5.3.28]# cp php.ini-production /usr/local/php/lib/php.ini
[root@localhost php-5.3.28]# ls -l /usr/local/php/lib/php.ini 
-rw-r--r--. 1 root root 69627 Jul 14 13:25 /usr/local/php/lib/php.ini
[root@localhost php-5.3.28]# cd /usr/local/php/etc/
[root@localhost etc]# ls
pear.conf  php-fpm.conf.default
[root@localhost etc]# cp php-fpm.conf.default php-fpm.conf

关于php-fpm.conf,暂时可用默认的配置,先把服务搭好,之后再进行优化。

3.5.7 启动PHP服务(FastCGI方式)

(1)启动PHP服务php-fpm,命令以下:

[root@localhost etc]# /usr/local/php/sbin/php-fpm

(2)检查PHP服务php-fpm的进程及启动端口的状况,命令以下:

[root@localhost etc]# ps -ef | grep php-fpm
root     126611      1  0 13:36 ?        00:00:00 php-fpm: master process (/usr/local/php5.3.28/etc/php-fpm.conf)
nginx    126612 126611  0 13:36 ?        00:00:00 php-fpm: pool www          
nginx    126613 126611  0 13:36 ?        00:00:00 php-fpm: pool www          
root     126619 126548  0 13:39 pts/1    00:00:00 grep php-fpm
[root@localhost etc]# lsof -i:9000  #默认9000端口提供服务
COMMAND    PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
php-fpm 126611  root    7u  IPv4 136041      0t0  TCP localhost:cslistener (LISTEN)
php-fpm 126612 nginx    0u  IPv4 136041      0t0  TCP localhost:cslistener (LISTEN)
php-fpm 126613 nginx    0u  IPv4 136041      0t0  TCP localhost:cslistener (LISTEN)

3.6 配置Nginx支持PHP程序请求访问

3.6.1 修改Nginx配置文件

(1)查看nginx当前的配置,命令以下:

[root@localhost etc]# cd /usr/local/nginx/conf/
[root@localhost conf]# cp nginx.conf nginx.conf.02
[root@localhost conf]# cat nginx.conf
worker_processes  1;
error_log  logs/error.log;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    include extra/www.conf;
    include extra/mail.conf;
    include extra/status.conf;
    include extra/blog.conf;
    
}

(2)PHP解析,这里以blog为例讲解,内容以下:

[root@localhost conf]# cat extra/blog.conf 
    server {
        listen       80;
        server_name  blog.yunjisuan.com;
        location / {
            root   /var/www/html/blogcom;
            index  index.html index.htm;
        }
    }

最终blog虚拟机的完整配置以下:

[root@localhost conf]# cat extra/blog.conf 
    server {
        listen       80;
        server_name  blog.yunjisuan.com;
        location / {
            root   /var/www/html/blogcom;
            index  index.html index.htm;
        }
		location ~ .*\.(php|php5)?$ {
			root	/var/www/html/blogcom;
			fastcgi_pass	127.0.0.1:9000;
			fastcgi_index	index.php;
			include		fastcgi.conf;
		}
    }

3.6.2 检查并启动Nginx

可经过以下命令检查Nginx配置文件的语法:

[root@localhost conf]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx-1.10.2//conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx-1.10.2//conf/nginx.conf test is successful
[root@localhost conf]# /usr/local/nginx/sbin/nginx -s reload

此步在生产环境很关键,如不提早检查语法,重启后发现语法错误会致使Nginx没法提供服务,,给用户访问体验带来很差的影响。

3.6.3 测试LNMP环境生效状况

(1)测试PHP解析请求是否OK

1)进入指定的默认站点目录后,编辑index.php,添加以下内容:

[root@localhost conf]# cd /var/www/html/blogcom/
[root@localhost blogcom]# echo "<?php phpinfo(); ?>" >test_info.php
[root@localhost blogcom]# cat test_info.php 
<?php phpinfo(); ?>

以上代码为显示PHP配置信息的简单PHP文件代码

注意:
对于初学者来讲,以上内容最好手工录入而不要拷贝,不然可能会致使意外结果。

2)调整Windows下的host解析(192.168.0.121为当前的机器IP),命令以下:

192.168.0.121 www.yunjisuan.com mail.yunjisuan.com yunjisuan.com blog.yunjisuan.com

3)打开浏览器,输入http://blog.yunjisuan.com/test_info.php 便可打开以下图所示界面:

屏幕快照 2017-07-15 下午7.28.50.png-209.8kB

出现上述界面,表示Nginx配合PHP解析已经正常。

(2)针对Nginx请求访问PHP,而后对PHP链接MySQL的状况进行测试

编辑test_mysql.php,加入以下内容:

[root@localhost blogcom]# cat test_mysql.php 
<?php
	//$link_id=mysql_connect('主机名','用户','密码');
	$link_id=mysql_connect('localhost','root','123123');
	if($link_id){
		echo "mysql successful by Mr.chen !";
	}else{
		echo mysql_error();
	}
?>

测试结果以下:

屏幕快照 2017-07-15 下午7.49.14.png-109.6kB

至此,LNMP的组合已基本搭建完毕。固然,咱们尚未作相关优化,所以,咱们须要将虚拟机保存好。留待之后之用

四, 部署一个blog程序服务

4.1 开源博客程序WordPress介绍

WordPress 是一套利用PHP语言和MySQL数据库开发的开源免费的blog(博客,网站)程序,用户能够在支持PHP环境和MySQL数据库的服务器上创建blog站点。它的功能很是强大,拥有众多插件,易于扩充功能。其安装和使用也都很是方便。目前WordPress已经成为搭建blog平台的主流,不少发布平台都是根据WordPress二次开发的,若是你也想像他们同样拥有本身的blog,可购买网上的域名及空间,而后搭建LNMP环境,部署WordPress程序后就能够轻松成就本身的梦想了。

注意:

WordPress是单用户我的博客,与blog.51cto.com的多用户博客是有区别的。

4.2 WordPress 博客程序的搭建准备

(1)MySQL数据库配置准备

1)登录MySQL数据库,操做以下:

[root@localhost ~]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.5.32 MySQL Community Server (GPL)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

2)建立一个专用的数据库WordPress,用于存放blog数据,操做以下:

mysql> create database wordpress;   #建立一个数据库,名字为wordpress
Query OK, 1 row affected (0.00 sec)

mysql> show databases like 'wordpress';  #查看
+----------------------+
| Database (wordpress) |
+----------------------+
| wordpress            |
+----------------------+
1 row in set (0.00 sec)

mysql>

3)建立一个专用的WordPress blog管理用户,命令以下:

mysql> grant all on wordpress.* to wordpress@'localhost' identified by '123123';                    #localhost为客户端地址
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;            #刷新权限,使得建立用户生效
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for wordpress@'localhost';   #查看用户对应权限
+------------------------------------------------------------------------------------------------------------------+
| Grants for wordpress@localhost                                                                                   |
+------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wordpress'@'localhost' IDENTIFIED BY PASSWORD '*E56A114692FE0DE073F9A1DD68A00EEB9703F3F1' |
| GRANT ALL PRIVILEGES ON `wordpress`.* TO 'wordpress'@'localhost'                                                 |
+------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> select user,host from mysql.user;        #查看数据库里建立的wordpress用户
+-----------+-----------+
| user      | host      |
+-----------+-----------+
| root      | 127.0.0.1 |
| root      | localhost |
| wordpress | localhost |   #只容许本机经过wordpress用户访问数据库
+-----------+-----------+
3 rows in set (0.00 sec)

mysql> quit
Bye

(2)Nginx及PHP环境配置准备

1)选择以前配置好的支持LNMP的blog域名对应的虚拟主机,命令以下:

[root@localhost extra]# cat blog.conf 
    server {
        listen       80;
        server_name  blog.yunjisuan.com;
        location / {
            root   /var/www/html/blogcom;
            index  index.php index.html index.htm;  #补充一个首页文件index.php
        }
		location ~ .*\.(php|php5)?$ {
			root	/var/www/html/blogcom;
			fastcgi_pass	127.0.0.1:9000;
			fastcgi_index	index.php;
			include		fastcgi.conf;
		}
    }

[root@localhost extra]# /usr/local/nginx/sbin/nginx -s reload

2)获取WordPress博客程序,并放置到blog域名对应虚拟主机的站点目录下,即/var/www/html/blogcom,操做命令以下:

[root@localhost blogcom]# ls   #浏览www.wordpress.org下载博客程序
index.html  test_info.php  test_mysql.php  wordpress-4.7.4-zh_CN.tar.gz
[root@localhost blogcom]# tar xf wordpress-4.7.4-zh_CN.tar.gz #解压
[root@localhost blogcom]# ls
index.html  test_info.php  test_mysql.php  wordpress  wordpress-4.7.4-zh_CN.tar.gz
[root@localhost blogcom]# rm -f index.html test_info.php  test_mysql.php #删除无用文件
[root@localhost blogcom]# ls
wordpress  wordpress-4.7.4-zh_CN.tar.gz
[root@localhost blogcom]# mv wordpress/* .  #把目录里的内容移动到blogcom根目录下
[root@localhost blogcom]# /bin/mv wordpress-4.7.4-zh_CN.tar.gz /root/ #移走源程序
[root@localhost blogcom]# ls -l  #完整的blog程序内容
total 192
-rw-r--r--.  1 nobody 65534   418 Sep 24  2013 index.php
-rw-r--r--.  1 nobody 65534 19935 Jan  2  2017 license.txt
-rw-r--r--.  1 nobody 65534  6956 Apr 23 09:24 readme.html
drwxr-xr-x.  2 nobody 65534  4096 Jul 14 16:04 wordpress
-rw-r--r--.  1 nobody 65534  5447 Sep 27  2016 wp-activate.php
drwxr-xr-x.  9 nobody 65534  4096 Apr 23 09:24 wp-admin
-rw-r--r--.  1 nobody 65534   364 Dec 19  2015 wp-blog-header.php
-rw-r--r--.  1 nobody 65534  1627 Aug 29  2016 wp-comments-post.php
-rw-r--r--.  1 nobody 65534  2930 Apr 23 09:24 wp-config-sample.php
drwxr-xr-x.  5 nobody 65534  4096 Apr 23 09:24 wp-content
-rw-r--r--.  1 nobody 65534  3286 May 24  2015 wp-cron.php
drwxr-xr-x. 18 nobody 65534 12288 Apr 23 09:24 wp-includes
-rw-r--r--.  1 nobody 65534  2422 Nov 20  2016 wp-links-opml.php
-rw-r--r--.  1 nobody 65534  3301 Oct 24  2016 wp-load.php
-rw-r--r--.  1 nobody 65534 33939 Nov 20  2016 wp-login.php
-rw-r--r--.  1 nobody 65534  8048 Jan 11  2017 wp-mail.php
-rw-r--r--.  1 nobody 65534 16255 Apr  6 14:23 wp-settings.php
-rw-r--r--.  1 nobody 65534 29896 Oct 19  2016 wp-signup.php
-rw-r--r--.  1 nobody 65534  4513 Oct 14  2016 wp-trackback.php
-rw-r--r--.  1 nobody 65534  3065 Aug 31  2016 xmlrpc.php
root@localhost blogcom]# chown -R www.www ../blogcom/ #受权用户访问
[root@localhost blogcom]# ls -l  #最终博客目录和权限
total 192
-rw-r--r--.  1 www www   418 Sep 24  2013 index.php
-rw-r--r--.  1 www www 19935 Jan  2  2017 license.txt
-rw-r--r--.  1 www www  6956 Apr 23 09:24 readme.html
drwxr-xr-x.  2 www www  4096 Jul 14 16:04 wordpress
-rw-r--r--.  1 www www  5447 Sep 27  2016 wp-activate.php
drwxr-xr-x.  9 www www  4096 Apr 23 09:24 wp-admin
-rw-r--r--.  1 www www   364 Dec 19  2015 wp-blog-header.php
-rw-r--r--.  1 www www  1627 Aug 29  2016 wp-comments-post.php
-rw-r--r--.  1 www www  2930 Apr 23 09:24 wp-config-sample.php
drwxr-xr-x.  5 www www  4096 Apr 23 09:24 wp-content
-rw-r--r--.  1 www www  3286 May 24  2015 wp-cron.php
drwxr-xr-x. 18 www www 12288 Apr 23 09:24 wp-includes
-rw-r--r--.  1 www www  2422 Nov 20  2016 wp-links-opml.php
-rw-r--r--.  1 www www  3301 Oct 24  2016 wp-load.php
-rw-r--r--.  1 www www 33939 Nov 20  2016 wp-login.php
-rw-r--r--.  1 www www  8048 Jan 11  2017 wp-mail.php
-rw-r--r--.  1 www www 16255 Apr  6 14:23 wp-settings.php
-rw-r--r--.  1 www www 29896 Oct 19  2016 wp-signup.php
-rw-r--r--.  1 www www  4513 Oct 14  2016 wp-trackback.php
-rw-r--r--.  1 www www  3065 Aug 31  2016 xmlrpc.php

4.3 开始安装blog博客程序

不少开源程序都支持浏览器傻瓜式的界面安装,此处也用这种方法。

1)打开浏览器输入blog.yunjisuan.com(提早作好hosts或DNS解析),回车后,出现下图:

屏幕快照 2017-07-15 下午9.20.22.png-107.5kB

2)仔细阅读页面的文字信息后,单击“如今就开始”按钮继续,而后在出现的页面表单上填写相应的内容,以下图所示:

QQ20170715-212718@2x.png-134kB

3)在页面表单里填好内容后,单击结尾的“提交”按钮继续,获得下图:

屏幕快照 2017-07-15 下午9.28.36.png-46.2kB

4)出现上图就表示能够安装了,单击“进行安装”按钮继续,进入下图:

QQ20170715-213332@2x.png-166.9kB

5)根据界面提示设置blog站点的信息后,单击“安装WordPress”按钮继续。
出现下图所示的信息就代表已经成功安装了WordPress博客。

屏幕快照 2017-07-15 下午9.35.29.png-49.9kB

4.4 博客的简单使用

(1)后台登陆,以下图:

屏幕快照 2017-07-15 下午10.08.08.png-53.9kB

屏幕快照 2017-07-15 下午10.42.40.png-497.1kB

其余功能同窗们本身玩

4.5 实现WordPress博客程序URL静态化

实现此功能时,首先要在WordPress后台依次单击设置--->固定连接--->自定义结构,而后输入下面的代码,并保存更改。

/archives/%post_id%.html

#说明:%post_id%是数据库对应博文内容的惟一ID,例如423

QQ20170715-225054@2x.png-409.5kB

接着,在Nginx配置文件的server容器中添加下面的代码:

[root@localhost extra]# cat blog.conf 
    server {
        listen       80;
        server_name  blog.yunjisuan.com;
	root	/var/www/html/blogcom;
        location / {
            	index  index.php index.html index.htm;
		if (-f $request_filename/index.html){
			rewrite (.*) $1/index.html break;
		}
		if (-f $request_filename/index.php){
			rewrite (.*) $1/index.php;
		}
		if (!-f $request_filename){
			rewrite (.*) /index.php;
		}
        }
	location ~ .*\.(php|php5)?$ {
		fastcgi_pass	127.0.0.1:9000;
		fastcgi_index	index.php;
		include		fastcgi.conf;
	}
    }

最后检查语法并从新加载Nginx服务,操做以下:

[root@localhost extra]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx-1.10.2//conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx-1.10.2//conf/nginx.conf test is successful
[root@localhost extra]# /usr/local/nginx/sbin/nginx -s reload

如今能够经过浏览器访问了,以下图所示:

QQ20170715-230225@2x.png-869.5kB

五, 本章重点回顾

  1. LNMP的组合中各组件工做调度逻辑关系。
  2. Nginx与PHP经过FastCGI模式通讯的原理。
  3. LNMP环境的企业级搭建。
  4. WordPress博客程序的安装搭建与URL静态化
相关文章
相关标签/搜索