主要概念:
1.LNMP=Linux+NGINX+MySQL+PHP
Nginx是一个高性能的http和反向代理服务器
MySQL是一个小型关系型数据管理系统
PHP是一种在服务器端执行的嵌入HTML文档的脚本语言
这四个都是免费开源的软件,组合起来就是一个免费高效扩展性强的网站服务系统
2.LNMP的工作流程:
client —>浏览器—>nginx —>静态的直接返回给client,动态的 —>php —>数据库中找资源
3.LNMP架构代表的就是Linux系统下NGINX+MySQL+PHP这种网站服务器的架构。NGINX中的PHP是以fastcgi的方式结合nginx的,可以理解为Nginx代理了PHP的fastcgi
4.工作方式:
(1)首先,浏览器发送http request请求到服务器(Nginx)
(2)服务器响应并处理web请求,将一些静态资源(CSS,图片,视频等)保存服务器上,然后将php脚本通过接口传输协议(网关协议)PHP-FCGI(fast-cgi)传输给PHP-FPM(进程管理程序)
(3)PHP-FPM不做处理,然后PHP-FPM调用PHP解析器进程,PHP解析器解析php脚本信息。
(4)PHP解析器进程可以启动多个,进行并发执行。然后将解析后的脚本返回到PHP-FPM
(5)PHP-FPM再通过fast-cgi的形式将脚本信息传送给Nginx
(6)服务器再通过Http response的形式传送给浏览器。
5 . LNMP和LAMP的区别:
LNMP和LAMP唯一不同是指提供web服务的是Nginx,
在Apache中,PHP是作为一个模块存在的。而在Nginx中,PHP是作为一个独立服务存在的,这个服务叫做php-fpm。
Nginx直接处理静态请求,动态请求会转发给php-fpm
6. LNMP的特点:
7. Nginx的性能稳定,功能丰富,处理静态文件速度快且消耗的系统资源较少,支持比Apache更多的并发连接数,效率更高
注:CGI 通用网关接口
在解析的过程中不能响应请求
fattcgi将两者分开,解析的同时也能响应请求
fastcgi_pass相当于一个反向代理 将请求交给php,让php处理动态的请求
mysql_connect连接数据库管理系统
mysql_select查询数据
memcachad缓存 每一级都可加缓存
实验环境:
主机名 | IP | 服务 |
---|---|---|
server1 | 172.25.68.1 | mysqld,php,nginx |
一、给虚拟机扩容:
mysql源码编译时要求虚拟机的硬盘大小不能小于20G,否则后边的编译过程会出问题,为了提升速度我们再增加CPU核数和内存大小
1.开机之前先打开虚拟机图形管理器,将cpu核数增加,扩大内存为2048,添加一个硬盘
2.开机后查看,出现新增的硬盘,/dev/sdb
[root@server1 ~]# fdisk -l
3.更改新增磁盘的标签以及分区
[root@server1 ~]# fdisk /dev/sdb
4.修改后可以看到这个磁盘变成了一和lvm类型的设备
[root@server1 ~]# fdisk -l
5.将新增的磁盘扩充到磁盘的逻辑卷dev/mapper/VolGroup中
[root@server1 ~]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created
[root@server1 ~]# vgextend VolGroup /dev/sdb1
Volume group "VolGroup" successfully extended
[root@server1 ~]# lvextend -L 30G /dev/mapper/VolGroup-lv_root
Extending logical volume lv_root to 30.00 GiB
Insufficient free space: 5494 extents needed, but only 5118 available
[root@server1 ~]# lvextend -l +5118 /dev/mapper/VolGroup-lv_root
Extending logical volume lv_root to 28.53 GiB
Logical volume lv_root successfully resized
6.再次查看磁盘的大小发生变化
[root@server1 ~]# fdisk -l
Disk /dev/mapper/VolGroup-lv_root: 30.6 GB, 30635196416 bytes
7.查看挂载情况,没有变化
[root@server1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root 8.5G 1.1G 7.0G 13% /
tmpfs 939M 0 939M 0% /dev/shm
/dev/sda1 485M 33M 427M 8% /boot
8.重新加载后查看发生变化,扩容成功
[root@server1 ~]# resize2fs /dev/mapper/VolGroup-lv_root
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/mapper/VolGroup-lv_root is mounted on /; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 2
Performing an on-line resize of /dev/mapper/VolGroup-lv_root to 7479296 (4k) blocks.
The filesystem on /dev/mapper/VolGroup-lv_root is now 7479296 blocks long.
[root@server1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root 29G 1.1G 26G 4% /
tmpfs 939M 0 939M 0% /dev/shm
/dev/sda1 485M 33M 427M 8% /boot
二、安装mysql
1.下载一个安装包,解压
[root@server1 ~]# ls
bansys mysql-boost-5.7.17.tar.gz varnish-libs-3.0.5-1.el6.x86_64.rpm
bansys.zip varnish-3.0.5-1.el6.x86_64.rpm
[root@server1 ~]# tar zxf mysql-boost-5.7.17.tar.gz
[root@server1 ~]# ls
bansys mysql-5.7.17 varnish-3.0.5-1.el6.x86_64.rpm
bansys.zip mysql-boost-5.7.17.tar.gz varnish-libs-3.0.5-1.el6.x86_64.rpm
[root@server1 ~]# cd mysql-5.7.17/
2.新建一个目录,作为mysql的目录
[root@server1 mysql-5.7.17]# mkdir /usr/local/lnmp/
3.安装cmake软件(c++编译)
[root@server1 mysql-5.7.17]# yum install cmake -y
cmake跨平台工具时用来编译mysql源码的,用于设置mysql的编译参数,如安装目录,数据存放目录,字符编码,排序规则等
4.编译(这个过程中会出现很多问题,一个一个解决)
<1>第一次编译:报错cmake版本太低
[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 \ #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 #安装所有扩展字符集
下载一个更高版本的cmake安装包,安装软件
[root@server1 ~]# ls
bansys mysql-boost-5.7.17.tar.gz
bansys.zip varnish-3.0.5-1.el6.x86_64.rpm
cmake-2.8.12.2-4.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm
mysql-5.7.17
[root@server1 ~]# yum install cmake-2.8.12.2-4.el6.x86_64.rpm -y
<2>第二次编译:报错缺少一个参数
[root@server1 ~]# cd mysql-5.7.17/
[root@server1 mysql-5.7.17]# ls
[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
<3>第三次:添加参数再次编译,报错没有安装ncurses-devel
[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]# yum install -y ncurses-devel
<4>第四次:报错一出缓存文件
删除编译缓存文件,再次编译
[root@server1 mysql-5.7.17]# ls
[root@server1 mysql-5.7.17]# rm -fr CMakeCache.txt
[root@server1 mysql-5.7.17]# ls
<5>第五次编译:报错c++的依赖性没有安装
安装gcc gcc-c++
[root@server1 mysql-5.7.17]# yum install gcc gcc-c++ -y
<6>第六次:删除缓存文件再次编译,报错bison没有安装
[root@server1 mysql-5.7.17]# rm -fr CMakeCache.txt
[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/
安装bison
<7>第七次编译:删除缓存文件,再次编译,编译成功
5.安装
6.安装包
7.安装之后可以看到/usr/local/lnmp目录下生成了mysql目录,而mysql目录下有一些子目录和文件
[root@server1 mysql-5.7.17]# cd /usr/local/lnmp
[root@server1 lnmp]# ls
mysql
[root@server1 lnmp]# cd mysql/
[root@server1 mysql]# ls
bin COPYING docs include lib man mysql-test README share support-files
8.将mysql的配置文件复制到etc下
备份/etc/my.cnf文件为/etc/my.cnf.bak
[root@server1 mysql]# cd /etc/
[root@server1 etc]# cp my.cnf my.cnf.bak
mysql的默认配置文件在support-files目录下,将mysql配置文件赋值为/etc/my.cnf文件
[root@server1 etc]# cd -
/usr/local/lnmp/mysql
[root@server1 mysql]# cd support-files/
[root@server1 support-files]# ls
magic my-default.cnf mysqld_multi.server mysql-log-rotate mysql.server
[root@server1 support-files]# vim my-default.cnf
[root@server1 support-files]# cp my-default.cnf /etc/my.cnf
cp: overwrite `/etc/my.cnf'? y
[root@server1 support-files]#
9.编辑mysql的配置文件,内容如下:
basedir = /usr/local/lnmp/mysql
datadir = /usr/local/lnmp/mysql/data
# port = .....
# server_id = .....
socket = /usr/local/lnmp/mysql/data/mysql.sock
[root@server1 ~]# vim /etc/my.cnf
[root@server1 ~]#
10.创建mysql组和用户
[root@server1 ~]# groupadd -g 27 mysql
[root@server1 ~]# useradd -u 27 -g 27 mysql
[root@server1 ~]# id mysql
uid=27(mysql) gid=27(mysql) groups=27(mysql)
[root@server1 ~]#
11.新建一个data目录作为数据存放目录,修改目录的属性,让mysql用户对这个目录有操作的权限
[root@server1 mysql]# mkdir data
[root@server1 mysql]# ll
[root@server1 mysql]# chgrp mysql /usr/local/lnmp/mysql -R
[root@server1 mysql]# chown mysql /usr/local/lnmp/mysql/data/ -R
[root@server1 mysql]# ll
12.将编译生成的mysql二进制命令放进系统环境变量的文件中,保证可以直接使用二进制命令(配置完之后mysql命令可以自动补齐)
[root@server1 mysql]# vim ~/.bash_profile
[root@server1 mysql]#
[root@server1 mysql]# source ~/.bash_profile
[root@server1 mysql]#
13.将编辑生成的mysql启动脚本复制到系统服务的目录中,保证脚本有可执行权限
[root@server1 mysql]# cd support-files/
[root@server1 support-files]# ls
magic my-default.cnf mysqld_multi.server mysql-log-rotate mysql.server
[root@server1 support-files]# cp mysql.server /etc/init.d/mysqld
[root@server1 support-files]# ll /etc/init.d/mysqld
-rwxr-xr-x 1 root root 10916 Apr 26 22:47 /etc/init.d/mysqld
[root@server1 support-files]# cd
14.将mysql初始化,这时data目录下不能有任何文件,如果有的话删除
[root@server1 ~]# mysqld --user=mysql --initialize
[root@server1 data]# cd
[root@server1 ~]# /etc/init.d/mysqld start
Starting MySQL.Logging to '/usr/local/lnmp/mysql/data/server1.err'.
.. SUCCESS!
15.初始化文成后会生成一个临时密码,用这个密码登陆数据库,查看数据失败,这是因为没有进行安全初始化
[root@server1 ~]# mysql -p
16.对mysql进行安全初始化,按照提示进行即可
[root@server1 ~]# mysql_secure_installation
17.再次进入数据库查看,可以查看
[root@server1 ~]# mysql -uroot -p
Enter password:
三、源码安装php
1.下载一个php的安装包,解压
2.安装编译php源码时需要的依赖性
3.进行编译
编译时出错,提示需要libmcrypt的依赖性,下载一个libmcrypt的安安装包,安庄后再次编译,编译成功
编译完是这样的
4.安装
make && make install
5.安装成功后会看到/usr/local/lnmp下会出先一个php目录
6.切换到这个目录下,编辑php的默认配置文件
25 pid = run/php-fpm.pid ##pid行去掉注释
149 user = nginx
150 group = niginx ##保证用户和组都是nginx
7.将源码包中的php。ini文件复制到安装后的目录中
编辑这个文件
更改时区
8.将php的启动文件复制到系统启动脚本的默认目录下
9.创建nginx用户
10.启动php服务,启动成功后可以查看到他使用的端口
四、源码安装NGINX
1.解压安装包
[root@server1 ~]# tar zxf nginx-1.14.0.tar.gz
[root@server1 ~]# ls
2.切换到解压出的目录,修改下面文件的内容
(1)去掉版本号
[root@server1 nginx-1.14.0]# vim src/core/nginx.h
[root@server1 nginx-1.14.0]#
#define NGINX_VER "nginx/"
(2)去掉debug日志(debug日志的级别很低,会产生很多数据,一般不需要开启)
[root@server1 nginx-1.14.0]# vim auto/cc/gcc
171 # debug
172 # CFLAGS="$CFLAGS -g"
3.创建编译环境,添加需要的模块
第一次编译:报错需要安装pcre库
[root@server1 nginx-1.14.0]# ./configure
--prefix=/usr/local/lnmp/nginx
--with-threads
--with-file-aio
--with-http_ssl_module
--with-http_stub_status_module
--user=nginx
--group=nginx
解决依赖性
[root@server1 nginx-1.14.0]# yum install pcre-devel -y
再次编译:编译成功
[root@server1 nginx-1.14.0]# ./configure
--prefix=/usr/local/lnmp/nginx
--with-threads
--with-file-aio
--with-http_ssl_module
--with-http_stub_status_module
--user=nginx
--group=nginx
4.安装
[root@server1 nginx-1.14.0]# make && make install
安装后在/usr/local/lnmp目录下会产生一个nginx子目录
5.配置nginx服务
[root@server1 nginx-1.14.0]# cd /usr/local/lnmp/
[root@server1 lnmp]# ls
mysql nginx php
[root@server1 lnmp]# cd nginx/
[root@server1 nginx]# ls
conf html logs sbin
[root@server1 nginx]# cd conf/
[root@server1 conf]# ls
fastcgi.conf koi-win scgi_params
fastcgi.conf.default mime.types scgi_params.default
fastcgi_params mime.types.default uwsgi_params
fastcgi_params.default nginx.conf uwsgi_params.default
koi-utf nginx.conf.default win-utf
[root@server1 conf]# vim nginx.conf
2 user nginx nginx;
3 worker_processes 2;
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;
71 }
切换到nginx/sbin目录下可以进行语法检测,检查配置文件中有没有语法问题
[root@server1 conf]# cd ..
[root@server1 nginx]# ls
conf html logs sbin
[root@server1 nginx]# cd sbin/
[root@server1 sbin]# ls
nginx
[root@server1 sbin]# ./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 sbin]#
-v查看版本号
[root@server1 sbin]# ./nginx -v
nginx version: nginx/
-V查看编译环境
[root@server1 sbin]# ./nginx -V
nginx version: nginx/
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/usr/local/lnmp/nginx --with-threads --with-file-aio
--with-http_ssl_module --with-http_stub_status_module --user=nginx --group=nginx
6.创建一个软连接可以直接使用nginx命令
[root@server1 sbin]# ln -s /usr/local/lnmp/nginx/sbin/nginx /usr/local/sbin/
[root@server1 sbin]#
[root@server1 sbin]# 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
7.打开服务查看端口号
[root@server1 sbin]# nginx
[root@server1 sbin]# netstat -tnlp
打开服务后可以看到多出了几个子目录
[root@server1 sbin]# cd ..
[root@server1 nginx]# ls
client_body_temp fastcgi_temp logs sbin uwsgi_temp
conf html proxy_temp scgi_temp
8.打开浏览器,访问测试
出现nginx的页面
9.编辑一个php文件,浏览器访问测试
[root@server1 sbin]# cd ..
[root@server1 nginx]# ls
client_body_temp fastcgi_temp logs sbin uwsgi_temp
conf html proxy_temp scgi_temp
[root@server1 nginx]# cd html/
[root@server1 html]# ls
50x.html index.html
[root@server1 html]# vim index.php
[root@server1 html]# ls
50x.html index.html index.php
<?php
phpinfo()
?>
浏览器中刷新后出现php页面,说明nginx和php结合成功