LAMP架构
LAMP架构说明:
LAMP名词解析:
- L:linux
- A:apache
- M:mysql、mariadb
- P:PHP、prel、python
LAMP结构说明
- 当客户端请求的是静态资源时,web服务器会直接把静态资源返回客户端;
- 当客户端请求的时动态资源时,httpd和php模块会进行相应的动态资源运算,如果此过程还需要数据库的数据作为运算参数时,php会连接mysql取得数据然后允许,运算的结果转为静态资源由web让服务器返回到客户端;
动态资源与语言:
-
web资源类型:
- 静态资源:原始形式与响应内容一致,在客户端浏览器执行
- 动态资源:原始形式通常为程序文件,需要在服务器端执行之后,将执行结果返回给客户端
注意事项:
- 静态和动态的区别,不在于网页是否能动态变化,而在于服务端的页面文件和客户端得到页面文件是否一致
-
web相关语言
- 客户端技术:html,javascript,css
- 服务器端技术:java, Go, php,python,javascript(Node.js),jsp,asp,Perl,Ruby, Shell
CGI和fastcgi
公共网关接口-CGI
什么是CGI
- Common Gateway Interface 公共网关接口
CGI的作用
- 让apache调用外部的程序或者脚本,在调用前自己会fork一个新进程用于运行外部的C程序或者bash、perl、python脚本等;
- 当新进程执行完毕后,会将执行结果回传给apache服务器,最后由apache服务器传给客户端,成功后会关闭进程。若后续还需要调用动态页面,则会再次fork一个新的进程,执行刚才的操作;
范例
#查看CGI模块是否加载
[root@xiangdeming ~09:01]#httpd -M |grep cgi
proxy_fcgi_module (shared)
proxy_scgi_module (shared)
cgi_module (shared)
#修改cgi目录并增加新的目录授权
[root@xiangdeming ~09:03]#grep -in "cgi-bin" /etc/httpd/conf/httpd.conf
247: ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
252:# "/var/www/cgi-bin" should be changed to whatever your ScriptAliased
255:<Directory "/var/www/cgi-bin">
334:#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
#注释原有行
sed -ri "s/(.*ScriptAlias \/cgi-bin\/ .*)/#\1/" /etc/httpd/conf/httpd.conf
#增加新行
sed -ri "/^#ScriptAlias .*/a ScriptAlias /sh/ \"/var/www/cgi-bin/\""
#创建文件cgi.sh并键入以下内容
touch /var/www/cgi-bin/cgi.sh
#!/bin/bash
#
cat << EOF
Content-Type: text/html
<pre>
My username is: $(id -un)
My id is: $(id -u)
My shell settings are:
$(set)
My environment variables are:
$(env)
Here is the file in /etc:
$(ls -l /etc/redhat-release )
$( cat /etc/redhat-release )
</pre>
EOF
#给与执行权限,重启服务
chmod +x /var/www/cgi-bin/cgi.sh
httpd -t
systemctl restart httpd
#访问测试
root@web-0aadc460 ~08:57]$curl 192.168.213.100/sh/cgi.sh
<pre>
My username is: apache
My id is: 48
My shell settings are:
BASH=/bin/bash
BASHOPTS=cmdhist:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=([0]="0")
BASH_SOURCE=([0]="/var/www/cgi-bin/cgi.sh")
BASH_VERSINFO=([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.2.46(2)-release'
请求流程
Client – (http协议) --> httpd – (cgi协议) --> application server (program file) – (mysql协议) --> mysql、
范例:实现cgi功能
#查看是否启动CGI
httpd -M |grep cgi
#若没由启动则修改
sed -rn "s/(LoadModule cgi.?_module.*cgi.?\.so)$/\1/gp" httpd.conf
#修改 ScriptAlias /cgi-bin/ "/apps/httpd/cgi-bin/"字段
sed -ri '/.*ScriptAlias \/cgi-bin.*/a\ ScriptAlias \/sh\/ "\/var\/www\/cgi-bin\/"' httpd.conf
sed -ri "s@/(.*ScriptAlias \/cgi-bin.*)@# \1@"
#增加目录运行访问
<directory /var/www/cgi-bin>
require all granted
</directory>
#ScriptAlias /cgi-bin/
grep -Ei 'Directory.*cgi-bin' httpd.conf
#创建cgi-bin目录(名称随意)
mkdir -p /var/www/cgi-bin
#生成内嵌php的shell脚本
cat << END
Content-Type: text/html
<pre>
My username is: $(id -un)
My id is: $(id -u)
My shell settings are:
$(set)
Here is the file in /etc:
$(ls -l /etc/redhat-release )
$( cat /etc/redhat-release )
</pre>
END
$(sleep 100)
#添加执行权限
chmod +x /var/www/html/cgi-bin/1.sh
快速通用网关接口-Fastcgi
什么是fastcgi
- FastCommonGatewayInterface 快速通用网关接口
fastcgi的作用
- 是CGI的改进,描述了客户端和服务器程序之间传输数据的一种标准
- FastCGI是一个可伸缩地、高速地在HTTP服务器和动态脚本语言间通信的接口
- CGI在每次调用外部程序时都会fork一个新进程的逻辑,导致在高并发场景下几乎是不可用的,而fastcgi则是将动态语言和HTTP服务器分离开来,同时在脚本解析服务器上fork一个或多个脚本解析守护进程当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程执行,然后将得到的结构返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能;
请求流程
Client – (http协议) --> httpd – (fastcgi协议) --> fastcgi服务器 – (mysql协议) --> mysql
CGI和Fastcgi比较
APP调用流程对比
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8dj7DD5s-1657006433524)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220626163832083.png)]
名称 | web服务器方面 | 数据处理 |
---|---|---|
CGI | 每次处理外部程序都会fork一个新的进程 | 读取参数、处理数据完成后结束进程的生命周期,高并发场景基本不可用 |
Fastcgi | 用TCP的方式跟远程主机上的进程或本地进程建立连接;脚本解析服务器可以和web服务器分开 | 需开启TCP端口,进入循环,等待数据的到来,处理数据,进程是持续的 |
LAMP的实现方式
httpd 接收用户的web请求;静态资源则直接响应;动态资源为php脚本,对此类资源的请求将交由php 来运行
-
httpd与php结合的方式
- modules :将php编译成为httpd的模块libphp5.so,只有prefork 模式才支持
- FastCGI
-
LAMP架构实现
-
静态资源:
Client – http --> httpd
-
动态资源:
Client – http --> httpd --> libphp5.so () – mysql --> MySQL server
Client – http --> httpd -->fastcgi-- mysql --> MySQL server
-
实现LAMP
环境:
服务器名称 | IP | 功能 | 系统 |
---|---|---|---|
web服务器 | 192.168.213.100 | apache、php | Centos 7 |
mysql服务器 | 192.168.231.122 | mysql服务器,powerdns | Centos 7 |
步骤一:环境安装
##web服务器:(需使用prefork模型)
yum -y install httpd php php-mysql(若版本是8则为mysqlnd) mariadb-clent
#等待mysql安装完成且创建远程用户后,验证是否可以远程登录
mysql -uxiang -p"redhat@2022" -h 192.168.213.122
##mysql服务器
#因为自带的只有5.5,安装10.0.8则需要新建yum文件
tee /etc/yum.repos.d/mariadb.repo << EOF
[mariadb]
name = MariaDB
baseurl = https://mirrors.aliyun.com/mariadb/yum/10.7/centos7-amd64
gpgkey=https://mirrors.aliyun.com/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck=1
EOF
yum makecache
yum -y install MariaDB-server
#给root创建密码
mysqladmin password redhat@2022
#mysql服务器创建用户
mysql -uroot -e "create user xiang@'192.168.213.%' identified by 'redhat@2022';"
#授权所有数据库权限给mysql用户
mysql -uroot -e "grant all on *.* to xiang@'192.168.213.%';"
步骤二:尝试连接mysql数据库
##web服务器
#创建数据库调用文件
tee /var/www/html/mysql.php <<EOF
<?php
try {
$user='xiang';
$pass='redhat@2022';
$dbh = new PDO('mysql:host=192.168.213.122;port=3306;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() . "<br/>";
die();
}
phpinfo();
?>
EOF
#访问验证
[root@web-0aadc460 html10:28]$curl 192.168.213.100/mysql.php
Array
(
[User] => xiang
[0] => xiang
[Host] => 192.168.213.%
[1] => 192.168.213.%
)
Array
(
[User] =>
[0] =>
[Host] => localhost
[1] => localhost
)
Array
(
[User] => mariadb.sys
[0] => mariadb.sys
[Host] => localhost
[1] => localhost
)
Array
(
[User] => mysql
[0] => mysql
[Host] => localhost
[1] => localhost
)
Array
(
[User] => root
[0] => root
[Host] => localhost
[1] => localhost
)
Array
(
[User] =>
[0] =>
[Host] => web-0aadc460.slave01
[1] => web-0aadc460.slave01
)
步骤三:部署PhpMyAdmin
PhpMyAdmin介绍
- PhpMyAdmin是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工 具,让管理者可用Web接口管理MySQL数据库
- 官网:https://www.phpmyadmin.net/
#需要php在7.4以上版本
#卸载原有的php
yum -y remove php-*
#安装第三方的php源
yum -y install https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-7.rpm
#下载5.2.0的myadmin软件包
mkdir /apps
wget -P /apps/ https://files.phpmyadmin.net/phpMyAdmin/5.2.0/phpMyAdmin-5.2.0-all-languages.zip --no-check-certificate
#安装php相关包
yum -y install php74-php php74-php-mysqlnd php74-php-mbstring unzip
#解压安装包
unzip /apps/phpMyAdmin-5.2.0-all-languages.zip
#移动安装包,并改名为pam
mv phpMyAdmin-5.2.0-all-languages /var/www/html/pam
#修改配置文件
cp -p config.sample.inc.php config.inc.php
sed -ri "s/^($cfg.*)localhost(';)$/\1192.168.213.122\2/"
sed -ri "/^$cgf.*192.168.213.122.*;$/a \$cfg['Servers'][\$i]['user'] = 'xiang';" config.inc.php
sed -rn "/^$cgf.*192.168.213.122.*;$/a \$cfg['Servers'][\$i]['password'] = 'redhat@2022';" config.inc.php
#修改配置文件(如果不生效则修改config.default.php)
sed -ri "s/^($cfg.*localhost';$)/#\1/" config.default.php
sed -ri "/^#$cfg.*localhost';$/a \$cfg['Servers'][\$i]['host'] = '192.168.213.122';" config.default.php
sed -ri "/^#$cfg.*localhost';$/a \$cfg['Servers'][\$i]['user'] = 'xiang';" config.default.php
sed -ri "/^#$cfg.*localhost';$/a \$cfg['Servers'][\$i]['password'] = 'redhat@2022';" config.default.php
#重启服务
systemctl restart httpd
#访问
http://ApacheServerIP/pma/
访问示例:
步骤四:部署Wordpress
Wordpress介绍
- 以PHP为基础的,以Web-Base方式架构在网站主机上博客软件,可以实现自定义,高相应,高安全性的博客网站
- Wordpress官网:https://cn.wordpress.org/
##web服务器
#软件下载
wget -P /apss https://cn.wordpress.org/latest-zh_CN.tar.gz
#解压文件
tar -xvf latest-zh_CN.tar.gz
#移动目录到/var/www/html/wordpress
mv wordpress/ /var/www/html/
#授权
chown -R apache.apache /var/www/html/wordpress/
##mysql服务器
#创建库
mysql -uroot -p"redhat@2022" -e "create database wordpress;"
#创建用户
mysql -uroot -p"redhat@2022" -e "create user wordpr@'192.168.213.%' identified by 'redhat@2022';"
#授权
mysql -uroot -p"redhat@2022" -e "grant all on wordpress.* to wordpr@'192.168.213.%';"
#访问页面完成安装
http://192.168.213.100/wordpress
#安全加入
curl https://api.wordpress.org/secret-key/1.1/salt/|while read -r line;do
a=$(echo $line | awk -F"'" '{print $2}')
sed -ri "s/(^define\( '$a'.*)/#\1/" /var/www/html/wordpress/wp-config.php
sed -ri "/^#define\( '$a'.*/a $line" /var/www/html/wordpress/wp-config.php
done
#安装完成后访问
http://192.168.213.100/wordpress/wp-login.php
步骤五:部署 Discuz
Discuz介绍
- Discuz! 超过300万站长使用,全球成熟度最高、覆盖率最大的建站系统之一,拥有超过5000款应用。
- 站长可以方便的通过 Discuz! 搭建社区论坛、知识付费网站、视频直播点播站、企业网站、同城社区、小程序、APP、图片素材站,游戏交流站,电商购物站、小说阅读、博客、拼车系统、房产信息、求职招聘、婚恋交友等等绝大多数类型的网站
- Discuz!自2001年6月面世以来,已有20年的历史,Discuz!性能优异、功能全面、安全稳定,在社区论坛(BBS)软件领域全球市场占有率第一。
- Discuz! 的基础架构采用世界上最流行的web编程组合PHP+MySQL实现,是一个经过完善设计,适用于各种服务器环境的高效建站解决方案
- Discuz官网:http://www.discuz.net/
#下载软件
wget -P /apps https://www.discuz.net/files/DiscuzX/3.4/Discuz_X3.4_SC_UTF8_20220518.zip
#解压软件
unzip Discuz_X3.4_SC_UTF8_20220518.zip
#检查是否安装xml插件
rpm -qa |grep -i php74-php-xml || yum -y install php74-php-xml && systemctl restart httpd
#移动upload目录到/var/www/html下
mv upload/ /var/www/html/Discuz
#授权
setfacl -R -m u:apache:rwx /var/www/html/Discuz
#创建库
mysql -uroot -p"redhat@2022" -e "create database discuz;"
#创建用户
mysql -uroot -p"redhat@2022" -e "create user dis@'192.168.213.%' identified by 'redhat@2022';"
#授权
mysql -uroot -p"redhat@2022" -e "grant all on discuz.* to dis@'192.168.213.%';"
#访问网页完成安装
http://192.168.213.100/Discuz
步骤五:部署PowerDns
PowerDns介绍
- Poweradmin 是为 PowerDNS 服务器的提供基于PHP语言实现的 Web 界面的DNS 管理工具。此工具支 持 PowerDNS 的主要功能。
- PowerDNS 是一个跨平台的开源DNS服务组件,PowerDNS为DNS数据提供纯文本文件或第三方数据库 (如MySQL,PostgreSQL,Microsoft SQL Server,Oracle或Sybase)中存储的数据
- PowerDNS同 时有Windows和Linux/Unix的版本,常使用MySQL来记录DNS信息
- PowerDNS官网:https://www.powerdns.com/
- PowerDNS文档:https://doc.powerdns.com/
- Poweradmin官网:http://www.poweradmin.org
##mysql服务器
#安装软件-基于epel源
yum install -y pdns pdns-backend-mysql boost-program-options.x86_64
#修改powerdns配置文件,配置以下内容
sed -ri "s/^(launch=.*)/#\1/" /etc/pdns/pdns.conf
sed -ri "/^#launch.*/a launch=gmysql" /etc/pdns/pdns.conf
sed -ri "/^launch=gmysql/a gmysql-host=192.168.213.122" /etc/pdns/pdns.conf
sed -ri "/^gmysql-host.*/a gmysql-port=3306" /etc/pdns/pdns.conf
sed -ri "/^gmysql-port.*/a gmysql-dbname=powerdns" /etc/pdns/pdns.conf
sed -ri "/^gmysql-dbname.*/a gmysql-user=power" /etc/pdns/pdns.conf
sed -ri "/^gmysql-user.*/a gmysql-password=redhat@2022" /etc/pdns/pdns.conf
#检查
grep -Ev "^#|^$" /etc/pdns/pdns.conf
launch=gmysql
gmysql-host=192.168.213.122
gmysql-port=3306
gmysql-dbname=powerdns
gmysql-user=power
gmysql-password=redhat@2022
setgid=pdns
setuid=pdns
#创建库
mysql -uroot -p"redhat@2022" -e "CREATE DATABASE powerdns"
#创建用户
mysql -uroot -p"redhat@2022" -e "create user power@'192.168.213.%' identified by 'redhat@2022';"
#授权
mysql -uroot -p"redhat@2022" -e "grant all on powerdns.* to power@'192.168.213.%';"
#创建表-domains
[root@web-0aadc460 ~16:56]$mysql -uroot -p"redhat@2022" -e "
CREATE TABLE powerdns.domains (
id INT AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
master VARCHAR(128) DEFAULT NULL,
last_check INT DEFAULT NULL,
type VARCHAR(6) NOT NULL,
notified_serial INT DEFAULT NULL,
account VARCHAR(40) DEFAULT NULL,
PRIMARY KEY (id)
) Engine=InnoDB;"
[root@web-0aadc460 ~16:57]$mysql -uroot -p"redhat@2022" -e "desc powerdns.domains"
+-----------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
| master | varchar(128) | YES | | NULL | |
| last_check | int(11) | YES | | NULL | |
| type | varchar(6) | NO | | NULL | |
| notified_serial | int(11) | YES | | NULL | |
| account | varchar(40) | YES | | NULL | |
+-----------------+--------------+------+-----+---------+----------------+
#创建索引
mysql -uroot -p"redhat@2022" -e "CREATE UNIQUE INDEX name_index ON powerdns.domains(name);"
#创建表-records
mysql -uroot -p"redhat@2022" -e "
CREATE TABLE powerdns.records (
id BIGINT AUTO_INCREMENT,
domain_id INT DEFAULT NULL,
name VARCHAR(255) DEFAULT NULL,
type VARCHAR(10) DEFAULT NULL,
content VARCHAR(64000) DEFAULT NULL,
ttl INT DEFAULT NULL,
prio INT DEFAULT NULL,
change_date INT DEFAULT NULL,
disabled TINYINT(1) DEFAULT 0,
ordername VARCHAR(255) BINARY DEFAULT NULL,
auth TINYINT(1) DEFAULT 1,
PRIMARY KEY (id))
Engine=InnoDB;"
+-------------+----------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| domain_id | int(11) | YES | MUL | NULL | |
| name | varchar(255) | YES | MUL | NULL | |
| type | varchar(10) | YES | | NULL | |
| content | varchar(64000) | YES | | NULL | |
| ttl | int(11) | YES | | NULL | |
| prio | int(11) | YES | | NULL | |
| change_date | int(11) | YES | | NULL | |
| disabled | tinyint(1) | YES | | 0 | |
| ordername | varchar(255) | YES | | NULL | |
| auth | tinyint(1) | YES | | 1 | |
+-------------+----------------+------+-----+---------+----------------+
#创建索引
mysql -uroot -p"redhat@2022" -e "CREATE INDEX nametype_index ON powerdns.records(name,type);"
mysql -uroot -p"redhat@2022" -e "CREATE INDEX domain_id ON powerdns.records(domain_id);"
mysql -uroot -p"redhat@2022" -e "CREATE INDEX recordorder ON powerdns.records (domain_id, ordername);"
#创建表-supermasters
mysql -uroot -p"redhat@2022" -e "
CREATE TABLE powerdns.supermasters (
ip VARCHAR(64) NOT NULL,
nameserver VARCHAR(255) NOT NULL,
account VARCHAR(40) NOT NULL,
PRIMARY KEY (ip, nameserver))
Engine=InnoDB;"
mysql -uroot -p"redhat@2022" -e "desc powerdns.supermasters"
+------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| ip | varchar(64) | NO | PRI | NULL | |
| nameserver | varchar(255) | NO | PRI | NULL | |
| account | varchar(40) | NO | | NULL | |
+------------+--------------+------+-----+---------+-------+
#创建表-comments
mysql -uroot -p"redhat@2022" -e "
CREATE TABLE powerdns.comments (
id INT AUTO_INCREMENT,
domain_id INT NOT NULL,
name VARCHAR(255) NOT NULL,
type VARCHAR(10) NOT NULL,
modified_at INT NOT NULL,
account VARCHAR(40) NOT NULL,
comment VARCHAR(64000) NOT NULL,
PRIMARY KEY (id))
Engine=InnoDB;"
mysql -uroot -p"redhat@2022" -e "desc powerdns.comments"
+-------------+----------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| domain_id | int(11) | NO | MUL | NULL | |
| name | varchar(255) | NO | MUL | NULL | |
| type | varchar(10) | NO | | NULL | |
| modified_at | int(11) | NO | | NULL | |
| account | varchar(40) | NO | | NULL | |
| comment | varchar(64000) | NO | | NULL | |
+-------------+----------------+------+-----+---------+----------------+
#创建索引
mysql -uroot -p"redhat@2022" -e "
CREATE INDEX comments_domain_id_idx ON powerdns.comments (domain_id);"
mysql -uroot -p"redhat@2022" -e "
CREATE INDEX comments_name_type_idx ON powerdns.comments (name, type);"
mysql -uroot -p"redhat@2022" -e "
CREATE INDEX comments_order_idx ON powerdns.comments (domain_id, modified_at);"
#创建表-domainmetadata
mysql -uroot -p"redhat@2022" -e "
CREATE TABLE powerdns.domainmetadata (
id INT AUTO_INCREMENT,
domain_id INT NOT NULL,
kind VARCHAR(32),
content TEXT,
PRIMARY KEY (id))
Engine=InnoDB;"
mysql -uroot -p"redhat@2022" -e "desc powerdns.domainmetadata"
+-----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| domain_id | int(11) | NO | MUL | NULL | |
| kind | varchar(32) | YES | | NULL | |
| content | text | YES | | NULL | |
+-----------+-------------+------+-----+---------+----------------+
#创建索引
mysql -uroot -p"redhat@2022" -e "
CREATE INDEX domainmetadata_idx ON powerdns.domainmetadata (domain_id, kind);"
#创建表-cryptokeys
mysql -uroot -p"redhat@2022" -e "
CREATE TABLE powerdns.cryptokeys (
id INT AUTO_INCREMENT,
domain_id INT NOT NULL,
flags INT NOT NULL,
active BOOL,
content TEXT,
PRIMARY KEY(id))
Engine=InnoDB;"
mysql -uroot -p"redhat@2022" -e "desc powerdns.cryptokeys"
+-----------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| domain_id | int(11) | NO | MUL | NULL | |
| flags | int(11) | NO | | NULL | |
| active | tinyint(1) | YES | | NULL | |
| content | text | YES | | NULL | |
+-----------+------------+------+-----+---------+----------------+
#创建索引
mysql -uroot -p"redhat@2022" -e "
CREATE INDEX domainidindex ON powerdns.cryptokeys(domain_id);"
#创建表-tsigkeys
mysql -uroot -p"redhat@2022" -e "
CREATE TABLE powerdns.tsigkeys (
id INT AUTO_INCREMENT,
name VARCHAR(255),
algorithm VARCHAR(50),
secret VARCHAR(255),
PRIMARY KEY (id))
Engine=InnoDB;"
mysql -uroot -p"redhat@2022" -e "desc powerdns.tsigkeys"
+-----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | MUL | NULL | |
| algorithm | varchar(50) | YES | | NULL | |
| secret | varchar(255) | YES | | NULL | |
+-----------+--------------+------+-----+---------+----------------+
#创建索引
mysql -uroot -p"redhat@2022" -e "
CREATE UNIQUE INDEX namealgoindex ON powerdns.tsigkeys(name, algorithm);"
#查看表名称
mysql -uroot -p"redhat@2022" -e "show tables from powerdns;"
+--------------------+
| Tables_in_powerdns |
+--------------------+
| comments |
| cryptokeys |
| domainmetadata |
| domains |
| records |
| supermasters |
| tsigkeys |
+--------------------+
#启动pdns服务
systemctl enable --now pdns
#下载poweradmin
wget -P /apps http://downloads.sourceforge.net/project/poweradmin/poweradmin-2.1.7.tgz
#解压
tar -xvf poweradmin-2.1.7.tgz -C /var/www/html/
#改名
mv poweradmin-2.1.7/ poweradmin
#安装php程序
yum -y install php74-php-devel php74-php-gd php74-php-pecl-mcrypt php74-php-imap php74-php-ldap php74-php-pecl-mysql php74-php-mysqlnd php74-php-xml php74-php-xmlrpc php74-php-mbstring php74-php httpd
#访问poweradmin网页开始安装
http://192.168.213.122/poweradmin/install/
#创建管理用户
mysql -uroot -p"redhat@2022" -e "
> GRANT SELECT, INSERT, UPDATE, DELETE
> ON powerdns.*
> TO 'poweradmin'@'localhost'
> IDENTIFIED BY 'redhat@2022';"
#生成config.inc.php文件
tee /var/www/html/poweradmin/inc/config.inc.php << EOF
<?php
$db_host = 'localhost';
$db_user = 'poweradmin';
$db_pass = 'redhat@2022';
$db_name = 'powerdns';
$db_type = 'mysql';
$db_layer = 'PDO';
$session_key = 'mK{*4ywhScsn}WUwER[KX7Ah0QH[[}bnaC~$$5vLT8F%yq';
$iface_lang = 'en_EN';
$dns_hostmaster = 'powerdnsserver';
$dns_ns1 = '192.168.213.122';
$dns_ns2 = '192.168.213.122';
EOF
#安装完成后删除install目录
mv /var/www/html/poweradmin/install/ /var/www/html/poweradmin/install_bak/
#访问地址
http://192.168.213.122/poweradmin/
PHP加速器介绍
加速原理
- 基于PHP的特殊扩展机制如opcode缓存扩展也可以将opcode缓存于php的共享内存中, 从而可以让同一段代码的后续重复执行时跳过编译阶段以提高性能。这些加速器并非真正提高了opcode 的运行速度,而仅是通过分析opcode后并将它们重新排列以达到快速执行的目的
APC (Alternative PHP Cache)
- 遵循PHP License的开源框架,PHP opcode缓存加速器,目前的版本不适用于PHP 5.4
- 项目地址:http://pecl.php.net/package/APC
eAccelerator
- 源于Turck MMCache,早期的版本包含了一个PHP encoder和PHP loader,目前encoder已经不 在支持
- 项目地址 :http://eaccelerator.net/
XCache
- 快速而且稳定的PHP opcode缓存,经过严格测试且被大量用于生产环境。
- 项目地址:http://xcach e.lighttpd.net/,收录EPEL源
Zend Optimizer和Zend Guard Loader
- Zend Optimizer并非一个opcode加速器,它是由Zend Technologies为PHP5.2及以前的版本提供 的一个免费、闭源的PHP扩展,其能够运行由Zend Guard生成的加密的PHP代码或模糊代码。 而 Zend Guard Loader则是专为PHP5.3提供的类似于Zend Optimizer功能的扩展。
- 项目地址http:// www.zend.com/en/products/guard/runtime-decoders
NuSphere PhpExpress
- NuSphere的一款开源PHP加速器,它支持装载通过NuSphere PHP Encoder编码的PHP程序文 件,并能够实现对常规PHP文件的执行加速。
- 项目地址,http://www.nusphere.com/products/p hpexpress.htm
OPcache
- OPcache 通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字 节码的好处就是 省去了每次加载和解析 PHP 脚本的开销。PHP 5.5.0 及后续版本中已经绑定了 OPcache 扩展。 对于 PHP 5.2,5.3 和 5.4 版本可以使用 » PECL 扩展中的 OPcache 库。
- 需要注意: 如果开启opcache,并使用软链接,会导致更新php的源代码但不更新中间码的缓存,导致更 新失败,需要重新启动服务php-fpm
- 官网说明: https://www.php.net/manual/zh/intro.opcache.php
使用Xcache加速php5.x
说明
- 官网:http://xcache.lighttpd.net/wiki/ReleaseArchive
- 编译安装php-xcache
- php版本5.6及以下
- PHP5.x依赖于apache
范例:实现Xcache加速
###配置Xcache加速
#安装php-5.4(自带)
yum -y install php
#查看是否加载php
httpd -M |grep php
#若未正确加载则修改该文件
/usr/lib64/httpd/modules/libphp5.so
#配置状态页面,查看是否在家status模块
httpd -M |grep mod_status
#若未加载则修改该文件
/etc/httpd/conf.modules.d/00-base.conf
#修改主配置文件
vim /etc/httpd/conf/httpd.conf
<Location "/status">#访问页面路径
SetHandler server-status
</Location>
#在/var/www/html中添加php测试页面
vim /var/www/html/info.php
<?php
echo date("Y/m/d H:i:s");
phpinfo();
?>
#访问
curl 192.168.213.122/php.info |grep cmod_cache
实现Opcache加速
#确认旧的php已卸载
rpm -qa |grep php && yum remove php* -y
#安装第三方php源
yum -y install https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-7.rpm
#安装php7.x
yum -y install php74-php php74-mysqlnd php74-php-opcache php74-php-json
#查看是否开启
grep opcache.enable /etc/opt/remi/php74/php.d/10-opcache.ini
#重启httpd服务
systemctl restart httpd
#访问验证
curl 192.168.213.122/info.php|grep -i opcache
实现fpm-php(PHP FastCGI Process Manager)模式的LAMP
说明
- 对于php请求,httpd可以用模块和fastcgi两种方式实现动态程序的支持。
- fastcgi模式:php处理请求,不再由http服务器自身进行管理,http服务器把http协议转化为factcgi协 议,通过socket发送给fastcgi专用进程处理php程序
- 从稳定性上看,fastcgi是以独立的进程池运行来程序,如果单独一个进程死掉,系统可以很轻易的丢弃,然 后重新分配新的进程来运行。
- 从安全性上看,fastcgi和http的server完全独立, fastcgi怎么down也不会把 server搞垮。
- 从性能上看,fastcgi把动态逻辑的处理从http server中分离出来,大负荷的IO处理还是留给宿主server,这 样httpd server可以一心一意作IO,对于一个普通的动态网页来说,逻辑处理可能只有一小部分,大量的图片 等静态IO处理完全不需要逻辑程序的参与。从扩展性上讲,fastcgi是一个中立的技术标准,完全可以支持任 何语言写的处理程序,如php,java,python等。而php-fpm就是用来支持php的fastcgi服务器。
- php-fpm 需要 mod_proxy_fcgi 模块的支持
- 官方文档:http://httpd.apache.org/docs/2.4/mod/mod_proxy_fcgi.html
各个版本对fpm-php的支持
CentOS 8: 默认使用fpm模式
httpd-2.4:默认rpm包支持fcgi模块
php包默认使用fpm模式
php-fpm包:专用于将php运行于fpm模式
CentOS 7:
httpd-2.4:默认rpm包支持fcgi模块
php-fpm包:专用于将php运行于fpm模式
CentOS 6:
PHP-5.3.2之前:默认不支持fpm机制;需要自行打补丁并编译安装
httpd-2.2:默认不支持fcgi协议,需要自行编译此模块
解决方案:编译安装httpd-2.4, php-5.3.3+
PHP-FPM主要的配置文件
主配置文件
- /etc/php-fpm.conf
- /etc/php-fpm.d/*.conf
session目录
- 作用:确保运行php-fpm进程的用户对session目录有读写权限
- /var/lib/php/session(若没有可自己创建且需要授权:chown apache.apache /var/lib/php/session)
PHP-FPM常见配置
- 路径:/etc/opt/remi/php74/php-fpm.d/www.conf
daemonize = no #是否将程序运行在后台
listen = 127.0.0.1:9000 #FPM 监听地址
listen = /var/run/php.sock #UDF模式使用,指定生成的unix socket文件的路径
#注意:Unix Domain Socket (UDS) support added in httpd-2.4.7
#http://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypass
listen.owner = apache #UDF模式使用,指定生成的unix socket文件的所有者
listen.group = apache #UDF模式使用,指定生成的unix socket文件的所属组
listen.mode= 0666 #UDF模式使用,,指定生成的unix socket文件的权限
listen.acl_users = apache,nginx #指定用户访问unix socket文件,listen.owner 和
listen.group将无效
listen.backlog = -1 #等待队列的长度 -1表示无限制
listen.allowed_clients = 127.0.0.1 #仅允许哪些WEB主机访问
pm = dynamic|static #static 固定数量的子进程,dynamic子进程数据以动态模式管理
pm.max_childen=500 #静态方式下开启的php-fpm进程数量,在动态方式下限定php-fpm的最大进程数
pm.start_servers=100 #动态模式下初始进程数,必须大于等于pm.min_spare_servers和小于等于
pm.max_children的值
pm.min_spare_servers=100 #最小空闲进程数
pm.max_spare_servers=200 #最大空闲进程数
pm.max_requests = 500000 #进程累计请求回收值,会重新生成进程
pm.status_path = /pm_status #状态访问URL
ping.path = /ping #ping访问活动地址
ping.response = pong #ping返回值
php_value[session.save_handler] = files #以文件存放session,也可以支持
redis等
php_value[session.save_path] = /var/lib/php/session #设置session存放位置
access.log log/access.log #访问日志
access.format "%R - %u %t \"%m %r\" %s" #访问日志格式
error_log log/php-fpm.log #错误日志
request_slowlog_timeout mixed #当一个请求该设置的超时时间后,就会将对应的 PHP 调用堆栈
信息完整写入到慢日志中。设置为 '0' 表示 'Off'。可用单位:s(秒),m(分),h(小时)或者
d(天)。默认单位:s(秒)。默认值:0(关闭)
slowlog log/php-fpm.log.slow #慢请求的记录日志
案例配置ftp-php
#卸载php74-php包
yum remove php74-php
#安装php74-fpm包
yum -y install php74-php-fpm
#启动fpm服务
systemctl enable --now php74-php-fpm
#查看端口是否启用
ss -ntl |grep ":9000"
#修改apache主配置文件(这里主要是配置转发条件)
tee /etc/httpd/conf.d/fcgi.conf <<EOF
DirectoryIndex index.php
ProxyRequests Off
ProxyPassMatch ^/(.*\.php)$ fcgi://192.168.213.122:9000/var/www/html/$1
ProxyPassMatch ^/(fpm_status|ping) fcgi://192.168.213.122:9000
EOF
#修改php74-php-fpm配置文件
/etc/opt/remi/php74/php-fpm.d/www.conf
#监听
sed -ri "/^listen =.*/s/127.0.0.1/0.0.0.0/" /etc/opt/remi/php74/php-fpm.d/www.conf
#允许访问
sed -ri "/^(isten.allowed_clients.*)/;\1/" /etc/opt/remi/php74/php-fpm.d/www.conf
#状态页
sed -ri "s/.*(pm.status_path.*)status/\1fpm_status/" /etc/opt/remi/php74/php-fpm.d/www.conf
#ping测试
sed -ri "s/^;(\/ping.path.*)/\1/" /etc/opt/remi/php74/php-fpm.d/www.conf
sed -ri "s/^;(ping.response.*)/\1/" /etc/opt/remi/php74/php-fpm.d/www.conf
#重启服务
systemctl restart php74-php-fpm httpd
#访问
curl 192.168.213.122/info.php|grep -i "server api"
一键配置脚本
#!/bin/bash
#环境安装,web服务器
. /etc/init.d/functions
read -r -p "Enter the local host IP" Local_IP
read -r -p "Enter the remote host IP :" SSH_IP
read -r -p "Enter the remote host user:" SSH_User
read -r -s -p "Enter the remote host password:" SSH_Pass
{ [ -n "$SSH_IP" ] && [ -n "$SSH_User" ] && [ -n "$SSH_Pass" ]; } || { echo "请输入远端主机IP、用户、密码;";exit; }
function install_env()
{
#判断版本
local Version
Version=$(awk '-F"' '/^CENTOS_MANTISBT_PROJECT=/{print $2}' /etc/os-release)
if [[ ! "$Version" == CentOS-7 ]];then
echo "仅支持Centos 7.x";exit 1
fi
#环境判断
ping -w1 -c1 www.baidu.com &> /dev/null && action "公网连接" || { action "公网连接" false;exit; }
#检查数据库环境
[ ! -f /etc/yum.repos.d/mariadb.repo ] &&\
tee /etc/yum.repos.d/mariadb.repo << EOF
[mariadb]
name = MariaDB
baseurl = https://mirrors.aliyun.com/mariadb/yum/10.7/centos7-amd64
gpgkey=https://mirrors.aliyun.com/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck=1
EOF
sed -ri "s/ +//" /etc/yum.repos.d/mariadb.repo、
yum makecache &> /dev/null && action "yum仓库加载" || { action "yum仓库加载" false;exit; }
echo "开始软件安装"
cat /etc/yum.repos.d/remi-*.repo |grep -q -i "remi" ||\
yum -q -y install https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-7.rpm &&\
yum -q -y install php74-php php74-php-mysqlnd php74-php-xml php74-php-opcache php74-php-json httpd unzip sshpass expect MariaDB-client &&\
action "软件安装"
[ ! -d /apps ] && mkdir /apps
systemctl enable --now httpd || exit 1
action "环境准备OK"
}
function install_mysql()
{
local log_file
log_file=/apps/SSH_wordpress.log
#生成数据库yum源
[ ! -f /etc/yum.repos.d/mariadb.repo ] &&\
tee /etc/yum.repos.d/mariadb.repo << EOF
[mariadb]
name = MariaDB
baseurl = https://mirrors.aliyun.com/mariadb/yum/10.7/centos7-amd64
gpgkey=https://mirrors.aliyun.com/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck=1
EOF
sed -ri "s/ +//" /etc/yum.repos.d/mariadb.repo
#复制文件到远端并安装
sshpass -p "$SSH_Pass" scp /etc/yum.repos.d/mariadb.repo "$SSH_User@$SSH_IP:/etc/yum.repos.d/mariadb.repo" &&\
action "源文件配置"
#创建库
/usr/bin/expect <<EOF >"$log_file"
set timeout -1
spawn ssh ${SSH_User}@${SSH_IP}
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "${SSH_Pass}\n" }
}
expect "]" { send "yum -y install MariaDB-server\n" }
expect "Complete" { send "systemctl enable --now mysqld\n" }
send "mysql -uroot -e \"create database Myadmin;\"\n"
send "mysql -uroot -e \"create database Wordpress;\"\n"
send "mysql -uroot -e \"create database discuz;\"\n"
send "mysql -uroot -e \"create user myadmin@'192.168.213.%' identified by 'redhat@2022';\"\n"
send "mysql -uroot -e \"create user wordpr@'192.168.213.%' identified by 'redhat@2022';\"\n"
sedn "mysql -uroot -e \"create user dis@'192.168.213.%' identified by 'redhat@2022';\"\n"
send "mysql -uroot -e \"grant all on Myadmin.* to myadmin@'192.168.213.%';\"\n"
send "mysql -uroot -e \"grant all on Wordpress.* to wordpr@'192.168.213.%';\"\n"
send "mysql -uroot -e \"grant all on discuz.* to dis@'192.168.213.%';\"\n"
send "mysql -uroot -e \"alter user root@localhost identified by 'redhat@2022';\"\n"
expect "]" { send "exit\n"}
expect eof
EOF
grep -i "error" /apps/SSH_wordpress.log &>/dev/null && { action "配置失败" false;exit; } || action "数据库:wordpress配置完成"
}
function install_Myadmin()
{
#访问数据库
mysql -umyadmin -p"redhat@2022" -h "$SSH_IP" -e "show databases;" || { action "数据库连接性" false;exit; }
#下载软件包
[ ! -f /apps/phpMyAdmin-5.2.0-all-languages.zip ] &&\
wget -P /apps https://files.phpmyadmin.net/phpMyAdmin/5.2.0/phpMyAdmin-5.2.0-all-languages.zip --no-check-certificate &> /dev/null && action "Myadmin下载完成"
cd /apps || exit
unzip /apps/phpMyAdmin-5.2.0-all-languages.zip &> /dev/null && action "解压" || { action "解压失败" false;exit; }
mv /apps/phpMyAdmin-5.2.0-all-languages /var/www/html/pma
#修改配置文件
cd /var/www/html/pma || exit
cp -p config.sample.inc.php config.inc.php
sed -ri "s/^(\\\$cfg.*)localhost(';)$/\1$SSH_IP\2/" config.inc.php
sed -ri "/^\$cgf.*$SSH_IP.*;$/a \$cfg['Servers'][\$i]['user'] = 'myadmin';" config.inc.php
sed -rn "/^\$cgf.*$SSH_IP.*;$/a \$cfg['Servers'][\$i]['password'] = 'redhat@2022';" config.inc.php
#重启服务
systemctl restart httpd &>/dev/null && action "Myadmin配置"
}
function install_Wordpress()
{
#访问数据库
mysql -uwordpr -p"redhat@2022" -h "$SSH_IP" -e "show databases;" &>/dev/null || { action "数据库连接性" false;exit; }
#软件下载
[ ! -f /apps/latest-zh_CN.tar.gz ] &&\
wget -P /apps https://cn.wordpress.org/latest-zh_CN.tar.gz &> /dev/null ||\
{ action 下载失败 false;exit; }
#解压文件
tar -xvf /apps/latest-zh_CN.tar.gz -C /var/www/html
#权限授权
chown -R apache.apache /var/www/html/wordpress/
#访问验证
curl "$SSH_IP"/wordpress &>/dev/null && echo "请访问wordpress完成安装"
local T
T="true"
while $T;do
curl https://api.wordpress.org/secret-key/1.1/salt/ &>/dev/null && break || echo "请访问页面完成安装"
done
echo "
mysql账户:wordprg
mysql密码:redhat@2022
mysql地址:$SSH_IP
"
#安全加固
curl https://api.wordpress.org/secret-key/1.1/salt/|while read -r line;do
a=$(echo "$line" | awk -F"'" '{print $2}')
sed -ri "s/(^define\( '$a'.*)/#\1/" /var/www/html/wordpress/wp-config.php
sed -ri "/^#define\( '$a'.*/a $line" /var/www/html/wordpress/wp-config.php
done
#安装完成
action "安装wordpress"
echo "请访问http://$Local_IP/wordpress/wp-login.php"
}
function install_Discuz()
{
#软件下载
[ ! -f /apps/Discuz_X3.4_SC_UTF8_20220518.zip ] &&\
wget -P /apps https://www.discuz.net/files/DiscuzX/3.4/Discuz_X3.4_SC_UTF8_20220518.zip
#软件解压
unzip Discuz_X3.4_SC_UTF8_20220518.zip &> /dev/null && action "Discuz解压" || action "Discuz解压" false
#移动upload目录到/var/www/html下
cd /apps || exit
mv upload/ /var/www/html/Discuz
#权限授权
setfacl -R -m u:apache:rwx /var/www/html/Discuz
#访问网页完成安装
echo "请访问http://${Local_IP}/Discuz完成安装"
}
#菜单
PS3="请选择菜单:(1-5)"
select MENU in 环境检查 安装Myadmin 安装Wordpress 安装数据库 退出 ;do
case $REPLY in
1)
install_env
;;
2)
install_env
install_Myadmin
;;
3)
install_env
install_Wordpress
;;
4)
install_env
install_Discuz
;;
5)
install_env
install_mysql
;;
6)
exit
;;
*)
echo 输入错误
;;
esac
done