LNMP分离式部署:Linux,Ninx,MySQL,PHP
开启三台虚拟机,分别安装搭建nginx,php和mysql
首先搭建nginx
修改目录的属主属组
开始搭建PHP
安装相关的lib软件包
安装libiconv库 安装libmcrypt库 安装mhash加密扩展库 安装mcrvpt加密扩展库
开始安装PHP(FastCGI方式)服务
解压配置PHP(别忘了建程序用户www)
#特别强调:上述每行结尾的换行符反斜线(\)之后不能再有任何字符包括空格
如果执行编译后报错显示你没有安装openssl那个包,那么直接yum安装所有和openssl相关的包即可。
执行上述命令后,最后的正确输出提示为下图
对于上面命令,部分参数说明如下:
正确执行前文配置PHP软件的./configure系列命令后,就可以编译安装PHP软件了
最后的正确提示
配置PHP引擎配置文件php.ini
设置软链接以方便访问
查看PHP配置默认模版文件
开发环境更多的是开启日志,调试信息,而生产环境都是关闭状态
拷贝PHP配置文件到PHP默认目录,并更改文件名称为php.ini
配置PHP(FastCGI方式)的配置文件php-fpm.conf
修改配置文件的监听端口,151行改成监听本地IP的,可以进行远程访问
关于php-fpm.conf,暂时可用默认的配置,先把服务搭好,以后再进行优化。
启动PHP服务(FastCGI方式)
启动PHP服务php-fpm
配置Nginx支持PHP程序请求访问
修改Nginx配置文件
将nginx的ip加入windows的映射文件中
测试静态网页
添加一个动态网页
在浏览器上刷新显示的仍旧是html,因为它跳转的就是index.html静态网页
如果在域名后面加上动态网页的后缀,我们发现返回码404,因为nginx配置文件里的目录是共享的,所以它去php服务器里去找www目录了,但是php服务器没有创建这个目录,所以找不到网页。
在php服务器上创建www目录并添加一个动态首页,再在浏览器上刷新发现有内容了,显示的内容是php服务器上的
在nginx服务器上把静态网页删了,只保留一个动态网页,打开配置文件,将静态网页都删了,加入动态网页,重启配置文件,再访问,没问题。
测试:
既然看到的网页是php服务器上的,那么nginx上的动态网页是不是就可以把它删了呢?将nginx上的动态网页删掉,再在浏览器上访问发现返回码403,禁止访问。权限拒绝了。
测试发现,不能在nginx上将他删掉。但是找不到首页应该返回码404,为什么是403呢?
这就是nginx的安全机制,跳转首页的时候,如果发现跳转的首页找不着,它就会权限拒绝,不会再去php那里拿网页。它之前在nginx那里静态的部分先确定有没有那个首页,因为它是自动跳转,如果没有首页,它为了防止把目录内容都被别人看到,它的内部安全机制就会都给禁止了。所以就变成403,而非404。即使php里有,它也并不会再去拿,权限就给拒绝了。因为它发现本地没有。
我们在域名后面加上后缀动态网页名去访问,访问成功。不需它挑战,直接自己找,没问题。
在静态的部分也要添加动态网页名的原因就是防止它找不到首页时被权限拒绝。
如果想要让它跳转,静态的部分必须要有要找的那个“名字”,哪怕是空的都可以。
只要有这个“名字”,它的内部机制就不会阻碍你,它跳转的时候会去确定有没有这个文件,发现没有就不会再去推给php。后面加上了具体的文件名其实是去找php看文件的,所以nginx静态部分挂存储,php动态部分也要挂存储,两边要一致。
存储nfs不是挂在网页目录上的,而是挂在网页目录的子目录下的。
是挂在static upload这两个子目录下的。页面是不放在存储上的,网页文件是放在网页目录下的。所以每台web节点的网页目录下的内容都是一样的,然而还不是放在存储上的。
网页文件那么多,如何保持服务器一致呢?
每台服务器上都挂网页文件,放的还都是一样的,因为网页文件就是代码,代码不更新他就不会变,这就是具体的网页内容。开发修改了才需要变。变的时候用ansible批量分发。
一旦开发申请所有的页面需要升级修改,会把那个新的网页文件给运维,运维将这些文件都批量分发覆盖就上线了。所有的web服务器都是一样的,他不是挂nfs的,每个都有网页文件,用户不可能去修改网页内容,也修改不了。
一旦要上线,开发交申请,然后交给运维去更新,更新自然是ansible批量分发。真正挂存储的就是子目录图片视频才挂存储,所以动态服务器如果不考虑上传的问题,上传图片就进入nfs了,一旦把上传的东西给分离出去,剩下的就只有读功能了,读功能本地访问网页目录,但本地的网页目录文件是有的,每台都有,不需要挂存储。
测试:将php服务器关了,克隆一个它叫php2,再开启。然后再启动php服务
回到nginx进行反向代理,修改nginx的配置文件
再去浏览器访问也可以成功。fastcgi也有推服务器池的功能,当分离部署的时候,可以推一个服务器池,也可以推多个服务器池,每个服务器池都可以是一个业务。
搭建mysql,采用二进制方式安装MySQL
二进制安装包,仅需要解压就可以了,不需要执行cmake/configure,make,make install等过程
- 当安装LNMP一体化环境时,MySQL数据库要装在Nginx所在的机器上。如果MySQL和Nginx不在一台机器上,那么,Nginx服务器上的MySQL数据库软件包只要解压移动到/usr/local/目录,改名为mysql就可以了,不需要进行后面的初始化配置。
- :在非一体的LNMP环境(Nginx和MySQL不在一台机器上),编译PHP环境时,也是需要MySQL数据库环境的,但是高版本的PHP,例如5.3版本以上,内置了PHP需要的MySQL程序,因此,对于此类版本就不需要在Nginx服务器上安装MySQL软件了,只需要在编译PHP时指定相关参数即可。这个PHP的编译参数为--with-mysql=mysqld,表示PHP程序在编译时会调用内置的MySQL的库。
初始化MySQL配置文件my.cnf
support-files下有my.cnf的各种配置样例。
- 使用cp全路径/bin/cp,可实现拷贝而不出现替换提示,即如果有重名文件会直接覆盖
- 本例为测试安装环境,因此选择参数配置小的my-small.cnf配置模版,如果是生产环境可以根据硬件选择更高级的配置文件,上述配置文件模版对硬件的要求从低到高依次为:
创建mysql用户的账号 授权mysql用户管理MySQL的安装目录
初始化MySQL数据库文件
光盘源安装依赖包,否则下一步的编译会报错
初始化MySQL数据库文件,会有很多信息提示,如果没有ERROR级别的错误,会有两个OK的字样,表示初始化成功,否则就要解决初始化的问题
配置并启动MySQL数据库
设置MySQL启动脚本 拷贝MySQL启动脚本到MySQL的命令路径 使脚本可执行
MySQL二进制默认安装路径是/usr/local/mysql,启动脚本里是/usr/local/mysql。如果安装路径不同,那么脚本里路径等都需要替换
加入开机自启动 配置mysql命令的全局使用路径
启动MySQL数据库 检查MySQL数据库是否启动
登陆MySQL测试 直接输入命令即可登陆
创建mysql登录密码
创建mysql远程登录用户
对PHP连接MySQL的情况进行测试
编辑test_mysql.php
由于php2没有做配置,所以再刷新会有返回码页面,这里就不再配置它了。
测试连接成功。至此,LNMP的分离式部署已经搭建完毕。