#实现LAMP架构
什么是LAM(M)P
一套开源组合,用来构建应用程序服务器
数据分类
WEB资源类型
httpd怎么处理动态资源
CGI:Common Gateway Interface(通用网关接口)
可以让一个客户端,从网页浏览器通过http服务器向执行在网络服务器上的程序传输数据;CGI描述了客户端和服务器程序之间传输的一种标准
php
PHP是通用服务器端脚本编程语言,其主要用于web开发以实现动态web页面,它也是最早实现将脚本嵌入HTML源码文档中的服务器端脚本语言之一。同时,php还提供了一个命令行接口,因此,其也可以在大多数系统上作为一个独立的shell来使用,意味着php可以在其交互式窗口直接运行
httpd+php结合的方式:
在LAMP中设计的PHP程序
php通用配置文件
配置文件在php解释器启动时被读取
[root@hai7-6 ~]$rpm -qf /etc/php.ini
php-common-5.4.16-45.el7.x86_64
[foo]:Section Header
directive = value
[foo]
:表示段落名称;
:没空格的表示可以启用的选项;
:加空格的表示纯粹的说明信息max_execution_time= 30 <==最长执行时间30s,高并发情况下,可以考虑调小
max_input_time = 60 <==最大输入时间
memory_limit = 128M <==内存大小,生产不够,可调大
display_errors off <==显示错误信息,调试使用,不要打开,否则可能暴露重要信息
display_startup_errors off <==建议关闭,启动错误信息
post_max_size 8M <==最大上传数据大小,生产可能临时要调大,比下面项要大
upload_max_filesize 2M <==最大上传文件,生产可能要调大
max_file_uploads = 20 <==同时上传最多文件数
date.timezone =Asia/Shanghai <==指定时区
short_open_tag=on <==开启短标签,如<? phpinfo();?> ,原格式为<?php phpinfo(); ?>
以下实验会用到的测试代码
<?php
echo date("Y/m/d H:i:s");
phpinfo();
?>
<?php
$conn = mysql_connect(‘mysqlserver','username','password');
if ($conn)
echo "OK";
else
echo "Failure";
?>
<?php
$mysqli=new mysqli("mysqlserver",“username",“password");
if(mysqli_connect_errno()){
echo "Failure";
$mysqli=null;
exit;
}
echo “OK";
$mysqli->close();
?>
<?php
$dsn='mysql:host=localhost;dbname=mysql';
$username='root';
$passwd='centos';
$dbh=new PDO($dsn,$username,$passwd);
var_dump($dbh);
?>
try {
$user='root';
$pass=‘centos';
$dbh = new PDO('mysql:host=localhost;dbname=mysql', $user, $pass);
foreach($dbh->query('SELECT user,host from user') as $row) {
print_r($row);
}
$dbh = null;
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "
";
die();
}
?>
以模块(Modules)方式实现
CentOS 7:涉及安装程序
Modules:httpd, php, php-mysql, mariadb-server
CentOS 6:涉及安装程序
Modules:httpd, php, php-mysql, mysql-server
[root@hai7-7 ~]$yum install php
[root@hai7-7 ~]$vim php.conf
<FilesMatch \.php$>
SetHandler application/x-httpd-php <==所有以.php结尾的文件,都交给httpd-php处理
</FilesMatch>
DirectoryIndex index.php <==设置默认主页
php_value session.save_handler "files"
php_value session.save_path "/var/lib/php/session" <==保存session目录
[root@hai7-7 conf.modules.d]$vim 10-php.conf
<IfModule prefork.c> <==只要在prefork.c模型下才会装载名为php5_module的模块
LoadModule php5_module modules/libphp5.so
</IfModule>
也就是说httpd以线程模式运行的话,需要装入的模块为php-zts,在extras仓库root@hai7-7 conf.modules.d]$httpd -M
[root@hai7-7 html]$vim index.php
<?php
phpinfo();
?>
[root@hai7-6 ~]$yum -y install mariadb-server php-mysql
<?php
$conn = mysql_connect('127.0.0.1','root',''); <本机测试用,生产环境不可以用root,配置文件容易丢
if ($conn)
echo "OK";
else
echo "Failure";
?>
以FastCGI实现(php-fpm)
php包与php-fpm包是互斥的,只能安装一种,如果测试机上有php需要先卸载
FastCGI涉及程序:httpd, php-fpm, php-mysql, mariadb-server
[root@hai7-7 ~]$yum install httpd php-mysql php-fpm mariadb-server -y
[root@hai7-7 ~]$vim /etc/my.cnf.d/server.cnf
[mysqld]
skip_name_resolve=ON
[root@hai7-7 ~]$httpd -M |grep cgi
proxy_fcgi_module (shared)
/etc/php-fpm.conf
用来配置php守护进程工作特性(如何管理自己的进程),/etc/php.ini依然生效,用来配置加载那些模块,修改了模块设置,就需要要重启php-fpm服务[root@hai7-7 ~]$vim /etc/php-fpm.conf
include=/etc/php-fpm.d/*.conf <==模块化配置加载此目录下所有的配置文件
[global]
pid = /run/php-fpm/php-fpm.pid <==守护进程的pid
error_log = /var/log/php-fpm/error.log <==错误日志
log_level = notice <==日子记录级别
daemonize = no <==表示是否以守护进程的方式运行,定义为no,因为要托管到 systemd上
;;;;;;;;;;;;;;;;;;;;
; Pool Definitions ;
;;;;;;;;;;;;;;;;;;;;
; See /etc/php-fpm.d/*.conf <==Connection Pool连接池的定义都在php-fpm.d/下模块化的配置文件中
[root@hai7-7 ~]$vim /etc/php-fpm.d/www.conf
[www] <==连接池的名字,此名可以自定义
listen = 127.0.0.1:9000 <==监听在哪个地址哪个端口上,本机所有ipv4地址可用修改为0.0.0.0
listen.backlog = -1 <==队列长度,-1表示在服务器承载范围内不设限,队列时放在内存中的,防止didos攻击,推荐设限
#listen.allowed_clients = 127.0.0.1 <==访问控制,注释掉
user = apache <==表示子进程以哪个身份运行
group = apache
pm = dynamic <==定义管理连接池的模式,有两个值static和dynamic
static: <==静态模式,直接启用所有子进程
dynamic: <==动态管理模式
following directives:
pm.max_children:'最大连接数,动态静态都有用,默认值50,通过压测确定'
pm.start_servers:'服务启动时启动的进程数,此参数动态模式有用,默认值5'
pm.min_spare_servers:'空闲进程数,此参数动态模式有用,默认值5'
pm.max_spare_servers:'最大空闲进程数,此参数动态模式有用,默认值35'
pm.max_requests = 500 <==进程最大服务数,达到此值就会kill生成新的,设为0表示不设限
pm.status_path = /status <==pm状态页面
ping.path = /ping <==判断服务工作状态的URL
ping.response = pong <==判断/ping后返回的结果,可以自定义
php_value[session.save_handler] = files <==定义会话管理模式
php_value[session.save_path] = /var/lib/php/session <==会话保存路径,确保此文件存在,且apache有读写权限
[root@hai7-7 ~]$mkdir /var/lib/php/session
[root@hai7-7 ~]$chown apache.apache /var/lib/php/session/
1. '编辑http配置文件,添加FCGI的配置'
[root@hai7-7 data]$vim /etc/httpd/conf.d/text.conf
DirectoryIndex index.php <==指明默认主页文件为index.php
<VirtualHost *:80>
ServerName www.v9.com
DocumentRoot /data/virtual/v9.com
ProxyRequests Off <==关闭正向代理
ProxyPassMatch ^/(.*\.php)$ fcgi://192.168.50.115:9000/apps/vhosts/b.net/$1 <==反向代理,以php结尾的URL,转发给fcgi由/apps/vhosts/b.net/$1提供,后面的$1是指前面的/(.*\.php)
<Directory "/data/virtual/v9.com"> <==授权限制目录
Options None
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
[root@hai7-7 v9.com]$ vim /data/virtual/v9.com/index.php
<?php
phpinfo();
?>
1. '解压文件'
[root@hai7-7 ~]$tar xf phpMyAdmin-4.0.10.20-all-languages.tar.gz
2. '移动至页面目录下'
[root@hai7-7 ~]$mv phpMyAdmin-4.0.10.20-all-languages /data/virtual/
3. '做软连接'
[root@hai7-7 ~]$ln -sv phpMyAdmin-4.0.10.20-all-languages v9.com
[root@hai7-7 ~]$cp config.sample.inc.php config.inc.php
[root@hai7-7 ~]$vim /data/virtual/phpMyAdmin-4.0.10.20-all-languages/config.inc.php
$cfg['blowfish_secret'] = '123456'; <==输入一个随机字符串
$cfg['Servers'][$i]['host'] = 'localhost'; <==修改连接地址,与数据库中授权的用户地址要相同
yum install php-mbstring <==多字符支持
yum install php-mcrypt <==加密相关
systemctl restart php-fpm <==重启php-fpm
[root@hai7-7 ~]$cd /var/www/html/wordpress-4.9
[root@hai7-7 wordpress-4.9]$cp wp-config-sample.php wp-config.php
[root@hai7-7 ~]$chmod 666 wp-config.php
[root@hai7-7 ~]$mysql
MariaDB [(none)]> CREATE DATABASE wpdb;
MariaDB [(none)]> GRANT ALL ON phptest.* TO 'wpuser'@'172.20.0.%'IDENTIFIED BY 'centos';
[root@hai7-7 ~]$vim /var/www/html/wordpress-4.9/wp-config.php
define('DB_NAME', 'phptest'); <==指定数据库名
define('DB_USER', 'root'); <==指定用户名
define('DB_PASSWORD', ''); <==指定密码
define('DB_HOST', '192.168.50.115'); <==指定主机
独立搭建服务器优点
搭建过程
规划以110为httpd服务器,107为php-fpm服务器,基于FastCGI
[root@hai7-7 ~]$yum install php-fpm php-mysql
[root@hai7-7 ~]$mkdir /data/website
[root@hai7-7 website]$vim /etc/php-fpm.d/www.conf
listen = 9000
[root@hai7-7 website]$systemctl restart php-fpm
[root@hai7-7 website]$ss -ntl
State Recv-Q Send-Q Local Address:Port
LISTEN 0 128 *:9000 <==看到*就说明所有地址都可以访问
[root@hai7-8 ~]$yum install httpd
[root@hai7-8 ~]$vim /etc/httpd/conf.dfcgi.conf
DirectoryIndex index.php
ProxyRequests Off
ProxyPassMatch ^/(.*\.php)$ fcgi://192.168.50.107:9000/data/website/$1 <==目标地址改为php服务器
数据库服务器
[root@hai7-6 ~]$yum install mariadb-server
1. '为wordpress网页建立数据库和账户'
[root@hai7-6 ~]$mysql -e "CREATE DATABASE wpdb;GRANT ALL ON wpdb.* TO wpuser@'192.168.50.%' IDENTIFIED BY 'centos'"
2. '为Discuz网页建立数据库和账户'
[root@hai7-6 ~]$mysql -e "CREATE DATABASE Dzdb;GRANT ALL ON Dzdb.* TO dzuser@'192.168.50.%' IDENTIFIED BY 'centos'"
php-fpm服务器
[root@hai7-6 ~]$yum install php-fpm php-mysql
[root@hai7-6 ~]$mkdir /data/wordpress
[root@hai7-6 ~]$tar xvf wordpress-4.9.4-zh_CN.tar.gz
[root@hai7-6 ~]$unzip Discuz_X3.2_SC_UTF8.zip
'Discuz解压后的目录为upload,重命名为discuz'
[root@hai7-6 ~]$mv upload/ discuz
1. '进入wordpress目录下,将配置文件模板修改为配置文件'
[root@hai7-8 ~]$mv wp-config-sample.php wp-config.php
2. '修改配置文件'
[root@hai7-8 ~]$vim /data/wordpress/wp-config.php
/** WordPress数据库的名称 */
define('DB_NAME', 'wpdb');
/** MySQL数据库用户名 */
define('DB_USER', 'wpuser');
/** MySQL数据库密码 */
define('DB_PASSWORD', 'centos');
/** MySQL主机 */
define('DB_HOST', '192.168.50.107');
[root@hai7-8 /data]$setfacl -R -m u:apache:rwx discuz/
httpd服务器
[root@hai7-8 ~]$yum -y install httpd
[root@hai7-8 ~]$vim /etc/httpd/conf.d/test.conf
DirectoryIndex index.php <==指定默认网页文件为index.php
<VirtualHost *:80> <==设立虚拟主机
ServerName www.wordpress.net <==服务名
DocumentRoot /data/wordpress/ <==web服务页面路径
ProxyRequests Off <==不启用正向代理
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/data/wordpress/$1 <==启用反向代理
<Directory "/data/wordpress/"> <==授权虚拟主机服务目录
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:80> <==第二个虚拟机
ServerName www.discuz.net
DocumentRoot /data/discuz/
ProxyRequests Off
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/data/discuz/$1
<Directory "/data/discuz/">
Require all granted
</Directory>
</VirtualHost>
客户端
在客户端D上修改hosts文件,模拟DNS解析,登录网页检测
[root@hai6 ~]$vim /etc/hosts
192.168.50.110 www.wordpress.net www.discuz.net
[root@hai7-8 ~]$yum groupinstall "Development Tools"
[root@hai7-7 ~]$yum install pcre-devel openssl-devel expat-devel -y
[root@hai7115 srcd]$tar xf apr-1.6.3.tar.gz
[root@hai7115 srcd]$tar xf apr-util-1.6.1.tar.gz
[root@hai7115 srcd]$tar xf httpd-2.4.34.tar.bz2
[root@hai7115 srcd]$cp -r apr-1.6.3 httpd-2.4.34/srclib/apr
[root@hai7115 srcd]$cp -r apr-util-1.6.1 httpd-2.4.34/srclib/apr-util
'进入httpd解压后的目录,运行configure'
./configure\
--prefix=/app/httpd24\
--enable-so\ <==是否支持动态模块
--enable-ssl\ <==是否支持加密
--enable-cgi\
--enable-rewrite\
--with-zlib\
--with-pcre\ <==正则表达式
--with-included-apr\ <==表示已经将apr相关需要编译的内容放在httpd相关的路径下,可以一起编译
--enable-modules=most\ <==是否支持大部分模块
--enable-mpms-shared=all\
--with-mpm=prefork <==是否支持mpm的prefork工作模型
1. '构造和安装 '
[root@hai7115 httpd-2.4.34]$make -j 8 && make install
2. '创建用户'
[root@hai7-7 ~]$useradd -r -s /sbin/nologin apache
3. '修改配置文件中的用户项,将httpd账号修改为apache'
[root@hai7-7 ~]$vim /app/httpd24/conf/httpd.conf
User apache
Group apache
[root@hai7-8 /app/httpd24]$ll
bin
build
cgi-bin <==动态资源存放目录,cgi脚本
conf
error <==错误页(例如访问页面不存在返回404等)
htdocs <==网页测试页面
icons
include <==调用当前开发库做二次开发,需要知道API接口有哪些接口可被调用,对于c语言而言,都在include里用头文件标识
lib <==当前程序提供的库文件,分为共享库和开发库,共享库,被本程序的多个程序或程序包共享使用,开发库时做二次开发的的调用接口
logs <==日志文件
man <==帮助手册
manual <==超链接手册,需要web服务进行访问,在主配置文件中启用 #Include conf/extra/httpd-manual.conf行,配置文件在include后面为manual配置文件,需要启用negotiation_module模块
modules <==以编译的模块
1. '加入PATH列表'
[root@hai7-7 ~]$echo PATH=/app/httpd24/bin:$PATH > /etc/profile.d/lamp.sh
2. '重启生效'
[root@hai7-7 ~]$. /etc/profile.d/lamp.sh
1. '将启动程序放在启动脚本中'
[root@hai7-7 rc.d]$vim /etc/rc.d/rc.local
/app/httpd24/bin/apachectl
2. '加上执行权限'
[root@hai7-7 rc.d]$chmod +x /etc/rc.d/rc.local
[root@hai7-7 ~]$tar xvf mariadb-10.2.15-linux-x86_64.tar.gz -C /usr/local
1. '进入解压目录'
[root@hai7-7 ~]$cd /usr/local/
2. '建立软连接,重命名程序'
[root@hai7-7 local/]$ln -s mariadb-10.2.15-linux-x86_64/ mysql
3. '建立系统账户'
[root@hai7-7 local/]$useradd -r -s /sbin/nologin mysql
4. '修改权限'
[root@hai7-7 local]$chown -R mysql.mysql mysql/
1. '建立数据库目录'
[root@hai7-7 ~]$mkdir /app/mysql
2. '将目录所属组所属者修改为mysql'
[root@hai7-7 ~]$chown mysql.mysql /app/mysql
3. '运行解压包带的脚本,生成系统数据库,必须在解压目录(/usr/local/mysql)运行,指定路径为新建的数据库目录,指定账号'
[root@hai7-7 mysql]$scripts/mysql_install_db --datadir=/app/mysql --user=mysql
1. '在etc下建一个独立配置文件目录'
[root@hai7-7 ~]$mkdir /etc/mysql
2. '拷贝二进制包中模板来修改'
[root@hai7-7 ~]$cp /usr/local/mysql/support-files/my-huge.cnf /etc/mysql/my.cnf
3. '修改配置文件,指定数据库目录'
[root@hai7-7 ~]$vim /etc/mysql/my.cnf
[mysqld]
datadir=/app/mysql
[root@hai7-7 ~]$cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
[root@hai7-7 ~]$chkconfig --add mysqld
[root@hai7-7 bin]$vim /etc/profile.d/lamp.sh
PATH=/app/httpd24/bin:/usr/local/mysql/bin:$PATH
'生效一下'
[root@hai7-7 bin]$. /etc/profile.d/lamp.sh
'建立wordpress网页用的账号和数据库'
[root@hai7-7 bin]$mysql -e "CREATE DATABASE wpdb2;GRANT ALL ON wpdb2.* TO wpuser@'localhost' IDENTIFIED BY 'centos'"
libxml2-devel
:php有些功能启用时,需要使用代码处理xml格式的文档,必须兼容使用xml的开发库bzip2-devel
:php本身使用压缩解压功能,所依赖的库libmcrypt-devel
:加密解密功能(epel)[root@hai7-7 bin]$yum -y install libxml2-devel bzip2-devel libmcrypt-devel
1. '解压源码包'
[root@hai7-7 data]$tar xvf php-7.1.18.tar.bz2
2. '进入目录'
[root@hai7-7 data]$cd php-7.1.18/
3. '运行configure'
[root@hai7-7 php-7.1.18]$./configure --prefix=/app/php \
--enable-mysqlnd \
--with-mysqli=mysqlnd \ <==连接数据库的3种方法之一
--with-openssl \
--with-pdo-mysql=mysqlnd \ <==连接数据库的方法之一,基于对象方式来访问数据的接口
--enable-mbstring \ <==支持多字节
--with-freetype-dir \ <==与字体处理相关联的库
--with-jpeg-dir \ <==与图形处理相关的
--with-png-dir \ <==png图形处理相关
--with-zlib \ <==压缩解压缩相
--with-libxml-dir=/usr \ <==处理xml格式文档
--enable-xml \ <==启用xml功能
--enable-sockets \ <==支持基于sockets本地进行通讯
--enable-fpm \ <==基于fpm工作
--with-config-file-path=/etc \ <==指明config路径
--with-config-file-scan-dir=/etc/php.d \ <==模块化配置文件路径
--enable-maintainer-zts \ <==mpm如果是prefork不需要此项,此项为启用线程化的php模块
--disable-fileinfo 禁止访问file信息
4. '构造和安装'
[root@hai7-7 php-7.1.18]$make -j 8 && make install
[root@hai7-7 bin]$cat /etc/profile.d/lamp.sh
PATH=/app/httpd24/bin:/usr/local/mysql/bin:/app/php/bin:$PATH
[root@hai7-7 ~]$cp /data/php-7.1.18/php.ini-production /etc/php.ini
1. '先在主配置文件中加入include,让其可以包含子配置文件'
[root@hai7-7 ~]$vim /app/httpd24/conf/httpd.conf
Include conf/extra/php.conf
2. '建立子配置文件,加入FCGI配置项'
[root@hai7-7 ~]$cd /app/httpd24/conf/extra/
[root@hai7-7 extra]$vim php.conf
AddType application/x-httpd-php .php <==让httpd可以识别php文件
AddType application/x-httpd-php-source .phps
ProxyRequests Off <==不启动正向代理
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/app/httpd24/htdocs/$1 <==启动反向代理```
[root@hai7-7 ~]$vim /app/httpd24/conf/httpd.conf
DirectoryIndex index.php index.html <==指定默认页面文件为php文件,没有在读取html
LoadModule proxy_module modules/mod_proxy.so <==需要启动的模块
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so <==需要启动的模块
1. '将解压目录下init.d.php-fpm文件作为模板,拷贝到init.d中'
[root@hai7-7 ~]$cp /data/php-7.1.18/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
2. '为其加上执行权限'
[root@hai7-7 ~]$chmod +x /etc/init.d/php-fpm
3. '加入到启动服务列表'
[root@hai7-7 ~]$chkconfig --add php-fpm
1. '编译后已经生成,只是文件后缀不符合要求,进入/app/php/etc目录,修改后缀,启动服务'
[root@hai7-7 ~]$cd /app/php/etc
[root@hai7-7 etc]$cp php-fpm.conf.default php-fpm.conf <==主配置文件
2.' 进入 /app/php/etcphp-fpm.d'
[root@hai7-7 etc]$cd php-fpm.d/
[root@hai7-7 php-fpm.d]$cp www.conf.default www.conf <==子配置文件
3. '在子配置文件中修改运行账号,还可以定义监听端口等'
[root@hai7-7 php-fpm.d]$vim www.conf
user = apache <==将运行账号修改为apache
group = apache
4. '启动服务'
[root@hai7-7 php-fpm.d]$service php-fpm start
1. '解压文件'
[root@hai7-7 data]$tar xvf wordpress-4.9.4-zh_CN.tar.gz
2. '拷贝到页面目录下'
[root@hai7-7 data]$cp -r wordpress/* /app/httpd24/htdocs/
3. '准备wordpress的配置文件'
[root@hai7-7 htdocs]$cp wp-config-sample.php wp-config.php
4. '修改配置,连接数据库'
[root@hai7-7 htdocs]$vim wp-config.php
/** WordPress数据库的名称 */
define('DB_NAME', 'wpdb2');
/** MySQL数据库用户名 */
define('DB_USER', 'wpuser');
/** MySQL数据库密码 */
define('DB_PASSWORD', 'centos');
/** MySQL主机 */
define('DB_HOST', 'localhost');
<?php
$link = mysql_connect('127.0.0.1','root','magedu');
if ($link)
echo "Success...";
else
echo "Failure...";
mysql_close();
phpinfo();
?>