一、基础概念
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.
LNMP的工作原理
- 首先,浏览器发送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的形式传送给浏览器。
- 浏览器再进行解析与渲染然后进行呈现。
主机环境:rhel6.5 selinux and iptables disabled
二、Mysql 数据库的源码编译
1.获得软件包资源(当前最主流的是5.7.17),进行解压
[root@server1 lnmp]# tar zxf mysql-boost-5.7.17.tar.gz
[root@server6 lnmp]# ls #会发现生成mysql-5.7.17目录
2.安装mysql源码编译需要的工具
[root@server1 lnmp]# yum install cmake-2.8.12.2-4.el6.x86_64.rpm -y
3.安装编译前需要的软件(解决软件包的依赖性)
[root@server1 mysql-5.7.17]# yum install gcc gcc-c++ ncurses-devel -y
注意:如果mysql编译的时候出错的话,需要先进入解压的目录下,执行以下命令
首先,make clean
rm -rf CMakeCache.txt(之后再重新编译)
4.进行编译(确保在解压的目录下)
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 \ #Unix socket 文件路径
-DWITH_MYISAM_STORAGE_ENGINE=1 \ #安装 myisam 存储引擎
-DWITH_INNOBASE_STORAGE_ENGINE=1 \ #安装 innodb 存储引擎
-DDEFAULT_CHARSET=utf8 \ #使用 utf8 字符
-DDEFAULT_COLLATION=utf8_general_ci \ #校验字符
-DEXTRA_CHARSETS=all \ #安装所有扩展字符集
-DWITH_BOOST=boost/boost_1_59_0/ #不装的话会报错
注意:编译完成后会发现CMake Warning at cmake/bison.cmake:20 (MESSAGE):警告;如果追求完美可以安装:[root@server1 mysql-5.7.17]# yum install bison -y(他会在安装的时候重新读取)
5.进行安装(请耐心等待,时间较长)
[root@server1 mysql-5.7.17]# make && make install
mysql 基础设置
1.查看安装完成对应生成的文件
2.将mysql.server拷贝成一个脚本
[root@server1 support-files]# pwd
/root/lnmp/mysql-5.7.17/support-files
[root@server1 support-files]# cp mysql.server /etc/init.d/mysqld
3.进入到/etc下,可以查看my.cnf的内容(默认的mysql配置)
4.备份一份默认配置文件
[root@server1 etc]# cp my.cnf my.cnf.bak
5.将my-default.cnf复制一份到/etc/下,覆盖my.cnf(根据你的主机内存复制 mysql 配置文件)
[root@server1 etc]# cd -
/root/lnmp/mysql-5.7.17/support-files
[root@server1 support-files]# cp my-default.cnf /etc/my.cnf
cp: overwrite `/etc/my.cnf'? yes
6.编辑配置文件
[root@server1 support-files]# vim /etc/my.cnf
18 basedir = /usr/local/lnmp/mysql
19 datadir = /usr/local/lnmp/mysql/data
20 # port = .....
21 # server_id = .....
22 socket = /usr/local/lnmp/mysql/data/mysql.sock
7.编辑完配置文件后,可以看到没有mysql这个用户(当用yum安装的时候会发现起始id是27)
[root@server1 support-files]# id mysql
id: mysql: No such user
[root@server1 support-files]# groupadd -g 27 mysql #也可以自己定义id号
[root@server1 support-files]# useradd -u 27 -g 27 mysql
8.更改用户和组
[root@server1 support-files]# chown mysql.mysql /usr/local/lnmp/mysql/ -R
9.修改全局变量
[root@server1 support-files]# vim ~/.bash_profile
10 PATH=$PATH:$HOME/bin:/usr/local/lnmp/mysql/bin
[root@server1 support-files]# source ~/.bash_profile
10.生成初始默认密码,给启动脚本添加权限,启动mysql
#按提示完成 mysql 安全设置,生产环境推荐使用
[root@server1 support-files]# mysqld --user=mysql --initialize
[root@server1 support-files]# chmod +x /etc/init.d/mysqld
[root@server1 support-files]# /etc/init.d/mysqld start
11.用初始密码进行登陆,当查看库信息的时候会报错
[root@server1 support-files]# mysql -uroot -p",iUw;arjP7d."
12.修改密码,重新尝试
[root@server1 support-files]# mysql_secure_installation #此处密码设置为Westos+001(自定义:大小写和特殊字符)
注意:除了输入原密码和现密码之外其余回车
三、Nginx 的源码编译
因为之前进行过编译介绍,此处不再赘述,步骤详情请见此片博文
https://blog.csdn.net/weixin_44209804/article/details/89389465
四、PHP 的源码编译
1.获得软件包资源,并进行解压
[root@server1 lnmp]# tar jxf php-5.6.35.tar.bz2 #可以得到一个目录
2.进入到解压获得的目录,进行编译
[root@server1 lnmp]# cd php-5.6.35
[root@server1 php-5.6.35]# ls #当拿到源码不会时,可以读里面README的文档或者./configure --help
[root@server6 php-5.6.35]# ./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 #支持limxml函数
--with-png-dir --with-jpeg-dir --with-freetype-dir #png处理图片的格式
--with-gmp
--with-gettext
--with-pear --enable-mysqlnd
--with-mysql=mysqlnd
--with-mysqli=mysqlnd
--with-pdo-mysql=mysqlnd --enable-inline-optimization --enable-soap --enable-ftp --enable-sockets --enable-mbstring --enable-fpm #支持与mysql数据库之间建立联系(enable-fpm表示开启fpm模式(nginx等服务所用的)
--with-fpm-user=nginx #对php服务的限制通过nginx的用户来实现
--with-fpm-group=nginx #php服务以nginx用户组的身份来运行
--with-mcrypt #提供了对多种块算法的支持,只要用来实现加密等算法
--with-mhash #加密算法
注意,在编译时必须有nginx用户
注意:会出现configure: error: xml2-config not found. Please check your libxml2 installation. 报错
[root@server1 php-5.6.35]# yum install libxml2-devel libcurl-devel -y
再次进行编译
注意:会出现configure: error: jpeglib.h not found.的报错
[root@server1 php-5.6.35]# yum whatprovides */jpeglib.h #查找含有此文件的包
[root@server1 php-5.6.35]# yum install libjpeg-turbo-devel-1.2.1-1.el6.x86_64 -y
再次进行编译
注意:会出现configure: error: png.h not found.的报错
[root@server1 php-5.6.35]# yum whatprovides */png.h
[root@server1 php-5.6.35]# yum install libpng-devel-1.2.49-1.el6_2.x86_64 -y
再次进行编译
注意:出现configure: error: freetype-config not found.的报错
[root@server1 php-5.6.35]# yum install freetype-devel -y
再次进行编译
注意:出现configure: error: Unable to locate gmp.h的报错
[root@server1 php-5.6.35]# yum whatprovides */gmp.h
[root@server1 php-5.6.35]# yum install gmp-devel-4.3.1-7.el6_2.2.x86_64 -y
再次进行编译
注意:出现configure: error: mcrypt.h not found. Please reinstall libmcrypt.的报错(这个资源可以从官网下载)
[root@server1 lnmp]# yum install re2c-0.13.5-1.el6.x86_64.rpm libmcrypt-2.5.8-9.el6.x86_64.rpm libmcrypt-devel-2.5.8-9.el6.x86_64.rpm -y
再次进入解压的目录下进行编译
[root@server1 php-5.6.35]# yum install net-snmp-devel -y
再次进行编译
此时编译成功
3.进行安装
[root@server1 php-5.6.35]# make && make install
注意:此时安装成功
- php的简单配置(让nginx可以识别php动态页面)
1.查看mysql的状态(开启),编辑php配置文件(配置pid)、更改时区
[root@server1 etc]# pwd
/usr/local/lnmp/php/etc
[root@server1 etc]# cp php-fpm.conf.default php-fpm.conf #拷贝一份模板作为配置文件
[root@server1 etc]# vim php-fpm.conf
25 pid = run/php-fpm.pid
149 user = nginx #保证用户和组都是nginx
150 group = nginx
[root@server1 php-5.6.35]# pwd
/root/lnmp/php-5.6.35
[root@server1 php-5.6.35]# cp php.ini-production /usr/local/lnmp/php/etc/php.ini #拷贝一份配置文件
[root@server1 php-5.6.35]# vim /usr/local/lnmp/php/etc/php.ini
936 date.timezone = Asia/Shanghai
2.复制php启动脚本到系统启动脚本的默认目录下(ps aux 可以发现当php 启动时会开启一个主进程,两个子进程)
[root@server1 fpm]# pwd
/root/lnmp/php-5.6.35/sapi/fpm
[root@server1 fpm]# cp init.d.php-fpm /etc/init.d/php-fpm
[root@server1 fpm]# chmod +x /etc/init.d/php-fpm
[root@server1 fpm]# /etc/init.d/php-fpm start #启动
Starting php-fpm done
3.更改nginx的配置文件
[root@server1 nginx]# pwd
/usr/local/lnmp/nginx
[root@server1 nginx]# cd conf/
[root@server1 conf]# vim nginx.conf
43 location / {
44 root html;
45 index index.php index.html index.htm;
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; #可以启动fpm
71 }
[root@server1 conf]# nginx -t
4.在nginx的默认发布页面目录下添加php页面,重新加载nginx配置
[root@server1 html]# pwd
/usr/local/lnmp/nginx/html
[root@server1 html]# ls
50x.html index.html
[root@server1 html]# vim index.php
[root@server1 html]# cat index.php
<?php
phpinfo()
?>
[root@server1 html]# nginx -s reload
浏览器输入172.25.254.1