LNMP架构的搭建——源码编译(MYSQL,PHP,nginx)
概念解析
LNMP架构介绍
LNMP = Linux+Nginx+Mysql+PHP
LNMP代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构。Nginx中的PHP是以fastcgi的方式结合Nginx的,可以理解为Nginx代理了PHP的fastcgi。
LNMP和LAMP唯一不同是指提供web服务的是Nginx,
在Apache中,PHP是作为一个模块存在的。而在Nginx中,PHP是作为一个独立服务存在的,这个服务叫做php-fpm。
Nginx直接处理静态请求,动态请求会转发给php-fpm.
LAMP的工作原理
浏览器发送http request请求到服务器(Nginx)服务器响应并处理web请求,将一些静态资源(CSS,图片,视频等)保存服务器上,然后将php脚本通过接口传输协议(网关协议)PHP-FCGI(fast-cgi)传输给PHP-FPM(进程管理程序),PHP-FPM不做处理,然后PHP-FPM调用PHP解析器进程,PHP解析器解析php脚本信息。PHP解析器进程可以启动多个,进行并发执行。然后将解析后的脚本返回到PHP-FPM,PHP-FPM再通过fast-cgi的形式将脚本信息传送给Nginx,服务器再通过Http response的形式传送给浏览器。浏览器再进行解析与渲染然后进行呈现。
mysql源码编译
1.得到mysql数据库的源码包,并进行解压,然后查看目录mysql-5.7.17下的内容
[[email protected] ~]# ls
[[email protected] ~]# tar zxf mysql-boost-5.7.17.tar.gz
[[email protected] ~]# cd mysql-5.7.17/
[[email protected] mysql-5.7.17]# ls
2.创建一个目录(用于将之后编译的的MYSQL,PHP,nginx都放在一起)
[[email protected] mysql-5.7.17]# mkdir /usr/local/lnmp/
3.安装源码编译工具cmake(支持编译C++语言)
cmake跨平台工具是用来预编译mysql源码的,用于设置mysql的编译参数。如:安装目录、数据存放目录、字符编码、排序规则等
[[email protected] ~]# yum install cmake-2.8.12.2-4.el6.x86_64.rpm -y
4.解决依赖性
5.进入解压目录创造预编译环境
[[email protected] mysql-5.7.17]# cmake
-DCMAKE_INSTALL_PREFIX=/usr/local/lnmp/mysql
-DMYSQL_DATADIR=/usr/local/lnmp/mysql/data
-DMYSQL_UNIX_ADDR=/usr/local/lnmp/mysql/data/mysql.sock
-DWITH_MYISAM_STORAGE_ENGINE=1
-DWITH_INNOBASE_STORAGE_ENGINE=1
-DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci
-DEXTRA_CHARSETS=all -DWITH_BOOST=boost/boost_1_59_0/
编译成功画面
如果编译失败,可以重新进行编译,但要先删除缓存
[[email protected] mysql-5.7.17]# rm -rf CMakeCache.txt
6.扩容磁盘(磁盘大小要在20G以上)
使用fdisk -l查看磁盘的大小
添加一块虚拟硬盘,并建立分区
将新增磁盘扩充到需要扩充的磁盘的物理卷组
扩大逻辑卷VolGroup-lv_root为20G
但是查看挂载的文件系统的大小并没有发生改变,同步文件系统并再次查看,发现根目录下的文件系统的大小也已经成功改变,说明磁盘扩容成功
再添加一块,重复操作,达到20G以上
7.安装
[[email protected] ~]# cd mysql-5.7.17/
[[email protected] mysql-5.7.17]# make
[[email protected] mysql-5.7.17]# make install
8.进入源码编译目录,再进入mysql安装的位置,将编译完成的默认配置文件放置/etc/my.cnf并编译此文件
[[email protected] ~]# cd /etc/
[[email protected] etc]# cp my.cnf my.cnf.bak
[[email protected] etc]# cd
[[email protected] ~]# cd mysql-5.7.17/support-files/
[[email protected] support-files]# cp my-default.cnf /etc/my.cnf #根据你的主机内存复制 mysql 配置文件
[[email protected] ~]# vim /etc/my.cnf
/etc/my.cnf中的内容
18 basedir = /usr/local/lnmp/mysql # mysql的安装目录
19 datadir = /usr/local/lnmp/mysql/data # mysql数据存放位置
22 socket = /usr/local/lnmp/mysql/data/mysql.sock # mysql与外界联系的套接字文件位置
9.创建组和用户mysql(利用mysql用户对mysql服务进行限制,将mysql服务的工作可以局限在mysql用户的家目录中)
[[email protected] ~]# groupadd -g 27 mysql
[[email protected] ~]# useradd -u 27 -g 27 -M -d /usr/local/lnmp/mysql/data -s /sbin/nologin mysql
[[email protected] ~]# id mysql
10.将编译完成的mysql启动脚本复制到系统启动服务的默认目录中
[[email protected] support-files]# cp mysql.server /etc/init.d/mysqld #将脚本复制到系统启动服务中
[[email protected] support-files]# cd /etc/init.d
[[email protected] init.d]# chmod +x mysqld ##添加权限
[[email protected] init.d]# /etc/init.d/mysqld ^C #命令可以补齐则说明成功
11.创建data目录
将mysql目录下的所有文件的所有组都改为mysql,只有data目录的所有人是mysql
因为mysql服务将要往这个目录中写数据,保证其有执行权限
[[email protected] mysql]# mkdir data
[[email protected] mysql]# ll #修改权限前
[[email protected] mysql]# chgrp mysql /usr/local/lnmp/mysql -R
[[email protected] mysql]# chown mysql /usr/local/lnmp/mysql/data -R
[[email protected] mysql]# ll #修改权限后
12.将编译生成的mysql二进制命令放进系统的环境变量文件中,保证可以直接调用该二进制命令(完成后mysql命令可以生成)
[[email protected] mysql]# vim ~/.bash_profile
PATH=$PATH:$HOME/bin:/usr/local/lnmp/mysql/bin
[[email protected] mysql]# source ~/.bash_profile #使之生效
13.执行mysql的配置初始化文件(注意/usr/local/lnmp/mysql/data下不能有任何文件,如果有,必须将其全部删除才可成功执行配置初始化文件)
[[email protected] ~]# cd /usr/local/lnmp/mysql/
[[email protected] mysql]# cd data
[[email protected] data]# ls #查看时没有任何文件或目录
[[email protected] data]# mysqld --user=mysql --initialize
[[email protected] data]# ls #执行文件后生成了文件和目录
14.开启mysqld
[[email protected] data]# /etc/init.d/mysqld start
15.尝试进入mysql数据库并查看,发现无法查看
[[email protected] data]# mysql -uroot -p 3#输入初始密码
16.无法正常查看的原因是因为没有设置安全初始化,所以下面将设置安全初始化
新密码设置为redhat
[[email protected] mysql]# mysql_secure_installatio
17,测试 再次进入mysql数据库并查看,发现可以成功查看
[[email protected] mysql]# mysql -uroot -predhat
18 查看服务,端口是3306
[[email protected] mysql]# netstat -ntlp
php源码编译
1.将得到的php源码包进行解压
[[email protected] ~]# tar jxf php-5.6.35.tar.bz2
2.解决依赖性
[[email protected] ~]# yum install -y libmcrypt-2.5.8-9.el6.x86_64.rpm
[[email protected] ~]# yum install -y libmcrypt-devel-2.5.8-9.el6.x86_64.rpm
以上两个包要在官网上下载
[[email protected] php-5.6.35]# yum install libxml2-devel -y
[[email protected] php-5.6.35]# yum install openssl-devel -y
[[email protected] php-5.6.35]# yum install libcurl-devel -y
[[email protected] php-5.6.35]# yum install libjpeg-turbo-devel-1.2.1-1.el6.x86_64 -y
[[email protected] php-5.6.35]# yum install 2:libpng-devel-1.2.49-1.el6_2.x86_64 -y
[[email protected] php-5.6.35]# yum install freetype-devel -y
[[email protected] php-5.6.35]# yum install gmp-devel-4.3.1-7.el6_2.2.x86_64 -y
[[email protected] php-5.6.35]# yum install net-snmp-devel -y
3.进入解压目录创造预编译环境
./configure --prefix=/usr/local/lnmp/php # php安装的位置
--with-config-file-path=/usr/local/lnmp/php/etc # php配置文件所在的位置
--with-openssl # 支持openssl加密
--with-snmp
--with-gd
--with-zlib --with-curl
--with-libxml-dir #支持 libxml 函数
--with-png-dir --with-jpeg-dir --with-freetype-dir # php处理图片的格式
--with-gmp
--with-gettext
--with-pear
--enable-mysqlnd
--with-mysql=mysqlnd
--with-mysqli=mysqlnd
--with-pdo-mysql=mysqlnd # 支持与mysql数据库之间建立联系
--enable-inline-optimization
--enable-soap
--enable-ftp
--enable-sockets
--enable-mbstring
--enable-fpm # 开启fpm模式(nginx等服务用的)
--with-fpm-user=nginx # 对PHP服务的限制通过nginx用户来实现
--with-fpm-group=nginx # PHP以nginx用户组身份运行
--with-mcrypt # 提供了对多种块算法的支持 主要用来实现加密等算法
--with-mhash # 加密算法
4.编译和安装
[[email protected] php-5.6.35]# make && make install
成功
5.创建nginx用户
[[email protected] php-5.6.35]# useradd -M -d /usr/local/lnmp/nginx -s /sbin/nologin nginx
[[email protected] php-5.6.35]# id nginx
6.做php服务的简单配置(配置pid和时区)
[[email protected] etc]# cd /usr/local/lnmp/php/etc/
[[email protected] etc]# ls
pear.conf php-fpm.conf.default
[[email protected] etc]# cp php-fpm.conf.default php-fpm.conf
[[email protected] etc]# vim php-fpm.conf
25 pid = run/php-fpm.pid ##去掉注释
149 user = nginx ##保证用户和组都是ngnix
150 group = nginx
[[email protected] ~]# cd php-5.6.35
[[email protected] php-5.6.35]# cp php.ini-production /usr/local/lnmp/php/etc/php.ini
[[email protected] php-5.6.35]# cd /usr/local/lnmp/php/etc/
[[email protected] etc]# vim php.ini
date.timezone =Asia/Shanghai ##修改时区
7.将php启动的脚本复制到系统启动脚本的默认目录下,并测试php是否可以启动
[[email protected] ~]# cd php-5.6.35
[[email protected] php-5.6.35]# cd sapi/fpm/
[[email protected] fpm]# cp init.d.php-fpm /etc/init.d/php-fpm # init.d.php-fpm是编译完成的启动脚本
[[email protected] fpm]# chmod +x /etc/init.d/php-fpm #给脚本加上可执行权限
[[email protected] fpm]# /etc/init.d/php-fpm start
Starting php-fpm done
[[email protected] fpm]# netstat -tlnp # 查看php服务的监听端口(9000)
nginx的源码编译
1.得到nginx的源码包并解压
[[email protected] ~]# tar zxf nginx-1.14.0.tar.gz
2.去掉nginx的版本号
[[email protected] ~]# cd nginx-1.14.0
[[email protected] nginx-1.14.0]# vim src/core/nginx.h
14 #define NGINX_VER "nginx/"
3.关闭debug日至(因为debug的日志非常多,企业中一般不需要开启)
[[email protected] nginx-1.14.0]# vim auto/cc/gcc
171 # debug
172 #CFLAGS="$CFLAGS -g" ##添加注释
4.解决源编译中的依赖性问题
[[email protected] nginx-1.14.0]# yum install pcre-devel gcc zlib-devel -y
5.创造预编译环境
[[email protected] nginx-1.14.0]# ./configure --prefix=/usr/local/lnmp/nginx --with-http_ssl_module --with-http_stub_status_module --with-threads --with-file-aio --user=nginx --group=nginx
成功
6.安装
[[email protected] nginx-1.14.0]# make && make install
成功
- 配置nginx服务
[[email protected] nginx-1.14.0]# cd /usr/local/lnmp/nginx/conf/
[[email protected] conf]# vim nginx.conf
43 location / {
44 root html;
45 index index.php index.html index.htm; ##添加index.php(放在最前面)
46 }
65 location ~ \.php$ {
66 root html;
67 fastcgi_pass 127.0.0.1:9000;
68 fastcgi_index index.php;
69 # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
70 include fastcgi.conf; ##修改
71 }
8.创建一个软连接,可以直接调用命令
[[email protected] sbin]# ln -s /usr/local/lnmp/nginx/sbin/nginx /usr/local/sbin/ ##创建一个软连接
9.检测nginx服务是否可用并打开nginx服务
[[email protected] sbin]# nginx -t ##语法检测
[[email protected] nginx-1.14.0]# nginx ##打开nginx
[[email protected] nginx-1.14.0]# netstat -tnlp ##查看端口为80
10.浏览器中输入172.25.79.1 显示nginx页面
11.访问测试
[[email protected] ~]# cd /usr/local/lnmp/nginx/html/
[[email protected] html]# ls
50x.html index.html
[[email protected] html]# vim index.php ##编写默认页面
<?php
phpinfo()
?>
测试:
浏览器中输入172.25.79.1/index.php,出现以下界面则,表示nginx和PHP结合成功