首页 > 技术文章 > 企业LNMP环境应用

wangyinuo 2018-11-08 15:41 原文

企业LNMP环境应用

第四部笔记

---私人文章

 

一,LNMP应用环境

 

1.1 LNMP 介绍

  • 2010年以前,互联网公司最常用的经典Web服务环境组合就是LAMP(L=Linux,A=Apache,M=MySQL,P=PHP(如果出现T=tomcat)),近几年随着Nginx Web服务的逐渐流行又出现了新的Web服务环境组合---LNMP或LEMP,其中LNMP为Linux,Nginx,MySQL,PHP等首字母的缩写,而LEMP中的E则表示Nginx,它曲子取自Nginx名字的发音(engine x)。
  • 目前LNMP已经逐渐成为国内大中型互联网公司网站的主流组合环境,所以我们必须熟练掌握LNMP环境的搭建、优化以及维护方法。
 

1.2 LNMP 组合工作流程及部署方式

  • 在LNMP组合工作时,首先是用户通过浏览器输入域名请求Nginx Web服务,如果请求时静态资源则有Nginx解析返回给用户(注4);如果是动态请求(.php结尾)那么Nginx就会把它通过FastCGI接口(生产常用方法)发送给PHP引擎服务(FastCGI进程php-fpm)进行解析,如果这个动态请求要读取数据库数据,那么PHP就会继续向后请求MySQL数据库以读取需要的数据并最终通过Nginx服务把获取的数据返回给用户(注9),这就是LNMP环境的基本请求顺序流程,也是企业中LNMP环境的常用流程
  • LNMP的部署方式分为两种: 
    1.全部部署在一台上 
    2.全部不在一台上:N+P+M 或只分离MySQL ---> NP+M 
    一般用第二种。

image_1crhpnm6t19hr1h11uf8jgj1ntjm.png-102.3kB

注: 
(1)用户的请求一定是遵循HTTP协议的,因为是通过浏览器过来的。默认访问80端口 
(2)Nginx和Apache其实一样,如果没有PHP支持那么都处理不了所谓的动态请求,他们自身都只能处理静态只是Apache转发动态数据包的速度快,只限单个包速度 
(3)软件的设计架构分为C/S和B/S (C=客户端 B=Web) 
作为客户端Client的fastcgi_pass和作为Server的PHP-fpm,由于Nginx和PHP搭上就需要这两个东西,所以随着发展没有fastcgi这个软件包了,而是把这个软件包分成了两部分,它的客户端(fastcgi_pass)和Nginx合并了,只要安装Nginx必然有它的客户端,而它的另一部分服务端(PHP-fpm)和PHP功能合并了,只要安装PHP就必然有它的服务端 
(4)用户请求为静态请求,location过滤为静态,Nginx去网页目录里根据URL的URI的部分去拿网页然后返回给用户(可以把这个过程看作为磁盘I/O读写) 
(5)用户请求为动态请求,location过滤为动态(正则~*.(php|)php5)${}),fastcgi_pass 127.0.0.1:9000推过去,如果在别的IP上就得换IP那么就进入分离式部署了。 
(6)PHP-fpm监听端口号:9000 
(7)PHP是一种动态语言,它需要激活开发的代码,根据代码里写的代码去找数据库,一般开发写的代码以.php结尾 
(8)静态网页有真实文件,动态网页也有真实文件,只不过它文件实体里面是代码(首页index.php)。 
(9)php先读取到内存里把代码去执行,JS代码部分去数据库把它想取的文字取出来然后写回到内存里,到内存里就把代码去掉变成取出来的文字然后再打个包给用户


 

二,LNMP之MySQL数据库

 

2.1 MySQL数据库介绍

  • MySQL是互联网领域里非常重要的,深受广大用户欢迎的一款开源关系型数据库软件,由瑞典MySQL公司开发与维护。2006年被SUN公司收购,2008年,SUN公司又被传统数据数据库领域大佬甲骨文(Oracle)公司收购。因此MySQL目前属于Oracle公司但仍是开源的,Oracle公司收购MySQL的战略意图显而易见,其自身的Oracle数据库继续服务于传统大中型企业而利用收购的MySQL抢占互联网领域数据库份额完成其战略布局。
  • 关系型数据的特点是将数据保存在不同的二维表中并且将这些表放入不同的数据库中而不是统一放在一个数据库中,这样设计增加了MySQL的读取速度,灵活性和可管理性都得到了很大的提高。
  • 访问及管理MySQL数据库最常用的标准化语言为SQL结构化查询语言
 

2.2 MySQL数据库的优点和特点

  1. 性能卓越,服务稳定,很少出现异常宕机
  2. 开放源代码且无版权制约,自主性强,只用成本低
  3. 历史悠久,社区及用户非常活跃,遇到问题可以很快获取到帮助
  4. 软件体积小,安装使用简单并且易于维护,安装及维护成本低
  5. 支持多种操作系统,提供多种API接口,支持多种开发语言,特别是对流行的PHP语言无缝支持
  6. 品牌口碑效应,使得企业无需考虑可以直接用之
 

2.3 安装MySQL数据库

 

2.3.1 安装概览

  • MySQL有几种不同的产品线且每种产品线又有很多不同的版本,我们这里选择当前企业使用最广的社区版MySQL5.5系列作为LNMP的组合环境数据库平台
  • MySQL的安装方法也有很多,常见的方法如下:

image_1crhvpe9d175r1cgm1d4h1ctphsp9.png-169.1kB

备注:安装MySQL的注意事项如下: 
(1)建议和之前介绍的Nginx服务安装在同一台机器上 
(2)重视操作过程的报错输出,有错误要解决掉在继续,不能忽略编译中的错误

 

2.3.2 安装步骤

 
1.安装MySQL

php安装需要现有MySQL的环境,不然php编译报错

tar xf mysql-5.5.32-linux2.6-x86_64.tar.gz -C /usr/local/
 
2.创建MySQL用户的账号
useradd -s /sbin/nologin -M mysql
 
3.初始化MySQL配置文件my.cnf

(1)进入 /usr/local/mysql目录

cd /usr/local/mysql-5.5.32-linux2.6-x86_64/

(2)用 support-files/my-small.cnf 做初始化文件

/bin/cp support-files/my-small.cnf /etc/my.cnf

(3)初始化MySQL 
1,先做一个映射,如果工作中你的主机名没有在本地有映射的情况下有可能会导致错误的出现

echo "192.168.200.52 LNMP" >> /etc/hosts

2,做个软连接

ln -s /usr/local/mysql-5.5.32-linux2.6-x86_64 /usr/local/mysql

3,给MySQL程序用户属主属组

chown -R mysql.mysql /usr/local/mysql

4,yum 安装依赖支持包

yum -y install libaio

5,初始化

 /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/ --user=mysql
 
(4)配置并启动MySQL数据库

1,复制MySQL启动脚本到MySQL的命令路径

cp support-files/mysql.server /etc/init.d/mysqld

2,使脚本可执行

chmod +x /etc/init.d/mysqld

3,启动MySQL

/etc/init.d/mysqld start
 
(5)给MySQL设置密码

1,做软连接

ln -s /usr/local/mysql/bin/* /usr/local/bin/

2,设置密码

mysqladmin -uroot password '123456'

3,登陆试试

mysql -uroot -p123456

 

三, FastCHI 介绍

 

3.1 什么是CGI

  • CGI的全程为“通用网关接口”(Common Gateway Interface),为HTTP服务器与其他机器上的程序服务通信交流的一种工具,CGI程序须运行在网络服务器上。
  • 传统CGI接口方式的主要缺点是性能较差,因为每次HTTP服务器遇到动态程序是都需要重新启动解析器来执行解析,之后结果才会返回给HTTP服务器,这在处理高并发访问时几乎是不可用的,因此就诞生的FastCGI,另外,传统的CGI接口方式安全性也很差故而现在已经很少被使用
 

3.2 什么是 FastCGI

FastCGI是一个可伸缩的,高速的在HTTP服务器和动态脚本语言间通信的接口(Linux下,FastCGI接口即为socket,这个socket可以是文件socket也可以是IP socket),主要有点是吧动态语言和HTTP服务器分离出来。多数流行的HTTP服务器都支持FastCGI,包括Apache,Nginx和Lighttpd等。 
FastCGI被许多脚本语言所支持,例如当前比较流行的脚本语言PHP,FastCGI接口采用的是C/S架构,它可以将HTTP服务器和脚本解析服务器分开同时还能再脚本解析服务器上启动一个或多个脚本来解析守护进程,当HTTP服务器遇到动态程序时可以将其直接交付给FastCGI进程来执行然后将得到的结果返回给浏览器,这种方式可以让HTTP服务器转移地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能

FastCGI的重要特点如下: 
1.HTTP服务器和动态脚本语言间通过新的接口或工具 
2.可把动态语言解析和HTTP服务器分离开 
3. Nginx,Apache,Lighttpd,以及多数动态语言都支持 
4. FastCGI接口方式采用C/S结构,分为客户端(HTTP服务器)和服务器端(动态语言解析服务器) 
5. PHP动态语言服务器端可以启动多个FastCGI的守护进程(例如:php-fpm(fchi process mangement)) 
6. HTTP服务器通过(例如:Nginx fastcgi_pass)FastCGI客户端和动态语言FastCGI服务器端通信

 

3.3 Nginx FastCGI 的运行原理

Nginx不支持对外部动态程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用,FastCGI接口在Linx下是socket,为了调用CGI程序还需要一个FastCGI的wrapper(可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个骨盾给的socket上,如端口或文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接收到请求然后派生出一个新的线程调用解释器或外部程序处理脚本来读取返回的数据;接着wrapper在讲返回id数据通过FastCGI接口沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整个运作过程

image_1cri57005ovp15o7c7h5orn8g9.png-68.7kB
FastCGI的主要优点是把动态语言和HTTP服务器分离开来,使Nginx专门处理静态请求及向后转发的动态请求,而PHP/PHP-FPM服务器则专门解析PHP动态请求

 

3.4 LNMP之PHP(FastCGI方式)服务的安装和准备

 

3.4.1 检查Nginx及MySQL的安装情况

(1)检查确认Nginx及MySQL的安装路径

ls -ld /usr/local/nginx
ls -ld /usr/local/mysql

(2)检查端口及启动情况

netstat -antup | grep -E "80|3306"
 

3.4.2 PHP服务搭建

1. 检查安装PHP所需的lib库 
PHP程序在开发及运行时会调用一些诸如zlib,gd等函数库,因此需要确认lib库是否已经安装

(1) yum -y install zlib-devel libxml2-devel libjpeg-devel libjpeg-turbo-devel libiconv-devel
(2) yum -y install freetype-devel libpng-devel gd libcurl-devel libxslt-devel
(3) 查看是否下载好 
yum -y rpm -qa zlib-devel libxml2-devel libjpeg-devel libjpeg-turbo-devel libiconv-devel

2. 云yum下载本地yum没有下载源的lib包并解压安装

   (1) wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
   (2) tar xf libiconv-1.14.tar.gz -C /usr/src/
   (3) cd /usr/src/libiconv-1.14/
   (4) ./configure --prefix=/usr/local/libiconv && make && make install

3. 安装libmcrypt库 
云Yum安装

(1)wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo 
(2) yum -y install libmcrypt-devel

4. 安装mhash加密扩展库

云Yum安装 
yum -y install mhash

5. 安装mcrvpt加密扩展库

云Yum安装 
yum -y install mcrypt

6. 获取PHP软件包

云Yum安装PHP软件包 
wget http://cn2.php.net/distributions/php-5.3.28.tar.gz

7. 解压配置PHP(此步骤之前MySQL和Nginx必须搭建成功)

 
  1. tar xf php-5.3.28.tar.gz -C /usr/src/
  2. cd /usr/src/php-5.3.28/
  3. ./configure --prefix=/usr/local/php5.3.28 --with-mysql=/usr/local/mysql --with-iconv-dir=/usr/local/libiconv --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-safe-mode --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --with-curlwrappers --enable-mbregex --enable-fpm --enable-mbstring --with-mcrypt --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --enable-short-tags --enable-zend-multibyte --enable-static --with-xsl --with-fpm-user=yinuo --with-fpm-group=yinuo --enable-ftp

最后的正确输出提示为:Thank you for using PHP.

image_1crmieh8l1n617ko1sgbkcieqj9.png-2.1kB

编译详解 
1.--prefix=/usr/local/php5.2.28 表示指定PHP的安装路径为/usr/local/php5.3.28 
2.--with-mysql=/usr/local/mysql 
表示需要指定MySQL的安装路径,安装PHP需要的MySQL相关内容。当然,如果没有MySQL软件包,也可以不单独安装,这样的情况可使用--with-mysql=mysqlnd替代--with-mysql=/usr/local/mysql,因为PHP软件里已经自带了连接MySQL的客户端工具。 
3.--with-fpm-user=yinuo 
nginx表示指定PHP-FPM进程管理的用户为www,此处最好和Nginx服务用户统一 
4.--with-fpm-group=yinuo 
表示指定PHP-FPM进程管理的组为www,此处最好与Nginx服务用户组统一。 
5.--enable-fpm 
表示激活PHP-FPM方式服务,即以FastCGIF方式运行PHP服务。

 

8. 编译PHP

(1) 软连接 
ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib64

(2)手动创建一个文件 
touch ext/phar/phar.phar

(3)编译 
make

make最后正确提示 
image_1crmjdc8k1fs01c9ftqf3lh1ln0m.png-2.9kB

 

3.4.3 安装PHP生成文件到系统及设置软链接

make install

ln -s /usr/local/php5.3.28/ /usr/local/php
 

配置PHP引擎配置文件php.ini

生产环境: php.ini-development 开发环境: php.ini-production 
开发环境更多的是开启日志,调试信息,而生产环境都是关闭状态 
cd /usr/src/php-5.3.28 
cp php.ini-production /usr/local/php/lib/php.ini 
cd /usr/local/php/etc/ 
cp php-fpm.conf.default php-fpm.conf 
关于php-fpm.conf,暂时可用默认的配置,先把服务搭好,以后再进行优化

 

3.4.4 启动PHP服务

/usr/local/php/sbin/php-fpm 
ss -antup | grep 9000 #查看端口号是否启动成功

 

3.5 修改Nginx配置文件支持PHP服务

vim /usr/local/nginx/conf/nginx.conf

 
  1. worker_processes 1;
  2. error_log logs/error.log; # 增加错误日志
  3. events {
  4. worker_connections 1024;
  5. }
  6. http {
  7. include mime.types;
  8. default_type application/octet-stream;
  9. sendfile on;
  10. keepalive_timeout 65;
  11. server {
  12. listen 80;
  13. server_name blog.yunjisuan.com; # 做一个网站
  14. location / {
  15. root html/blog;
  16. index index.html index.htm;
  17. }
  18. location ~ .*\.(php|php5)?$ { # 添加遇到动态状况
  19. root html/blog;
  20. fastcgi_pass 127.0.0.1:9000;
  21. fastcgi_index index.php;
  22. include fastcgi.conf;
  23. }
  24. }
  25. } # 先创建首页
  26. cd /usr/local/nginx/html
  27. mkdir bolg
  28. echo "`hostname -I` blog.yunjisuan.com" > blog/index.html
 

3.5.1 检查并启动Nginx

检查Nginx配置文件的语法 
/usr/local/nginx/sbin/nginx -t

启动Nginx 
/usr/local/nginx/sbin/nginx

查看端口号 
ss -antup | grep 80

此步在生产环境很关键,如不提前检查语法,重启后发现语法错误会导致Nginx无法提供服务,,给用户访问体验带来不好的影响

 

3.5.2 添加本地映射并测试静态网页

vim /etc/hosts

192.168.200.53 LNMP blog.yunjisuan.com

curl blog.yunjisuan.com

 

3.5.3 针对动态网页测试

cd /usr/local/nginx/html/blog

vim test_info.php 
image_1crmmths2tbm1skesu130n16tr20.png-7kB

 

3.5.4 添加Windows映射文件并测试动态

  • C:\Windows\System32\drivers\etc --->windows映射文件位置
  • 192.168.200.53 blog.yunjisuan.com
  • 在浏览器输入blog.yunjisuan.com/test_info.php 
    image_1crmnlj001qok1pi8ag92t71dqj2d.png-73.3kB
    注:查不到网页的情况下先重启服务关闭防火墙
 

3.6 MySQL测试

cd /usr/local/nginx/html/blog

vim test_mysql.php

 
  1. <?php
  2. $link_id=mysql_connect('localhost','root','123456');
  3. if($link_id) {
  4. echo "mysql successful by YiNuo !\n";
  5. }else{
  6. echo mysql_error();
  7. }
  8. ?> #后台PHP代码,测试MySQL
 

3.6.1 用PHP命令测试

先启动MySQL在测试

如果没有PHP命令就是没做软链接 
ln -s /usr/local/php/bin/* /usr/local/bin

LINUX php测试 
php test_mysql.php 
image_1crmq8qvg1csb144a25hiei9l03a.png-4.2kB

Windowns 网页测试 
网页输入:blog.yunjisuan.com 
image_1crmqgrbmhbs1kkl14sgi1t1o6e3n.png-12.2kB


 

四, 开源博客程序

 

4.1 开源博客程序WordPress介绍

  • WordPress 是一套利用PHP语言和MySQL数据库开发的开源免费的blog(博客,网站)程序,用户可以在支持PHP环境和MySQL数据库的服务器上建立blog站点。它的功能非常强大,拥有众多插件,易于扩充功能。其安装和使用也都非常方便。目前WordPress已经成为搭建blog平台的主流,很多发布平台都是根据WordPress二次开发的,如果你也想像他们一样拥有自己的blog,可购买网上的域名及空间,然后搭建LNMP环境,部署WordPress程序后就可以轻松成就自己的梦想了。
  • WordPress是单用户个人博客与多用户博客是有区别的。
 

4.2 WordPress 博客程序的搭建准备

(1) MySQL数据库配置准备

1)登陆MySQL数据库 
mysql -uroot -p123456

2)创建一个数据库,名字为wordpress 
create database wordpress;

3) 创建一个专用的WordPressblog管理用户,localhost只允许本机通过wordpress用户访问数据库 
grant all on wordpress.* to wordpress@'localhost' identified by '123456';

4)刷新权限,使得创建用户生效 
flush privileges;

 

4.3 Nginx及PHP环境配置准备

1)在Nginx配置文件里补充一个首页文件需要在index后补一个首页文件index.php 
vim /usr/local/nginx/conf/nginx.conf 
image_1crms7ldtl7ufs814uhdm1a6u4k.png-15.5kB

2)重启Nginx

/usr/local/nginx/sbin/nginx -s reload

 

4.4 获取WordPress博客程序

链接:https://pan.baidu.com/s/1_HjxLp2A_3FzEk43FLK50A 
提取码:0xyp

1) 解压并放置到blog域名到对应虚拟主机的站点目录下

tar xf wordpress-4.9.8.tar.gz 
cd /usr/local/nginx/html/blog 
rm -rf * 
mv ~/wordpress/* .

2) 授权用户访问 
目录递归授权 
chown -R yinuo.yinuo /usr/local/nginx/html/blog

 

4.4.1 安装blog博客程序

浏览器输入blog.yunjisuan.com,进入界面安装,选择中文 
image_1crmui56a15mi11ov1u9tceg12vh51.png-41.5kB
image_1crmuk2an131658e1kj2nl1d8l5u.png-66.1kB
image_1crmv301ttsf1ac71on614bmice6o.png-73.9kB
image_1crn1mh6b1gh64vf80suc3lsd75.png-38.2kB
image_1crn2dtlv1t091lnunlkqnc14rm9i.png-62.7kB
image_1crn2fps0150h1g3gu6rirp199t9v.png-34.8kB
image_1crn2hbb5sqj1irb412skiscpac.png-23.3kB
image_1crn2n4931sl117t81j7f1mob17s9b6.png-73.8kB
image_1crn2o69t4ocuoe1ea010e819n7bj.png-711.6kB

 
4.5 实现WordPress博客程序URL静态化

实现此功能是,首先要在WordPress后台一次单机设置--->固定链接--->自定义结构--->添加代码-->保存修改。 
/archives/%post_id%.html

(1) 网页修改设置 
image_1crn3fbbrpp79d1m1o11k481kc0.png-62.1kB

(2) 修改Nginx配置文件

 
  1. worker_processes 1;
  2. error_log logs/error.log;
  3. events {
  4. worker_connections 1024;
  5. }
  6. http {
  7. include mime.types;
  8. default_type application/octet-stream;
  9. sendfile on;
  10. keepalive_timeout 65;
  11. server {
  12. listen 80;
  13. server_name blog.yunjisuan.com;
  14. location / {
  15. root html/blog;
  16. index index.php index.html index.htm;
  17. if (-f $request_filename/index.html){
  18. rewrite (.*) $1/index.html break;
  19. }
  20. if (-f $request_filename/index.php){
  21. rewrite (.*) $1/index.php;
  22. }
  23. if (!-f $request_filename){
  24. rewrite (.*) /index.php;
  25. }
  26. }
  27. location ~ .*\.(php|php5)?$ {
  28. root html/blog;
  29. fastcgi_pass 127.0.0.1:9000;
  30. fastcgi_index index.php;
  31. include fastcgi.conf;
  32. }
  33. }
  34. # 修改配置文件一定要重启服务

在点进文章就变成.html结尾了 
image_1crn4at8o10h57h41rq51v2tphncd.png-220.1kB

 

五,用户浏览器图片解析规则

看文件都是文字,可为什么文件内容读走传给浏览器就变成图片?

  • 当浏览器解析到<img ... />结构时,它发现这是一个html的框架写法也就是代码,浏览器是认识这种代码的,遇到这种代码它就知道你这不是文字是一种图片格式,这种时候浏览器端就会在重新发起一个请求单独去图片服务器把图片拿过来,能找到图片就出现,找不到就不出现。
  • 文字是一次性从服务器端拿过来的,而图片拿过来的是图片的URL地址,这个地址会从新在浏览器发起请求,单独把那个图片拿过来放在浏览器上,所以到图片时它会进行两部操作,如果在出现一个图片浏览器会在找服务器拿一次,一个图片去服务器拿一次。
  • 上传图片需要做2个操作,图片放到存储里,放在存储的位置需要写人到数据库里。
  • PHP读可以不挂存储,写必须挂存储。

如何网页带文字带图片

(1) 修改Nginx配置文件,添加一个Server 
image_1crn5eumq1ba51g8a935tk110eucq.png-36.2kB
image_1crn6gbtvm2soukeul3nt1bpbe4.png-947.6kB

(2) 生成目录和导入图片

cd /usr/local/nginx/html
mkdir xxx
vim xxx/index.html
在把需要用的图片,导入虚拟机里--->直接Xftp导入即可

(3) 修改XXX目录下index.html 文件(第一种写法) 
image_1crn6bdcs1j6j5um1uid1q0h1q4ndn.png-6.3kB

推荐阅读