一、LAMP架构介绍
1、LAMP 是Linux Apache MySQL PHP的简写,其实就是把Apache, MySQL以及PHP安装在Linux系统上,组成一个环境来运行php的脚本语言
- Apache是最常用的WEB服务软件,httpd真正的名字
- MySQL是存储的软件,存储的是数据,字符串
- php是一个脚本语言,与Shell类似,比Shell复杂,php实际上用C开发的,通常用来做网站
可以把Apache+PHP安装在一台机器上,再把MySQL安装在另外一台机器上,也可以把他们三个安装在同一台机器上。但Apache和PHP需要在同一台机器上,因为PHP是作为Apache的一个模块存在的,他们两个必须在一起。
网页资源的动态和静态
静态内容服务:客户端发起资源请求,服务器将请求的资源原封不动的发给客户端。
动态资源:服务器将客户端发起的资源先执行一下,进行一定的处理,返还给客户端。(登录时去MsSQL找账号密码的密码进行比对)
2、MySQL/MariaDB介绍
3、MySQL安装
查看自己什么平台(X86_64显示64位,32位显示i686 i586)
[root@han01 src]# uname -a
Linux han01 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
下载
[root@han01 src]# wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.36-linux-glibc2.5-x86_64.tar.gz
解压安装包
[root@han01 src]# tar zxvf mysql-5.6.36-linux-glibc2.5-x86_64.tar.gz
挪动目录,并且改名字
[root@han01 src]# mv mysql-5.6.36-linux-glibc2.5-x86_64 /usr/local/mysql
在挪动后要ls检查一下文件是否正确(有的mkdir创建了目录后,mv时把原目录放到/usr/local/mysql下面,最终导致实验结果不对)
[root@han01 src]# cd /usr/local/mysql
[root@han01 mysql]# ls
bin data include man README share support-files
COPYING docs lib mysql-test scripts sql-bench
创建mysql用户,创建Data目录
[root@han01 mysql]# useradd mysql
[root@han01 mysql]# mkdir /data/
初始化,指定用户,指定数据库目录(Perl脚本语言,提示少了一个模块Dumper)
[root@han01 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
模糊搜索一下,加上-i选项不管大小写
[root@han01 mysql]# yum list |grep perl |grep -i dumper
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@han01 ~]# yum install -y perl-Data-Dumper.x86_64
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
* epel: mirrors.ustc.edu.cn
正在解决依赖关系
--> 正在检查事务
---> 软件包 perl-Data-Dumper.x86_64.0.2.145-3.el7 将被 安装
--> 解决依赖关系完成
依赖关系解决
安装完后再次初始化下看看是否能成功执行
[root@han01 ~]# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql
-bash: ./scripts/mysql_install_db: 没有那个文件或目录
[root@han01 ~]# cd /usr/local/mysql/
[root@han01 mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql
Installing MySQL system tables...2018-06-25 23:59:45 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
如果看到2个OK,就说明成功正确,或者echo $?检验上条命令是否对
[root@han01 mysql]# echo $?
0
拷贝配置文件,拷贝到/etc并且改名为my.cnf(mysql的配置文件就叫my.cnf,固定在/etc下,如果想放到其他地方,在启动的时候就得做个指定,不然在启动时会默认去找/etc下的)和启动脚本
[root@han01 mysql]# ls support-files/
binary-configure magic my-default.cnf mysqld_multi.server mysql-log-rotate mysql.server
[root@han01 mysql]# cp support-files/my-default.cnf /etc/my.cnf^C
在复制前可以看下有一个自带/etc/my.cnf,查一下由哪个rpm来的,可能是CentOS自带的
[root@han01 mysql]# ls /etc/my.cnf
/etc/my.cnf
[root@han01 mysql]# rpm -qf /etc/my.cnf
mariadb-libs-5.5.56-2.el7.x86_64
有这个文件,我们可以用,不用去拷贝,但前提是要修改配置
[root@han01 mysql]# vim /etc/my.cnf
修改datadir,socket,接着在log-error、!includedir和pid前加#,不要它们
[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
修改启动脚本
[root@han01 mysql]# cp support-files/mysql.server /etc/init.d/mysqld
[root@han01 mysql]# vi /etc/init.d/mysqld
找到下列这两列,加上目录
basedir=/usr/local/mysql
datadir=/data/mysql
修改权限755,但是它本身就是755
[root@han01 mysql]# ls -l /etc/init.d/mysqld
-rwxr-xr-x. 1 root root 10592 6月 26 00:22 /etc/init.d/mysqld
设置开机自动启动
[root@han01 mysql]# chkconfig --add mysqld
[root@han01 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@han01 mysql]# /etc/init.d/mysqld start^C
[root@han01 mysql]# service mysqld start
Starting MySQL SUCCESS!
[root@han01 mysql]# 180626 00:27:15 mysqld_safe A mysqld process already exists
^C
[root@han01 mysql]# ps aux |grep mysql
root 1308 0.0 0.1 113264 1600 ? S 00:26 0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql --pid-file=/data/mysql/han01.pid
mysql 1445 0.8 29.5 1300776 450276 ? Sl 00:26 0:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/mysql/han01.err --pid-file=/data/mysql/han01.pid --socket=/tmp/mysql.sock
root 1767 0.0 0.0 112676 980 pts/1 R+ 00:27 0:00 grep --color=auto mysql
[root@han01 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:22 0.0.0.0:* LISTEN 893/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 982/master
tcp6 0 0 :::22 :::* LISTEN 893/sshd
tcp6 0 0 ::1:25 :::* LISTEN 982/master
tcp6 0 0 :::3306 :::* LISTEN 1445/mysqld
可以用命令行(指定配置文件所在的路径,)
[root@han01 mysql]# service mysqld stop
Shutting down MySQL.. SUCCESS!
[root@han01 mysql]# !ps
ps aux |grep mysql
root 1796 0.0 0.0 112676 980 pts/1 R+ 00:29 0:00 grep --color=auto mysql
[root@han01 mysql]# /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql --datadir=
/data/mysql &
[1] 1808
[root@han01 mysql]# 180626 00:31:20 mysqld_safe Logging to '/data/mysql/han01.err'.
180626 00:31:20 mysqld_safe Starting mysqld daemon with databases from /data/mysql
[root@han01 mysql]# !ps
ps aux |grep mysql
root 1808 0.0 0.1 113260 1612 pts/1 S 00:31 0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql --datadir=/data/mysql
mysql 1933 11.0 29.4 1300776 449528 pts/1 Sl 00:31 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=/data/mysql/han01.err --pid-file=/data/mysql/han01.pid --socket=/tmp/mysql.sock
root 1956 0.0 0.0 112676 980 pts/1 S+ 00:31 0:00 grep --color=auto mysql
[root@han01 mysql]# !net
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:22 0.0.0.0:* LISTEN 893/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 982/master
tcp6 0 0 :::22 :::* LISTEN 893/sshd
tcp6 0 0 ::1:25 :::* LISTEN 982/master
tcp6 0 0 :::3306 :::* LISTEN 1933/mysqld
用命令行的形式的话,只能用killall mysqld才能关闭(直接Kill可能会数据丢失,killall会停止当前的写读操作,写完后才会结束进程)
三、MariaDB安装
下载好包,解压
[root@han01 mysql]# tar zxvf rmariadb-10.2.6-linux-glibc_214-x86_64.tar.gz
拷贝并改名,进入到mariadb目录下
[root@han01 src]# mv mariadb-10.2.6-linux-glibc_214-x86_64 /usr/local/mariadb
[root@han01 src]# cd /usr/local/mariadb
[root@han01 mariadb]#
初始化并检查
[root@han01 mariadb]# ./scripts/mysql_install_db --user=mysql --basedir=/usr/local/mariadb/ --datadir=/data/mariadb
如果不定义basedir有可能会去找mysql
[root@han01 mariadb]# echo $?
0
[root@han01 mariadb]# ls /data/mariadb/
aria_log.00000001 ib_buffer_pool ib_logfile0 mysql test
aria_log_control ibdata1 ib_logfile1 performance_schema
拷贝配置文件,启动脚本
[root@han01 mariadb]# cp support-files/my-small.cnf /usr/local/mariadb/my.cnf
[root@han01 mariadb]# cp support-files/mysql.server /etc/init.d/mariadb
编辑配置文件,不需要改动
[root@han01 mariadb]# vim /usr/local/mariadb/my.cnf
需要改动的是启动脚本
conf指定配置文件所在路径
[root@han01 mariadb]# vim /etc/init.d/mariadb
basedir=/usr/local/mariadb
datadir=/data/mariadb
conf=$basedir/my.cnf
启动命令下面指定一下,添加–defaults-file=”$conf”
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" "$@" &
在启动前,先查看下mysql有没在启动,会产生冲突,因为两个监听的窗口一样的
[root@han01 mariadb]# ps aux |grep mysql
root 2121 0.0 0.0 112676 980 pts/1 R+ 01:08 0:00 grep --color=auto mysql
[root@han01 mariadb]# /etc/init.d/mariadb start
Reloading systemd: [ 确定 ]
Starting mariadb (via systemctl): [ 确定 ]
查看服务是否启动成功
[root@han01 mariadb]# ps aux |grep mariadb
root 2168 0.0 0.1 115388 1724 ? S 01:10 0:00 /bin/sh /usr/local/mariadb/bin/mysqld_safe --defaults-file=/usr/local/mariadb/my.cnf --datadir=/data/mysql --pid-file=/data/mysql/han01.pid
mysql 2284 3.6 3.7 1125124 56556 ? Sl 01:10 0:01 /usr/local/mariadb/bin/mysqld --defaults-file=/usr/local/mariadb/my.cnf --basedir=/usr/local/mariadb --datadir=/data/mysql --plugin-dir=/usr/local/mariadb/lib/plugin --user=mysql --log-error=/data/mysql/han01.err --pid-file=/data/mysql/han01.pid --socket=/tmp/mysql.sock --port=3306
root 2338 0.0 0.0 112676 980 pts/1 S+ 01:10 0:00 grep --color=auto mariadb
端口,3306
[root@han01 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 893/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 982/master
tcp6 0 0 :::22 :::* LISTEN 893/sshd
tcp6 0 0 ::1:25 :::* LISTEN 982/master
tcp6 0 0 :::3306 :::* LISTEN 2284/mysqld
一台机器上装了mysql和mariadb
在指定了自定义的配置文件/usr/local/mariadb/my.cnf,进行修改
[root@han01 mariadb]# vi /usr/local/mariadb/my.cnf
找到mysql加上datadir
[mysqld]
datadir = /data/mariadb
查看是否成功
[root@han01 mariadb]# killall mysqld
mysqld: no process found
[root@han01 mariadb]# ps aux |grep mysql
root 2571 0.0 0.0 112676 980 pts/1 R+ 01:20 0:00 grep --color=auto mysql
[root@han01 mariadb]# /etc/init.d/mariadb start
Starting mariadb (via systemctl): [ 确定 ]
[root@han01 mariadb]# ps aux |grep mysql
root 2585 0.0 0.0 112676 980 pts/1 R+ 01:20 0:00 grep --color=auto mysql
[root@han01 mariadb]# ps aux |grep mysql
root 2587 0.0 0.0 112676 980 pts/1 R+ 01:20 0:00 grep --color=auto mysql
[root@han01 mariadb]# /etc/init.d/mariadb restart
Restarting mariadb (via systemctl): [ 确定 ]
[root@han01 mariadb]# ps aux |grep mysql
root 2627 0.0 0.1 115388 1732 ? S 01:20 0:00 /bin/sh /usr/local/mariadb/bin/mysqld_safe --defaults-file=/usr/local/mariadb/my.cnf --datadir=/data/mariadb --pid-file=/data/mariadb/han01.pid
mysql 2746 8.5 3.9 1125024 60228 ? Sl 01:20 0:00 /usr/local/mariadb/bin/mysqld --defaults-file=/usr/local/mariadb/my.cnf --basedir=/usr/local/mariadb --datadir=/data/mariadb --plugin-dir=/usr/local/mariadb/lib/plugin --user=mysql --log-error=/data/mariadb/han01.err --pid-file=/data/mariadb/han01.pid --socket=/tmp/mysql.sock --port=3306
root 2782 0.0 0.0 112676 980 pts/1 R+ 01:21 0:00 grep --color=auto mysql
四、Apache安装
下载3个包
http://mirrors.cnnic.cn/apache/httpd/httpd-2.4.33.tar.gz
apr: http://mirrors.cnnic.cn/apache/apr/apr-1.6.3.tar.gz
apr-util: http://mirrors.cnnic.cn/apache/apr/apr-util-1.6.1.tar.bz2
apr和apr-util是一个通用的函数库,它让httpd可以不关心底层的操作系统平台,可以很方便地移植(从linux移植到windows
查看
[root@han01 mariadb]# mv apr-* /usr/local/src/
[root@han01 mariadb]# cd /usr/local/src/
[root@han01 src]# ls
apr-1.6.3.tar.gz mariadb-10.2.6-linux-glibc_214-x86_64.tar.gz
apr-util-1.6.1.tar.bz2 mysql-5.6.36-linux-glibc2.5-x86_64.tar.gz
httpd-2.4.33.tar.gz
解压这3个包
编译安装apr
[root@han01 src]# cd apr-1.6.3/
[root@han01 apr-1.6.3]# ./configure --prefix=/usr/local/apr
出现错误,安装以下内容
安装后,再次执行之前的命令,执行完后进行检查,发现问题已经解决
[root@han01 apr-1.6.3] make && make install
[root@han01 apr-1.6.3]# echo $?
0
编译安装apr-util
[root@han01 ~]#curl -O http://mirrors.hust.edu.cn/apache/apr/apr-util-1.6.1.tar.gz
[root@han01 ~]#tar xf apr-util-1.6.1.tar.gz
[root@han01 ~]#cd apr-util-1.6.1
[root@han01 apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/
[root@han01 apr-util-1.6.1]# make && make install
编译安装httpd
[root@han01 src]# cd /usr/local/src/httpd-2.4.33
[root@han01 httpd-2.4.33]# ./configure \
> --prefix=/usr/local/apache2.4 \
> --with-apr=/usr/local/apr \
> --with-apr-util=/usr/local/apr-util \
> --enable-so \ #支持动态扩展模块
> --enable-mods-shared=most #表示以共享的方式安装大多数功能模块
PHP是Apache的一个模块,这个模块实际上就是一个文件,就是 .so 后缀名的文件,那他以Apache的一个模块形式存在,所以Apache本身是一个进程,是一个服务,在这个进程里面,通过一些配置文件指定一个模块的路径,那就可以去调用模块。
PHP模块是用来解析PHP的,执行PHP脚本的,所以就可以通过PHP脚本将PHP模块加载到进程里面去,加载到主进程里面去,
当它遇到PHP解析的需求时,它就会去调用这个模块,去执行一些操作
这些模块是一些独立的文件而且还可以指定有哪些动态扩展的模块,需要加载哪些,这里指定是most
–enable-mods-shared=mostmost,就是绝大多数,大多数会用到的模块,都会加载进来
安装后
在安装完成后,进入到/usr/local/apache2.4/目录下,并 ls 查看有哪些目录
[root@han01 httpd-2.4.33]# cd /usr/local/apache2.4/
[root@han01 apache2.4]# ls
bin build cgi-bin conf error htdocs icons include logs man manual modules
- /bin目录下,是可执行文件。也就是说,要启动一个服务,它就是在bin/httpd下面有一个文件或者命令,bin/httpd也是核心的二进制文件
[root@han01 apache2.4]# ls bin/httpd
bin/httpd
[root@han01 apache2.4]# ls -l bin/httpd
-rwxr-xr-x. 1 root root 2348432 6月 27 05:30 bin/httpd
[root@han01 apache2.4]# du -sh bin/httpd
2.3M bin/httpd
- conf目录,是配置文件所在目录
[root@han01 apache2.4]# ls conf/
extra httpd.conf magic mime.types original
- htdocs目录,是存放了一个访问页。启动完httpd服务后,去访问网站,默认的网站会放到 htdocs/目录下
[root@han01 apache2.4]# ls htdocs/
index.html
- logs目录,就是日志相关的目录,包含错误日志,访问日志
- man目录,就是一些帮助文档
- modules扩展模块目录,所有模块都放到了modules目录下,每一个模块都代表着一个功能
[root@han01 apache2.4]# ls modules
httpd.exp mod_buffer.so mod_lbmethod_heartbeat.so mod_reqtimeout.so
mod_access_compat.so mod_cache_disk.so mod_log_config.so mod_request.so
mod_actions.so mod_cache.so mod_log_debug.so mod_rewrite.so
mod_alias.so mod_cache_socache.so mod_logio.so mod_sed.so
mod_allowmethods.so mod_cgid.so mod_macro.so mod_session_cookie.so
mod_auth_basic.so mod_dav_fs.so mod_mime.so mod_session_dbd.so
mod_auth_digest.so mod_dav.so mod_negotiation.so mod_session.so
查看Apache加载了哪些模块
/usr/local/apache2.4/bin/httpd -M 查看加载的模块
-M 把所有的模块列出来 等于
- /usr/local/apache2.4/bin/apachectl -M //查看加载的模块——>这是一个shell文件,它调用了二进制的httpd
[root@han01 apache2.4]# /usr/local/apache2.4/bin/httpd -M
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::e009:8425:90b5:4c23. Set the 'ServerName' directive globally to suppress this message
Loaded Modules:
core_module (static)
so_module (static)
http_module (static)
mpm_event_module (static)
省略..
autoindex_module (shared)
dir_module (shared)
alias_module (shared)
[root@han01 apache2.4]# /usr/local/apache2.4/bin/apachectl -M
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::e009:8425:90b5:4c23. Set the 'ServerName' directive globally to suppress this message
Loaded Modules:
core_module (static)
so_module (static)
省略..
autoindex_module (shared)
dir_module (shared)
alias_module (shared)
- 在模块的右侧有小括号,里面是 static 或 shared ,static是静态
- 静态和动态的区别
静态是直接把模块编译进了主脚本或主二进制文件里面 - http是一个核心文件,这个文件加载了哪些模块
- 如果是static,那也就意味这个模块在httpd里面,和它绑定在了一起,它们是一个整体
- 如果是shared,说明它是一个扩展的模块,这个模块是一个文件,我们可以看到的 .so 文件,文件的目录是在/usr/local/apache2.4/module目录下
启动Apache2.4
在安装完成Apache2.4后,Apache启动不需要定义启动脚本,也不需要放到/etc/init.d下去,直接使用命令行启动就行
/usr/local/apache2.4/bin/apachectl start 命令行启动Apache脚本
启动脚本后,虽然出现提示,但不表示启动失败,若不想要出现提示,只需要编辑配置文件即可
[root@han01 apache2.4]# /usr/local/apache2.4/bin/apachectl start
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::e009:8425:90b5:4c23. Set the 'ServerName' directive globally to suppress this message
httpd (pid 34948) already running
[root@han01 apache2.4]# 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:22 0.0.0.0:* LISTEN 889/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1121/master
tcp6 0 0 :::80 :::* LISTEN 34948/bin/httpd
tcp6 0 0 :::22 :::* LISTEN 889/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1121/master
[root@han01 apache2.4]# ps aux |grep httpd
root 34948 0.0 0.1 95580 2528 ? Ss 05:33 0:00 bin/httpd
daemon 34953 0.0 0.2 382408 4436 ? Sl 05:33 0:00 bin/httpd
daemon 34954 0.0 0.2 382408 4436 ? Sl 05:33 0:00 bin/httpd
daemon 34955 0.0 0.2 382408 4436 ? Sl 05:33 0:00 bin/httpd
root 35050 0.0 0.0 112720 984 pts/0 R+ 05:39 0:00 grep --color=auto httpd
httpd默认监听端口为80,mysqld默认监听端口为3306,25端口是发邮件的,22端口是远程登录的
五、安装PHP5
PHP介绍
目前主流的PHP版本为5.6或7.1版本
现在很多企业是使用PHP 5 的版本,5.4版本或5.3版本,或者使用更老的版本
PHP7 的版本是近几年才出来的,7的版本改动很大,所以比较老的程序里面使用PHP7会出现问题,所以很多企业必须使用PHP5 ,而使用PHP7 会出现问题
PHP7 性能上得到很大的提升,如果程序,也就是你的PHP代码能够使用PHP7 ,那就使用PHP7 ,否则就使用PHP5
安装PHP5
切换到 /usr/local/src目录下,下载php5.6 的压缩包,然后解压
[root@han01 apache2.4]# cd /usr/local/src/
[root@han01 src]# wget http://cn2.php.net/distributions/php-5.6.32.tar.bz2
[root@han01 src]# tar jxvf php-5.6.32.tar.bz2
切换到php-5.6.32目录下,编译PHP5.6
[root@han01 src]# cd php-5.6.32/
[root@han01 src]# ./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
- –prefix=/usr/local/php 表示指定它的安装目录
- –with-apxs2=/usr/local/apache2.4/bin/apxs //apxs2,它是apache的一个工具,这个工具能让我们不用去人工的干涉它,它可以自动的帮你去把扩展的模块放到Apache中的modules目录里,并且在它的配置文件里加上一行load module
- –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 //指定mysql的路径。
- 这是三种不同的mysql驱动,原因是你想要把你的PHP和mysql相互通信,首先需要编译出支持它的模块来,因为在PHP代码里面,定义了连接mysql的命令,一段代码,若是没有相应的驱动,那根本是无法识别的
- –with-mysql 和 –with-mysqli 是有区别的,它们两者功能是相同的,目的都是为了让PHP去支持mysql,老版本中使用 –with-mysql,新版本中使用 –with-mysqli ,在PHP7中就不再使用–with-mysql 了
- –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 //指定PHP需要的模块,若是没有特殊的要求,直接复制这些参数即可,这些参数是通用的
configure: error: mcrypt.h not found. Please reinstall libmcrypt.
发现上述错误
解决方法:
若没有安装过eprl扩展源,则必须先安装epel-release包——>yum install -y epel-release
再来安装 libmcrypt-devel 包——>yum install -y libmcrypt-devel
安装后再次执行,检查一下,发现没问题,最后make && make install,安装完成
[root@han01 php-5.6.32]# echo $?
0
[root@han01 php-5.6.32]# make && make install
查看PHP目录/usr/local/php/
PHP核心的二进制文件,在/usr/local/php/bin/目录下
[root@han01 ~]# ls /usr/local/php/
bin etc include lib php
查看/usr/local/apache2.4/modules/libphp5.so文件大小
这个就是我们想要的扩展模块,apache和php结合起来,是通过这个.so 文件实现的
[root@han01 ~]# du -sh /usr/local/apache2.4/modules/libphp5.so
36M /usr/local/apache2.4/modules/libphp5.so
这时候若是想把/usr/local/php/bin/php 目录删除也没有问题,因为要的仅仅
是/usr/local/apache2.4/modules/libphp5.so文件
查看php加载的模块都有哪些,命令/usr/local/php/bin/php -m
[root@han01 ~]# /usr/local/php/bin/php -m
[PHP Modules]
bz2
Core
ctype
date
dom
ereg
这些加载的模块都是静态的
PHP是作为Apache的模块存在的,查看Apache的模块
- 可以看到最下方的 php5_module (shared) ,这个说明php是做为httpd 的一个扩展模块形式存在的
- Apache需要去执行php的文件,需要借助于php module ,需要这个模块,需要这个.so 文件
- 若是把 .so 一删除,那Apache肯定不支持php了
- php5_module (shared) 这个模块非常重要
[root@han01 ~]# /usr/local/apache2.4/bin/httpd -M
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::e009:8425:90b5:4c23. 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)
查看模块文件大小
ls -l /usr/local/apache2.4/modules/libphp5.so
[root@han01 ~]# ls -l /usr/local/apache2.4/modules/libphp5.so
-rwxr-xr-x. 1 root root 37743776 6月 27 06:01 /usr/local/apache2.4/modules/libphp5.so
打开/usr/local/apache2.4/conf/httpd.conf文件
/usr/local/apache2.4/conf/httpd.conf 这是Apache的配置文件
[root@han01 ~]# vim /usr/local/apache2.4/conf/httpd.conf
去搜索php5.so,会发现自动增加了一行
若想使用文件中的那一个模块,将前面的 # 号去除即可使用
若想不使用哪个模块,只需要加一个 # 号即可
把配置文件拷贝到指定路径下
可以查看到PHP的一些信息,包括编译参数,Configuration File 的路径
[root@han01 ~]# /usr/local/php/bin/php -i |less -i
拷贝配置文件
cp php.ini-production /usr/local/php/etc/php.in
php.ini-development 这个是测试环境用的
php.ini-production 这个是线上生产环境用的
[root@han01 ~]# cd /usr/local/src/
[root@han01 src]# cd php-5.6.32/
[root@han01 php-5.6.32]# cp php.ini-production /usr/local/php/etc/php.ini
查看/usr/local/php/bin/php -i |less
加载了路径
Configuration File (php.ini) Path => /usr/local/php/etc
Loaded Configuration File => /usr/local/php/etc/php.ini
Scan this dir for additional .ini files => (none)
他人出现的问题解决方法:
https://blog.csdn.net/weixin_39663255/article/details/80459107
六、安装PHP7
cd /usr/local/src/
wget http://cn2.php.net/distributions/php-7.1.6.tar.bz2
tar zxf php-7.1.6.tar.bz2
cd 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
make && make install
ls /usr/local/apache2.4/modules/libphp7.so
cp php.ini-production /usr/local/php7/etc/php.ini
切换到/usr/local/src/目录下,下载安装包,并解压
[root@han01 php-5.6.32]# cd /usr/local/src/
[root@han01 src]# wget http://cn2.php.net/distributions/php-7.1.6.tar.bz2
[root@han01 src]# tar jxvf php-7.1.6.tar.bz2
切换到php-7.1.6目录下
[root@han01 src]# cd php-7.1.6/
[root@han01 php-7.1.6]#
初始化配置
这里php7和php5的区别:
- –prefix=/usr/local/php7这里定义的目录名字是php7
- –with-config-file-path=/usr/local/php7/etc这里定义的配置文件路径是php7
- 这里只有–with-mysqli,没有–with-mysql,而其他的都类似
[root@han01 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
检查一下,然后make && make install
[root@han01 php-7.1.6]# echo $?
0
[root@han01 php-7.1.6]# make && make install
一台机器上安装两个php,两个PHP是可以同时存,但是Apache调用PHP的时候,需要指定好,在——> vim /usr/local/apache2.4/conf/httpd.conf 里面指定使用哪一个PHP即可
查看libphp7和5是不同的
/usr/local/apache2.4/modules/libphp7.so
[root@han01 php-7.1.6]# ls /usr/local/apache2.4/modules/libphp7.so
/usr/local/apache2.4/modules/libphp7.so
[root@han01 php-7.1.6]# du -sh /usr/local/apache2.4/modules/libphp7.so
37M /usr/local/apache2.4/modules/libphp7.so
查看php7所加载的模块,/usr/local/php7/bin/php -m,和php5基本是一致的
[root@han01 php-7.1.6]# /usr/local/php7/bin/php -m
[PHP Modules]
bz2
Core
ctype
date
dom
exif
fileinfo
查看Apache加载了几个php,会看到加载了php5和php7
[root@han01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl -M
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::e009:8425:90b5:4c23. 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)
省略
php5_module (shared)
php7_module (shared)
若想去使用哪一个PHP,根据自己的实际需求
[root@han01 php-7.1.6]# vim /usr/local/apache2.4/conf/httpd.conf
搜索php5.so
七、Apache和PHP结合
配置httpd支持php目录概要
- httpd主配置文件/usr/local/apache2.4/conf/httpd.conf
- vim /usr/local/apache2.4/conf/httpd.conf //修改以下4个地方
ServerName
Require all denied
AddType application/x-httpd-php .php
DirectoryIndex index.html index.php - /usr/local/apache2.4/bin/apachectl -t //测试语法
- /usr/local/apache2.4/bin/apachectl start //启动服务
- netstat -lntp curl localhost
vim /usr/local/apache2.4/htodcs/test.php //增加如下内容
编辑httpd的配置文件
- 在安装好Apache、mysql、httpd,但是还未结合在一起,虽然apche调用了php作为它的模块,但是还不知道是否能解析php,所以现在还是需要编辑Apache的配置文件
- httpd主配置文件,在/usr/local/apache2.4/conf/httpd.conf下
编辑四个地方 - 定义ServerName,去除 # 号
- 在/usr/local/apache2.4/bin/apachectl restart 乍一看是报错信息,其实只是一个警告信息,并不是错误,若想不看到这个提示,可以在 /usr/local/apache2.4/conf/httpd.conf 取消掉
方法:在/usr/local/apache2.4/conf/httpd.conf 中搜索 /ServerName ,然后将 # - ServerName www.example.com:80 前的# 去除掉,保存退出即可 - 把Require all denied 改成
- 若是不更改,那么访问会是 403
第一处:取消警告信息
在运行/usr/local/apache2.4/bin/apachectl restart 会跳出警告信息
进入配置文件 vim /usr/local/apache2.4/conf/httpd.conf
[root@han01 php-7.1.6]# vim /usr/local/apache2.4/conf/httpd.conf
将其中ServerName www.example.com:80前的#号删除
重新运行命令,还是不行,显示79行错误
[root@han01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl restart
httpd not running, trying to start
/usr/local/apache2.4/bin/apachectl: 行 79: 55520 段错误 $HTTPD -k $ARGV
原因:是因为在最后调用了两个PHP,加载了两个PHP,导致冲突
解决方法:只需要注释掉一个PHP即可
加个#号
#LoadModule php7_module modules/libphp7.so
注释掉后就正常了
[root@han01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl start
查看httpd进程
因为在打开了ServerName,就不在提示警告信息了
[root@han01 php-7.1.6]# ps aux |grep httpd
root 55547 0.0 0.5 253628 8940 ? Ss 19:03 0:00 /usr/local/apache2.4/bin/httpd -k start
daemon 55548 0.0 0.5 540456 8980 ? Sl 19:03 0:00 /usr/local/apache2.4/bin/httpd -k start
daemon 55549 0.0 0.5 540456 8980 ? Sl 19:03 0:00 /usr/local/apache2.4/bin/httpd -k start
daemon 55550 0.0 0.5 540456 8980 ? Sl 19:03 0:00 /usr/local/apache2.4/bin/httpd -k start
root 55633 0.0 0.0 112720 984 pts/0 S+ 19:04 0:00 grep --color=auto httpd
更改Require all denied
用浏览器访问自己虚拟机的IP,会发现无法访问
排查方法:
查看IP是否是通的,用物理机去ping 虚拟机的 IP
若IP是通的,再去判断80端口是否是通的——>用物理机去ping80端口
C:\Users\hhhhhxh>ping 192.168.0.115
正在 Ping 192.168.0.115 具有 32 字节的数据:
来自 192.168.0.115 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.0.115 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.0.115 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.0.115 的回复: 字节=32 时间<1ms TTL=64
192.168.0.115 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms
C:\Users\hhhhhxh>telnet 192.168.0.115 80
'telnet' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
- 因为windows 并没有打开telnet 客户端,所以会提示并没有这个命令
- 打开telnet客户端——>注意:不要打开Telnet服务端,否则会监听23端口,不安全 (打开物理机的控制面板 –然后选择程序–再选择打开或关闭Windows功能–选择Telnet客户端,并打开)
- 若是可以运行 telnet 命令,那出来的则是一个结果,显示80并不通,因为在linux虚拟机上,并没有打开80端口
C:\Users\hhhhhxh>telnet 192.168.0.115 80
正在连接192.168.0.115...无法打开到主机的连接。 在端口 80: 连接失败
在虚拟机上,使用iptables -nvL 命令,会查看到80端口并没有打开
若想要windows机器去访问它,还需要加上一个操作
临时加上80端口 :iptables -I INPUT -p tcp –dport 80 -j ACCEPT
[root@han01 ~]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT
再去物理机上访问虚拟机的IP,会显示一下内容
It works!
之前不能正常访问,就是由于防火墙的规则,没有加上80端口,不能正常访问
再CMD查看80端口,这样的界面表示80端口通了
在物理机中按 ctrl+] 退出来,然后在按 quit 字符退出
这是因为在/usr/local/apache2.4/conf/httpd.conf配置文件中,有一个Require all denied
将denied 改成 granted
<Directory />
AllowOverride none
Require all granted
</Directory>
在更改完配置文件,需要重新加载配置
/usr/local/apache2.4/bin/apachectl -t //检查你修改的配置文件是否存在错误
因为要支持php,所以要增加一行php相关的配置
搜索 /AddType,增加AddType application/x-httpd-php .php
再加引索页
搜索 /Index,加上index.php
<IfModule dir_module>
DirectoryIndex index.html index.php
</IfModule>
检查配置是否有错误
[root@han01 ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
重新加载配置文件
[root@han01 ~]# /usr/local/apache2.4/bin/apachectl graceful
检查Apache是否支持解析php5
写一个测试php脚本
在访问的时候,访问的是htdocs下的文件
phpinfo,可以把php的相关信息打[root@han01 ~]# vi /usr/local/apache2.4/htdocs/1.php
<?php
phpinfo();
?>
这时在浏览器访问http://192.168.0.115/1.php
当看到php正常显示,如上图,那说明php支持支持解析
如果php不支持解析(以上四步骤错误一处),那么刷新页面显示出来的则是源代码(就是 1.php 文件中的代码)
如果遇到php无法解析,则去检查Apache的配置文件
- 第一项,查看是否加载php5模块,使用/usr/local/apache2.4/bin/apachectl -M命令
- 如果没有加载这个模块,查看这个模块是否存在。使用 ls /usr/local/apache2.4/modules/libphp5.so查看文件是否存在,若是文件都没有,那么肯定不会加载这个模块
- 第二项,如果有文件,则没有显示php模块,那么就要去看apache的配置文件中有没有加载 libphp5 这一行配置,在文件中搜索/libphp5 ,如果没有这一行配置,那么肯定也是无法解析的
- 第三项,检查配置文件中是否加载了 AddType application/x-httpd-php .php 这一行
- 在 .php 前面有一行空格,需要注意下!不能遗忘!!!——>使用 /usr/local/apache2.4/bin/apachectl -t 可以检查出配置写错了
- 第四项,检查是否加了 index.php
- 在访问一个网站的时候,比如访问www.baidu.com的时候,并不用是www.baidu.com/index.php访问,会发现,两个访问出的页面是相同的,就是因为这里有索引页(或者叫做index页),它默认能跳转到这个页面下去,包括直接输入虚拟机ip的时候,也会访问到 It works!这是访问到的是 index.html ,就是因为我们定义了一个index
检查Apache是否支持解析php7
打开配置文件,注释掉php5,打开php7
[root@han01 ~]# vim /usr/local/apache2.4/conf/httpd.conf
#LoadModule php5_module modules/libphp5.so
LoadModule php7_module modules/libphp7.so
快捷键 ctrl+r ,可以快速执行命令历史中所用过的一些命令
在快捷键 ctrl+r 之后,然后输入命令的一些字母,就会显示出你使用过的命令
检查配置文件是否存在语法错误,并重新加载配置文件
[root@han01 ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@han01 ~]# /usr/local/apache2.4/bin/apachectl graceful
用物理机访问虚拟机的ip,正常
在浏览器打开看到的phpinfo,和/usr/local/php7/bin/php -i |less看到的结果基本是一致的,只不过一个是文本形式,一个是图形化,图形化看起来更加直观,清晰明了
Apache配置文件
为什么可以在htdocs下面中可以访问到 index.html、1.php
这是因为在/usr/local/apache2.4/conf/httpd.conf配置文件中的 DocumentRoot 参数,定义了网站的根目录在哪里,域名就是定义的ServerName
扩展:
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 http://man.chinaunix.net/newsoft/ApacheMenual_CN_2.2new/programs/apxs.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