笔记10 LAMP架构(MySQL、mariadb、Apache、PHP五、PHP七、)

MySQL安装
javascript

MySQL的几个经常使用安装包:rpm、源码、二进制免编译php

 把下载的包保存在这个目录里:cd /usr/local/src  因此要先进入这个目录下css

第一步,下载源码包:html

 wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz java

第二步,解压:mysql

 tar zxvf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gzlinux

第三步,把解压的这个目录移动到usr、local下并更名为mysql:git

 mv mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysqlgithub

第四步,进入到这个目录下:redis

 cd /usr/local/mysql

第五步,建立一个mysql用户:

 useradd mysql

第六步,建立一个目录:这个目录是为了存放mysql的数据

 mkdir /data/  

第七步,初始化一下让它生成/data/mysql这个目录:

 ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql

[root@aaa-01 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

缺乏软件包须要安装,咱们先模糊搜索一下,若是不清楚哪一个是能够把他们都装上,都试试。

[root@aaa-01 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

安装:yum install -y perl-Data-Dumper

问题

[root@bbb-01 mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql
Installing MySQL system tables..../bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory

解决办法

[root@bbb-01 mysql]# yum install libaio* -y

怎检验错误,两种方法:要不运行echo $?

[root@aaa-01 mysql]# echo $?
0

要不看是否是有两个OK

image.png

image.png

第七步,修改mysql自带的配置文件(mysqld的配置文件就叫my.cnf固定放在etc下)

vim /etc/my.cof

更改路径

datadir=/data/mysql

socket=/tmp/mysql.sock

注释掉这三段,暂时不用

log-error=/var/log/mariadb/mariadb.log

pid-file=/var/run/mariadb/mariadb.pid

!includedir /etc/my.cnf.d

image.png

第八步,拷贝启动脚本

 cp support-files/mysql.server /etc/init.d/mysqld

第九步,编辑配置文件

 vi /etc/init.d/mysqld

定义basedir和datadir 在配置文件最下边

basedir=/usr/local/mysql 指定mysql 的程序目录
datadir=/data/mysql 指定日期目录

 wKioL1mBxpPTyHAKAAAMEXcsMtE255.png

第十步,添加到系统服务中去,让他开机启动:

 chkconfig --add mysqld  查看一下:chkconfig --list

image.png

第十一步,启动服务:service mysqld start 或者用:/etc/init.d/mysqld start

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

查看进程:ps aux |grep mysql

image.png

查看监听端口:netstat -lntp(默认监听3306端口)

image.png

停掉服务命令:service mysqld stop


 也能够用命令行的方法启动:

wKioL1mBySDhqP_QAAB_G3nWB1o411.png

可是用平时的命令停不了须要:停掉服务命令:killall mysqld

若是碰到mysqld的进程杀不死你等了一分钟尚未杀死ps还会有进程那证实他数据量很大正在慢慢写入到磁盘里去这事你不能用kill -9杀死这个进程这样可能会致使你丢失数据或者损坏你的表



mariadb安装

cd /usr/local/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

 解压安装包:tar zxvf mariadb-10.2.6-linux-glibc_214-x86_64.tar.gz

 把安装包拷贝到usr/local目录下来:mv mariadb-10.2.6-linux-glibc_214-x86_64 /usr/local/mariadb

 cd /usr/local/mariadb

 ./scripts/mysql_install_db --user=mysql --basedir=/usr/local/mariadb/ --datadir=/data/mariadb

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

 vi /usr/local/mariadb/my.cnf //定义basedir和datadir 基本不用改

 cp support-files/mysql.server /etc/init.d/mariadb

 vim /etc/init.d/mariadb //更改启动脚本

 定义basedir=/usr/local/mariadb

    datadir=/data/mariadb

    conf=$basedir/my.cnf  以及启动参数

 wKiom1mFNDSicmNbAAB7G1mtgYg954.png

 最后在启动脚本定义:搜 /start 大概在300行,定义一下,加上下边的的内容:定义的是配置文件所在的路径,目的是不和mysql产生冲突,假如说你的机器上只安装了mariadb就不须要自定义--defaults这个参数

wKiom1mFNIfjqmo_AAGzHE5VubU828.png

 启动它:/etc/init.d/mariadb start

 启动它以前先看看有没有mysqld服务在运行ps aux |grep mysqld,由于他俩监听的是一个端口,先把它关掉。

 查看是否启动成功:ps aux |grep mariadb

 查看监听端口:netstat -lntp 是否是3306

maridb的配置文件:/usr/local/mariadb/my.cnf



Apache安装

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

 Apache官网www.apache.org

第一步,下载这三个包:

下载到这个目录下:cd /usr/local/src

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

wget http://mirrors.hust.edu.cn/apache/apr/apr-1.6.5.tar.gz

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

 apr和apr-util是一个通用的函数库,它让httpd能够不关心底层的操做系统平台,能够很方便地移植(从linux移植到windows)

第二步,解压这三个包:

 tar zxvf httpd-2.4.39.tar.gz

 tar zxvf apr-util-1.6.5.tar.gz

 tar zxvf apr-1.6.1.tar.gz

第三步,安装apr:

 1.先进到apr-1.6.5目录下:cd /usr/local/src/apr-1.6.5

 2.安装apr:./configure --prefix=/usr/local/apr

AD0FN3F9I5$OVA)WN2B_A6B.png

成功

image.png

 3.make && make install 成功

image.png

 他下边会有四个目录:ls /usr/local/apr

image.png

安装apr-util:

 1.进到目录下:cd /usr/local/src/apr-util-1.6.1

 2.安装:./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr

@7V_LN~J@`03GY3E2{D@EZ3.png

image.png

yum install -y expat-devel

成功

image.png 

3.make && make install

image.png

编译httpd:

 1.进到目录下:cd /usr/local/src/httpd-2.4.39

 2.安装:./configure --prefix=/usr/local/apache2.4 --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-so --enable-mods-shared=most

报错

image.png

解决办法:须要把apr-util-1.6.1从新编译安装一下在编译httpd

若是报下边这种是由于缺乏pcre

configure: error: pcre-config for libpcre not found. PCRE is required and available from http://pcre.org/

解决办法:

下载:http://sourceforge.net/projects/pcre

image.png

下载pcre不要下载pcre2

image.png

下载:wget https://sourceforge.net/projects/pcre/files/pcre/8.43/pcre-8.43.tar.gz

解压:tar zxvf pcre-8.43.tar.gz

进到目录:cd pcre-8.43

编译:./configure --prefix=/usr/local/pcre

安装:make && make install

再回到httpd-2.4.39编译时加上--with-pcre=/usr/local/pcre参数就能够了

./configure --prefix=/usr/local/apache2.4 --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-so --enable-mods-shared=most --with-pcre=/usr/local/pcre

image.png

 3.make && make install 成功以下图

image.png

bin:下是启动文件

image.png 

/bin/httpt这个是核心的二进制文件

image.png

conf:配置文件所在目录

image.png

htdocs:是存放访问页,等启动httpd以后访问网站时默认的网站会放到这个目录下

image.png

modules:模块目录 ls /usr/local/apache2.4/modules 每一个模块都表明着一个功能

 /usr/local/apache2.4/bin/httpd -M //查看阿帕奇加载的模块

命令行启动apache:

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

image.png

查看有没有启动:ps aux |grep hpptd

image.png

查看端口号:netstat -lntp(httpd默认监听80端口)

image.png


安装PHP5

必须先安装阿帕奇,由于编译PHP的时候他会用到阿帕奇的一个工具(--with-apxs2)

PHP介绍

PHP官网www.php.net

目前主流的PHP版本为5.6或7.1版本

如今不少企业是使用PHP 5 的版本,5.4版本或5.3版本,或者使用更老的版本

PHP7 的版本是近几年才出来的,7的版本改动很大,因此比较老的程序里面使用PHP7会出现问题,因此不少企业必须使用PHP5 ,而使用PHP7 会出现问题

PHP7 性能上获得很大的提高,若是程序,也就是你的PHP代码可以使用PHP7 ,那就使用PHP7 ,不然就使用PHP5

安装过程:

第一步,进到src目录下:cd /usr/local/src/ 

第二步,下载安装包:wget http://cn2.php.net/distributions/php-5.6.39.tar.gz

第三步,解压:tar zxf php-5.6.39.tar.gz

第四步,进到目录下:cd php-5.6.39

第五步,安装编译:

./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须要的模块,如果没有特殊的要求,直接复制这些参数便可,这些参数是通用的

错误1

yum install -y libxml2-devel

image.png 

错误2

yum install -y openssl-devel

image.png

错误3

yum install bzip2-devel

image.png

错误4

yum install -y libjpeg-devel

image.png

问题5

yum install -y libpng-devel

image.png

问题6

yum install -y freetype-devel

image.png

问题7

缺乏 libmcrypt-devel 库,可是在CentOS源不能安装libmcrypt-devel,因为版权的缘由没有自带mcrypt的包。

若没有安装过eprl扩展源,则必须先安装epel-release包:

yum install -y epel-release

再来安装 libmcrypt-devel 包:

yum install -y libmcrypt-devel

image.png

报错,缘由是yum源问题解决办法:http://www.javashuo.com/article/p-ywkjdcgq-bk.html  

image.png

成功标志:echo $?

image.png

安装:make && make install 成功以下图

image.png

查看PHP目录ls /usr/local/php/

image.png

PHP核心的二进制文件,在/usr/local/php/bin/目录下

image.png

查看ls /usr/local/apache2.4/modules/libphp5.so文件大小

这个就是咱们想要的扩展模块,apache和php结合起来,是经过这个libphp5.so 文件实现的

image.png

/usr/local/php/bin/php -m#查看php加载的模板都有哪些,这些加载的模块都是静态的

[root@localhost php-5.6.39]# /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]
  • PHP是做为Apache的模块存在的,查看Apache的模块,能够看到最下方的 php5_module (shared) ,这个说明php是作为httpd 的一个扩展模块形式存在的,Apache须要去执行php的文件,须要借助于php module ,须要这个模块,须要这个libphp5.so 文件,如果把 libphp5.so 文件删除,那Apache确定不支持php了

    php5_module (shared) 这个模块很是重要!!!

[root@aaa-01 php-5.6.30]# /usr/local/apache2.4/bin/httpd -M
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::20c:29ff:fec2:55a. 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)
 php5_module (shared)

Apache的配置文件:/usr/local/apache2.4/conf/httpd.conf

去搜索php5.so,会发现自动增长了一行

image.png

若想使用文件中的那一个模块,将前面的 # 号去除便可使用,若想不使用哪一个模块,只须要加一个 # 号便可

  • 第六步 安装完PHP以后,须要把配置文件拷贝到指定路径下:

/usr/local/php/bin/php -i |less -i 能够查看到PHP的一些信息,包括编译参数,Configuration File 的路径

image.png

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

两个配置文件

· php.ini-development 这个是测试环境用的

· php.ini-production 这个是线上生产环境用的

image.png

这时再来查看/usr/local/php/bin/php -i |less发现他已经加载了路径

image.png


安装PHP7

 安装方法跟PHP5同样!!!

 cd /usr/local/src/ 

 wget http://cn2.php.net/distributions/php-7.1.6.tar.bz2

 tar jvxf 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

这里php7和php5的区别

--prefix=/usr/local/php7这里定义的目录名字是php7

--with-config-file-path=/usr/local/php7/etc这里定义的配置文件路径是php7

这里只有--with-mysqli,没有--with-mysql,而其余的都相似

make && make install

查看PHP7的文件

查看libphp7和5是不一样的,ls/usr/local/apache2.4/modules/libphp7.so

 image.png

查看php7所加载的模块,和php5基本是一致的

[root@aaa-01 php-7.1.6]# /usr/local/php7/bin/php -m
[PHP Modules]
bz2
Core
ctype
date
dom
exif
fileinfo
filter
gd
hash
iconv
json
libxml
mbstring
mcrypt
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]


查看Apache加载了几个php,会看到加载了php5和php7

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

image.png

 小常识:一台机器上安装两个php,两个PHP是能够同时存,可是Apache调用PHP的时候,须要指定好,在——> vim /usr/local/apache2.4/conf/httpd.conf 里面指定使用哪个PHP便可

拷贝配置文件:

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

PHP5跟PHP7不想用哪一个就把它注释掉,编辑配置文件

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

搜索php5.so,会看到有两行

想使用哪一个php,就在另外一个前面加 # 号注释掉,而后保存 

wKiom1mESFvg1DOXAAAhvLqyOJk171.png


  • Apache和PHP结合,Apache默认虚拟主机

配置http支持PHP

编辑一下httpd主配置文件/usr/local/apache2.4/conf/httpd.conf

vim /usr/local/apache2.4/conf/httpd.conf //修改如下4个地方

第一步,搜索:ServerName 把这个服务打开,前边的井号去掉

wKiom1mFPZKg2Hc8AAAgaVFqB9w807.png 

去掉以后他就不会在提示下面的错误信息了

image.png      

第二步,增长一行配置,搜索:Require all denied 改为:Require all granted

第三步,搜AddType加上下边这条命令:

加他的目的是为了能让php能解析

AddType application/x-httpd-php .php

wKioL1mFV0ST_QWzAAAgr4FlnDw553.png


第四步,增长索引页,搜索Index,加上下边语句:

DirectoryIndex index.html index.php

image.png


每次写完配置文件都要执行一下这两步!!

检查配置文件语法是否正确,加上-t选项
 /usr/local/apache2.4/bin/apachectl -t
从新加载配置文件,加上graceful
 /usr/local/apache2.4/bin/apachectl graceful

提示错误

image.png

缘由:是由于在最后调用了两个PHP,加载了两个PHP,致使冲突

解决方法:只须要注释掉一个PHP便可

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

搜索php5.so,会看到有两行,注释一个便可

image.png


第五步,写一个脚本看看阿帕奇能不能解析PHP:

vi /usr/local/apache2.4/htdocs/1.php #脚本内容以下:

image.png

写完在浏览器上访问一下IP加1.php:192.168.232.132/1.php  只要能出下边的页面就证实能解析

image.png

若是不能解析那么你就检查一下Apache配置文件:

第一项,看看php5有没有加载:

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

image.png

若是没有加载php5,你就要看看他有没有这个模块,有没有这个文件:

ls /usr/local/apache2.4/modules/libphp5.so

image.png

若是有文件也没有显示,查看配置文件里边有没有加载php5:

vim /usr/local/apache2.4/conf/httpd.conf    搜索libphp5.so

image.png

在查看配置文件里有没有加AddType这一行搜索AddType

AddType application/x-httpd-php .php

image.png

/usr/local/apache2.4/bin/apachectl -t //测试语法

/usr/local/apache2.4/bin/apachectl start //启动服务

netstat -lntp 


用curl localhost测试一下是否解析成功

vim /usr/local/apache2.4/htdocs/test.php //增长以下内容

image.png

curl localhost/test.php

image.png



http的默认虚拟主机

 一台服务器能够访问多个网站,每一个网站都是一个虚拟主机

任何一个域名解析到这个主机台机器,均可以访问的虚拟主机就是默认虚拟主机

 概念:域名(主机名)、DNS、解析域名、hosts

window下边的hosts在C:\Windows\System32\drivers\etc路径下,能够定义一个域名指向到一个IP,例如

image.png

定义完在windows上边ping一下它确实指向了定义的IP上,若是不指定他会指向到一个公网IP上

image.png


 配置虚拟主机

编辑配置文件:vim /usr/local/apache2.4/conf/httpd.conf 搜索httpd-vhosts,去掉#

image.png

由于配置文件仅仅能定义一个ServerName,因此如今打开一个二级配置文件

二级配置文件就是虚拟主机配置文件

在这个配置文件里,是能够定义多个ServerName的

vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf//改成以下

<VirtualHost *:80>
    ServerAdmin admin@aminglinux.com            #这个是要定义邮箱,要不要无所谓能够删掉
    DocumentRoot "/data/wwwroot/abc.com"        #这个定义网站的根目录在哪里,好比在/data/wwwroot/abc.com
    ServerName abc.com                  #网站域名(只容许写一个)  
    ServerAlias www.abc.com www.123.com     #网站别名,好比abc能够访问123也能够访问,能够写多个域名
    ErrorLog "logs/abc.com-error_log"        #错误日志
    CustomLog "logs/abc.com-access_log" common  #访问日志
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/111.com"
    ServerName www.111.com
    ServerAlias www.exaple.com
    ErrorLog "logs/111.com-error_log"
    CustomLog "logs/111.com-access_log" common
<VirtualHost *:80>
        DocumentRoot "/data/wwwroot/abc.com"  
        ServerName abc.com
        ServerAlias www.abc.com www.123.com
        ErrorLog "logs/abc.com-error_log"
        CustomLog "logs/abc.com-access_log" common
</VirtualHost>

<VirtualHost *:80>
        DocumentRoot "/data/wwwroot/111.com"
        ServerName 111.com
        ServerAlias www.example.com        //验证
        ErrorLog "logs/111.com-error_log"
        CustomLog "logs/111.com-access_log" common
</VirtualHost>

更改完配置文件建立对应的目录:

mkdir /data/wwwroot/

mkdir /data/wwwroot/abc.com

mkdir /data/wwwroot/111.com

而后在对应的站点根目录下建立一个好比说:index.php

vim /data/wwwroot/abc.com/index.php   给abc.com里边定义以下

<?php
echo "abc.com";

vim /data/wwwroot/111.com/index.php   给111.com里边定义以下

<?php
echo "111.com";

最后检查、重启

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

测试虚拟主机

mkdir -p /data/wwwroot/aming.com  /data/wwwroot/www.123.com 

 echo "aming.com" > /data/wwwroot/aming.com/index.html //网站默认的主页就是index.html   

 echo "123.com" > /data/wwwroot/123.com/index.html 

 curl -x127.0.0.1:80 aming.com //这样会去访问aming.com/index.html 

 curl -x127.0.0.1:80 www.123.com //访问www.123.com

 curl -x127.0.0.1:80 www.abc.com

image.png

 所谓虚拟主机就是:任何一个域名解析到这个ip上他都会去访问这个默认虚拟主机

在主配置文件中,httpd.conf里面,打开了虚拟主机配置文件,也就是删除到 # 号,那虚拟主机配置就生效了,一旦虚拟主机配置文件生效,那主配置文件里面所定义的DocumentRoot以及ServerName失效

虚拟主机配置文件一旦打开,能够定义不少个VirtualHost,每个VirtualHost都都有一个对应的 DocumentRoot 和 ServerName ,每个VirtualHost都表明着一个站点,都是一个虚拟主机。在虚拟主机里面有一个特殊的默认虚拟主机,所谓默认虚拟主机就是不管任何域名解析到这个IP上,都会去访问默认虚拟主机


httpd的用户认证

假如说访问123.com的时候有个需求,你能让你直接访问,须要输入用户名密码,验证经过以后呢才能访问,这样作的目的是为了增长安全性

在第二个上更改由于第一个是默认虚拟主机

image.png

vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf //把123.com那个虚拟主机编辑成以下内容

image.png

<Directory /data/wwwroot/111.com> //指定认证的目录
   AllowOverride AuthConfig //这个至关于打开认证的开关
   AuthName "111.com user auth" //自定义认证的名字,做用不大
   AuthType Basic //认证的类型,通常为Basic,其余类型阿铭没用过
   AuthUserFile /data/.htpasswd  //指定密码文件所在位置,这个要记住一会要生成他的密码文件
   require valid-user //指定须要认证的用户为所有可用用户
</Directory>

生成他的密码文件,-c建立密码文件,-m指定密码加密类型,好比说用户叫awei,输入两次密码

/usr/local/apache2.4/bin/htpasswd -c -m /data/.htpasswd awei

image.png

假如说你想在建立一个用户好比zhangsan,那就不须要-c建立密码文件了,由于刚才已经建立了,直接-m加用户名就能够/usr/local/apache2.4/bin/htpasswd -m /data/.htpasswd zhangsan

能够查看到生成的密码cat /data/.htpasswd

image.png

 从新加载配置-t , graceful

检查配置文件语法是否正确,加上-t选项
 /usr/local/apache2.4/bin/apachectl -t
从新加载配置文件,加上graceful
 /usr/local/apache2.4/bin/apachectl graceful

测试

如今虚拟机上用命令测试 

不指定用户密码:curl -x127.0.0.1:80 111.com //状态码为401,401表示须要用户验证

image.png

 指定用户密码:curl -x127.0.0.1:80 -uawei:123456789 111.com //状态码为200 

格式为:-u指定用户:用户密码 解释:下边的例子用户是aming密码是lishiming

image.png


在电脑浏览器上测试

先在Windows上绑定hosts,window下边的hosts在C:\Windows\System32\drivers\etc路径下

image.png

绑定完浏览器输入111.com,输入用户密码就能够访问到了

image.png



还能够针对单个文件进行认证

好比说访问123.php时再认证

    <FilesMatch 123.php>

        AllowOverride AuthConfig

        AuthName "123.com user auth"

        AuthType Basic

        AuthUserFile /data/.htpasswd

        require valid-user

    </FilesMatch>

image.png

 从新加载配置-t , 检测graceful

检查配置文件语法是否正确,加上-t选项
 /usr/local/apache2.4/bin/apachectl -t
从新加载配置文件,加上graceful
 /usr/local/apache2.4/bin/apachectl graceful

测试

编写一个123.php脚本vim /data/wwwroot/111.com/123.php 写入:

<?php
echo "123.php";

在虚拟机上:curl -x127.0.0.1:80 111.com  -I 你发现不用输入密码也能够访问到了

而访问123.com时则是401:curl -x127.0.0.1:80 111.com/123.php -I

输入用户名密码就能够访问到:curl -x127.0.0.1:80 -uaming:lishiming 111.com/123.php



域名跳转

需求,把123.com域名跳转到www.123.com,配置以下:

<IfModule mod_rewrite.c> //须要mod_rewrite模块支持
        RewriteEngine on  //打开rewrite引擎功能,打开了下边的功能才会生效
        RewriteCond %{HTTP_HOST} !^111.com$  //定义rewrite的条件(何时才跳转),当主机名(域名)不是111.com时知足条件,他就会跳转
        RewriteRule ^/(.*)$ http://111.com/$1 [R=301,L] //定义rewrite规则,除去域名以外的连接或者其余的也跳转到111.com,当知足上面的条件时,这条规则才会执行,R权重301表示永久重定向,L跳转一次
</IfModule>

image.png

能够再这增长一个测试域名

image.png

 从新加载配置-t , 检测graceful

检查配置文件语法是否正确,加上-t选项
 /usr/local/apache2.4/bin/apachectl -t
从新加载配置文件,加上graceful
 /usr/local/apache2.4/bin/apachectl graceful

测试

1.先检查阿帕奇有没有加载rewrite模块:

/usr/local/apache2/bin/apachectl -M|grep -i rewrite

2.若无该模块,须要编辑配置文件,搜索:rewrite,删除前面的#

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

image.png

检查配置文件语法是否正确,加上-t选项
 /usr/local/apache2.4/bin/apachectl -t
从新加载配置文件,加上graceful
 /usr/local/apache2.4/bin/apachectl graceful

3.在查看有没有模板:/usr/local/apache2/bin/apachectl -M|grep -i rewrite

image.png

curl -x127.0.0.1:80 2111.com.cn //状态码为301,你发现他自动跳转到了111.com

image.png



httpd访问日志

访问日志记录用户的每个请求

日志所在目录:

[root@aaa-01 ~]# ls /usr/local/apache2.4/logs
111.com-access_log  abc.com-error_log                   dummy-host2.example.com-error_log  error_log
111.com-error_log   access_log                          dummy-host.example.com-access_log  httpd.pid
abc.com-access_log  dummy-host2.example.com-access_log  dummy-host.example.com-error_log

能够更改格式:

 vim /usr/local/apache2.4/conf/httpd.conf //搜索LogFormat 

它提供了两个日志的格式,默认使用的是第二种common

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
#h表示host来源IP,l表示login用户,u表示user用户密码,t表示time时间,r表示request(行为),s表示status状态码,b表示byte大小
#user-agent:用户代理
#referer:跳转到当前位置的上一个网址(即:提供当前IP的网站)

image.png 

把虚拟主机配置文件改为以下: 把默认的common格式改为combined

vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

 <VirtualHost *:80>

    DocumentRoot "/data/wwwroot/www.123.com"

    ServerName www.123.com

    ServerAlias 123.com

    CustomLog "logs/123.com-access_log" combined

</VirtualHost>

 从新加载配置文件 -t,graceful

 在访问:curl -x127.0.0.1:80 -I 123.com 

 查看日志:tail /usr/local/apache2.4/logs/123.com-access_log

image.png



访问日志不记录静态文件

网站大多元素为静态文件,如图片、css、js等,这些元素能够不用记录 

 把虚拟主机配置文件改为以下: 

vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

image.png

以什么结尾的标识符


    SetEnvIf Request_URI ".*\.gif$" img
    SetEnvIf Request_URI ".*\.jpg$" img
    SetEnvIf Request_URI ".*\.png$" img
    SetEnvIf Request_URI ".*\.bmp$" img
    SetEnvIf Request_URI ".*\.swf$" img
    SetEnvIf Request_URI ".*\.js$" img
    SetEnvIf Request_URI ".*\.css$" img

    CustomLog "logs/111.com-access_log" combined env=!img (只要符合这个条件的请求都不会记录到条件里)

image.png

从新加载配置文件 -t, graceful

测试

mkdir /data/wwwroot/111.com/images //建立目录,并在这目录下上传一个图片rz

image.png

curl -x127.0.0.1:80 -I 111.com/timg.jpg

tail /usr/local/apache2.4/logs/111.com-access_log 



访问日志切割

· 日志一直记录总有一天会把整个磁盘占满,因此有必要让它自动切割,并删除老的日志文件

· 作日志切割的目的,是为了防止磁盘写满,另外一个目的就是为了更方便的去管理日志

 把虚拟主机配置文件改为以下: 

vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

  <VirtualHost *:80>

    DocumentRoot "/data/wwwroot/www.111.com"

    ServerName www.111.com

    ServerAlias 111.com

    SetEnvIf Request_URI ".*\.gif$" img

    SetEnvIf Request_URI ".*\.jpg$" img

    SetEnvIf Request_URI ".*\.png$" img

    SetEnvIf Request_URI ".*\.bmp$" img

    SetEnvIf Request_URI ".*\.swf$" img

    SetEnvIf Request_URI ".*\.js$" img

    SetEnvIf Request_URI ".*\.css$" img 

    CustomLog "|/usr/local/apache2.4/bin/rotatelogs -l logs/111.com-access_%Y%m%d.log 86400" combined env=!img

</VirtualHost>

从新加载配置文件 -t, graceful

解释:

rotatelogs工具,它是Apache自带的一个切割工具

-l参数,目的是以当前系统时间为基准。若是不指定 -l ,那么就会指定 UTC时间 的格式去切割日志

在中国应该是 CST,在美国是 UTC ,二者时区不一样,相差几个小时

定义日志的名称,由于是切割的,因此根据时间日期让它自动变,就须要加一个变量%Y%m%d

%Y,表示 年

%m,表示 月

%d,表示 日

按规定时间去生成,时间段为1天,换算成秒,就是86400秒

测试:

这时候还须要去作一些访问,由于尚未任何的日志生成,在这个目录下尚未生成一个新的文件

[root@aaa-01 111.com]# ls /usr/local/apache2.4/logs/
111.com-access_log  abc.com-error_log                   dummy-host2.example.com-error_log  error_log
111.com-error_log   access_log                          dummy-host.example.com-access_log  httpd.pid
abc.com-access_log  dummy-host2.example.com-access_log  dummy-host.example.com-error_log

在访问一下:curl -x127.0.0.1:80 111.com/123.php

查看一下生成了新的日志文件:ls /usr/local/apache2.4/logs/以日期为后缀的新日志文件

image.png

查看新生成的日志文件内容,会看到就是刚刚curl命令访问的

[root@aaa-01 111.com]# cat /usr/local/apache2.4/logs/111.com-access_20180728.log
127.0.0.1 - - [28/Jul/2018:17:24:32 +0800] "GET HTTP://111.com/123.php HTTP/1.1" 200 7 "-" "curl/7.29.0"

· 在之后的凌晨0点的时候,就会生成一个新的日志

· 另外还须要作一个任务计划,超过一个月或两个月的日志删除,若是不删除,那是否切割日志就没有意义了



静态元素过时时间

浏览器访问网站的图片时会把静态的文件缓存在本地电脑里,这样下次再访问时就不用去远程下载了

静态元素,就是访问的图片、css、js

当用浏览器去访问一个网站的时候,这个网站里全部的静态文件(好比图片的样式、js),浏览器就会默认把静态文件缓存在电脑里,叫作临时的目录或目录

缓存的时间是在服务器上定义的,若是不去定义,那么浏览器也不会把这些文件清空,或者浏览器有本身的机制去清空这些文件,或者说电脑软件会定时帮你清理这些缓存的文件

为何电脑会自动加载这些静态文件呢?目的就是第二次,第三次访问的时候,不去服务器去下载这些静态文件了

在使用浏览器自带的F12键去进行比对,第一次访问一个图片的时候是200的状态码,第二次访问的时候,就是304,它检测到下载的图片并无修改过,因此就不会从新到服务器下载一次,这样能够节省带宽,但没有规定缓存何时清空,何时去服务器上去下载,再次下载,由于只要浏览器检测到图片未作更改,它这个状态码就一直为304,304这个状态码就意味着他不会去服务器下载

image.png

<IfModule mod_expires.c>
    ExpiresActive on  //打开该功能的开关
    ExpiresByType image/gif  "access plus 1 days"
    ExpiresByType image/jpeg "access plus 24 hours"
    ExpiresByType image/png "access plus 24 hours"
    ExpiresByType text/css "now plus 2 hour"
    ExpiresByType application/x-javascript "now plus 2 hours"
    ExpiresByType application/javascript "now plus 2 hours"
    ExpiresByType application/x-shockwave-flash "now plus 2 hours"
    ExpiresDefault "now plus 0 min"
</IfModule>

测试

查看一下expaire模块服务是否开启:

/usr/local/apache2.4/bin/apachectl -M |grep expaire

没开启须要编辑配置文件搜索:expires_module  把前边的#去掉

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

image.png

从新加载一下,在查看一下服务:

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

image.png

 curl测试一下:

[root@aaa-01 111.com]# curl -x127.0.0.1:80 111.com/linux.jpg -I
HTTP/1.1 200 OK
Date: Sat, 28 Jul 2018 09:56:32 GMT     #当前时间
Server: Apache/2.4.34 (Unix) PHP/5.6.30
Last-Modified: Sat, 28 Jul 2018 08:43:01 GMT
ETag: "595e-5720b37448f40"
Accept-Ranges: bytes
Content-Length: 22878
Cache-Control: max-age=86400 #缓存的时间
Expires: Sun, 29 Jul 2018 09:56:32 GMT #过时时间
Content-Type: image/jpeg

image.png



配置防盗链

经过限制referer来实现防盗链的功能

不是我认识的referer我就不容许你访问,好比说有一个第三方网站,原本图片是他本身的图片,可是这个图片的访问地址是A域名,而他在B域名里边去引用,这样是不容许的,只能在A域名里去访问才能够,这样图片会控制在咱们的服务器上,第三方的站点没办法引用 

解释:     

盗链是指在本身的页面上展现一些并不在本身服务器上的内容。一般的作法是经过技术手段得到它人服务器上的资源地址,绕过别人的资源展现页面,直接在本身的页面上向最终用户提供此内容。比较常见的是一些小站盗用大站的资源(图片、音乐、视频、软件等),对于这些小站来讲,经过盗链的方法能够减轻本身服务器的负担,由于真实的空间和流量均是来自别人的服务器。

        防盗链系统就是防范盗链的系统,防止别人经过一些技术手段绕过本站的资源展现页面,盗用本站的资源,让绕开本站资源展现页面的资源连接失效。实施防盗链系统后,由于屏蔽了那些盗链的间接资源请求,从而能够大大减轻服务器及带宽的压力

 配置文件增长以下内容

  <Directory /data/wwwroot/111.com>    #本站点的目录,实际上就是DocumentRoot
        SetEnvIfNoCase Referer "http://111.com" local_ref    #定义referer的白名单,你论坛总有一个域名吧,好比111.com和aaa.com
        SetEnvIfNoCase Referer "http://aaa.com" local_ref
        #SetEnvIfNoCase Referer "^$" local_ref     #空的referer也设为白名单,这里先注释掉
        <filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)">    #定义规则,这种格式的图片设置白名单
            Order Allow,Deny #Order顺序,
            Allow from env=local_ref
        </filesmatch>
    </Directory>

用电脑访问

image.png 

若是咱们想要直接在浏览器中访问111.com/qq.png,能够将虚拟主机配置文件中空referer行前的注释符去掉

而后检查配置文件是否有语法错误,并从新加载配置文件

这样就能够在浏览器中正常访问了

curl测试:

用curl模拟referer,-e指定referer

curl -e "http://www.aminglinux.com/123.html" 自定义referer



访问控制-Directory

以目录的形式

核心配置文件内容

  <Directory /data/wwwroot/www.111.com/admin/>

        Order deny,allow   以这顺序为主,哪一个在前边就先执行哪一个

        Deny from all       先拒绝

        Allow from 127.0.0.1  在容许

    </Directory>

 curl测试状态码为403则被限制访问了

curl -x127.0.0.1:80 111.com/admin/index.php -I,-x指定的是目标IP 127.0.0.1,限制的源IP也是127.0.0.1,也能够访问内容



访问控制-FilesMatch

针对文件或者连接

核心配置文件内容

<Directory /data/wwwroot/www.123.com>

    <FilesMatch  "admin.php(.*)">

        Order deny,allow

        Deny from all

        Allow from 127.0.0.1

    </FilesMatch>

</Directory>



访问控制-禁止php解析

核心配置文件内容

    <Directory /data/wwwroot/www.123.com/upload>

        php_admin_flag engine off

        <FilesMatch  (.*)\.php(.*)>

        Order allow,deny

        Deny from all

    </Directory>

 curl测试时直接返回了php源代码,并未解析



访问控制-user_agent

user_agent能够理解为浏览器标识

CC是一种访问***,它利用不少个肉鸡访问,是颇有规律的访问,这时咱们须要用user_agent来控制。

 核心配置文件内容

   <IfModule mod_rewrite.c>

        RewriteEngine on

        RewriteCond %{HTTP_USER_AGENT}  .*curl.* [NC,OR] //NC:表示忽略大小写 OR:或者

        RewriteCond %{HTTP_USER_AGENT}  .*baidu.com.* [NC]

        RewriteRule  .*  -  [F]

    </IfModule>

 curl -A "123123" 指定user_agent,模拟user_agent



php相关配置

 查看php配置文件位置

 /usr/local/php/bin/php -i|grep -i "loaded configuration file"可是这个不许

模拟一下,在111目录下建立一个phpinfo

编辑:vi index.php

把这个写进去:

<?php

phpinfo(); 

登陆网站:111.com/index.php查看它的配置文件,可是他并无加载,咱们须要复制一份:

先进入到他的源码包:cd /usr/local/src/php-7.1.6/

拷贝:cp php.init-development /usr/local/php7/etc/php.ini

刷新配置:/usr/local/apache2.4/bin/apachectl graceful

找到phpinfo所在的路径打开它进行配置

wKiom1mIFD_TMPwCAACUGNxgjyo949.png

vim /usr/local/php7/etc/php.ini

 搜索date.timezone定义时区

 Asia/Shanghai 上海

禁掉一些安全相关的函数

搜索下边这个:默认他是空的,把下边这些安全安全函数粘贴进去 

 disable_functions 安全函数

eval,assert,popen,passthru,escapeshellarg,escapeshellcmd,passthru,exec,system,chroot,scandir,chgrp,chown,escapeshellcmd,escapeshellarg,shell_exec,proc_get_status,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,leak,popepassthru,stream_socket_server,popen,proc_open,proc_close,phpinfo

打开调试错误日志

搜索:display_errors 

把On改为Off 这样他就不会把错误信息输出到浏览器中

配置一个错误日志搜索:log_errors On表示开启,

把日志定义到一个地方,搜索error_log,好比咱们放到/tmp/php_errors.log下去,还要定义errors.log的级别,搜索:error_reporting

open_basedir安全选项

 你一台服务器上跑了不少个站点,可能会有一个站点上代码有问题,结果站点被黑了,被人拿到了权  限,而后他会往里***,又跑到另外一个站点,可是这时我要加一个open_basedir,他就有可能黑不了,咱们能够给它作一个隔离,A网站目录在A目录下B网站在B目录下,这样即便A网站被黑了他也看不到B网站的目录,也不会被牵连进来,

搜索open_basedir

定义格式:/data/wwwroot/111.com:/

若是你这个网站上跑了N多个站点,能够再aoach的虚拟主机里边编辑:

打开:vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

加上这个php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/"



php动态扩展模块

/usr/local/php/bin/php -m //查看模块

 下面安装一个redis的模块

 cd /usr/local/src/

 wget https://codeload.github.com/phpredis/phpredis/zip/develop 

 mv develop phpredis-develop.zip

 unzip phpredis-develop.zip

 cd phpredis-develop

 /usr/local/php7/bin/phpize //生成configure文件

 ./configure --with-php-config=/usr/local/php7/bin/php-config

 make && make install

 /usr/local/php/bin/php -i |grep extension_dir //查看扩展模块存放目录,咱们能够在php.ini中去自定义该路径 

 vim /usr/local/php/etc/php.ini  //增长一行配置(能够放到文件最后一行)

extension = redis.so  

相关文章
相关标签/搜索