WEB项目实战_源码构建LAMP环境

项目背景

初创公司,随着业务不断增长,用户基数越来越大,为更好满足用户体验,开发人员提一个工单过来,需要运维人员给开发人员部署一套预发布环境(和生产环境保持一致),能够保证开发人员高效的进行预发布测试等工作。

WEB项目实战_源码构建LAMP环境

具体要求

  • 源码部署LAMP环境,和生产保持一致
  • 静态资源文件同步生产环境(生产发生改变立马同步到预发布平台)

涉及知识点

  • ==源码部署LAMP环境(重点)==
  • NFS文件共享(旧)
  • rsync同步静态资源(旧)
  • ==虚拟主机的配置(新)==
  • 用户认证访问控制(新)
  • ==Apache的安全认证(新)==

理论知识

一、WEB服务概述

web服务是我们日常使用最多的服务,所有的网站都是以web服务的形式为我们呈现

1. WEB服务的特点

服务的架构:

C/S:FTP SAMBA SSH (一般应用于局域网中)

B/S:apache、nginx(一般应用于互联网中)

  • web服务分为客户端和服务端

  • web客户端通常是我们所使用的浏览器(IE/Chrome/Firefox/Safari或者命令行浏览器等)

  • web服务端就是我们所访问的网站提供的web服务器

    • 常见的web服务端程序有:

    ==Apache(httpd)==/Nginx/Tengine/Lighttpd/IIS等,不同的web服务针对不同的系统平台各自有优缺点

#####2. HTTP协议

  • web服务端与客户端是通过HTTP协议(HyperText Transfer Protocol)超文本传输协议进行交互

WEB项目实战_源码构建LAMP环境

  • Apache或Nginx都==只==支持==静态页面==的解析
3. 静态页面和动态页面
  • HTML语言
    • HTML(HyperText Markup Language)超文本标记语言,是绝大多数网页使用的语言,几乎所有的网页都是以HTML作为源代码,通过浏览器解释后展现出来
    • HTML有固定语法,用来存储网页数据,定义不同元素,如文字、标题、图片等,现在的网页都用CSS语言来存储网页的表现形式
    • 现代主流的网页设计架构:
      ? 内容存储:HTML
      ? 网页架构:div
      ? 网页样式:css
    • HTML形式的页面我们称之为静态页面,包含一些图片、文本、表格等
  • 动态语言
    • 网站使用特定的语言编写的一些程序,在用户访问的时候==基于不同的条件生成==不同的HTML代码返回给用户浏览器,这样就实现网页的动态化。
    • 常见的动态语言: .php .jsp .cgi .asp、python等
4. WEB服务的中间件
  • php: ==PHP-FPM==
  • jsp: ==Tomcat==、JBOSS、Resin、IBM WebSphere
5.常见的WEB组合方式
  • ==LAMP (Linux + Apache + MySQL + PHP)== php作为Apache的模块
  • LNMP (Linux + Nginx + MySQL + PHP) php-fpm进程(服务)
  • Nginx /Apache+ Tomcat

二、Apache的介绍

Apache(httpd)是著名的web服务器软件,开源,由apache软件基金会负责管理开发。

WEB项目实战_源码构建LAMP环境

1. Apache服务特点
  • 开放源码
  • 跨平台
  • 支持多种编程语言
  • 采用模块化设计
  • 安全稳定
2. Apache的工作原理

WEB项目实战_源码构建LAMP环境

  1. Apache只能够解析静态页面
  2. 如果需要访问动态页面,==Apache调用libphp5.so模块==帮助解析,然后Apache将解析的结果返回用户
3. Apache的官网和手册
  • www.apache.org

  • 英文手册:需要安装

    httpd-manual.noarch           //安装后启动服务就可以本地查看
    yum -y install httpd-manual.noarch    
    service httpd restart
    查看官方手册:
    IE:http://10.1.1.1/manual
    
  • 中文手册参考:http://www.jinbuguo.com/apache/menu22/index.html
4. Apache的软件包
  • 软件包: httpd-2.2 httpd-2.4
5. Apache相关文件介绍
服务端口:
80/tcp(http)    443/tcp http+ssl(   https)
配置文件:
/etc/httpd/conf                         主配置文件目录  
/etc/httpd/conf.d/*.conf                子配置文件目录
/etc/httpd/conf.d/README                说明书
/etc/httpd/conf.d/welcome.conf      当没有首页index.html 显示红帽欢迎页面
/etc/httpd/conf/httpd.conf              主配置文件
/etc/httpd/logs                         日志目录 /var/log/httpd/硬链接
/etc/httpd/modules                      库文件 /usr/lib64/httpd/modules硬链接
/etc/httpd/run                          pid信息
/etc/logrotate.d/httpd                  日志轮循
/etc/rc.d/init.d/httpd                  启动脚本
/etc/sysconfig/httpd                    额外配置文件
/usr/lib64/httpd               
/usr/lib64/httpd/modules                库文件
/usr/lib64/httpd/modules/mod_actions.so
/usr/sbin/apachectl                     apache官方启动脚本
/usr/sbin/httpd
/var/www                                apache数据目录
/var/www/cgi-bin                        存放apache的cgi脚本程序的数据目录
/var/www/html                           存放apache的html数据目录
/var/www/error                 
/var/www/error/HTTP_NOT_FOUND.html.var    404
/var/www/error/HTTP_FORBIDDEN.html.var    403
6. Apache主配置文件
ServerRoot "/etc/httpd"                             服务主目录
Listen 80                                               监听端口
IncludeOptional conf.d/*.conf                       包含conf.d下的*.conf文件
User apache                                             运行Apache的用户
Group apache                                            运行Apache的用户组
DirectoryIndex index.html index.php             设置默认主页
DocumentRoot               /var/www/html/       站点默认数据主目录

<Directory />                                           系统的根目录授权
    Options FollowSymLinks                          支持软链接
    AllowOverride None
   //不支持.htaccess访问列表 .htaccess文件提供了针对每个目录改变配置的方法
</Directory>

RHEL6(httpd-2.2):
<Directory "/var/www/html">                 授权
    Options Indexes FollowSymLinks          支持索引,支持软链接
    AllowOverride None                          不支持 .htaccess 访问列表
    Order allow,deny                            排序,先允许再拒绝
    Allow from all                          允许所有人
</Directory>

REHL7(httpd-2.4):
<Directory "/var/www/html">
     AllowOverride None
     Require all granted                        允许所有人访问
</Directory>

###实战演练

基本功操作

需求1:

访问一个静态页面,内容:hello world 新年快乐!

环境:
web-server:10.1.1.1
client:10.1.1.2
思路:
1. 搭建web服务
1)安装httpd软件
2)启动服务

2.创建首页文件
[root@server ~]# echo "hello world 新年快乐!" > /var/www/html/index.html

引申:修改默认的静态资源数据根目录
1. 修改配置文件
# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/webserver"
<Directory "/webserver">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

2. 创建数据目录及首页文件
[root@server conf]# mkdir /webserver
[root@server conf]# echo "this is webserver test page" > /webserver/index.html

3. 重启web服务
# service httpd restart
4. 客户端测试验证
[root@client ~]# elinks http://10.1.1.1

扩展:Apache作为文件共享服务使用
注意:默认情况下,apache回到默认的数据目录里找index.html的首页文件,如果首页文件不存在就会找测试页,如果测试页不存在,那么就会将目录里的文件共享出去
需求:访问http://10.1.1.1来查看共享文件
1)在默认的数据目录里创建数据文件
2)将测试页删掉或者重命名
[root@server conf.d]# mv welcome.conf welcome.conf.abc
[root@server conf.d]# service httpd restart
需求2:

搭建2个静态页面网站,内容分别为:

this is first test page!

this is second test page!

环境:一台服务 ——>搭建两个网站
http://10.1.1.1/web1
http://10.1.1.1/web2

方法1:(不推荐)
步骤:
[root@web-server ~]# mkdir /www/web{1..2}
[root@web-server ~]# echo "this is first test page!" > /www/web1/index.html
[root@web-server ~]# echo "this is 2 test page!" > /www/web2/index.html
测试验证:
http://10.1.1.1/web1
http://10.1.1.1/web2

方法2:通过虚拟主机的方式实现(推荐)
基于IP的虚拟主机
基于端口的虚拟主机
基于域名的虚拟主机

http://10.1.1.1         web1
http://192.168.0.1      web2

80      web1
8080    web2

http://10.1.1.1:80      web1
http://10.1.1.1:8080        web2
1. 基于IP虚拟主机
需求:
http://10.1.1.1         this is 10.1.1.1 test page
http://192.168.0.1      this is 192.168.0.1 test page
环境准备:
eth0        10.1.1.1
eth0:1  192.168.0.1

[root@server ~]# ifconfig eth0:1 192.168.0.1/24         临时增加子接口
[root@server ~]# cd /etc/sysconfig/network-scripts/
[root@server network-scripts]# cp ifcfg-eth0 ifcfg-eth0:1   永久配置
[root@server network-scripts]# cat ifcfg-eth0:1
DEVICE=eth0:1
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=none
IPADDR=192.168.0.1
NETMASK=255.255.255.0

重启网卡:
# service network restart

在配置文件的最后面有虚拟主机的模板:
#<VirtualHost *:80>
#    ServerAdmin webmaster@dummy-host.example.com
#    DocumentRoot /www/docs/dummy-host.example.com
#    ServerName dummy-host.example.com
#    ErrorLog logs/dummy-host.example.com-error_log
#    CustomLog logs/dummy-host.example.com-access_log common
#</VirtualHost>

发布虚拟主机:
1. 创建不同网站的数据目录以及首页文件
# mkdir /www/web{1,2} -p
# echo "this is 10.1.1.1 test page" > /www/web1/index.html
# echo "this is 192.168.0.1 test page" > /www/web2/index.html

2.发布网站
在配置文件/etc/httpd/conf/httpd.conf追加如下内容:
<VirtualHost 10.1.1.1:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /www/web1                      web1网站的数据根目录
    #ServerName dummy-host.example.com
    ErrorLog logs/10.1.1.1-error_log
    CustomLog logs/10.1.1.1-access_log common
</VirtualHost>
<VirtualHost 192.168.0.1:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /www/web2                      web1网站的数据根目录
    #ServerName dummy-host.example.com
    ErrorLog logs/192-error_log
    CustomLog logs/192-access_log common
</VirtualHost>

3. 启动服务
</VirtualHost>
[root@server conf]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd: httpd: apr_sockaddr_info_get() failed for server.heima.cc
httpd: Could not reliably determine the server‘s fully qualified domain name, using 127.0.0.1 for ServerName
[Thu Jan 03 03:21:26 2019] [error] (EAI 3)Temporary failure in name resolution: Failed to resolve server name for 192.168.0.1 (check DNS) -- or specify an explicit ServerName
[Thu Jan 03 03:21:26 2019] [error] (EAI 3)Temporary failure in name resolution: Failed to resolve server name for 10.1.1.1 (check DNS) -- or specify an explicit ServerName
                                                           [  OK  ]
以上报错原因:IP地址无法解析
解决:修改hosts文件
[root@server conf]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.1.1.1     server.heima.cc    server
192.168.0.1     server.heima.cc  server

4. 测试验证
1)保证客户端和服务的的网络畅通
[root@client ~]#ping 10.1.1.1
[root@client ~]#ping 192.168.0.1

[root@client ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.1.1.0        0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
0.0.0.0         10.1.1.254      0.0.0.0         UG    0      0        0 eth0
[root@client ~]# route add -net 192.168.0.0/24 dev eth0
[root@client ~]# ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=18.8 ms

2)测试验证
[root@client ~]# elinks http://10.1.1.1
[root@client ~]# elinks http://192.168.0.1
2. 基于端口虚拟主机
1)需要2个端口
Listen 80
Listen 8080
2)创建两个网站的数据目录和首页文件
3)发布网站
在配置文件/etc/httpd/conf/httpd.conf追加如下内容:
Listen 80
Listen 8080
<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /www/web1                      web1网站的数据根目录
    #ServerName dummy-host.example.com
    ErrorLog logs/10.1.1.1-error_log
    CustomLog logs/10.1.1.1-access_log common
</VirtualHost>
<VirtualHost *:8080>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /www/web2                      web1网站的数据根目录
    #ServerName dummy-host.example.com
    ErrorLog logs/192-error_log
    CustomLog logs/192-access_log common
</VirtualHost>

4)重启服务
# netstat -nltp|grep httpd      80  8080
3. 基于域名虚拟主机(重点)
需求:
http://www.heima.cc             this is www.heima.cc test page
http://bbs.momowu.cn                this is bbs.momowu.cn
环境:
web-server:10.1.1.1     提供2个网站
dns-server:10.1.1.3     域名解析
client:10.1.1.2         用于测试
步骤:
0.搭建DNS服务(多域管理) 10.1.1.3
1)以下配置文件参考
[root@dns-server named]# tail -10 /etc/named.rfc1912.zones 
zone "heima.cc" IN {
        type master;
        file "heima.cc.zone";
        allow-update { none; };
};
zone "momowu.cn" IN {
        type master;
        file "momowu.cn.zone";
        allow-update { none; };
};
[root@dns-server named]# cat /var/named/heima.cc.zone 
$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      dns.heima.cc.
dns     A       10.1.1.3
www     A       10.1.1.1
[root@dns-server named]# cat /var/named/momowu.cn.zone 
$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      dns.momowu.cn.
dns     A       10.1.1.3
bbs     A       10.1.1.1

2)启动服务
[root@dns-server named]# service named start
Generating /etc/rndc.key:                                  [  OK  ]
Starting named:                                            [  OK  ]
[root@dns-server named]# netstat -nlutp|grep named

3)客户端测试验证
[root@client ~]# echo nameserver 10.1.1.3 > /etc/resolv.conf 
[root@client ~]# nslookup www.heima.cc
Server:         10.1.1.3
Address:        10.1.1.3#53

Name:   www.heima.cc
Address: 10.1.1.1

[root@client ~]# nslookup bbs.momowu.cn
Server:         10.1.1.3
Address:        10.1.1.3#53

Name:   bbs.momowu.cn
Address: 10.1.1.1

1.在web-server上创建两个网站的数据目录和首页文件
mkdir /www/web{1,2}
echo "this is www.heima.cc test page" > /www/web1/index.html
echo "this is bbs.momowu.cn test page" > /www/web2/index.html
2.发布两个网站(配置2个虚拟主机)
[root@web-server ~]# cd /etc/httpd/conf
[root@web-server conf]# vim httpd.conf
NameVirtualHost *:80
<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /www/web1              网站目录
    ServerName www.heima.cc         域名
    ErrorLog logs/heima.cc-error_log
    CustomLog logs/heima.cc-access_log common
</VirtualHost>
<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /www/web2
    ServerName bbs.momowu.cn
    ErrorLog logs/bbs-error_log
    CustomLog logs/bbs-access_log common
</VirtualHost>

3.重启服务
[root@web-server conf]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]

4.客户端测试验证
1)指定DNS服务器
[root@client ~]# echo nameserver 10.1.1.3 > /etc/resolv.conf
2)测试验证
[root@client ~]# elinks http://bbs.momowu.cn
[root@client ~]# elinks http://www.heima.cc
需求3:

对于第一个静态网站,需要特定的用户和密码才能访问,并且拒绝10.1.1.0/24网段访问除了10.1.1.254

核心思路:对指定的网站数据目录做访问控制
<Directory  /var/www/html>
....
</Directory>

1. 创建密码文件并将用户加入其中
[root@web-server conf]# htpasswd -cm /etc/httpd/conf/.pass user01
New password: 
Re-type new password: 
Adding password for user user01
[root@web-server conf]# cat .pass 
user01:$apr1$r5TsZKph$kxdIssOcWyR39jMW0bnbW.
[root@web-server conf]# htpasswd -bm /etc/httpd/conf/.pass user02 123
Adding password for user user02
[root@web-server conf]# cat .pass 
user01:$apr1$r5TsZKph$kxdIssOcWyR39jMW0bnbW.
user02:$apr1$zzoCZcb.$zTaH7vfvP1QnfCPcVP0Xb.

2.修改配置文件开启认证的功能
<Directory "/www/web1">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
    AuthType Basic
    AuthName "Input your name and password:"
    AuthBasicProvider file
    AuthUserFile /etc/httpd/conf/.pass
    Require user user01
</Directory>

3. 启动服务测试验证
[root@web-server conf]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd: [Thu Sep 06 16:37:27 2018] [warn] _default_ VirtualHost overlap on port 80, the first has precedence
                                                          [  OK  ]
解决:开启如下开关                                                        
NameVirtualHost *:80

如何允许多个人来访问?
方法1:将用户加入到组中,然后再允许组访问
1. 创建组文件
[root@web-server conf]# vim /etc/httpd/conf/groups
admin:user01 stu1 stu2

2. 修改配置文件
<Directory "/www/web1">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
AuthType Basic                                      //启用认证
AuthName "Input your name and password:"        //输入提示信息
AuthBasicProvider file
AuthUserFile /etc/httpd/conf/.pass          //指定密码文件
AuthGroupFile /etc/httpd/conf/groups        //指定组文件
Require group admin                             //允许admin的人来访问
</Directory>

注意:
属于admin组的成员必须在密码文件中存在。

方法2:允许密码文件里的所有用户访问
<Directory "/www/web1">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
AuthType Basic
AuthName "Input your name and password:"
AuthBasicProvider file
AuthUserFile /etc/httpd/conf/.pass
#AuthGroupFile /etc/httpd/conf/groups
#Require group admin
#Require user user02
Require valid-user      //允许多个用户
Order deny,allow
Deny from 10.1.1.0/24
Allow from 10.1.1.254
</Directory>

网络访问控制:

RHEL6:http 2.2

Order allow,deny  如果allow和deny冲突,deny为准
Order deny,allow  如果allow和deny冲突,allow为准

1、禁止部分ip不能访问网站
Order allow,deny
Allow from  all
Deny from  192.168.0.254 172.16.2.10

2、针对某个网段
Order allow,deny
Allow from  all
Deny from  192.168.0.0/255.255.255.0

3、针对域名
Order allow,deny
Allow from  all
Deny from  node1.itcast.cc .example.com

4、拒绝大部分,只允许某个ip
Order deny,allow
Deny from  all
Allow from 192.168.0.254

需求3:只拒绝10.1.1.2主机访问我的网站

Order allow,deny
Allow from  all
Deny from  10.1.1.2

引申扩展:
RHEL7:http 2.4+
案例1:允许所有主机访问
<Directory "/var/www/html">
     AllowOverride None
     Require all granted
</Directory>

AllowOverride All        允许子目中的 .htaccess 中的设置覆盖当前设置
AllowOverride None       不允许子目中的 .htaccess 中的设置覆盖当前设置

案例2:只允许网段192.168.0.0/24和192.168.10.254/24访问
<Directory "/var/www/html">
     AllowOverride None
     Require ip 192.168.0.0/24
     Require ip 192.168.10.254
</Directory>

案例3:只拒绝某些主机访问
<Directory "/var/www/html">
        AllowOverride None
        <RequireAll>
                Require not ip 10.1.1.254
                Require all granted
        </RequireAll>
</Directory>
总结:
  1. Apache(httpd)的工作原理

    • 只解析静态页面
    • php的动态页面解析需要调用php的模块
  2. 一台web服务器搭建多个网站如何实现?

    ==虚拟主机技术==

    • 基于IP虚拟主机
    • 基于端口虚拟主机
    • 基于域名虚拟主机(重点)
  3. 网站做访问控制

    • 对象访问控制(用户名密码认证)
    • 网络访问控制(允许或拒绝某个主机某个IP等)
    • httpd-2.2和httpd-2.4版本区别(知道)

项目实战

一、环境准备
1. 需要准备的软件包
apr-1.5.2.tar.bz2
apr-util-1.5.4.tar.bz2
httpd-2.4.12.tar.bz2
php-5.6.23.tar.xz
mysql-5.6.31.tar.gz
wordpress-4.7.3-zh_CN.tar.gz
2. 安装前环境准备

说明:

  • 如果你在一台机器启动两个 apache 和 mysql ,那么很可能造成一定的冲突,所以为了减少不必要的麻烦,首先停止卸载它们。
  • 由于整个环境会涉及比较多的依赖关系包,所以我们先将一些依赖包装上。(根据不同的环境可能不仅限于这些包)
1)清空环境
[root@web soft]# netstat -nltp|grep 80
tcp        0      0 :::80                       :::*                        LISTEN      1651/httpd          
[root@web soft]# service httpd stop
Stopping httpd:                                            [  OK  ]
2)关闭防火墙和selinux
[root@web soft]# service iptables stop
[root@web soft]# getenforce 
Disabled
[root@web soft]# cd
3)临时更改主机名并且绑定到hosts文件中
[root@web ~]# hostname lamp.itcast.cc
[root@web ~]# vim /etc/hosts
根据自己的环境将IP地址和主机名绑定到hosts文件中
10.1.1.1   lamp.itcast.cc  lamp

4)安装相应的软件包
# yum groupinstall "Development tools" -y
# yum groupinstall "Desktop Platform Development" -y 
桌面开发工具包(图形化相关包)
# yum install cmake pcre-devel ncurses-devel openssl-devel libcurl-devel -y

准备相应的软件:将所需要的软件包放到虚拟机里,我放到了/soft目录里
3. 编译方式
Linux+Apache(2.4)+Mysql(5.6.31)+Php(5.6.23)

Apache——>MySQL——>PHP 或者  MySQL——>Apache——>PHP

说明:

  1. apache必须要先于php安装。
  2. apache和mysql之间并没有直接先后顺序的依赖,所以谁先谁后没所谓。
  3. 在php-5.3版本前,mysql必须先于php的编译;因为php需要实现连接数据库的功能,它通过mysql的接口才能编译出该功能;
  4. 在php-5.3版本或者之后,php已经集成了一套连接mysql数据的代码,并不依赖mysql的接口,这个时候,mysql和php的编译顺序也就无所谓了。
二、编译安装MySQL
版本:mysql-5.6.31.tar.gz
需求:
1. 安装目录         /usr/local/mysql
2. 数据目录         /usr/local/mysql/data
3. 端口                 默认3306
4. socket文件       /usr/local/mysql/mysql.sock

安装:
1. 官方网站下载相应的软件包
mysql-5.6.31.tar.gz
2. 解压软件包
[root@lamp soft]# tar xf mysql-5.6.31.tar.gz
3. 安装
0) 创建相应的用户
[root@lamp mysql-5.6.31]# useradd -r -s /sbin/nologin mysql
-r:创建系统用户
-s:指定默认的shell(非交互式)
说明:如果有mysql用户,可以省略。
[root@lamp mysql-5.6.31]# id mysql
uid=498(mysql) gid=498(mysql) groups=498(mysql)

1) 配置
根据需求配置:
[root@lamp soft]# cd mysql-5.6.31
[root@lamp mysql-5.6.31]# vim cmake.sh
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql/ -DMYSQL_DATADIR=/usr/local/mysql/data -DENABLED_LOCAL_INFILE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DSYSCONFDIR=/usr/local/mysql/etc -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock -DMYSQL_TCP_PORT=3306 -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DMYSQL_USER=mysql

[root@lamp mysql-5.6.31]#  chmod +x cmake.sh
[root@lamp mysql-5.6.31]#  ./cmake.sh
编译:
根据上一步产生的Makefile进行编译——>mysqld(当前操作系统平台)
make

安装:
make install

参数说明:
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql/ \          安装路径
-DMYSQL_DATADIR=/usr/local/mysql/data \             数据目录
-DENABLED_LOCAL_INFILE=1 \                                  开启加载外部文件功能;1开启,0关闭
-DWITH_INNOBASE_STORAGE_ENGINE=1 \                      将InnoDB存储引擎静态编译到服务器
-DSYSCONFDIR=/usr/local/mysql/etc \                     配置文件路径
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \      socket文件路径
-DMYSQL_TCP_PORT=3306 \                                     端口
-DDEFAULT_CHARSET=utf8 \                                    字符集
-DDEFAULT_COLLATION=utf8_general_ci \                   字符校验规则
-DWITH_EXTRA_CHARSETS=all \                             扩展字符集
-DMYSQL_USER=mysql                                          用户身份mysql

后续配置:

注意:安装完毕后一定要进入到安装目录里进行如下操作

1. 更改目录权限让mysql用户可读写
# chown -R mysql.mysql /usr/local/mysql/

2. 初始化数据库
1)清空环境
# rm -f /etc/my.cnf
说明:如果/etc/my.cnf不存在可以省略此步
# ps -ef|grep mysqld   确保当前没有其他mysql程序运行,如果有请kill掉。
# pkill -9 mysqld
2)初始化数据库
# cd /usr/local/mysql/
[root@lamp mysql]# ./scripts/mysql_install_db --user=mysql

说明:看到2个ok说明初始化完毕
3)验证数据目录里是否有文件
[root@lamp mysql]# ll data/
total 110604
-rw-rw---- 1 mysql mysql 12582912 Nov 14 11:28 ibdata1
-rw-rw---- 1 mysql mysql 50331648 Nov 14 11:28 ib_logfile0
-rw-rw---- 1 mysql mysql 50331648 Nov 14 11:28 ib_logfile1
drwx------ 2 mysql mysql     4096 Nov 14 11:28 mysql
drwx------ 2 mysql mysql     4096 Nov 14 11:28 performance_schema
drwxr-xr-x 2 mysql mysql     4096 Nov 14 11:21 test

3. 拷贝mysql启动脚本到/etc/init.d/目录
[root@lamp mysql]# pwd
/usr/local/mysql
[root@lamp mysql]# ls
bin  COPYING  data  docs  include  lib  man  my.cnf  mysql-test  README  scripts  share  sql-bench  support-files
[root@lamp mysql]# cp support-files/mysql.server /etc/init.d/mysql

4. 启动mysql数据库
1)启动前确认3306端口没有被占用
[root@lamp data]# netstat -nltp|grep 3306
说明:如果3306端口被占用,请kill掉之前的mysqld程序,如果没有被占用,此步省略。
# pkill -9 mysqld
2)启动mysql数据库
[root@lamp mysql]# service mysql start
Starting MySQL.. SUCCESS!

5. 设置数据库管理员root用户密码
[root@lamp mysql]# /usr/local/mysql/bin/mysqladmin -u root password ‘123‘
Warning: Using a password on the command line interface can be insecure.

6. 测试登录
[root@lamp mysql]# mysql -p123
-bash: mysql: command not found

原因:环境变量没有设置
解决:
[root@lamp mysql]# export PATH=/usr/local/mysql/bin/:$PATH
[root@lamp mysql]# echo $PATH
/usr/local/mysql/bin/:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
永久解决:
[root@lamp mysql]# vim /etc/profile
在文件最后追加以下内容:
export PATH=/usr/local/mysql/bin/:$PATH
[root@lamp mysql]# source /etc/profile      立即生效
或者退出去重新登录生效

错误:
[root@lamp mysql]# mysql -p123
Warning: Using a password on the command line interface can be insecure.
ERROR 2002 (HY000): Can‘t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock‘ (111)
原因:/etc/my.cnf文件没有删
解决:删除/etc/my.cnf

[root@lamp mysql]# mysql -p123
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.31 Source distribution

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.

mysql> 
三、编译安装Apache

######1. 编译安装依赖包apr

安装apr软件:

# tar xf apr-1.5.2.tar.bz2
# cd apr-1.5.2
# ./configure
# make
# make install
安装apr-util软件:
# tar xf apr-util-1.5.4.tar.bz2
# cd apr-util-1.5.4/
# ./configure --with-apr=/usr/local/apr/bin/apr-1-config    指定软件apr的路径
# make
# make install

思考:

==一个软件的库文件是有可能被其它软件所调用,那么其它软件能否找到你的库文件呢?==

  • 一般来说,库文件安装到/lib,/lib64,/usr/lib/,/usr/lib64等,都可以找得到; 但是如果一个软件A把库文件安装到/usr/local/A/lib下,就要把这个路径加入到ldconfig命令可以找到的路径列表里面去,别人才能找到。
  • ldconfig是一个动态链接库管理命令;主要用途是在默认搜索目录(/lib,/lib64,/usr/lib/,/usr/lib64)以及动态库配置文件/etc/ld.so.conf中所列的目录中搜索出可共享的动态链接库。

问题:怎样将库文件的指定安装路径加入到ldconfig命令的搜索列表里?

方法1:在/etc/ld.so.conf这个主配置文件里加上一行,写上让别人要查找库文件的路径
echo "/usr/local/apr/lib/" >> /etc/ld.so.conf
方法2:在/etc/ld.so.conf.d/目录下创建一个*.conf结尾的文件,里面加入该路径即可 

# echo /usr/local/apr/lib/ > /etc/ld.so.conf.d/lamp.conf
# ldconfig      上面加入路径后,就使用此命令让其生效
2. 编译安装httpd
版本:httpd-2.4.12.tar.bz2
1.下载
2.解压
[root@lamp soft]# tar xf httpd-2.4.12.tar.bz2
3.安装(解压目录)
进入到解压目录里进行安装:
[root@lamp soft]# cd httpd-2.4.12

配置:

[root@lamp httpd-2.4.12]# vim apache.sh
./configure --enable-modules=all --enable-mods-shared=all --enable-so --enable-rewrite --with-pcre --enable-ssl --with-mpm=prefork --with-apr=/usr/local/apr/bin/apr-1-config --with-apr-util=/usr/local/apr/bin/apu-1-config

[root@lamp httpd-2.4.12]# chmod +x apache.sh  
[root@lamp httpd-2.4.12]# ./apache.sh
说明:如果之前相关的软件包都已安装,基本不会有问题。

配置错误:
[root@lamp httpd-2.4.12]# ./apache.sh
checking how to run the C preprocessor... gcc -E
checking for gcc option to accept ISO C99... -std=gnu99
checking for pcre-config... false
configure: error: pcre-config for libpcre not found. PCRE is required and available from http://pcre.org/
原因:缺少软件包  pcre相关
解决:
[root@lamp httpd-2.4.12]# yum -y install pcre-devel
安装好依赖包后,继续配置,没有error说明配置完成

[root@lamp httpd-2.4.12]# ./apache.sh
...

checking for OpenSSL... checking for user-provided OpenSSL base directory... none
checking for OpenSSL version >= 0.9.8a... FAILED
configure: WARNING: OpenSSL version is too old
no
checking whether to enable mod_ssl... configure: error: mod_ssl has been requested but can not be built due to prerequisite failures
解决:
yum -y install openssl-devel

编译:
make

安装:
make install

确认是否成功安装apache:
[root@lamp httpd-2.4.12]# ls /usr/local/apache2/    
bin  build  cgi-bin  conf  error  htdocs  icons  include  logs  man  manual  modules
注意:
确认这个目录产生后,说明apache编译安装成功

配置参数说明:
# ./configure 
--enable-modules=all             加载所有支持模块
--enable-mods-shared=all         共享方式加载大部分常用的模块
--enable-so                       启动动态模块加载功能
--enable-rewrite                启用url地址重写功能
--enable-ssl                        编译ssl模块,支持https
--with-pcre                         支持正则表达式
--with-mpm=prefork     插入式并行处理模块,称为多路处理模块,Prefork?是类UNIX平台上默认的MPM
(1)prefork
    多进程模型,每个进程响应一个请求
(2)worker
    多进程多线程模型,每个线程处理一个用户请求 
(3)event(最优)
    事件驱动模型,多进程模型,每个进程响应多个请求
--with-apr=/usr/local/apr/bin/apr-1-config  指定依赖软件apr路径
--with-apr-util=/usr/local/apr/bin/apu-1-config 
四、编译安装php
版本:php-5.6.23.tar.xz
1. 下载软件
2. 解压
[root@lamp soft]# tar xf php-5.6.23.tar.xz
3. 进入到解压的目录里
[root@lamp soft]# cd php-5.6.23
1) 配置
[root@lamp php-5.6.23]# vim php.sh
./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql=/usr/local/mysql/ --with-mysqli=/usr/local/mysql/bin/mysql_config --with-pdo-mysql=/usr/local/mysql --with-zlib --with-zlib-dir=/usr/local/mysql/zlib --with-curl --enable-zip --with-gd --with-freetype-dir --with-jpeg-dir --with-png-dir --enable-sockets --with-xmlrpc --enable-soap --enable-opcache --enable-mbstring --enable-mbregex --enable-pcntl --enable-shmop --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-calendar --enable-bcmath

配置错误:
checking for cURL support... yes
checking for cURL in default path... not found
configure: error: Please reinstall the libcurl distribution -
    easy.h should be in <curl-dir>/include/curl/
解决:
yum -y install libcurl-devel

2)编译
make            //make成功后,会显示让你make test,不用做
3)安装
make install

确认php成功安装:
[root@lamp php-5.6.23]# ls /usr/local/apache2/modules/libphp5.so    
注意:确认有这个libphp5.so模块文件,就表示编译php成功

php编译相关参数介绍:

--with-apxs2=/usr/local/apache2/bin/apxs    //指定apxs路径
apxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,with-apxs2构建apache2.0版本的处理模块
--with-config-file-path 和 --with-config-file-scan-dir   //在指定 php 配置文件的路径
--with-mysql 和 --with-mysqli                //在指定你的 mysql 的位置和它的相关工具
--with-iconv-dir
--with-freetype-dir
--with-jpeg-dir
--with-png-dir
--with-gd
--with-zlib
--with-libxml-dir                   //这些都是在启用对某种文件的支持
--with-curl 和 --with-curlwrappers
用于支持 curl 函数,此函数允许你用不同的协议连接和沟通不同的服务器
--with-openssl,--with-mhash,--with-mcrypt
这都是和加密有关的参数,启用它们是为了让php可以更好的支持各种加密。
--enable-bcmath                         //高精度数学运算组件。
--enable-shmop和 --enable-sysvsem        //使得你的PHP系统可以处理相关的IPC函数.
IPC是一个Unix标准通讯机制,它提供了使得在同一台主机不同进程之间可以互相通讯的方法。
--enable-inline-optimization        //栈堆指针和优化线程。
--enable-pcntl                      //多线程优化。

with-apxs2      调用apache加载模块支持PHP
gd              画图库
libiconv        字符变换转换
libmcrypt       字符加密
mcrypt          字符加密
mhash           哈希运算
五、后续配置
1. 配置apache和php联系
1. 修改apache主配置文件
# vim /usr/local/apache2/conf/httpd.conf

//配置语言支持
LoadModule negotiation_module modules/mod_negotiation.so    此模块打开注释
Include conf/extra/httpd-languages.conf         打开此选项,扩展配置文件就生效了
...

//对虚拟主机的支持,后续再打开
#Include conf/extra/httpd-vhosts.conf

//加载php模块解析php页面,添加两行,告诉httpd把.php文件交给模块去编译
LoadModule php5_module    modules/libphp5.so    找到这一句,在这句下面加上两句
//添加以下两行意思是以.php结尾的文件都认为是php程序文件,注意两句话的.php前面都是有一个空格的
AddHandler php5-script   .php       
AddType text/html  .php

//默认主页加上index.php,并放在index.html前,支持php的首页文件
<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>

注意:默认的网站目录是:/usr/local/apache2/htdocs/
2. 修改apache的子配置文件,优先支持中文
# vim /usr/local/apache2/conf/extra/httpd-languages.conf
DefaultLanguage zh-CN       打开注释,默认语言集改为中文
LanguagePriority zh-CN en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv tr zh-TW     语言集优先集,把zh-CN 写到前面
2. php支持连接本地数据库

说明:

本地数据库一般是通过socket文件连接,而本地数据库的socket文件如果不在默认路径,就必须告诉php从哪里读取socket文件。

# cp /soft/lamp/php-5.6.23/php.ini-production /usr/local/lib/php.ini
vim /usr/local/lib/php.ini
.....
[MySQL]
mysql.default_port = 3306       改成对应的mysql的端口
mysql.default_socket = /usr/local/mysql/mysql.sock      对应的socket文件地址
mysql.default_host = localhost

[MySQLi]
mysqli.default_port = 3306
mysqli.default_socket = /usr/local/mysql/mysql.sock
mysqli.default_host = localhost
3. 测试是否支持php
# cd  /usr/local/apache2/htdocs
# rm -f index.html
# vim index.php
<?php
        phpinfo();
?>
4. 启动apache
为了方便启动,做成脚本启动脚本:
# cp /usr/local/apache2/bin/apachectl /etc/init.d/apache
# netstat -nltp|grep 80     确保没有80端口监听
# lsof -i :80
# service apache start

可能遇到的错误:
# /usr/local/apache2/bin/apachectl start
(98)Address already in use: make_sock: could not bind to address [::]:80
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs

注意:
上面的报错表示80被占用,可以去先停掉rpm版(或者改端口)httpd再启动
5. 测试环境

浏览器里输入:http://10.1.1.1 //看到php的测试页表示ok

到此,lamp的编译安装和基本配置完毕,下面就可以根据需求部署web应用了.

六、部署web应用
  • 通过虚拟主机将web应用发布出去
1. 创建相应的数据目录来保存网站文件
[root@lamp ~]# mkdir /www/myblog -p

2. 拷贝网站文件到指定目录
[root@lamp soft]# tar -xf wordpress-4.7.3-zh_CN.tar.gz
[root@lamp soft]# cp -a wordpress/* /www/myblog/

3. 更改数据文件权限
[root@lamp soft]# chown -R daemon.daemon /www/myblog/

4. 配置虚拟主(网站上线发布)
1) 主配置文件打开加载虚拟主机配置
[root@lamp ~]# cd /usr/local/apache2/conf/
[root@lamp conf]# vim httpd.conf        
# Virtual hosts
Include conf/extra/httpd-vhosts.conf        //打开加载虚拟主机配置文件

2) 子配置文件目录里修改虚拟主机配置文件
[root@lamp extra]# pwd
/usr/local/apache2/conf/extra
[root@lamp extra]# vim httpd-vhosts.conf
注释掉默认的虚拟主机配置,增加如下内容:
<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host2.example.com
    DocumentRoot "/www/myblog"
    ServerName bbs.momowu.cc
    ErrorLog "logs/bbs-error_log"
    CustomLog "logs/bbs-access_log" common
</VirtualHost>

5. 网站连接后台数据库配置
1)在mysql数据库里创建myblog库
[root@lamp myblog]# mysql -p123
。。。
mysql> create database myblog default charset utf8; //创建myblog库来存放wordpress的数据
Query OK, 1 row affected (0.46 sec)

2)指定网站连接数据库的用户名密码
[root@lamp soft]# cd /www/myblog/
[root@lamp myblog]# cp wp-config-sample.php wp-config.php 
[root@lamp myblog]# vim wp-config.php 
...
// ** MySQL 设置 - 具体信息来自您正在使用的主机 ** //
/** WordPress数据库的名称 */
define(‘DB_NAME‘, ‘myblog‘);

/** MySQL数据库用户名 */
define(‘DB_USER‘, ‘root‘);

/** MySQL数据库密码 */
define(‘DB_PASSWORD‘, ‘123‘);

/** MySQL主机 */
define(‘DB_HOST‘, ‘127.0.0.1‘);

/** 创建数据表时默认的文字编码 */
define(‘DB_CHARSET‘, ‘utf8‘);

/** 数据库整理类型。如不确定请勿更改 */
define(‘DB_COLLATE‘, ‘‘);
...

补充:phpMyadmin网站相关配置文件
mysql的web管理网站phpMyAdmin相关文件
# cp config.sample.inc.php config.inc.php
# vim config.inc.php
....
/* Authentication type */
$cfg[‘Servers‘][$i][‘auth_type‘] = ‘cookie‘;
/* Server parameters */
$cfg[‘Servers‘][$i][‘host‘] = ‘127.0.0.1‘;  ————>将localhost改为127.0.0.1
$cfg[‘Servers‘][$i][‘connect_type‘] = ‘tcp‘;
$cfg[‘Servers‘][$i][‘compress‘] = false;
$cfg[‘Servers‘][$i][‘AllowNoPassword‘] = false;
....

问题:在重启apache的时候报如下错误:
[root@lamp myblog]# service apache restart
AH00557: httpd: apr_sockaddr_info_get() failed for LAMP
AH00558: httpd: Could not reliably determine the server‘s fully qualified domain name, using 127.0.0.1. Set the ‘ServerName‘ directive globally to suppress this message
httpd (no pid file) not running

原因:自己的主机名和IP地址没有绑定在hosts文件中
七、测试验证
1. Linux客户端通过Firefox浏览器测试
1)保证DNS能解析到www.myblog.net域名
方法1:配置DNS
方法2:更改hosts文件增加如下内容
10.1.1.2  www.myblog.net
2)firefox http://www.myblog.net
报错信息:
Forbidden
You don‘t have permission to access / on this server.
原因:没有给网站目录授权
解决:在web服务器端修改主配置文件授权
[root@lamp conf]# pwd
/usr/local/apache2/conf
[root@lamp conf]# vim httpd.conf
....
<Directory />
    AllowOverride none
    Require all denied      默认拒绝所有,改为Require all granted
</Directory>
重启apache测试验证

项目总结

1. 源码编译总结

  • 配置阶段
# 通过指定参数,来确认你想要安装的软件安装在哪里,加上哪些功能和去掉哪些功能
./configure 或者 cmake
# 如果这一步报错,基本都是缺少依赖包,解决办法:
1>  使用yum去安装,一般来说,rhel/centos做为一个成熟的linux操作系统,常见的底层依赖包都自带了,所以安装下面这两个组,一般都会有你所需要的依赖包。
# yum groupinstall "Development tools" -y
# yum groupinstall "Desktop Platform Development" -y 
2>  如果缺少依赖包在rhel/centos的yum源里找不到,则上网下载第三方的软件,先编译第三方软件,再编译本软件

关于./configure参数选择的基本方法:

./configure --help 查看所有的编译参数
第一个重要参数
--prefix=   此参数指定安装目录(一般安装到/usr/local/或者/usr/local/软件名下)
注意:如果指定了新的路径,注意后续环境变量的修改

第二类重要参数:
--enable-xxx    打开一个功能(默认是关闭的)
--disable-xxx   关闭一个功能(默认是打开的)

第三类参数:
--with-xxx=DIR/file    指定一个目录或文件,调用此目录或文件的功能
  • 编译阶段
make   
相当于是根据你上一步定义好的文件(Makefile),把这个软件给做出来(这一步一般很少出错,如果出错,问题都比较麻烦。可能是一些兼容性的问题等等,你可以尝试上网查询解决方法,如果查不到,只能换个环境或者换个软件版本或者换些编译参数重新编译)
  • 安装阶段
make install  
把做好的软件,安装到你第一步所指定的安装目录里(这一步几乎不会出错的),如果目录不存在会自动创建

2. 需求分析

所有复杂的任务都有一个简单的解决办法,理清思路,结合业务场景分析,测试,验证。

课程目标

  • 了解常见的WEB服务器
  • 理解Apache的工作原理
  • 能够更改apache的默认数据根目录 /var/www/html
  • ==能够配置对网页实现用户名密码认证(掌握)==
  • ==能够配置apache的虚拟主机(重点)==
  • 熟悉Apache的网络访问控制配置(掌握)
  • ==能够通过源码包的方式搭建LAMP环境(掌握)==

WEB项目实战_源码构建LAMP环境

上一篇:dhtmlxSpreadSheet的各种配置满足您的各种需求


下一篇:Weblogic-SSRF漏洞的复现