[TOC]

0x00 快速入门

LAMP发展
LAMP这个特定名词最早出现在1998年,是Linux操作系统、Apache网页服务器、MySQL数据库管理系统和PHP程序模块,四种技术名称开头字母缩写组成的。是一组常用来搭建动态网站或者服务器的开源软件组合, 本身都是各自独立的软件,但是因为常被结合在一起使用,并拥有越来越高的兼容度,共同组成了一个强大的Web应用程序平台。

随着开源潮流的蓬勃发展,开放源代码的LAMP组合在发展速度上(运行各种商业应用和协作构建各种网络应用程序),已经超过了JavaEE和ASP.net等同类开发平台的商业软件。

并且在LAMP平台上开发的项目在软件方面的投资成本较低,运行稳定,因此受到整个IT界的关注。

所以: Apache+PHP+MySQL被认为是在Linux平台上最佳组合之一。


LAMP介绍
LAMP并不是一个独立的软件,由Linux+Apache+PHP+MySQL组合而成的一套可以运行PHP程序体系(并非只有Apache可以通过扩展支持PHP的解析,Nginx, LightHttpd等其他软件同样可以),经过多年的Web技术的发展,在业内广泛应用于一种Web服务器解决方案之一,由一些独立的系统或者由软件组合而成。

LAMP是怎么产生的?
由Server OS , Web Server , DataBase , ScriptLanguage来寻找高效运行的Web软件组合。

WeiyiGeek.LAMP

WeiyiGeek.LAMP

LAMP的工作原理:
Apache加载Libphp5/7.so模块来支持PHP解析,而PHP引入Mysql.so模块来对数据库进行CURD操作(因为并非所有的php代码都支持CURD操作)。
数据库的操作术语:CURD = create(创建) + update(更新) + read(读取) + 删除(delete)

WeiyiGeek.工作原理

WeiyiGeek.工作原理

LAMP环境文件目录概述:
通过apt-get工具安装的软件配置文件均放置在/etc下,并为每个软件建立一个以软件名称为名的文件夹用于区分不同软件的配置文件:

  • Ubuntu/redhat系统配置文件目录:/etc/
  • 各种组件配置文件位置:Apache /etc/apache2 ; MySQL /etc/mysql ; PHP /etc/php5
  • 对于php有版本变动,其目录也随之而变化:/etc/php/7.0/

一个初级LAMP服务器集群
通过负载均衡服务器,以轮询或其他方式分发给不同apache服务器,当有数据写入数据库时,则会同步到其他负责读取的mysql服务器中

WeiyiGeek.

WeiyiGeek.

国内外著名的巨型服务器集群:

  • Google App Engine 是一种让您可以在 Google 的基础架构上运行您的网络应用程序。Google App Engine 应用程序易于构建和维护,并可根据您的访问量和数据存储需要的增长轻松扩展,上面的BAE和SAE就是以此为基础得,
    WeiyiGeek.

    WeiyiGeek.


0x01 CentOS安装LAMP案例

yum安装

安装环境:CentOS Linux release 7.6.1810 (Core) - 3.10.0-957.12.2.el7.x86_64
安装步骤:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#1.下载一个epel,可以下载第三方资源
yum install -y httpd httpd-dev
#启用httpd服服务项
systemctl start httpd.service


#2.卸载自带的mariadb
rpm -qa | grep "mariadb"
mariadb-libs-5.5.52-1.el7.x86_64
rpm -e --nodeps mariadb-libs-5.5.52-1.el7.x86_64
#安装mariadb,没有安装MYSQL
yum install mariadb mariadb-server mariadb-libs mariadb-devel
systemctl start mariadb
systemctl enable mariadb
#允许情况
netstat -tlnp
# Active Internet connections (only servers)
# Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
# tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 10215/mysqld
#数据库初始化与安全配置
mysql_secure_installation


#3.安装 PHP7.2安装 EPEL 软件包:
sudo yum install -y epel-release #安装 PHP7.2 需要使用到
sudo yum install -y http://rpms.remirepo.net/enterprise/remi-release-7.rpm #安装 remi 源:
sudo yum install -y yum-utils #安装 yum 扩展包
sudo yum-config-manager --enable remi-php73 #启用 remi-php32仓库:
sudo yum update

#4.安装 PHP7.2 安装 php-fpm (注意这里并没有安装httpd中php模块)
#现在使用下面的命令安装PHP 7的必要模块和扩展来支持httpd
sudo yum install php73-php-fpm php73-php-gd php73-php-json php73-php-mbstring php73-php-mysqlnd php73-php-xml php73-php-xmlrpc php73-php-opcache
yum --enablerepo=remi-php73 install -y php php-mysqli #机器推荐这样的方法

#安装好后会发现httpd多了两个php静态连接文件
ll /etc/httpd/modules/
总用量 12660
-rwxr-xr-x. 1 root root 5136336 5月 28 21:49 libphp7.so
-rwxr-xr-x. 1 root root 5309448 5月 28 21:49 libphp7-zts.so

#4.验证php和httpd
service httpd restart
php -v
# PHP 7.3.6 (cli) (built: May 28 2019 09:32:59) ( NTS )
# Copyright (c) 1997-2018 The PHP Group
# Zend Engine v3.3.6, Copyright (c) 1998-2018 Zend Technologies

WeiyiGeek.phpinfo

WeiyiGeek.phpinfo

编译安装

0x02 Ubuntu安装LAMP案例

安装OS环境:Ubuntu 16.04 TLS(Linux ubuntu 4.4.0-47-generic #68-Ubuntu SMP x86_64 x86_64 x86_64 GNU/Linux)
应用版本:

  • apache/2.4.18(Ubuntu)
  • php
  • mysql Ver 14.14 Distrib 5.7.19, for Linux (x86_64) using EditLine wrapper

安装步骤:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#0.一条命令完成所有应用的安装 LAMP
sudo apt-get install apache2 mysql-server php5-mysql
或者通过:
tasksel install lamp-server

#2.php5安装,在最新Ubuntu 16.04 TLS版本中默认是php7.0
sudo apt-get php5
#sudo apt-get install php7.0

#3. 检查php和apache是不是安装成功
php5 -v
apache2 -v

#4.确认apache加载php5.so模块
cat /etc/apache2/mods-enabled/php5.load #12.04 version
cat /etc/apache2/mods-enabled/php7.0.load #16.04 version

sudo apt-get install libapache2-mod-php #16.04 version
sudo apt-get install libapache2-mod-php7.0 #16.04 version
#(查看php是否被apache 加载) 显示 LoadModule php5_module /usr/lib/apache2/modules/libphp5.so 表示加载成功

#5. 启动apache和验证php模块是否正常工作
<?php
echo "test php";
?>

WeiyiGeek.测试php

WeiyiGeek.测试php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#6. 安装过程中输出 root 密码 注:此密码为mysql 数据库密码(toor)
# php通过一个mysql.so的模块进行CURD操作,为确保php和mysql正常进行数据交互
cat /etc/php5/conf.d/mysql.ini #php默认不安装mysql扩展,课程使用的是12.04版本的系统,
cat /etc/php5/mods-available/mysql.ini #14.10版
cat /etc/php/7.0/mods-available/mysqli.ini #16.10版

sudo apt-get install php5-mysql #如果没有被加载许手动安装,12.04
sudo apt-get install php7.0-mysql #如果没有被加载许手动安装,16.04

#在php中加入的mysqli扩展模块支持
/etc/php/mods-available/mysqli.ini

#7.重启 mysql apache
sudo service mysql restart
sudo service apache2 restart
WeiyiGeek.mysqli扩展

WeiyiGeek.mysqli扩展

1
2
3
4
5
6
7
8
9
10
#LAMP之PHP探针:验证php连接mysql数据库
<?php
echo mysql_connect('localhost','root','123456') ? '连接成功的信息' : '连接失败的信息’;
# php5.0 version-测试连接mysql,有时mysql_connect()函数默认端口被其他程序占用时, 可以指定其他端口;

echo new mysqli('localhost','root','toor') ? 'successful message' : 'fail message';
# php7.0 version-PHP 5 的使用者可以使用 mysql extension,mysqli 和 PDO_MYSQ,PHP 7移除了mysql extension支持

phpinfo(); //查看php版本信息
?>
WeiyiGeek.连接数据库测试

WeiyiGeek.连接数据库测试


配置与实战

描述:ubuntu的apache配置文件目录是/etc/apache2/,入口在conf.d/*,进行Include配置文件.

WeiyiGeek.apache目录介绍

WeiyiGeek.apache目录介绍

apache最核心的配置是模块和虚拟主机,mods-enabled文件夹中有软连接指向了modes-available文件,Apache会在加载配置过程中将所有软连接一次性全部加载,以方便软连接误删时再次建立软连接启动模块.

  • available表示可以使用
  • enabled表示已启用的
1
2
3
mysql核心配置文件 /etc/mysql/my.cnf
php5核心配置文件 /etc/php5/php.ini
php7核心配置文件 /etc/php/7.0/php.ini
WeiyiGeek.配置文件加载流程

WeiyiGeek.配置文件加载流程

配置1:LAMP之给PHP添加常用扩展(Extension)

1
2
3
#测试方法:重启Apache后,利用phpinfo();查看拓展是否有curl和gd库以及是否被正确加载
$sudo apt-get install php5-gd curl libcurl3 libcurl4-openssl-dev php5-curl #12.04 version
$sudo apt-get install php7.0-gd curl libcurl3 libcurl4-openssl-dev php7.0-curl #16.04 version

WeiyiGeek.gd扩展

WeiyiGeek.gd扩展


配置2:apache虚拟主机工作原理通过域名来指向访问
在同一台服务器上,可以访问不同的网站二级域名,让Apache来区分用户是通过哪个二级域名访问这台服务器的,根据不同的二级域名访问对应项目所在的目录,也就是说一台服务器上可以同时放置多个完全独立的网站或者系统,用不同的域名访问对应的系统。
配置需求:

WeiyiGeek.虚拟主机

WeiyiGeek.虚拟主机

最新版的ubuntu server Apache默认解析的网页文件是在var/www/html下,如果要修改的话需要修改/etc/apache2/sites-enabled/000-default中的DocumentRoot的值

WeiyiGeek.virtualhost

WeiyiGeek.virtualhost

Step1. 手动模拟,DNS将在host文件里面修改域名指向192.168.0.104:
客户端的Host文件:

  • Windows是在c:\windows\system64\drivers\etc\hosts
  • Linux,Mac都是在/etc/hosts,因为都是采用了unix的内核kerner.
    1
    2
    3
    4
    5
    6
    192.168.133.134 video.ubuntu.com
    192.168.133.134 bbs.ubuntu.com
    192.168.133.134 oa.ubuntu.com

    #通过终端工具操作服务器创建目录.
    [email protected]:/$ sudo mkdir -p /wwwroot/{oa,bbs,video}
WeiyiGeek.DNS模拟指向

WeiyiGeek.DNS模拟指向

Step2. 在Apache中配置虚拟主机
1、设置配置文件:$sudo cp /etc/apache2/site-aviailable000-defaule.conf video.conf (同理复制成bbs.conf、oa.conf)
2、修改配置文件:$sudo vi video.conf (同理修改bbs.conf、oa.conf)

1
2
添加:ServerName video.imooc.com
修改:DocumentRoot /wwwroot/video

3、修改Apache配置文件apache2.conf
1
2
3
4
5
6
$sudo vi /etc/apache2/apache2.conf
<Directory /wwwroot/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>

4、在/etc/apache2/sites-enabled中建立软连接:
1
$ sudo ln -s ../sites-availables/video.conf video.conf #同理建立bbs.conf和os.conf的软连接

5、重启Apache
1
$ sudo service apache2 restart

6、在浏览器中输入二级域名看是否显示对应内容
WeiyiGeek.域名访问

WeiyiGeek.域名访问


0x03 Apache安全配置

主要是对httpd进行安全配置,有效的防止网站被入侵;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#配置1.禁止上传目录脚本执行
<Directory ~ "/website/uploads">
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
php_flag engine off
</Directory>


#配置2.指定设置错误请求页面文件
#ErrorDocument 500 "The server made a boo boo."
ErrorDocument 404 /missing.html
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
#ErrorDocument 402 http://www.example.com/subscription_info.html


#配置3.设置目录访问密码
<Directory "/var/www/cgi-bin/awstats/">
AuthType Basic
AuthName "test"
AuthUserFile /tmp/passwd
Require user test
</Directory>
#生成用户密码在访问目录中使用
/etc/httpd/bin/htpasswd -c /etc/httpd/passwd test

0x03 补充知识

htpasswd 命令

描述:Apache的Web服务器内置工具,用于创建和更新储存用户名、域和用户基本认证的密码文件。
执行文件目录: /etc/httpd/bin/htpasswd
语法参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
htpasswd [选项] [参数]
#选项
-b:在命令行中一并输入用户名和密码而不是根据提示输入密码;
-c:创建一个加密文件;
-n:不更新加密文件,只将加密后的用户名密码显示在屏幕上;
-m:默认采用MD5算法对密码进行加密;
-d:采用CRYPT算法对密码进行加密;
-p:不对密码进行进行加密,即明文密码;
-s:采用SHA算法对密码进行加密;
-D:删除指定的用户。

#参数
用户:要创建或者更新密码的用户名;
密码:用户的新密码。


基础实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#1.利用htpasswd命令添加用户名weiyigeek,密码:123456并生成passwd在当前路径下,默认采用sha1加密方式。
htpasswd -bc .password weiyigeek 123456
Adding password for user weiyigeek
[[email protected] ~]# cat .password
weiyigeek:$apr1$WOXxFnda$ocLFdlzLQXyJydPQYtwLL.

#2.在原有密码文件中增加下一个用户
htpasswd -b .passwd Jack 123456

#3.不更新密码文件,只显示加密后的用户名和密码
htpasswd -nb Jack 123456
Jack:$apr1$esmjsBIu$eFfutTYZMZp9peHNAdllq0

#4.利用htpasswd命令删除用户名和密码
htpasswd -D .passwd Jack


#利用htpasswd命令修改密码,即先使用htpasswd删除命令删除指定用户,再利用htpasswd添加用户命令创建用户即可实现修改密码的功能。
htpasswd -D .passwd Jack
htpasswd -b .passwd Jack 123456