
企业级WEB架构之LNMP
企业级WEB架构之LNMP
一、互联网发展史
1.1 几个网络基本概念
QPS:Queries Per Second,每秒查询数。每秒能够响应的查询次数。
QPS 是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,在因特网上,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。每秒的响应请求数,也即是最大吞吐能力。
TPS
Transactions Per Second 的缩写,每秒处理的事务数目。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数,最终利用这些信息作出的评估分。
TPS 的过程包括:客户端请求服务端、服务端内部处理、服务端返回客户端。
例如,访问一个 Index 页面会请求服务器 3 次,包括一次 html,一次 css,一次 js,那么访问这一个页面就会产生一个 “T”,产生三个 “Q”。
PV
Page View 即页面浏览量,通常是衡量一个网络新闻频道或网站甚至一条网络新闻的主要指标。户每一次对网站中的每个页面访问均被记录 1 次。用户对同一页面的多次刷新,访问量累计。
根据这个特性,刷网站的 PV 就很好刷了。与 PV 相关的还有 RV,即重复访问者数量 Repeat Visitors。
UV
访问数(Unique Visitor)指独立访客访问数,统计 1 天内访问某站点的用户数 (以 cookie 为依据),一台电脑终端为一个访客。
GMV: Gross Merchandise Volume 的简称。只要是订单,不管消费者是否付款、卖家是否发货、是否退货,都可放进 GMV
1.2 互联网发展这三十年
1.2.1 Web 1.0
第一代互联网(Web 1.0)是PC(个人计算机)互联网,从1994年发展至今,提升了全球信息传输的效率,降低了信息获取的门槛。
1.2.2 Web 2.0
第二代互联网(Web 2.0)是移动互联网,从2008年左右拉开大幕,到今天仍然精彩纷呈。
智能手机具备**“永远在线”和“随时随地”**的特点,这让移动互联网成为很多人生活的重要组成部分。
“上网”这个概念在这个阶段逐步消失,我们时刻都生活在网络里,社交关系被大量地引入互联网,更多的新社交关系被建立。
1.2.3 Web 3.0
第三代互联网(Web 3.0)将是一个去中心化的互联网,旨在打造出一个全新的合约系统,并颠覆个人和机构达成协议的方式。
Web 3.0复刻了第一版互联网(即Web 1.0)的去中心化基础架构,Web 1.0的特色是用户自己架设博客网站以及RSS feed,在此基础上,Web 3.0还结合了Web 2.0丰富的交互体验,比如社交媒体平台。
Web 1.0和Web 2.0相结合,就形成了Web3的数字化生态,在其中用户可以真正拥有自己的数据,并且交易受到了加密技术保障。
1.3 运维演变发展史这十年
项目开发流程
公司老板和产品经理根据市场调查,决定开发的一整套互联网产品
互动社交+电商+用户论坛 (BBS)
产品决策(老板+产品+设计)=》代码开发(程序开发人员(前端开发(客户端页面或者APP)和后端开发java php python node ruby))=》测试工作(测试人员)=》部署上线(运维人员) (SA、 dev 开发ops运维)
项目从开始策划,实施,上线,维护,一直到结束。称之为项目的生命周期
作为运维人员来说,不仅仅是在上线流程中参与
需要在策划,买施之初,就进行准备工作。学习对应架构和方案的知识点簿。
比如:
①项目代码使用lnmp架构 那么就需要对(lnmp架构熟悉
②开发人员需要多人协作开发,合井代码,就需要服务器上搭建代码版本控制器
③測试人员需要用到的测试环境等等
二、LNMP架构介绍
2.1 nginx的介绍
官方网址:http://nginx.org/
Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器。Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
Tengine:
Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。(可以这样理解:淘宝拿到了Nginx源代码之后,进行了功能的填充,优化等等,然后提交给Nginx官方,但是由于Nginx官方相应慢或者不响应,加上语言沟通的不顺畅,于是淘宝公司就自己打包,在遵循GPL的原则上进行二次开发,于是就出了现在的Tengine这个版本)
阿里云官方文档介绍说明:
传统型负载均衡CLB产品架构_负载均衡-阿里云帮助中心 (aliyun.com)
2.2 Nginx架构的特点:
1)高可靠:稳定性 master进程 管理调度请求分发到哪—个worker->worker进程 响应请求-master Sworker
2)热部署: (1) 平滑升级 (2)可以快速里载配置
3)高并发:可以同时响应更多的请求 事件epol模型 几万
4)响应快:尤其在处理静态文件上,响应速度很快 sendfile
5)低消耗:cpu和内存 1W个请求 内存2-3MB
6)分布式支持:反向代理 七层负载均衡
2.3 常见用法
1)web服务器软件 https http协议
同类型web服务器软件:apache nginx、iis、 lighttd
2)代理服务器 反向代理
3)邮箱代理服分器 IMAP POP3 SMTP
4)负载均衡功能 LB loadblance
2.4 NGINX的工作过程
1. 用户通过http协议发起请求,请求会先抵达LNMP架构中的Nginx
2. Nginx根据用户的请求进行判断,该判断由Location进行完成(静态请求走本地,动态请求交给后端)。
3. 判断用户请求为静态页面,Nginx直接进行处理。
4. 判断用户请求的是动态页面,Nginx会将该请求交给fastcgi协议进行下发
5. fastcgi协议将请求提交给php-fpm管理进程,php-fpm管理进程接收到后会调用PHP解析器进程。
6. 由php解析器进行解析PHP脚本信息
7. 若请求中设计查询数据库的操作,则由php连接数据库(用户名 密码),然后发起查询操作
8. 最终将解析结果返还给nginx,再由nginx返还给浏览器渲染处理
apache
:
nginx
:
2.5 LNMP缺点
php-fpm组件的负载能力有限,在访问量巨大的时候,php-fpm进程容易僵死,容易发生502 bad gateway错误,此时需要重启php-fpm模块。
2.6 LANMP架构结合
LAMP==Linux+Apache+Mysql+PHP
LNMP==Linux+Nginx+Mysql+PHP
以上两只架构是目前网站的主流架构
LAMP和LNMP最主要的区别在于:一个使用的是Apache,一个使用的是Nginx。
2.7 nginx和apache的对比
轻量级,同样起web 服务,比apache 占用更少的内存及资源
高并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
高度模块化的设计,编写模块相对简单
社区活跃,各种高性能模块出品迅速。
apache 相对于nginx 的优点:
rewrite ,比nginx 的rewrite强大;
模块超多,基本想到的都可以找到;少bug ,nginx 的bug 相对较多;
超稳定,一般来说,需要性能的web 服务,用nginx 。如果不需要性能只求稳定,那就apache ,nginx处理动态请求是鸡肋,一般动态请求要apache去做,nginx只适合静态和反向。
综上所述:
基于 LAMP 架构设计具有成本低廉、部署灵活、快速开发、安全稳定等特点,是 Web 网络应用和环境的优秀组合。若是服务器配置比较低的个人网站,当然首选 LNMP 架构。
当然,在大流量的时候。把Apache和Nginx结合起来使用,也不失为一个不错选择,如下:
LNAMP是Linux+Nginx+Apache+Mysql+PHP的组合方式,其特点是利用Nginx来作为静态脚本的解析,而利用 Nginx的转发特性,将动态脚本的解析转交给Apache来处理,这样,能充分利用两种Web服务器的特点,对于访问量需求较大的站点来说,是一个很不错的选择。
LNAMP方式的优点:由于Apache本身处理PHP的能力比起php-fpm要强,所以不容易出现类似502 bad gateway的错误。适合访问量较大的站点使用。
LNAMP方式的缺点:相比LNMP方式会多占用一些资源,另外,配置虚拟主机需要同时修改Nginx和Apache的配置文件,要稍微麻烦一些。
三、LNMP架构的部署
安装nginx,常见的nginx的部署方式有2种
1、yum安装
yum -y install epel-release nginx
2、源码编译安装
3.1 部署LNMP架构需要安装依赖包
yum -y install make cmake gcc gcc-c++ flex bison file libtool libtool-libs autoconf kernel-devel libjpeg libjpeg-devel libpng libpng-devel gd freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glib2 glib2-devel bzip2 bzip2-devel libevent ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5-devel libidn libidn-devel openssl openssl-devel gettext gettext-devel ncurses-devel gmp-devel unzip libcap lsof epel-release autoconf automake pcre-devel libxml2-devel
3.2 安装Nginx:下载源码包:nginx.org
说明:
<pre><code>Mainline version 主线版本
Stable version 稳定版本
Legacy versions 老版本,遗产版本</code></pre><h4 style="text-align: start; " id="heading-19"><strong>3.3 下载PCRE</strong></h4><p style="text-align: start; "><a target="_blank" rel="noopener noreferrer nofollow" href="https://ftp.pcre.org/pub/pcre/">https://ftp.pcre.org/pub/pcre/</a></p><p style="text-align: start; ">上传pcre源码包</p><pre><code>[root@lnmp ~]# tar zxvf pcre-8.41.tar.gz -C /usr/local/src/
pcre-8.41/ pcre-8.41/pcre_scanner.h
注:解压即可,不用安装,Nginx安装时指定pcre的解压路径即可
3.4 创建Nginx运行用户
[root@lnmp ~]#useradd -M -s /sbin/nologin nginx
3.5 解压Nginx到/usr/local/src目录下
我们采用的是nginx-1.18版本的稳定版
[root@lnmp ~]# tar zxvf nginx-1.18.0.tar.gz -C /usr/local/src/
[root@lnmp ~]# cd /usr/local/src/
[root@lnmp src]# ls
nginx-1.18.0 pcre-8.41
[root@lnmp src]# cd nginx-1.18.0/
3.6 检查配置参数和系统安装环境
[root@lnmp nginx-1.18.0]# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gunzip_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre=/usr/local/src/pcre-8.41 --user=nginx --group=nginx
常见模块
--pid-path=path
nginx.pid 文件的名称。默认值:<prefix>/logs/nginx.pid。安装后,可以使用 nginx.conf 中的 pid 指令更改。
--error-log-path=path
错误日志文件的名称。默认值:<prefix>/logs/error.log。安装后,可以使用 nginx.conf 中的 error_log 指令更改。
--http-log-path=path
HTTP 服务器的主请求日志文件的名称。默认值:<prefix>/logs/access.log。安装后,可以使用 nginx.conf 中的 access_log 指令更改。
--user=name
nginx 运行用户。默认值:nobody。安装后,可以使用 nginx.conf 中的 user 指令更改。
--group=name
nginx 运行组。默认值:--user 指定的值。安装后,可以使用 nginx.conf 中的 user 指令更改。
--with-http_ssl_module
启用 HTTPS 协议支持,需要 OpenSSL 库。默认情况下未构建此模块。
--with-openssl=path
设置 OpenSSL 库源的路径。
--with-openssl-opt=parameters
为 OpenSSL 设置其他构建选项。
--with-http_v2_module
启用 HTTP/2 协议支持。默认情况下未构建此模块。
--with-http_flv_module
启用 ngx_http_flv_module 模块,该模块为 Flash Video (FLV) 文件提供伪流服务器端支持。默认情况下未构建此模块。
--with-http_mp4_module
启用 ngx_http_mp4_module 模块,该模块为 MP4 文件提供伪流服务器端支持。默认情况下未构建此模块。
--with-http_gunzip_module
对于不支持 “gzip” 的客户端,启用 ngx_http_gunzip_module 模块,使用 “Content-Encoding: gzip” 解压缩响应。默认情况下未构建此模块。
--with-http_stub_status_module
启用 ngx_http_stub_status_module 模块,该模块提供对基本状态信息的访问。默认情况下未构建此模块。
--with-http_geoip_module
--with-http_geoip_module=dynamic
启用 ngx_http_geoip_module 模块,该模块根据客户端 IP 地址和预编译的 MaxMind 数据库创建变量。默认情况下未构建此模块。
3.7 编译&&安装
[root@lnmp nginx-1.18.0]# make -j 8 && make -j 8 install
[root@lnmp nginx-1.18.0]# ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx
安装完成后的目录结构
[root@lnmp nginx]# tree
.
├── conf ##nginx的配置文件的目录
│ ├── fastcgi.conf
│ ├── fastcgi.conf.default
│ ├── fastcgi_params
│ ├── fastcgi_params.default
│ ├── koi-utf
│ ├── koi-win
│ ├── mime.types
│ ├── mime.types.default
│ ├── nginx.conf
│ ├── nginx.conf.default
│ ├── scgi_params
│ ├── scgi_params.default
│ ├── uwsgi_params
│ ├── uwsgi_params.default
│ └── win-utf
├── html ##nginx的网页根目录的目录
│ ├── 50x.html
│ └── index.html
├── logs ##nginx的网站日志的目录(未启动nginx之前是空的)
└── sbin ##nginx的二进制启动脚本位置
└── nginx
4 directories, 18 files
[root@lnmp nginx]#
3.8 启动nginx
启动的方式分为2种
1)直接在sbin目录下./nginx执行启动
2)通过systemd服务托管启动(默认yum安装会自动生成)
https://www.nginx.com/resources/wiki/start/topics/examples/systemd/
3.8.1 第一种方式:
[root@lnmp sbin]# ./nginx #启动服务
[root@lnmp sbin]# netstat -antup |grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 19880/nginx: master
3.8.2 第二种方式:
服务脚本存放位置:/lib/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx-s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
[root@lnmp nginx-1.18.0]# systemctl daemon-reload
[root@lnmp nginx-1.18.0]# systemctl start nginx
3.9 nginx管理参数
[root@lnmp sbin]# ./nginx -h
nginx version: nginx/1.18.0
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
Options:
-?,-h : this help
-v : show version and exit
-V : show version and configure options then exit
-t : test configuration and exit
-T : test configuration, dump it and exit
-q : suppress non-error messages during configuration testing
-s signal : send signal to a master process: stop, quit, reopen, reload
-p prefix : set prefix path (default: /usr/local/nginx/)
-c filename : set configuration file (default: conf/nginx.conf)
-g directives : set global directives out of configuration file
options
#查看帮助
-?,-h : this help
#查看版本并退出
-v : show version and exit
#查看版本和配置选项并退出
-V : show version and configure options then exit
#检测配置文件语法并退出
-t : test configuration and exit
#检测配置文件语法打印它并退出
-T : test configuration, dump it and exit
#在配置测试期间禁止显示非错误信息
-q : suppress non-error messages during configuration testing
#发送信号给主进程 stop强制退出 quit优雅的退出 reopen重开日志
-s signal : send signal to a master process: stop, quit, reopen, reload
#设置nginx目录
-p prefix : set prefix path (default: /usr/local/nginx/)
#指定启动使用的配置文件
-c filename : set configuration file (default: conf/nginx.conf)
#在配置文件之外设置全局指令
-g directives : set global directives out of configuration file</p>
<p>一般主要使用:
-s参数控制管理nginx服务
-V参数查看nginx开启的模块和编译参数
-t参数检测配置文件是否有错误
四、安装mysql
我们还是以mysql-5.7.19版本为例
4.1 上传mysql的压缩包
4.2 创建用于运行 Mysql的用户
[root@lnmp ~]# useradd -r -s /sbin/nologin mysql
4.3 解压mysql到/usr/local/src目录下
[root@lnmp ~]# tar zxvf mysql-5.7.19.tar.gz -C /usr/local/src/
4.4 创建安装目录和数据存放目录
[root@lnmp ~]# mkdir -p /usr/local/mysql/
[root@lnmp ~]# mkdir -p /usr/local/mysql/data
[root@lnmp ~]# chown mysql.mysql /usr/local/mysql/ -R
4.5 检查配置参数和系统安装环境
[root@lnmp mysql-5.7.19]#cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql/ -DMYSQL_DATADIR=/usr/local/mysql/data -DSYSCONFDIR=/etc -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock -DMYSQL_TCP_PORT=3306 -DENABLED_LOCAL_INFILE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/usr/local/src/mysql-5.7.19/boost/boost_1_59_0
如果出现如下的报错:
请自行下载boost_1_59_0这个软件包并解压到/usr/local/src/mysql-5.7.19/boost/boost_1_59_0
[root@lnmp local]# mkdir -p /usr/local/src/mysql-5.7.19/boost/boost_1_59_0
[root@lnmp local]# tar zxvf boost_1_59_0.tar.gz -C /usr/local/src/mysql-5.7.19/boost/boost_1_59_0
再次检查就没有问题了
[root@lnmp mysql-5.7.19]# echo $?
0
如果出现如下报错,说明是服务器的内存不足导致,请增加一下服务器的内存
再次编译安装没有问题。
[root@lnmp mysql-5.7.19]# make -j 8 && make -j 8 install
[root@lnmp mysql-5.7.19]# echo $?
0
4.6 mysql的配置文件
[root@lnmp ~]# cat /etc/my.cnf
[client]
socket=/usr/local/mysql/mysql.sock
port=3306
[mysqld]</p>
<p>basedir=/usr/local/mysql/
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/mysql.sock
default-storage-engine=INNODB
character_set_server=utf8mb4
collation_server=utf8mb4_general_ci
port=3306</p>
<h1 id="Disabling symbolic-links is recommended to prevent assorted security risks">Disabling symbolic-links is recommended to prevent assorted security risks</h1>
<p>symbolic-links=0
log-error=/usr/local/mysql/log/mysqld3306.log
pid-file=/usr/local/mysql/mysqld3306.pid
log_bin=mysql3306-bin
server_id=1
##二进制日志格式STATEMENT,ROW,MIXED
binlog_format=ROW</p>
<h2 id="最大连接数,MySQL服务器允许的最大连接数16384,连接数越多消耗内存越多">最大连接数,MySQL服务器允许的最大连接数16384,连接数越多消耗内存越多</h2>
<p>max_connections = 1000</p>
<h2 id="日志过期时间,包括二进制日志(过期自动删除)">日志过期时间,包括二进制日志(过期自动删除)</h2>
<p>expire_logs_days = 15</p>
<h2 id="Enable Per Table Data for InnoDB to shrink ibdata1(innoDB表优化)">Enable Per Table Data for InnoDB to shrink ibdata1(innoDB表优化)</h2>
<p>innodb_file_per_table = 1
#默认128M,用于存储页面缓存数据外,另外正常情况下还有大约8%的开销,主要用在每个缓存页帧的描述、adaptive hash等数据结构,适当的增加这个参数的大小,可以有效的减少 InnoDB 类型的表的磁盘 I/O
innodb_buffer_pool_size = 2048M
innodb_log_file_size = 512M
#默认是8MB,InnoDB在写事务日志的时候,为了提高性能,也是先将信息写入Innofb Log Buffer中,当满足innodb_flush_log_trx_commit参数所设置的相应条件(或者日志缓冲区写满)之后,才会将日志写到文件 (或者同步到磁盘)中
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 2
#表大小写不敏感
lower_case_table_names=1
#跳过密码 安装完后屏蔽该选项
#skip-grant-tables
4.7 创建日志保存文件
[root@lnmp mysql-5.7.19]#mkdir /usr/local/mysql/log
[root@lnmp mysql-5.7.19]# chown mysql.mysql /usr/local/mysql/log -R
4.8 生成服务启动脚本
[root@lnmp ~]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
[root@lnmp ~]# chmod a+x /etc/init.d/mysqld
4.9 配置环境变量
vim /etc/profile
添加下面2行 在文件的结尾
export MYSQL_HOME=/usr/local/mysql
export PATH=$PATH:$MYSQL_HOME/bin
#使修改生效
source /etc/profile
4.10 初始化数据库并启动
[root@lnmp log]# /usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --port=3306
[root@lnmp ~]# cd /usr/local/mysql/data/
[root@lnmp data]# ls
auto.cnf ib_buffer_pool ibdata1 ib_logfile0 ib_logfile1 mysql performance_schema sys
[root@lnmp data]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS!
4.11 修改数据库密码
[root@lnmp ~]# mysqladmin -u root password "123456"
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.
[root@lnmp ~]#
五、安装php
PHP(外文名:PHP: Hypertext Preprocessor, 中文名:“超文本预处理器”)是一种通用开源脚本语言。语法
吸收了C语言、java,perl的特点,利于学习,使用广泛,主要适用子Web开发领域,PHP的独特语法使得它可以比其他的编程语言快很多,执行效率比html的CGI还要快很多
PHP-FPM(FastCGl Process Manager: FastcGl进程管理器)对于PHP 5.3.3之前的php来说,是一个补丁包
旨在持FastcG程管理整合进PHP包中。相对Spawn-FCGI,PHP-FPM在CPU和内存方面的控制都更胜一筹,而且前者很容易崩溃,必须用crontab定时进行监控,而PHP-FPM则没有这种烦恼。
PHP5.3.3已经华成php-fpm了,不再是第三方的包了。PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,比spawn-fcgi具有更多优点,所以被PHP官方收录了。 在./configure的时候带-enable-fpm参数即可开启PHP-FPM。
5.1 解压php安装包
[root@lnmp ~]# tar zxvf php-7.1.10.tar.gz -C /usr/local/src/
5.2 检查配置环境
[root@lnmp php-7.1.10]# ./configure --prefix=/usr/local/php/ --with-config-file-path=/usr/local/php/etc/ --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-soap --enable-mbstring=all --enable-sockets --with-pdo-mysql=/usr/local/mysql --with-gd --without-pear --enable-fpm
5.3 编译安装
[root@lnmp php-7.1.10]# make -j 8 && make -j 8 install
[root@lnmp php-7.1.10]# echo $?
0
安装后默认生成的文件
[root@lnmp php]# pwd
/usr/local/php
[root@lnmp php]# ls
bin etc include lib php sbin var
[root@lnmp php]#
目录名 作用 | ||
---|---|---|
bin php相关命令目录,php,phpize,php-config在源码编译扩展时使用 | ||
etc php的配置文件目录 | ||
include php默认类库 | ||
lib php第三方扩展类库 | ||
php php的man手册 | ||
sbin php-fpm执行文件 | ||
var log日志目录,run的运行目录,保存pid文件 |
5.4 生成配置文件
[root@lnmp php-7.1.10]# cp php.ini-production /usr/local/php/etc/php.ini
[root@lnmp php-7.1.10]# ln -s /usr/local/php/bin/* /usr/local/bin/
[root@lnmp php-7.1.10]# ln -s /usr/local/php/sbin/* /usr/local/sbin/
六、配置Nginx连接PHP(重点)
6.1 nginx连接 php需要启动 php-fpm服务
[root@lnmp ~]# cd /usr/local/php/etc/
[root@lnmp etc]# cp -a php-fpm.conf.default php-fpm.conf #生成 php-fpm的配置文件,并修改指定参数
6.2 修改php-fpm的配置文件
[root@lnmp etc]# vim php-fpm.conf
修改指定条目的参数:
pid = run/php-fpm.pid
[root@lnmp etc]# cd /usr/local/php/etc/php-fpm.d/
[root@lnmp etc]# cp -a www.conf.default www.conf
[root@lnmp etc]# vim www.conf
修改用户和组的指定用户
user = nginx
group = nginx
6.3 创建nginx和php的服务启动脚本
[root@lnmp ~]# vim nginx_php.sh
[root@lnmp ~]# chmod a+x nginx_php.sh
[root@lnmp ~]# cp nginx_php.sh /etc/init.d/nginx_php
以下是脚本内容:
cat >> /etc/init.d/nginx_php << EOF
#!/bin/bash
ngxc="/usr/local/nginx/sbin/nginx"
pidf="/usr/local/nginx/logs/nginx.pid"
ngxc_fpm="/usr/local/php/sbin/php-fpm"
pidf_fpm="/usr/local/php/var/run/php-fpm.pid"
case "$1" in
start)
$ngxc -t &> /dev/null
if [ $? -eq 0 ]; then
$ngxc
$ngxc_fpm
echo "nginx service start success!"
else
$ngxc -t
fi
;;
stop)
kill -s QUIT $(cat $pidf)
kill -s QUIT $(cat $pidf_fpm)
echo "nginx service stop success!"
;;
restart)
$0 stop
$0 start
;;
reload)
$ngxc -t &> /dev/null
if [ $? -eq 0 ]; then
kill -s HUP $(cat $pidf)
kill -s HUP $(cat $pidf_fpm)
echo "reload nginx config success!"
else
$ngxc -t
fi
;;
*)
echo "please input stop|start|restart|reload."
exit 1
esac
EOF
6.4 启动nginx和php
[root@lnmp ~]# /etc/init.d/nginx_php start
nginx service start success!
[root@lnmp ~]# ps -ef |grep nginx
root 3081 1 0 17:28 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 3083 3081 0 17:28 ? 00:00:00 nginx: worker process
nginx 3085 3084 0 17:28 ? 00:00:00 php-fpm: pool www
nginx 3086 3084 0 17:28 ? 00:00:00 php-fpm: pool www
root 3088 1413 0 17:28 pts/0 00:00:00 grep --color=auto nginx
[root@lnmp ~]# ps -ef |grep php
root 3084 1 0 17:28 ? 00:00:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
nginx 3085 3084 0 17:28 ? 00:00:00 php-fpm: pool www
nginx 3086 3084 0 17:28 ? 00:00:00 php-fpm: pool www
root 3090 1413 0 17:28 pts/0 00:00:00 grep --color=auto php
6.5 修改 Nginx的配置文件,使其识别.php后缀的文件
vim /usr/local/nginx/conf/nginx.conf
取消下列行的注释,并修改 include选项的后缀为 fastcgi.conf,并注意每一行结尾的分号和大括号
location ~ .php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi.conf;
}
6.6 重启服务
[root@lnmp ~]# /etc/init.d/nginx_php start
nginx service start success!
[root@lnmp ~]#
6.7 添加php的测试页
[root@lnmp html]# cd /usr/local/nginx/html/
[root@lnmp html]# cat index.php
<?php
phpinfo();
?>
[root@lnmp ~]# /etc/init.d/nginx_php stop && /etc/init.d/nginx_php start
6.8测试
6.9 部署脚本
</p>
<p>#!/bin/bash
#指定脚本运行环境</p>
<p>#源码编译安装mysql数据库
install_mysql(){
systemctl disable --now firewalld
setenforce 0
sed -i "7c SELINUX=disabled" /etc/sysconfig/selinux</p>
<p>cd /opt
#安装环境依赖包
yum -y install gcc gcc-c++ ncurses ncurses-devel bison cmake expect</p>
<p>tar zxvf /opt/mysql-5.7.19.tar.gz -C /opt/
mkdir -p /usr/local/src/mysql-5.7.19/boost
tar zxvf boost_1_59_0.tar.gz -C /usr/local/src/mysql-5.7.19/boost
useradd -M -s /sbin/nologin mysql</p>
<p>cd /opt/mysql-5.7.19</p>
<p>cmake <br />
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql <br />
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock <br />
-DSYSCONFDIR=/etc <br />
-DSYSTEMD_PID_DIR=/usr/local/mysql <br />
-DDEFAULT_CHARSET=utf8 <br />
-DDEFAULT_COLLATION=utf8_general_ci <br />
-DWITH_EXTRA_CHARSETS=all <br />
-DWITH_INNOBASE_STORAGE_ENGINE=1 <br />
-DWITH_ARCHIVE_STORAGE_ENGINE=1 <br />
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 <br />
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 <br />
-DMYSQL_DATADIR=/usr/local/mysql/data <br />
-DWITH_SYSTEMD=1 <br />
-DDOWNLOAD_BOOST=1 <br />
-DWITH_BOOST=/usr/local/src/mysql-5.7.19/boost/boost_1_59_0
make -j 8 && make -j 8 install</p>
<p>cat > /etc/my.cnf <<EOF
[client]
port = 3306
socket = /usr/local/mysql/mysql.sock</p>
<p>[mysql]
port = 3306
socket = /usr/local/mysql/mysql.sock
auto-rehash</p>
<p>[mysqld]
user = mysql
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port = 3306
character-set-server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket=/usr/local/mysql/mysql.sock
bind-address = 0.0.0.0
skip-name-resolve
max_connections=2048
default-storage-engine=INNODB
max_allowed_packet=16M
server-id = 1</p>
<p>sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES</p>
<p>EOF</p>
<p>chown -R mysql:mysql /usr/local/mysql/
chown mysql:mysql /etc/my.cnf</p>
<p>cat >> /etc/profile <<EOF
export PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
EOF</p>
<p>source /etc/profile</p>
<p>cd /usr/local/mysql/bin/</p>
<p>./mysqld <br />
--initialize-insecure <br />
--user=mysql <br />
--basedir=/usr/local/mysql <br />
--datadir=/usr/local/mysql/data</p>
<p>cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
systemctl daemon-reload
systemctl enable --now mysqld</p>
<p>/usr/bin/expect <<EOF
spawn mysqladmin -u root -p password "abc123"
expect "Enter password" {send "\r"}
expect eof
EOF</p>
<p>/usr/bin/expect <<EOF
spawn mysql -u root -p
expect "Enter password" {send "abc123\r"}
expect "mysql" {send "grant all privileges on <em>.</em> to 'root'@'%' identified by 'abc123';\r"}
expect "mysql" {send "quit\r"}
expect eof
EOF</p>
<p>/usr/bin/expect <<EOF
spawn mysql -u root -p
expect "Enter password" {send "abc123\r"}
expect "mysql" {send "CREATE DATABASE bbs;\r"}
expect "mysql" {send "GRANT all ON bbs.* TO 'bbsuser'@'%' IDENTIFIED BY 'admin123';\r"}
expect "mysql" {send "flush privileges;\r"}
expect "mysql" {send "quit\r"}
expect eof
EOF</p>
<p>}</p>
<p>#源码编译安装Nginx服务
install_nginx(){
yum -y install pcre-devel zlib-devel make</p>
<p>useradd -M -s /sbin/nologin nginx</p>
<p>tar zxvf /opt/nginx-1.18.0.tar.gz -C /opt/</p>
<p>cd /opt/nginx-1.18.0/
./configure <br />
--prefix=/usr/local/nginx <br />
--user=nginx <br />
--group=nginx <br />
--with-http_stub_status_module</p>
<p>make -j 4 && make install</p>
<p>ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/</p>
<p>cat > /lib/systemd/system/nginx.service <<EOF
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF</p>
<p>chmod 754 /lib/systemd/system/nginx.service
systemctl enable --now nginx.service
}</p>
<p>#源码编译安装php服务
install_php(){
yum -y install gd <br />
libjpeg libjpeg-devel <br />
libpng libpng-devel <br />
freetype freetype-devel <br />
libxml2 libxml2-devel <br />
zlib zlib-devel <br />
curl curl-devel <br />
openssl openssl-devel</p>
<p>tar zxvf /opt/php-7.1.10.tar.gz -C /opt/</p>
<p>cd /opt/php-7.1.10</p>
<p>./configure <br />
--prefix=/usr/local/php <br />
--with-mysql-sock=/usr/local/mysql/mysql.sock <br />
--with-mysqli <br />
--with-zlib <br />
--with-curl <br />
--with-gd <br />
--with-jpeg-dir <br />
--with-png-dir <br />
--with-freetype-dir <br />
--with-openssl <br />
--enable-fpm <br />
--enable-mbstring <br />
--enable-xml <br />
--enable-session <br />
--enable-ftp <br />
--enable-pdo <br />
--enable-tokenizer <br />
--enable-zip</p>
<p>make -j 4 && make install</p>
<p>ln -s /usr/local/php/bin/* /usr/local/bin/
ln -s /usr/local/php/sbin/* /usr/local/sbin/</p>
<p>cp /opt/php-7.1.10/php.ini-development /usr/local/php/lib/php.ini
sed -i "1170c mysqli.default_socket = /usr/local/mysql/mysql.sock" /usr/local/php/lib/php.ini
sed -i "939c date.timezone = Asia/Shanghai" /usr/local/php/lib/php.ini</p>
<p>cd /usr/local/php/etc/
cp php-fpm.conf.default php-fpm.conf
sed -i "17c pid = run/php-fpm.pid" /usr/local/php/etc/php-fpm.conf</p>
<p>cd /usr/local/php/etc/php-fpm.d/
cp www.conf.default www.conf</p>
<p>/usr/local/php/sbin/php-fpm -c /usr/local/php/lib/php.ini</p>
<p>cp /opt/php-7.1.10/sapi/fpm/php-fpm.service /usr/lib/systemd/system/php-fpm.service
systemctl restart php-fpm.service</p>
<p>sed -i "65,68 s/^.<em>#//" /usr/local/nginx/conf/nginx.conf
sed -i '69c fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;' /usr/local/nginx/conf/nginx.conf
sed -i "70,71 s/^.</em>#//" /usr/local/nginx/conf/nginx.conf
systemctl restart nginx.service</p>
<p>cat >/usr/local/nginx/html/index.php<<EOF
<?php
phpinfo();
?>
EOF</p>
<p>unzip /opt/Discuz_X3.5_SC_UTF8_20230316.zip -d /opt/dis
cd /opt/dis/
cp -r upload/ /usr/local/nginx/html/bbs
cd /usr/local/nginx/html
chmod 777 bbs -R</p>
<p>}</p>
<p>#####脚本主体#####</p>
<p>#调用安装mysql函数
install_mysql</p>
<p>#调用安装Nginx函数
install_nginx</p>
<p>#调用安装php函数
install_php</p>
<p>
- 感谢你赐予我前进的力量