[11]LAMP架构

[11] LAMP架构部署

11.1 LAMP架构介绍

Linux+Apache+Mysql+PHP,本次采用Centos7+Mysql5.6.35(MariaDB 10.2.6)+Apache 2.4.27+PHP5.6/7.1

  • Httpd、PHP、Mysql三者工作原理
    mark

Apache不能直接和Mysql进行通讯,只能通过PHP模块进行通讯
Apache和PHP必须安装在同一台Linux机器
Apcche通过PHP和Mysql进行通讯,该过程为动态请求

1. PHP作为一种后台操作语言,类似asp,可以制作web页面,创建ajax请求,访问数据库的请求,操作数据库表格等。
2. Apache服务,它可以解析html文件,解析php文件,提供html发出的http请求,并响应这个请求,返回给html一个php或者其他后台脚本的请求,如果你不开启Apache的服务,请求不能进行,无法使用php或者asp访问后台数据。这是一个中间的过程,目前的理解是这样的。不启动回报404。
3. MySQL数据库的服务,php是脚本语言,可以页面,可以访问后台数据库,如果没有开启mysql服务,或者其他同类的访问数据库的服务,php中的脚本不能链接到数据库,不开启时,请求服务提示没有mysql对象,不启动回报找不到Mysql。   

总结:前端访问后台,总共需要三个过程,首先,html通过Apache服务请求php文件,或者其他url链接,如果是访问本地php文件,则要求两个文件在同一个服务下,第二步,php文件被Apache服务器解析,执行php文件,访问后台数据库,第三步,执行php文件里的指令,访问数据库中的表,返回数据作为html文件中创建的请求的响应,三个过程就是访问后台数据库的过程

11.2 Mysql、MariaDB介绍


  • Mysql介绍

一种开放源代码的关系型数据库管理系统(RDBMS),使用最常用的数据库管理语言–结构化查询语言(SQL)进行数据库管理。

1. MySQL是一个关系型数据库,由mysql ab公司开发,mysql在2008年被sun公司收购(10亿刀),2009年sun公司被oracle公司收购(74亿刀)
2. MySQL官网https://www.mysql.com  最新版本5.7GA/8.0DMR
3. MySQL5.6变化比较大,5.7性能上有很大提升


  • MariaDB介绍

MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。MariaDB主要由SkySQL公司(现更名为MariaDB公司)维护,SkySQL公司由MySQL原作者带领大部分原班人马创立.

1. Mariadb为MySQL的一个分支,官网https://mariadb.com/最新版本10.2
2. Mariadb5.5版本对应MySQL的5.5,10.0对应MySQL5.6
3. Community 社区版本,Enterprise 企业版,GA(Generally Available)指通用版本,在生产环境中用的,DMR(Development Milestone Release)开发
  • MariaDB虽然被视为MySQL数据库的替代品,但它在扩展功能、存储引擎以及一些新的功能改进方面都强过MySQL。而且从MySQL迁移到MariaDB也是非常简单的:
1、数据和表定义文件(.frm)是二进制兼容的
2、所有客户端API、协议和结构都是完全一致的
3、所有文件名、二进制、路径、端口等都是一致的
4、所有的MySQL连接器,比如PHP、Perl、Python、Java、.NET、MyODBC、Ruby以及MySQL C connector等在MariaDB中都保持不变
5、mysql-client包在MariaDB服务器中也能够正常运行
6、共享的客户端库与MySQL也是二进制兼容的

11.3 MySQL安装


  • Mysql常用安装包

主要有几种:rpm、源码包、二进制免编译
rpm包和二进制免编译包类似,但是rpm包安装无法指定安装路径,默认/usr/,而二进制免编译包则可以指定路径


  • Mysql编译

将下载好的源码包放在/usr/local/src下
点此下载Mysql5.6.35源码包
点此下载Mysql5.6.35二进制包

  1. 解压源码包
[root@localhost src]# tar zxvf mysql-5.6.35.tar.gz
[root@localhost src]# mv mysql-5.6.35/ /usr/local/mysql
[root@localhost src]# cd /usr/local/mysql/
  1. 创建mysql用户,并创建存储路径
[root@localhost mysql]# useradd -s /sbin/nologin -M mysql
[root@localhost mysql]# mkdir -p /data/mysql
  1. 编译安装Mysql(使用二进制免编译安装省略该步骤)
[root@localhost mysql]# yum -y install gcc gcc-c++ zlib-devel libtool ncurses-devel libxml2-devel cmake
[root@localhost mysql]# cd /usr/local/mysql
[root@localhost mysql]# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql -DWITH_INNOBASE_STORAGE_ENGINE=1 -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock -DMYSQL_USER=mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci
[root@localhost mysql]# make
[root@localhost mysql]# make install
  1. 初始化数据库
[root@localhost mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql
  1. 拷贝模板配置文件和启动脚本
[root@localhost mysql]# cp support-files/my-default.cnf  /etc/my.cnf 
[root@localhost mysql]# cp support-files/mysql.server /etc/init.d/mysqld
[root@localhost mysql]# vim /etc/init.d/mysqld

定义
basedir=/usr/local/mysql  
datadir=/data/mysql  

[root@localhost mysql]# /etc/init.d/mysqld start
[root@localhost mysql]# chkconfig --add mysqld

  1. 命令行启动mysql
[root@localhost mysql]# /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql --datadir=/data/mysql &
  1. killall 和kill关闭mysql
kill对象是进程ID
killall对象是进程名字
优选killall,更加安全。会先停止当前写读操作,然后将内存中的数据慢慢写入磁盘中,直到所有数据写完才会杀死进程。

如果使用killall关闭mysql花费时间较长,表示中数据量较大,需要等待数据写完才能kill,此时千万不能使用kill -9 强制杀死进程

11.4 MariaDB安装

点此下载MariaDB 10.2.6
1.解压二进制包

[root@localhost src]# tar zxvf mariadb-10.2.6-linux-glibc_214-x86_64.tar.gz
[root@localhost src]# mv mariadb-10.2.6-linux-glibc_214-x86_64 /usr/local/mariadb

2.初始化数据库

[root@localhost ~]# cd /usr/local/mariadb

[root@localhost mariadb]# ./scripts/mysql_install_db --user=mysql --basedir=/usr/local/mariadb/ --datadir=/data/mariadb

3.拷贝配置文件和启动脚本

[root@localhost mariadb]# cp support-files/my-small.cnf /usr/local/mariadb/my.cnf

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

定义basedir和datadir
[root@localhost mariadb]# vim /usr/local/mariadb/my.cnf 
定义basedir、datadir、conf以及启动参数
[mysqld]下定义datadir=/data/mariadb

[root@localhost mariadb]# vim /etc/init.d/mariadb

basedir=/usr/local/mariadb
datadir=/data/mariadb
conf=$basedir/my.cnf
搜索start关键字,更改启动命令
$bindir/mysqld_safe --defaults-file=$conf --datadir="$datadir" --pid-file="$mysqld_pid_file_path" "$@" &

4.查看mysql是否启动

[root@localhost ~]# pgrep mysql
2142
2376
[root@localhost ~]# service mysql stop
Redirecting to /bin/systemctl stop  mysql.service
[root@localhost ~]# pgrep mysql

5.启动MariaDB服务

[root@localhost ~]# /etc/init.d/mariadb start
[root@localhost mysql]# chkconfig --add mariadb
  • Tips
    当安装两个数据库时,我们需要注意

11.5 Apache安装

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

apache 2.2版本和2.4版本不一样,涉及apr和apr-util是一个通用的函数库,它让httpd可以不关心底层的操作系统平台,可以很方便地移植(从linux移植到windows),yum安装的apr版本和https 2.4需要的apr版本不一致,需要编译安装apr和apr-util

Apache官网
点击此处下载Apache 2.4
点击此处下载apr 1.5.2
点击此处下载apr-util 1.5.4

1.解压源码包

[root@localhost src]# tar zxvf apr-util-1.5.4.tar.gz
[root@localhost src]# tar zxvf apr-1.5.2.tar.gz
[root@localhost src]# tar zxvf httpd-2.4.27.tar.gz

2.编译安装apr 1.52

[root@localhost src]# cd apr-1.5.2/
[root@localhost apr-1.5.2]# ./configure --prefix=/usr/local/apr
[root@localhost apr-1.5.2]# make
[root@localhost apr-1.5.2]# make install

3.编译安装apr-util 1.5.4

[root@localhost src]# cd apr-util-1.5.4/
[root@localhost apr-util-1.5.4]#  ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr        (指定apr的安装路径)
[root@localhost apr-util-1.5.4]# make 
[root@localhost apr-util-1.5.4]# make install

4.编译安装Apache 2.4.27

[root@localhost src]# cd httpd-2.4.27/
[root@localhost httpd-2.4.27]# ./configure --prefix=/usr/local/apache2.4 --with-apr=/usr/local/apr --with-apr-util=/usr/local/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/

需要安装pcre-devel(正则表达式驱动库):
[root@localhost httpd-2.4.27]# yum install -y pcre-devel

[root@localhost httpd-2.4.27]# make 
[root@localhost httpd-2.4.27]# make install

5.启动Apache

[root@localhost apache2.4]# /usr/local/apache2.4/bin/apachectl start
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
httpd (pid 33947) already running

[root@localhost apache2.4]# netstat -lnp | grep httpd
tcp6       0      0 :::80                   :::*                    LISTEN      33947/httpd 
  • 查看Apache加载的所有模块
[root@localhost apache2.4]# /usr/local/apache2.4/bin/httpd -M

[root@localhost apache2.4]# /usr/local/apache2.4/bin/apachectl -M

模块分为staticshared
静态(static)和扩展(shared)的区别在于:
静态模块被编译在主二进制(/apache2.4/bin/httpd)中
扩展模块的文件路径在:/usr/local/apache2.4/modules

11.6 安装PHP5

当前主流版本为5.6/7.1

PHP官网
点此下载PHP5.6.30
1.解压源码包

[root@localhost ~ ]# cd /usr/local/src/
[root@localhost src]# tar zxvf php-5.6.30.tar.gz

2.编译安装php5.6.30

[root@localhost src]# cd php-5.6.30/
[root@localhost php-5.6.30]#  ./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

此时出现以下报错信息:
configure: error: xml2-config not found. Please check your libxml2 installation.
需要安装libxml2-devl

再次执行编译命令,出现以下错误:
configure: error: Cannot find OpenSSL's <evp.h>
需要安装openssl-devel

再次执行编译命令,出现以下错误:
configure: error: Please reinstall the BZip2 distribution
需要安装bzip2-devel

再次执行编译命令,出现以下错误:
configure: error: jpeglib.h not found.
需要安装libjpeg-devel

再次执行编译命令,出现以下错误:
configure: error: png.h not found.
需要安装libpng-devel

再次执行编译命令,出现以下错误:
configure: error: freetype-config not found.
需要安装freetype-devel

再次执行编译命令,出现以下错误:
configure: error: mcrypt.h not found. Please reinstall libmcrypt.
需要安装epel-release(扩展源)、libmcrypt-devel

总结一下,首次安装php需要安装以下包:
yum install -y libxml2-devel openssl-devel bzip2-devel libjpeg-devel freetype-devel epel-release libmcrypt-devel libpng-devel

[root@localhost php-5.6.30]#  make
[root@localhost php-5.6.30]#  make install
--with-apxs2=/usr/local/apache2.4/bin/apxs 为apache的自动安装扩展模块工具

--with-mysql=/usr/local/mysql  
--with-pdo-mysql=/usr/local/mysql
--with-mysqli=/usr/local/mysql/bin/mysql_config
为php和mysql通信的工具,php7中已经取消--with-mysql=/usr/local/mysql

3.查看php加载的静态模块

[root@localhost php-5.6.30]#  /usr/local/php/bin/php -m

4.查看php配置信息

[root@localhost php-5.6.30]# /usr/local/php/bin/php -i

5.拷贝配置文件

[root@localhost php-5.6.30]# cp php.ini-production  /usr/local/php/etc/php.ini

php.ini-production配置文件适合在生产环境
php.ini-development配置文件适合在开发环境

11.7 安装PHP7

点此下载PHP7.1.6
1.解压源码包

[root@localhost src]# cd /usr/local/src/ 
[root@localhost src]# tar jxvf php-7.1.6.tar.bz2

2.编译PHP7

[root@localhost src]# cd php-7.1.6/
[root@localhost 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
[root@localhost php-7.1.6]# make 
[root@localhost php-7.1.6]# make install

3.查看php加载的静态模块

[root@localhost php-7.1.6]# /usr/local/php7/bin/php -m

4.查看Apache加载的php模块

[root@localhost 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 localhost.localdomain. 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)
 php7_module (shared

 如果需要更改不同的php模块:
 [root@localhost php-7.1.6]# vim /usr/local/apache2.4/conf/httpd.conf
 搜索php关键字,有选择性选择php版本模块

5.拷贝配置文件

[root@localhost php-7.1.6]# cp php.ini-production  /usr/local/php7/etc/php.ini

11.8 Apache和PHP结合

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

  • 修改配置文件/usr/local/apache2.4/conf/httpd.conf
[root@localhost ~]# vim /usr/local/apache2.4/conf/httpd.conf 

搜索ServerName关键字,把#ServerName www.example.com:80
#号关闭。

重新启动apache报以下错误:
[root@localhost ~]# /usr/local/apache2.4/bin/apachectl restart
httpd not running, trying to start
/usr/local/apache2.4/bin/apachectl: 行 79: 23785 段错误               (吐核)$HTTPD -k $ARGV
原因时因为本次编译了两个版本的php,需要将http.conf中php注释掉一个:#LoadModule php7_module        modules/libphp7.so。


修改iptables,允许所有客户端访问80端口:
[root@localhost ~]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT


如果此时浏览器不能访问该ip,则修改
<Directory />
    AllowOverride none
    Require all denied
</Directory> 

为
<Directory />
    AllowOverride none
    Require all granted
</Directory>

DocumentRoot配置下 
Require all denied
改为
Require all granted

检查http.conf配置文件是否有误:
[root@localhost ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK

重新加载httpd.conf配置文件:
[root@localhost ~]# /usr/local/apache2.4/bin/apachectl graceful

搜索关键字AddType,增加一行解析php配置
AddType application/x-httpd-php .php

搜索关键字DirectoryIndex index.html,增加php索引页

DirectoryIndex index.html index.php
  • 验证Apache是否已经支持解析PHP
[root@localhost ~]# vim /usr/local/apache2.4/htdocs/test.php
编辑内容为:
<?php
phpinfo()
?>

浏览器访问:http://192.168.1.11/test.php
  • 无法解析php需检查项:

1.检查apache是否已经加载php模块:

[root@localhost ~]# /usr/local/apache2.4/bin/apachectl -M

2.若无法找到php模块,则查看

[root@localhost ~]# ls /usr/local/apache2.4/modules/libphp*
/usr/local/apache2.4/modules/libphp5.so  /usr/local/apache2.4/modules/libphp7.so

3.若以上检查无问题,则检查apache主配置文件php模块是否被注释,只要有一个php版本开启就行:

[root@localhost ~]# vim /usr/local/apache2.4/conf/httpd.conf

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

4.若模块已被加载,则检查apache主配置文件是否添加php解析配置:

[root@localhost ~]# vim /usr/local/apache2.4/conf/httpd.conf

 AddType application/x-httpd-php .php
  • 更改PHP7模块
[root@localhost ~]# vim /usr/local/apache2.4/conf/httpd.conf

修改配置文件:
#LoadModule php5_module        modules/libphp5.so
LoadModule php7_module        modules/libphp7.so
[root@localhost ~]# /usr/local/apache2.4/bin/apachectl -t 
Syntax OK
[root@localhost ~]# /usr/local/apache2.4/bin/apachectl graceful

11.9 Apache设置默认虚拟主机

一台服务器可以访问多个网站,每个网站都是一个虚拟主机
概念:域名(主机名)、DNS、解析域名、hosts
任何一个域名解析到这台机器,都可以访问的虚拟主机就是默认虚拟主机

  • 配置Apache主配置文件httpd.conf
[root@localhost ~]# vim /usr/local/apache2/conf/httpd.conf
搜索vhost,去掉#注释,此时虚拟主机已经启用,http.conf配置文件ServerName字段不再生效
httpd.conf添加以下配置
 <Directory "/data/www/">
  Options Indexes FollowSymlinks
  AllowOverride None
  Require all granted
 </Directory>

  • 配置Apache虚拟主机配置文件
[root@localhost ~]# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf

<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "/usr/local/apache2/docs/dummy-host.example.com"
    ServerName dummy-host.example.com
    ServerAlias www.dummy-host.example.com
    ErrorLog "logs/dummy-host.example.com-error_log"
    CustomLog "logs/dummy-host.example.com-access_log" common
</VirtualHost>


每一个<VirtualHost *:80>代表一台虚拟主机
ServerAdmin                 定义管理员邮箱
DocumentRoot                定义虚拟主机根目录
ServerName                  定义主机名
ServerAlias                 定义主机别名,可以多个
ErrorLog                    定义错误日志
CustomLog                   定义访问日志

<VirtualHost *:80>
    ServerAdmin temence@163..com
    DocumentRoot "/data/www/temence.com"
    ServerName temence.com
    ServerAlias www.temence.com
    ErrorLog "logs/temence.com-error_log"
    CustomLog "logs/temnce-access_log" common
</VirtualHost>
  • 在虚拟主机目录下新建text.php页面
[root@localhost ~]# vim /data/www/temence.com/test.php

<?php
echo "Hell word!"
?>

[root@localhost ~]# /usr/local/apache2.4/bin/apachectl -t 
Syntax OK
[root@localhost ~]# /usr/local/apache2.4/bin/apachectl graceful
  • 测试虚拟主机

1. curl命令

利用URL规则在命令行下工作的文件传输工具。它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称curl为下载工具。作为一款强力工具,curl支持包括HTTP、HTTPS、ftp等众多协议,还支持POST、cookies、认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征。做网页处理流程和数据检索自动化,curl可以祝一臂之力。

-x              指定访问的主机ip:端口
-I              显示状态码等详细信息

[root@www ~]# curl -x192.168.1.11:80 temence.com -I
HTTP/1.1 200 OK
Date: Wed, 02 Aug 2017 13:40:44 GMT
Server: Apache/2.4.27 (Unix) PHP/5.6.30
X-Powered-By: PHP/5.6.30
Cache-Control: max-age=0
Expires: Wed, 02 Aug 2017 13:40:44 GMT
Content-Type: text/html; charset=UTF-8

11.10 Apache用户认证

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

  • 选择好虚拟主机,编辑以下内容
<VirtualHost *:80>
    DocumentRoot "/data/www/temence.com"
    ServerName temence.com
    <Directory /data/www/temence.com> //指定认证的目录
        AllowOverride AuthConfig //这个相当于打开认证的开关
        AuthName "temence.com user auth" //自定义认证的名字,作用不大
        AuthType Basic //认证的类型,一般为Basic
        AuthUserFile /data/.htpasswd  //指定密码文件所在位置
        require valid-user //指定需要认证的用户为全部可用用户
    </Directory>
</VirtualHost>

生成认证密码
[root@www extra]# /usr/local/apache2.4/bin/htpasswd -c -m /data/.htpassswd root

查看加密文件
[root@www ~]# cat /data/.htpassswd 
root:$apr1$DizIK6j.$vHgGstOL4OLndgQ7n4jX50

再次添加另一个用户
[root@www extra]# /usr/local/apache2.4/bin/htpasswd  -m /data/.htpassswd root

再次查看加密文件
[root@www extra]# cat /data/.htpassswd 
root:$apr1$DizIK6j.$vHgGstOL4OLndgQ7n4jX50
test:$apr1$M.V5INlW$wDiw.jPd.z/9J2TdsB1cC1
  • 重新加载配置
[root@www extra]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@www extra]# /usr/local/apache2.4/bin/apachectl graceful
  • 浏览器验证
    mark

  • 针对单个用户认证

<VirtualHost *:80>
    DocumentRoot "/data/www/temece.com"
    ServerName www.temence.com
    <FilesMatch admin.php>
        AllowOverride AuthConfig
        AuthName "temence.com user auth"
        AuthType Basic
        AuthUserFile /data/.htpasswd
        require valid-user
    </FilesMatch>
</VirtualHost>

11.11 301域名跳转

把temence.com域名跳转到www.temence.com,使用301永久重定向

  • 编辑httpd-vhosts.conf
  <IfModule mod_rewrite.c> #需要mod_rewrite模块支持 
        RewriteEngine on  #打开rewrite功能 
        RewriteCond %{HTTP_HOST} !^www.temence.com$  #定义rewrite的条件,主机名(域名)不是www.temence.com满足条件
        RewriteRule ^/(.*)$ http://www.temence.com/$1 [R=301,L] #定义rewrite规则,当满足上面的条件时,这条规则才会执>行  
    </IfModule>
  • 检查apache是否加载rewrite模块
[root@www ~]# /usr/local/apache2.4/bin/apachectl -M |grep rewrite

若未加载模块,则编辑httpd.conf文件,搜索rewrite关键字,将注释取消

[root@www ~]# /usr/local/apache2.4/bin/apachectl -M |grep rewrite
 rewrite_module (shared)
  • 验证
[root@www ~]# curl -x192.168.1.11:80 temence.com -I
HTTP/1.1 301 Moved Permanently
Date: Mon, 31 Jul 2017 23:54:48 GMT
Server: Apache/2.4.27 (Unix) PHP/5.6.30
Location: http://www.temence.com/
Content-Type: text/html; charset=iso-8859-1

11.12 Apache访问日志

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

  • 查看虚拟主机配置,里面记录了日志路径
ErrorLog "logs/temence.com-error_log"
CustomLog "logs/temence.com-access_log" common
  • 查看log
[root@www ~]# cat /usr/local/apache2.4/logs/temence.com-access_log
  • 定义日志格式
[root@www ~]# vim /usr/local/apache2.4/conf/httpd.conf
关键字搜索LogFormat
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common

%{User-Agent}           用户代理(浏览器)
%{Referer}              从哪个页面链接过来的

将访问虚拟主机日志由common改为combined
[root@www ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

11.13 访问日志不记录静态文件

使用Chrome或者火狐浏览器查看网站的静态文件,F12.一般网站都会有很多的静态文件,而且每次访问网站都会记录这些静态文件的访问记录,造成不必要的资源浪费,此时就需要将这些无用的访问记录取消。

  • 修改虚拟主机配置文件
[root@www ~]#  vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

虚拟主机添加如下:
    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/temence.com-access_log" common env=!img  
    #(该行需写在以上配置的下面,想要不记录静态文件,后面必须添加env=!img   img可以和上面的img自定义)

检查配置文件和重新加载
[root@www ~]# /usr/local/apache2.4/bin/apachectl -t
[root@www ~]# /usr/local/apache2.4/bin/apachectl graceful

11.14 访问日志切割

日志一直记录总有一天会把整个磁盘占满,所以有必要让它自动切割,并删除老的日志文件。此处的日志切割为apache自带的日志切割工具。

  • 修改虚拟主机配置文件
[root@www ~]#  vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

CustomLog "|/usr/local/apache2.4/bin/rotatelogs -l logs/temence.com-access_%Y%m%d.log 86400" 

|/usr/local/apache2.4/bin/rotatelogs                    为apache日志切割工具
-l                                                      以当前系统时间为基准进行日志切割,如果不指定则会以UTC时间切割日志,国内为CST时区

temence.com-access_%Y%m%d.log                           为定义切割的日志名字,%Y%m%d变量获取年月日

86400                                                   单位为秒,每天切割一次

检查配置文件和重新加载
[root@www ~]# /usr/local/apache2.4/bin/apachectl -t
[root@www ~]# /usr/local/apache2.4/bin/apachectl graceful

11.15 设置静态元素过期时间

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

  • 修改虚拟主机配置
[root@www ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
添加配置如下:
<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>

检测expire模块是否打开
[root@www ~]# /usr/local/apache2.4/bin/apachectl -M |grep expire

在主配置文件中取消expire注释
[root@www ~]# vim /usr/local/apache2.4/conf/httpd.conf
LoadModule expires_module modules/mod_expires.so

再次检查expire模块是否打开
[root@www ~]# /usr/local/apache2.4/bin/apachectl -M |grep expire
 expires_module (shared)

检查配置文件和重新加载
[root@www ~]# /usr/local/apache2.4/bin/apachectl -t
[root@www ~]# /usr/local/apache2.4/bin/apachectl graceful

浏览器中有静态元素缓存时,再次访问该静态元素时,该状态会显示为304状态码

11.16 设置防盗链referer

通过判断request请求头的refer是否来源于本站。

HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。

  • 添加虚拟主机配置文件
[root@www ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

   <Directory /data/www/temence.com>                                #添加目录
        SetEnvIfNoCase Referer "http://temence.com" local_ref       #设置白名单
        SetEnvIfNoCase Referer "^$" local_ref                      #设置空的referer为白名单,浏览器输入新的网址,referer为空
        <filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)">          #设置哪些元素文件需要设置白名单
            Order Allow,Deny                                        #order设置规则顺序,先allow,后deny
            Allow from env=local_ref                              #允许local_ref定义的域名访问
        </filesmatch>
    </Directory>

检查配置文件和重新加载
[root@www ~]# /usr/local/apache2.4/bin/apachectl -t
[root@www ~]# /usr/local/apache2.4/bin/apachectl graceful

  • curl模拟referer
-e          参数模拟referer

[root@www ~]# curl -e "https://www.baidu.com" -x192.168.1.11:80 temence.com/63.jpg -I
HTTP/1.1 403 Forbidden
Date: Wed, 02 Aug 2017 14:23:52 GMT
Server: Apache/2.4.27 (Unix) PHP/5.6.30
Content-Type: text/html; charset=iso-8859-1

11.17 访问控制Directory

虚拟主机的某个核心目录不想被其他人或者部分人访问,有两种办法,1.启用用户认证;2.设置Directory访问控制

  • 添加虚拟主机配置文件
[root@www ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
   <Directory /data/www/temence.com/admin/>
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
    </Directory>

检查配置文件和重新加载
[root@www ~]# /usr/local/apache2.4/bin/apachectl -t
[root@www ~]# /usr/local/apache2.4/bin/apachectl graceful
  • 测试访问控制
[root@www temence.com]# curl -x192.168.1.11:80 temence.com/admin -I
HTTP/1.1 403 Forbidden
Date: Wed, 02 Aug 2017 14:50:29 GMT
Server: Apache/2.4.27 (Unix) PHP/5.6.30
Content-Type: text/html; charset=iso-8859-1

[root@www temence.com]# curl -x127.0.0.1:80 temence.com/admin -I
HTTP/1.1 301 Moved Permanently
Date: Wed, 02 Aug 2017 14:50:40 GMT
Server: Apache/2.4.27 (Unix) PHP/5.6.30
Location: http://temence.com/admin/
Cache-Control: max-age=0
Expires: Wed, 02 Aug 2017 14:50:40 GMT
Content-Type: text/html; charset=iso-8859-1

11.18 访问控制FilesMatch

提供了基于文件名的访问控制,filename参数应当是一个文件名或是一个包含通配符的字符串

  • 添加虚拟主机配置文件
[root@www ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.con
   <Directory /data/www/temence.com>
    <FilesMatch  "admin.php(.*)">
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
    </FilesMatch>
</Directory>


检查配置文件和重新加载
[root@www ~]# /usr/local/apache2.4/bin/apachectl -t
[root@www ~]# /usr/local/apache2.4/bin/apachectl graceful
  • 测试访问控制
[root@www temence.com]# curl -x127.0.0.1:80 temene.com/admin.phpSKAFD -I
HTTP/1.1 404 Not Found
Date: Wed, 02 Aug 2017 15:04:15 GMT
Server: Apache/2.4.27 (Unix) PHP/5.6.30
Content-Type: text/html; charset=iso-8859-1

[root@www temence.com]# curl -x192.168.1.11:80 temene.com/admin.phpSKAFD -I
HTTP/1.1 403 Forbidden
Date: Wed, 02 Aug 2017 15:04:51 GMT
Server: Apache/2.4.27 (Unix) PHP/5.6.30
Content-Type: text/html; charset=iso-8859-1

Directory和FilesMatch区别在于,一个是对目录进行访问控制,FilesMatch对文件或者一个包含通配符的字符还进行访问控制,更加灵活。

11.19 php动态扩展模块安装

当已经php编译好以后,需要有另外的扩展需求,此时就需要动态安装扩展模块。这里演示添加redis动态扩展模块。在LAMP架构下,redis通常被用来作为缓存使用。

  • 下载压缩包
[root@www ~]# cd /usr/local/src/
[root@www src]# wget https://codeload.github.com/phpredis/phpredis/zip/develop
[root@www src]# mv develop phpredis-develop.zip
[root@www src]# unzip phpredis-develop.zip
[root@www src]# cd phpredis-develop
  • 编译动态扩展模块
此时phpredis-develop目录下没有configure,需要生成configure文件
[root@www phpredis-develop]# /usr/local/php/bin/phpize 
Configuring for:
PHP Api Version:         20131106
Zend Module Api No:      20131226
Zend Extension Api No:   220131226
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.

此时出现缺少autoconf包,需要yum安装
[root@www phpredis-develop]# yum install -y autoconf

再次生成configure文件
[root@www phpredis-develop]# /usr/local/php/bin/phpize

编译,并指定php的配置文件,我这边的配置文件路径为/usr/local/php/bin/php-config

[root@www phpredis-develop]# ./configure --with-php-config=/usr/local/php/bin/php-config

[root@www phpredis-develop]# make && make install

执行完成以后,会在/usr/local/php/lib/php/extensions/no-debug-zts-20131226/下生成刚刚动态编译的redis.so模块文件
[root@www phpredis-develop]# ls /usr/local/php/lib/php/extensions/no-debug-zts-20131226/
opcache.so  redis.so
  • 查看扩展模块存放目录,我们可以在php.ini中去自定义该路径
[root@www phpredis-develop]# /usr/local/php/bin/php -i |grep extension_dir
extension_dir => /usr/local/php/lib/php/extensions/no-debug-zts-20131226 => /usr/local/php/lib/php/extensions/no-debug-zts-20131226
sqlite3.extension_dir => no value => no value
  • 编辑php.ini文件
搜索extension=关键字,下面添加配置
extension = redis.so

查看模块是否加载
[root@www phpredis-develop]# /usr/local/php/bin/php -m |grep redis
redis
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值