2018-09-08笔记

LAMP架构介绍

LAMP是 linux Apache MySQL PHP的简写,即把Apache MySQL PHP 安装在linux系统上,组成一个环境来运行PHP网站。这里的Apache是httpd服务。这些可以安装在一个机器上,也可以安装在多台机器上,但是httpd和PHP安装在一台机器上(php作为httpd的一个模块存在的。 他们两者必须要在一起,才能实现效果)

Q:httpd和php为什么需要组合在一起,不能分开部署在不同的节点使用网络来进行数据协同吗?
A:因为我们使用的方式是,php作为httpd的一个模块存在的。 他们两者必须要在一起,才能实现效果。当然,如果你把php做成以fastcgi的形式,这样httpd可以在另外的机器上调用它,这样用就跟lnmp类似了。

MySQL_MariaDB介绍


文字版:
MySQL是一个关系型数据库,由mysql ab公司开发,mysql在2008年被sun公司收购(10亿刀),2009年sun公司被oracle公司收购(74亿刀)
MySQL官网https://www.mysql.com 最新版本5.7GA/8.0DMR
MySQL5.6变化比较大,5.7性能上有很大提升
Mariadb为MySQL的一个分支,官网https://mariadb.com/最新版本10.2
MariaDB主要由SkySQL公司(现更名为MariaDB公司)维护,SkySQL公司由MySQL原作者带领大部分原班人马创立.
Mariadb5.5版本对应MySQL的5.5,10.0对应MySQL5.6
(Community 社区版本,Enterprise 企业版,GA(Generally Available)指通用版本,在生产环境中用的,DMR(Development Milestone Release)开发里程碑发布版,RC(Release Candidate)发行候选版本,Beta开放测试版本,Alpha内部测试版本)

MySQL安装

MySQL的几个常用安装包:rpm、源码、二进制免编译
追求性能可以自己编译,否则可以使用二进制免编译

下载地址可到r.aminglinux.com下查找

下载MySQL到指定目录下(/usr/local/src).
[root@linux7-128 ~]# cd /usr/local/src/
查看目录下有哪些文件
[root@linux7-128 src]# ls
httpd-2.4.33  httpd-2.4.33.tar.gz
查看自己系统是多少位的,X86_64代表是64位
[root@linux7-128 src]# uname -a
Linux linux7-128 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
下载MySQL5.6版本64位的
[root@linux7-128 src]# wget http://mirrors.163.com/mysql/Downloads/MySQL-5.6/mysql-5.6.39-linux-glibc2.12-x86_64.tar.gz
--2018-09-07 22:11:05--  http://mirrors.163.com/mysql/Downloads/MySQL-5.6/mysql-5.6.39-linux-glibc2.12-x86_64.tar.gz
正在解析主机 mirrors.163.com (mirrors.163.com)... 59.111.0.251
正在连接 mirrors.163.com (mirrors.163.com)|59.111.0.251|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:328882304 (314M) [application/octet-stream]
正在保存至: “mysql-5.6.39-linux-glibc2.12-x86_64.tar.gz100%[===============================================================================>] 328,882,304  891KB/s 用时 4m 52s 

2018-09-07 22:15:57 (1.08 MB/s) - 已保存 “mysql-5.6.39-linux-glibc2.12-x86_64.tar.gz” [328882304/328882304])
解压
[root@linux7-128 src]# tar zxvf mysql-5.6.39-linux-glibc2.12-x86_64.tar.gz
目录改名为mysql
[root@linux7-128 src]# mv mysql-5.6.39-linux-glibc2.12-x86_64 /usr/local/mysql
进入到mysql目录下
[root@linux7-128 src]# cd /usr/local/mysql/
创建一个新用户mysql,并且新建一个data目录用于存放数据,如果data已存在可以省略
[root@linux7-128 mysql]# useradd mysql
[root@linux7-128 mysql]# mkdir /data/
mkdir: 无法创建目录"/data/": 文件已存在
[root@linux7-128 mysql]# ls
bin  COPYING  data  docs  include  lib  man  mysql-test  README  scripts  share  sql-bench  support-files
初始化,生成/data/mysql目录,如果mysql想要启动必须要有一个自带的库mysql
[root@linux7-128 mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql
FATAL ERROR: please install the following Perl modules before executing ./scripts/mysql_install_db:
Data::Dumper  --提示少了一个模块Dumper
搜索含有此模块的包
[root@linux7-128 mysql]# yum list |grep perl |grep -i dumper
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
perl-Data-Dumper.x86_64                   2.145-3.el7                  base     
perl-Data-Dumper-Concise.noarch           2.020-6.el7                  epel     
perl-Data-Dumper-Names.noarch             0.03-17.el7                  epel     
perl-XML-Dumper.noarch                    0.81-17.el7                  base  
依次安装后尝试初始化,如果不行,继续安装下一个包
[root@linux7-128 mysql]# yum install -y perl-Data-Dumper.x86_64
[root@linux7-128 mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql
没有报错,初始化完成。
[root@linux7-128 mysql]# echo $?
0  --echo $? 是检测上一条命令是否执行成功

此步骤可以省略
拷贝配置文件到/etc/目录下并改名为my.cnf,如果不放到etc目录下那么启动时要做一个指定

[root@linux7-128 mysql]# cp support-files/my-default.cnf /etc/my.cnf

其实/etc下默认已经有了一个my.cnf

[root@linux7-128 mysql]# ls /etc/my.cnf 
/etc/my.cnf

查看是由哪个包生成的my.cnf文件

[root@linux7-128 mysql]#  rpm -qf /etc/my.cnf
mariadb-libs-5.5.56-2.el7.x86_64
--centos7可能默认安装了此包

自带的/etc/my.cnf也可以使用,前提是要更改下文件设置

[mysqld]
datadir=/data/mysql
socket=/tmp/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

[mysqld_safe]
#log-error=/var/log/mariadb/mariadb.log
#pid-file=/var/run/mariadb/mariadb.pid

#
# include all files from the config directory
#
#!includedir /etc/my.cnf.d
  • datadir位置修改为/data/mysql
  • socke位置修改为/tmp/mysql.sock
  • 注释掉log-error=/var/log/mariadb/mariadb.log
  • 注释掉pid-file=/var/run/mariadb/mariadb.pid
  • 注释掉!includedir /etc/my.cnf.d

复制启动脚本到/etc/init.d下并命名为mysqld
[root@linux7-128 mysql]# cp support-files/mysql.server /etc/init.d/mysqld
修改配置文件/etc/init.d/mysqld

  • 指定程序目录basedir=/usr/local/mysql
  • 指定数据目录datadir=/data/mysql

查看文件权限,如果不是755修改为755

[root@linux7-128 mysql]# ls -l /etc/init.d/mysqld 
-rwxr-xr-x 1 root root 10592 97 23:16 /etc/init.d/mysqld

设置脚本文件为开机启动

[root@linux7-128 mysql]# chkconfig --add mysqld
[root@linux7-128 mysql]# chkconfig --list

注:该输出结果只显示 SysV 服务,并不包含
原生 systemd 服务。SysV 配置数据
可能被原生 systemd 配置覆盖。 

      要列出 systemd 服务,请执行 'systemctl list-unit-files'。
      查看在具体 target 启用的服务请执行
      'systemctl list-dependencies [target]'。

mysqld          0:1:2:3:4:5:6:关
netconsole      0:1:2:3:4:5:6:关
network         0:1:2:3:4:5:6:

也可以手动启动

[root@linux7-128 mysql]# service mysqld start
Starting MySQL.Logging to '/data/mysql/linux7-128.err'.
. SUCCESS! 

查看进程

[root@linux7-128 mysql]# ps aux |grep mysql
root      2349  0.0  0.1  11816  1624 pts/0    S    23:20   0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql --pid-file=/data/mysql/linux7-128.pid
mysql     2488  3.3 44.6 1304804 449804 pts/0  Sl   23:20   0:01 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=linux7-128.err --pid-file=/data/mysql/linux7-128.pid --socket=/tmp/mysql.sock
root      2521  0.0  0.0 112720   984 pts/0    S+   23:21   0:00 grep --color=auto mysql

查看监听端口,为3306

[root@linux7-128 mysql]# netstat -lntp
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:111             0.0.0.0:*               LISTEN      1/systemd           
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      1220/dnsmasq        
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1012/sshd           
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      1011/cupsd          
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1123/master         
tcp6       0      0 :::111                  :::*                    LISTEN      1/systemd           
tcp6       0      0 :::22                   :::*                    LISTEN      1012/sshd           
tcp6       0      0 ::1:631                 :::*                    LISTEN      1011/cupsd          
tcp6       0      0 ::1:25                  :::*                    LISTEN      1123/master         
tcp6       0      0 :::3306                 :::*                    LISTEN      2488/mysqld     

如果没有把脚本放到/etc/init.d下,或者根本没有这样的启动脚本模板去拷贝,可以用/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql --datadir=/data/mysql来启动,并且在最后可以加上&放到后台

[root@linux7-128 mysql]# /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql --datadir=/data/mysql &
[1] 2662
[root@linux7-128 mysql]# 180907 23:29:31 mysqld_safe Logging to '/data/mysql/linux7-128.err'.
180907 23:29:31 mysqld_safe Starting mysqld daemon with databases from /data/mysql

[root@linux7-128 mysql]# !ps
ps aux |grep mysql
root      2662  0.0  0.1 113304  1616 pts/0    S    23:29   0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql --datadir=/data/mysql
mysql     2796  3.2 44.6 1304804 449800 pts/0  Sl   23:29   0:00 /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql --datadir=/data/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=linux7-128.err --pid-file=linux7-128.pid --socket=/tmp/mysql.sock
root      2834  0.0  0.0 112720   984 pts/0    S+   23:29   0:00 grep --color=auto mysql

可以看到也是启动成功了的,进程里就是刚才启动的命令

注意:–defaults-file=/etc/my.cnf zhid 指定配置文件路径

关闭进程

[root@linux7-128 mysql]# killall mysqld
[root@linux7-128 mysql]# 180907 23:34:01 mysqld_safe mysqld from pid file /data/mysql/linux7-128.pid ended

[1]+  完成                  /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql --datadir=/data/mysql

一般不要用kill,使用killall相对安全一下
killall会先停止读写操作,把已有的写完后,就杀死MySQL服务。
而kill -9 pid 会啥都不管,直接杀掉进程。这样做很可能导致数据的丢失甚至损坏表

MySQL有两个引擎:innodb (小), myisam(大)

MariaDB安装


安装方法和MySQL基本类似,相同步骤参考上面,不多赘述。

1.进入/usr/local/src/目录下

[root@linux7-128 ~]# cd /usr/local/src/

2.下载MariaDB包,包很大,耐心等待,可以通过-b选项放到后台下载

[root@linux7-128 src]# wget https://downloads.mariadb.com/MariaDB/mariadb-10.2.6/bintar-linux-glibc_214-x86_64/mariadb-10.2.6-linux-glibc_214-x86_64.tar.gz

3.解压

[root@linux7-128 src]# tar zxvf mariadb-10.2.6-linux-glibc_214-x86_64.tar.gz

4.移动并改名为mariadb

[root@iz2zef1im6qv29viqhtk3qz src]# mv mariadb-10.2.6-linux-glibc_214-x86_64 /usr/local/mariadb

5.进入/usr/local/mariadb下
cd /usr/local/mariadb/

6.初始化

[root@iz2zef1im6qv29viqhtk3qz mariadb]# ./scripts/mysql_install_db --user=mysql --datadir=/data/mariadb
Installing MariaDB/MySQL system tables in '/data/mariadb' ...
OK

To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system

PLEASE REMEMBER TO SET A PASSWORD FOR THE MariaDB root USER !
To do so, start the server, then issue the following commands:

'./bin/mysqladmin' -u root password 'new-password'
'./bin/mysqladmin' -u root -h iz2zef1im6qv29viqhtk3qz password 'new-password'

Alternatively you can run:
'./bin/mysql_secure_installation'

which will also give you the option of removing the test
databases and anonymous user created by default.  This is
strongly recommended for production servers.

See the MariaDB Knowledgebase at http://mariadb.com/kb or the
MySQL manual for more instructions.

You can start the MariaDB daemon with:
cd '.' ; ./bin/mysqld_safe --datadir='/data/mariadb'

You can test the MariaDB daemon with mysql-test-run.pl
cd './mysql-test' ; perl mysql-test-run.pl

Please report any problems at http://mariadb.org/jira

The latest information about MariaDB is available at http://mariadb.org/.
You can find additional information about the MySQL part at:
http://dev.mysql.com
Consider joining MariaDB's strong and vibrant community:
https://mariadb.org/get-involved/

[root@iz2zef1im6qv29viqhtk3qz mariadb]# echo $?
0

7.拷贝配置文件
配置文件在support-files/里,不同的配置文件代表着里面的数值大小不一样。根据内存大小选择

cp support-files/my-small.cnf /usr/local/mariadb/my.cnf

8.拷贝启动脚本

[root@iz2zef1im6qv29viqhtk3qz mariadb]# cp support-files/mysql.server /etc/init.d/mariadb

9.编辑配置文件vim /usr/local/mariadb/my.cnf

更改配置着重看[mysqld]部分,基本上不需要更改。

10.编辑启动脚本vim /etc/init.d/mariadb

  • 更改basedir=/etc/local/mariadb
  • 更改datadir=/data/mariadb
  • 下面新增配置文件路径conf=$basedir/my.cnf
  • start配置里新增变量--defaults-file="$conf"
basedir=/usr/local/mariadb
datadir=/data/mariadb
conf=$basedir/my.cnf
case "$mode" in
  'start')
    # Start daemon

    # Safeguard (relative paths, core dumps..)
    cd $basedir

    echo $echo_n "Starting MySQL"
    if test -x $bindir/mysqld_safe
    then
      # Give extra arguments to mysqld with the my.cnf file. This script
      # may be overwritten at next upgrade.
      $bindir/mysqld_safe 此处加上括号内变量(--defaults-file="$conf") --datadir="$datadir" --pid-file="$mysqld_pid_file_path" "$@" &
      wait_for_ready; return_value=$?

      # Make lock for RedHat / SuSE
      if test -w "$lockdir"
      then
        touch "$lock_file_path"
      fi

11.启动
启动前要先关闭掉mysqld服务,两者监听端口一样,避免冲突。

/etc/init.d/mariadb start

查看端口

[root@iz2zef1im6qv29viqhtk3qz mariadb]# netstat -ltnp
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:22              0.0.0.0:*               LISTEN      948/sshd            
tcp6       0      0 :::3306                 :::*                    LISTEN      11450/mysqld  

知识点

假如一台机器上,即安装了mysql,又安装了mariadb。就需要定义其中一个的启动脚本,不能都使用/etc/init.d/my.cnf,如果只安装一种,不会出现这种问题。

查看mariadb进程时,会出现/data/mysql就是因为调用了/etc/init.d/my.cnf,因为我们本身指定的/usr/local/mariadb/my.cnf没有定义–datadir参数,所以它还会去/etc/init.d/my.cnf里找,可以注释掉来解决。

正确的做法:编辑本身指定的配置文件/usr/local/mariadb/my.cnf没,添加datadir参数

datadir =/usr/local/mariadb/data/mariadb
注意添加到[mysqld]下

重启服务查看进程。

细节:阿里云上安装要指定全路径,不然会指定到别的地方去,还要注意权限问题。

Apache安装(hppd)

Apache是一个基金会的名字,httpd才是我们要安装的软件包,早期它的名字就叫apache

Apache官网www.apache.org

apr和apr-util是一个通用函数库,他能让httpd不去关心底层的操作系统平台,可以很方便的移植(linux到Windows)

1.下载版本httpd2.4

三个包都得下载(下载到/usr/local/src)


 wget http://mirrors.cnnic.cn/apache/httpd/httpd-2.4.34.tar.gz

 wget  http://mirrors.cnnic.cn/apache/apr/apr-1.6.3.tar.gz

 wget http://mirrors.cnnic.cn/apache/apr/apr-util-1.6.1.tar.gz

yum 下载的apr和我们的httpd2.4版本是不匹配,所以要安装源码包

2.解压

tar zxvf httpd-2.4.34.tar.gz 

tar zxvf apr-1.6.3.tar.gz 

tar zxvf apr-util-1.6.1.tar.gz

3.先安装apr

# cd apr-1.6.3
# ./configure --prefix=/usr/local/apr
# echo $?
0
# make && make install
# echo $?
0
# ls /usr/local/apr/
bin  build-1  include  lib

4.安装apr-util

# cd /usr/local/src/apr-util-1.6.1
# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
# echo $?
0
# make && make install
提示:fatal error: expat.h: No such file or directory #include <expat.h>
解决办法:yum install expat-devel -y
# ls /usr/local/apr-util/
bin  include  lib

Apache和PHP都会支持以一个模块的形式存在。模块实际上是一个文件,是一个后缀名为.so的文件,PHP以Apache的一个模块存在。Apache算是一个进程,他可以通过配置文件指定路径的方式调用模块。

5.安装httpd

# cd /usr/local/src/httpd-2.4.34
# ./configure --prefix=/usr/local/apache2.4 --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-so --enable-mods-shared=most
释义:要加上两个依赖包apr和apr-util, --enable-so(能动态扩展模块),--enable-mods-shared=most(指定模块为大多数)
报错:configure: error: pcre-config for libpcre not found. PCRE is required and available from http://pcre.org/

解决方法:

[root@iz2zef1im6qv29viqhtk3qz httpd-2.4.34]# yum list |grep pcre
pcre.x86_64                              8.32-17.el7                   @anaconda
ghc-pcre-light.x86_64                    0.4-13.el7                    epel     
ghc-pcre-light-devel.x86_64              0.4-13.el7                    epel     
mingw32-pcre.noarch                      8.38-1.el7                    epel     
mingw32-pcre-static.noarch               8.38-1.el7                    epel     
mingw64-pcre.noarch                      8.38-1.el7                    epel     
mingw64-pcre-static.noarch               8.38-1.el7                    epel     
pcre.i686                                8.32-17.el7                   base     
pcre-devel.i686                          8.32-17.el7                   base     
pcre-devel.x86_64                        8.32-17.el7                   base     
pcre-static.i686                         8.32-17.el7                   base     
pcre-static.x86_64                       8.32-17.el7                   base     
pcre-tools.x86_64                        8.32-17.el7                   base     
pcre2.i686                               10.23-2.el7                   base     
pcre2.x86_64                             10.23-2.el7                   base     
pcre2-devel.i686                         10.23-2.el7                   base     
pcre2-devel.x86_64                       10.23-2.el7                   base     
pcre2-static.i686                        10.23-2.el7                   base     
pcre2-static.x86_64                      10.23-2.el7                   base     
pcre2-tools.x86_64                       10.23-2.el7                   base     
pcre2-utf16.i686                         10.23-2.el7                   base     
pcre2-utf16.x86_64                       10.23-2.el7                   base     
pcre2-utf32.i686                         10.23-2.el7                   base     
pcre2-utf32.x86_64                       10.23-2.el7                   base    

一般我们安装都是 包名-devel\lib的包

安装# yum install -y pcre-devel

然后重新编译安装

# ./configure --prefix=/usr/local/apache2.4 --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-so --enable-mods-shared=most
# echo $?
0
# make && make install
报错:collect2: error: ld returned 1 exit status
make[2]: *** [htpasswd] Error 1
make[2]: Leaving directory `/usr/local/src/httpd-2.4.34/support'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/usr/local/src/httpd-2.4.34/support'
make: *** [all-recursive] Error 1

解决办法:
重新编译安装apr-util,然后在重新编译安装httpd,编译安装之前先make clean一下。

# ./configure --prefix=/usr/local/apache2.4 --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-so --enable-mods-shared=most
# echo $?
0
# make && make install
# echo $?
0
# cd /usr/local/apache2.4/
# ls
bin  build  cgi-bin  conf  error  htdocs  icons  include  logs  man  manual  modules

查看Apache加载的模块

[root@iz2zef1im6qv29viqhtk3qz apache2.4]# /usr/local/apache2.4/bin/httpd -M
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.153.149. Set the 'ServerName' directive globally to suppress this message
Loaded Modules:
 core_module (static)
 so_module (static)
 http_module (static)
 mpm_event_module (static)
 authn_file_module (shared)
 authn_core_module (shared)
 authz_host_module (shared)
 authz_groupfile_module (shared)
 authz_user_module (shared)
 authz_core_module (shared)
 access_compat_module (shared)
 auth_basic_module (shared)
 reqtimeout_module (shared)
 filter_module (shared)
 mime_module (shared)
 log_config_module (shared)
 env_module (shared)
 headers_module (shared)
 setenvif_module (shared)
 version_module (shared)
 unixd_module (shared)
 status_module (shared)
 autoindex_module (shared)
 dir_module (shared)
 alias_module (shared)

(/usr/local/apache2.4/bin/apachectl -M 也是能查看到加载的模块,其实这里的apachectl就是调用httpd这个文件)

启动

/usr/local/apache2.4/bin/apachectl start

查看是否安装成功

# ps aux |grep httpd
root     20337  0.0  0.2  95476  2500 ?        Ss   15:33   0:00 /usr/local/apache2.4/bin/httpd -k start
daemon   20338  0.0  0.2 382304  2372 ?        Sl   15:33   0:00 /usr/local/apache2.4/bin/httpd -k start
daemon   20339  0.0  0.2 382304  2372 ?        Sl   15:33   0:00 /usr/local/apache2.4/bin/httpd -k start
daemon   20340  0.0  0.2 382304  2372 ?        Sl   15:33   0:00 /usr/local/apache2.4/bin/httpd -k start
root     20425  0.0  0.0 112660   968 pts/1    R+   15:34   0:00 grep --color=auto httpd
# netstat -lntp
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:80              0.0.0.0:*               LISTEN      20337/httpd         
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      948/sshd            
tcp6       0      0 :::3306                 :::*                    LISTEN      13248/mysqld  

安装PHP5

PHP官网:www.php.net
当前主流版本为5.6/7.1
目前很多的企业仍然是使用PHP5甚至更老的版本,很多老程序不支持PHP7。

1.进入目录/usr/local/src

# cd /usr/local/src

2.下载源码包,解压

# wget http://cn2.php.net/distributions/php-5.6.32.tar.bz2
# tar -jxvf php-5.6.32.tar.bz2

3.进入目录编译

# cd /usr/local/src/php-5.6.32
# ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2.4/bin/apxs --with-config-file-path=/usr/local/php/etc  --with-mysql=/usr/local/mysql --with-pdo-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-bz2 --with-openssl --with-mcrypt --enable-soap --enable-gd-native-ttf --enable-mbstring --enable-sockets --enable-exif
  • apxs2:apache的工具,自动的把扩展模块放到apache目录,且自动修改配置文件

报错及解决

出现报错信息1:configure: error: xml2-config not found. Please check your libxml2 installation.
解决方法:
安装xml2库

# yum list |grep xml2
libxml2.x86_64                           2.9.1-6.el7_2.3               @anaconda
libxml2.i686                             2.9.1-6.el7_2.3               base     
libxml2-devel.i686                       2.9.1-6.el7_2.3               base     
libxml2-devel.x86_64                     2.9.1-6.el7_2.3               base     
libxml2-python.x86_64                    2.9.1-6.el7_2.3               base     
libxml2-static.i686                      2.9.1-6.el7_2.3               base     
libxml2-static.x86_64                    2.9.1-6.el7_2.3               base     
mingw32-libxml2.noarch                   2.9.3-1.el7                   epel     
mingw32-libxml2-static.noarch            2.9.3-1.el7                   epel     
mingw64-libxml2.noarch                   2.9.3-1.el7                   epel     
mingw64-libxml2-static.noarch            2.9.3-1.el7                   epel     
python-xml2rfc.noarch                    2.5.2-2.el7                   epel     
tinyxml2.x86_64                          2.1.0-2.20140406git6ee53e7.el7
tinyxml2-devel.x86_64                    2.1.0-2.20140406git6ee53e7.el7
xml2.x86_64                              0.5-7.el7                     epel   
# yum install -y libxml2-devel

继续编译

出现报错信息2:configure: error: Cannot find OpenSSL's <evp.h>
解决方法:
安装OpenSSL库

# yum install -y openssl-devel

继续编译

出现报错信息3:configure: error: Please reinstall the BZip2 distribution

解决方法:
安装Bzip2

# yum install -y bzip2-devel

继续编译

出现报错信息4:configure: error: jpeglib.h not found.
解决方法:
安装jpeglib.h

# yum install -y libjpeg-devel

出现报错信息5:configure: error: png.h not found.
解决方法:
安装png.h

# yum install -y libpng-devel

出现报错信息6:configure: error: freetype-config not found.
解决方法:
安装freetype-config

# yum install -y freetype-devel

出现报错信息7:configure: error: mcrypt.h not found. Please reinstall libmcrypt.
解决方法:
安装mcrypt

# yum install -y libmcrypt-devel

安装成功

# echo $?
0

4.make

# make
# echo $?
0

5.make install

# make install
# echo $?
0

6.查看目录

# cd /usr/local/php/
# ls
bin  etc  include  lib  php

查看核心二进制文件大小

# du -sh /usr/local/php/bin/php
36M /usr/local/php/bin/php

查看他和Apache结合所用到的模块的大小

# du -sh /usr/local/apache2.4/modules/libphp5.so 
36M /usr/local/apache2.4/modules/libphp5.so

这时候即使删掉PHP目录也没关系,他要的仅仅是下面的模块libphp5.so

查看PHP所加载的模块

# /usr/local/php/bin/php -m
[PHP Modules]
bz2
Core
ctype
date
dom
ereg
exif
fileinfo
filter
gd
hash
iconv
json
libxml
mbstring
mcrypt
mysql
mysqli
openssl
pcre
PDO
pdo_mysql
pdo_sqlite
Phar
posix
Reflection
session
SimpleXML
soap
sockets
SPL
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
zlib

[Zend Modules]

和httpd -M功能类似,这些模块全部都是静态的,也能够扩展模块。

php安装完后不需启动

他是作为httpd的一个扩展模块形式存在的

# /usr/local/apache2.4/bin/httpd -M
省略..
 php5_module (shared)

查看Apache的配置文件

/usr/local/apache2.4/conf/httpd.conf

这里可以找到一行

LoadModule php5_module        modules/libphp5.so

上面用#号注释掉的都不会显示出来,不会被加载,如果想用哪个模块就把#号去掉。

安装后:把php的参考配置文件复制到我们定义的php配置文件路径

# cd /usr/local/src/php-5.6.32

# cp php.ini-production  /usr/local/php/etc/php.ini

/usr/local/php/etc,这个是在执行.configure时就定义了配置文件路径

使用命令/usr/local/php/bin/php -i |less加-i可以查看到PHP文件的信息


- php.ini-production :适应在生产环境中使用(我选用这个)

  • php.ini-development:适应在开发环境中使用

安装PHP7

1.进入到 /usr/local/src目录
# cd /usr/local/src
2.下载PHP7包
# wget http://cn2.php.net/distributions/php-7.1.6.tar.bz2
3.解压
# tar jxvf php-7.1.6.tar.bz2
4.编译安装

# cd /usr/local/src/php-7.1.6
#  ./configure --prefix=/usr/local/php7 --with-apxs2=/usr/local/apache2.4/bin/apxs --with-config-file-path=/usr/local/php7/etc  --with-pdo-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-bz2 --with-openssl --with-mcrypt --enable-soap --enable-gd-native-ttf --enable-mbstring --enable-sockets --enable-exif
# echo $?
0
# make
# echo $?
0
# make install
# echo $?
0

apache2.4下现在有两个PHP模块

# ls /usr/local/apache2.4/modules/libphp*
/usr/local/apache2.4/modules/libphp5.so  /usr/local/apache2.4/modules/libphp7.so
# du -sh /usr/local/apache2.4/modules/libphp7.so 
37M /usr/local/apache2.4/modules/libphp7.so

查看apache2.4加载了多少个PHP

#  /usr/local/apache2.4/bin/apachectl  -M
省略...
php5_module (shared)
php7_module (shared)

复制配置文件到定义的路径

# cd /usr/local/src/php-7.1.6
# cp php.ini-production  /usr/local/php7/etc/php.ini

根据自己的需求使用哪个版本的PHP(5或7,前提是两个都安装有)?

答:修改配置文件

vim /usr/local/apache2.4/conf/httpd.conf
不想用哪个把哪个注释掉

LoadModule php5_module        modules/libphp5.so
LoadModule php7_module        modules/libphp7.so

Apache和PHP结合

修改apache配置文件

httpd主配置文件/usr/local/apache2.4/conf/httpd.conf

1.修改ServerName,把前面注释的#取消

在启动httpd的时候,会提示要定义一个ServerName,若定义了则在启动时就不会再提示

2.如果安装了PHP5和PHP7,要注释掉一个,避免冲突

这时在Windows浏览器中访问Linux的IP地址会访问不了
首先检查网络原因
第一步:打开cmd,ping linuxIP地址;
第二步:检查80端口是否打开 telnet linuxIP地址 80
(若无telnet工具,则在 控制面板–>程序–>启动或关闭window功能->选中telnet客户端)

如果访问不了80端口,那么需要在Linux中添加80端口

iptables -I INPUT -p tcp --dport 80 -j ACCEPT

这时,就可以在浏览器中打开了

3.修改Require (不修改的话,在浏览器访问时会出现403错误)
将此位置的denied改为granted

前面之所以能够访问LinuxIP地址是因为
下面的

DocumentRoot "/usr/local/apache2.4/htdocs"
<Directory "/usr/local/apache2.4/htdocs">
省略...
    #
    # Controls who can get stuff from this server.
    #
    Require all granted

如果将此处的Require all granted修改为 Require all denied,然后重新加载配置文件,那么就不允许浏览器访问了。

知识点:检查配置文件语法是否对

# /usr/local/apache2.4/bin/apachectl -t
Syntax OK

重新加载配置文件# /usr/local/apache2.4/bin/apachectl graceful

这时候浏览器访问会出现提示

所以要恢复原样,将配置文件里都设置为Require all granted,为了防止在打开虚拟主机配置文件时显示403。

4.添加一行和php相关的内容(不添加php无法解析)
AddType application/x-httpd-php .php

5.修改一行索引页语句(加上了index.php时在访问地址时。可以省略地址栏的index.php)

DirectoryIndex index.html index.php

测试配置文件是否正确,然后重新加载

# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
# /usr/local/apache2.4/bin/apachectl graceful

测试php是否能正常解析

创建一个php测试文本:vi /usr/local/apache2.4/htdocs/1.php

输入如下内容

<?php
phpinfo();
?>


证明支持解析

不能正确解析解决方法

第一步: 查看php5模块是否加载

/usr/local/apache2.4/bin/apachectl -M
第二步:查看是否有libphp5.so文件:

ls /usr/local/apache2.4/modules/libphp5.so
第三步:配置文件是否加了

AddType application/x-httpd-php .php (.php前面有个空格)
第四步:DirectoryIndex index.html index.php是否填写正确

/usr/local/apache2.4/bin/apachectl -t

(在修改完配置文件后,执行 /usr/local/apache2.4/bin/apachectl -t

判断配置文件是否修改正确)

重启php服务: /usr/local/apache2.4/bin/apachectl restart

扩展

mysql5.5源码编译安装 http://www.aminglinux.com/bbs/thread-1059-1-1.html
mysql5.7二进制包安装(变化较大) http://www.apelearn.com/bbs/thread-10105-1-1.html
apache dso https://yq.aliyun.com/articles/6298
apache apxs https://wizardforcel.gitbooks.io/apache-doc/content/51.html
apache工作模式 http://www.cnblogs.com/fnng/archive/2012/11/20/2779977.html
php中mysql,mysqli,mysqlnd,pdo到底是什么 http://blog.csdn.net/u013785951/article/details/60876816
查看编译参数 http://ask.apelearn.com/question/1295

猜你喜欢

转载自blog.csdn.net/u013946328/article/details/82562190
今日推荐