LNMP(Linux+Nginx+MySQL+PHP)的搭建(源码编译)

LNMP架构是什么?

LNMP代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构

  • Linux是一类Unix计算机操作系统的统称,是目前最流行的免费操作系统。代表版本有:debian、centos、ubuntu、fedora、gentoo等。
  • Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。
  • Mysql是一个小型关系型数据库管理系统。
  • PHP是一种在服务器端执行的嵌入HTML文档的脚本语言。
    这四种软件均为免费开源软件,组合到一起,成为一个免费、高效、扩展性强的网站服务系统

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的形式传送给浏览器。
  • 浏览器再进行解析与渲染然后进行呈现。

一.Mysql数据库的源码编译及配置

编译安装

## 创建目录将之后编译的MySQL,Nginx,PHP都放在一起
[root@server1 ~]# mkdir /usr/local/lnmp
## 解压数据库包
[root@server1 ~]# tar zxf mysql-boost-5.7.17.tar.gz

## CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)
[root@server1 ~]# yum install cmake-2.8.12.2-4.el6.x86_64.rpm -y

## 编译需要的依赖包
[root@server1 ~]# yum install gcc gcc-c++ ncurses-devel bison -y
[root@server1 ~]# cd mysql-5.7.17/
## 此处用Cmake(支持编译C++语言),make跨平台工具是用来预编译mysql源码的,用于设置mysql的编译参数。如:安装目录、数据存放目录、字符编码、排序规则等
[root@server1 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/
[root@server1 mysql-5.7.17]# make && make install

编译的一些参数

cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \   #安装目录
-DMYSQL_DATADIR=/usr/local/mysql/data \  #数据库存放目录
-DMYSQL_UNIX_ADDR=/usr/local/mysql/data/mysql.sock \ #Unix socket 文件路径
-DWITH_MYISAM_STORAGE_ENGINE=1 \   #安装 myisam 存储引擎
-DWITH_INNOBASE_STORAGE_ENGINE=1 \  #安装 innodb 存储引擎
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \   #安装 archive 存储引擎
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \  #安装 blackhole 存储引擎
-DWITH_PARTITION_STORAGE_ENGINE=1 \  #安装数据库分区
-DENABLED_LOCAL_INFILE=1 \  #允许从本地导入数据
-DWITH_READLINE=1 \  #快捷键功能
-DWITH_SSL=yes \  #支持 SSL
-DDEFAULT_CHARSET=utf8 \  #使用 utf8 字符
-DDEFAULT_COLLATION=utf8_general_ci \  #校验字符
-DEXTRA_CHARSETS=all \   #安装所有扩展字符集
-DMYSQL_TCP_PORT=3306 \  #MySQL 监听端口

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


配置

  1. 将编译完成的MyQL启动脚本复制到系统启动服务的默认目录中
[root@server1 ~]# cp mysql-5.7.17/support-files/mysql.server /etc/init.d/mysql
[root@server1 ~]# chmod +x /etc/in		## 脚本,添加可执行权限
[root@server1 ~]# chmod +x /etc/init.d/mysql 
  1. 进入源码编译目录,再进入mysql安装的位置,将编译完成的默认配置文件放在/etc/my.cnf
## 备份文件
[root@server1 ~]# cp /etc/my.cnf /etc/my.cnf.bakeup	
[root@server1 ~]# cp mysql-5.7.17/support-files/my-default.cnf /etc/my.cnf
cp: overwrite `/etc/my.cnf'? y
  1. 编辑my.cnf
[root@server1 ~]# vim /etc/my.cnf
## 添加
basedir = /usr/local/lnmp/mysql    # mysql的安装目录
datadir = /usr/local/lnmp/mysql/data    # mysql数据存放位置
socket = /usr/local/lnmp/mysql/data/mysql.sock    # mysql与外界联系的套接字文件位置
  1. 对mysql服务进行限制(利用mysql用户),将mysql服务的工作空间局限在mysql用户的家目录中,创建mysql组和mysql用户
[root@server1 ~]# groupadd -g 27 mysql
[root@server1 ~]# useradd -u 27 -g 27 -M -d /usr/local/lnmp/mysql/data -s /sbin/nologin mysql
  1. 创建data目录,将mysql目录下的所有文件的所有组都改为mysql,只有data目录的所有人是mysql,因为mysql服务将要往这个目录中写数据,保证其有执行权限
[root@server1 ~]# mkdir /usr/local/lnmp/mysql/data
[root@server1 ~]# chgrp mysql /usr/local/lnmp/mysql -R
[root@server1 ~]# chown mysql /usr/local/lnmp/mysql/data -R
[root@server1 ~]# ll /usr/local/lnmp/mysql/ 
total 60
drwxr-xr-x  2 root  mysql  4096 Mar  1 15:12 bin
-rw-r--r--  1 root  mysql 17987 Nov 28  2016 COPYING
drwxr-xr-x  2 mysql mysql  4096 Mar  1 15:25 data
drwxr-xr-x  2 root  mysql  4096 Mar  1 15:12 docs
drwxr-xr-x  3 root  mysql  4096 Mar  1 15:12 include
drwxr-xr-x  4 root  mysql  4096 Mar  1 15:12 lib
drwxr-xr-x  4 root  mysql  4096 Mar  1 15:12 man
drwxr-xr-x 10 root  mysql  4096 Mar  1 15:12 mysql-test
-rw-r--r--  1 root  mysql  2478 Nov 28  2016 README
drwxr-xr-x 28 root  mysql  4096 Mar  1 15:12 share
drwxr-xr-x  2 root  mysql  4096 Mar  1 15:12 support-files
  1. 将编译生成的mysql二进制命令放进系统的环境变量文件中,保证可以直接调用该二进制命令
[root@server1 ~]# vim ~/.bash_profile 
PATH=$PATH:$HOME/bin:/usr/local/lnmp/mysql/bin
[root@server1 ~]# source ~/.bash_profile 	## 加载.bash_profile文件
  1. 初始化数据库
[root@server1 ~]# mysqld --user=mysql --initialize

在这里插入图片描述

注意:如果这条命令执行不成功,则进入data目录下,将里面的东西都删掉,再次执行则成功

  1. 开启mysqld
[root@server1 ~]# /etc/init.d/mysql start
Starting MySQL.Logging to '/usr/local/lnmp/mysql/data/server1.err'.
 SUCCESS! 
  1. 查是否可以登录进入mysql
## 特殊字符带单引号
[root@server1 ~]# mysql -uroot -p'i=c:rer-d8lX'

注意:如果不能成功进入
显示:ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/usr/local/lnmpmysql/data/mysql.sock’
(1)可能是mysql.sock目录位置没有写对,可能在编译的时候就编写错误,也可能在 my.conf 文件中的socket:指定位置没有写对
(2)有可能是3306端口被占用了
解决方式:

netstat -anp | grep 3306 ##查看占用3306端口的pid
kill -9 pid(占用)
/etc/init.d/mysqld stop ##把mysql服务关掉
然后把data目录下的东西都删掉 :rm -fr *
/etc/init.d/mysqld start ##再打开mysql服务
mysqld --user=mysql --initialize ##再次生成初始化密码
mysql -uroot -p新密码 ##再次登录则可以成功进入
  1. mysql的安全初始化
[root@server1 ~]# mysql_secure_installation

在这里插入图片描述

初始数据库不懂的可以看我以前的关于数据库的博客

  1. 登录Mysql数据库测试

在这里插入图片描述


二.PHP源码编译

  1. 得到PHP的源码包并解压,解决依赖性,编译并安装
[root@server1 ~]#  tar jxf php-5.6.35.tar.bz2
[root@server1 ~]# yum install -y libmcrypt-devel-2.5.8-9.el6.x86_64.rpm libmcrypt-2.5.8-9.el6.x86_64.rpm
## 以上两个包要在官网上下载
## PHP编译需要很多依赖包,如果出问题报错语句百度一下,直接安包就行了
[root@server1 ~]# yum install libjpeg libpng freetype libjpeg-devel libpng-devel freetype-devel libxml2-devel openssl-devel libcurl-devel net-snmp-devel libjpeg libpng freetype libjpeg-devel libpng-devel freetype-devel yum install libxml2-devel libjpeg-turbo-devel-1.2.1-1.el6.x86_64 net-snmp-devel gmp-devel-4.3.1-7.el6_2.2.x86_64 freetype-devel 2:libpng-devel-1.2.49-1.el6_2.x86_64
## 别管是啥,盘他!!!
[root@server1 ~]# cd php-5.6.35
[root@server1 php-5.6.35]# ./configure --prefix=/usr/local/lnmp/php --with-config-file-path=/usr/local/lnmp/php/etc --with-openssl --with-snmp --with-gd --with-zlib --with-curl --with-libxml-dir --with-png-dir --with-jpeg-dir --with-freetype-dir --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 --with-fpm-user=nginx --with-fpm-group=nginx --with-mcrypt --with-mhash
[root@server1 php-5.6.35]# make && make install
  1. 编译的详细参数以及部分参数的含义
 ./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              # 加密算法
  1. 创建Nginx用户
root@server1 ~]# useradd -M -d /usr/local/lnmp/nginx -s /sbin/nologin nginx
  1. 做php服务的简单配置(配置pid和时区)
[root@server1 ~]# cp /usr/local/lnmp/php/etc/php-fpm.conf.default /usr/local/lnmp/php/etc/php-fpm.conf
[root@server1 ~]# vim /usr/local/lnmp/php/etc/php-fpm.conf
 25 pid = run/php-fpm.pid   ##去掉注释
149 user = nginx     ##保证用户和组都是ngnix
150 group = nginx

[root@server1 ~]# cp php-5.6.35/php.ini-production /usr/local/lnmp/php/etc/php.ini
[root@server1 ~]# vim /usr/local/lnmp/php/etc/php.ini
date.timezone =Asia/Shanghai    ##修改时区
  1. 将php启动的脚本复制到系统启动脚本的默认目录下,并测试php是否可以启动
[root@server1 ~]# cp php-5.6.35/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
[root@server1 ~]# chmod +x /etc/init.d/php-fpm 
[root@server1 ~]# /etc/init.d/php-fpm start
Starting php-fpm  done
[root@server1 ~]# netstat -tpln		 # 查看php服务的监听端口(9000)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      905/sshd            
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      981/master          
tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN      30679/php-fpm       
tcp        0      0 :::22                       :::*                        LISTEN      905/sshd            
tcp        0      0 ::1:25                      :::*                        LISTEN      981/master          
tcp        0      0 :::3306                     :::*                        LISTEN      19464/mysqld        

三.Nginx的源码编译

  1. 得到nginx的源码包并解压
[root@server1 ~]# tar zxf nginx-1.14.0.tar.gz
  1. 去掉nginx的版本号,关闭debug日至(因为debug的日志非常多,企业中一般不需要开启)
[root@server1 ~]# cd nginx-1.14.0
[root@server1 nginx-1.14.0]# vim src/core/nginx.h 
14 #define NGINX_VER          "nginx/"  
[root@server1 nginx-1.14.0]# vim auto/cc/gcc 
171 # debug
172 #CFLAGS="$CFLAGS -g"     ##添加注释
  1. 解决源编译中的依赖性问题,编译安装
[root@server1 nginx-1.14.0]# yum install pcre-devel gcc zlib-devel -y
[root@server1 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
[root@server1 nginx-1.14.0]# make && make install
  1. 配置nginx服务
[root@server1 nginx-1.14.0]# cd /usr/local/lnmp/nginx/
[root@server1 nginx]# vim conf/nginx.con

在这里插入图片描述

在这里插入图片描述

  1. 创建一个软连接,可以直接调用命令
[root@server1 nginx]# ln -s /usr/local/lnmp/nginx/sbin/nginx /usr/local/bin/
  1. 检测nginx服务是否可用并打开nginx服务
root@server1 nginx]# nginx -t	##语法检测
nginx: the configuration file /usr/local/lnmp/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/lnmp/nginx/conf/nginx.conf test is successful
[root@server1 nginx]# nginx	 ##打开nginx
[root@server1 nginx]# netstat -tnlp	##查看端口为80
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      904/nginx           
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      905/sshd            
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      981/master          
tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN      30679/php-fpm       
tcp        0      0 :::22                       :::*                        LISTEN      905/sshd            
tcp        0      0 ::1:25                      :::*                        LISTEN      981/master          
tcp        0      0 :::3306                     :::*                        LISTEN      19464/mysqld 
  1. 浏览器中输入172.25.254.60 显示nginx页面

在这里插入图片描述

  1. 访问测试,浏览器中输入172.25.254.60/index.php,出现以下界面则,表示nginx和PHP结合成功
[root@server1 nginx]# vim html/index.php
<?php
phpinfo()
?>

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值