Linux+Apache+Mysql+PHP,本次采用Centos7+Mysql5.6.35(MariaDB 10.2.6)+Apache 2.4.27+PHP5.6/7.1
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文件中创建的请求的响应,三个过程就是访问后台数据库的过程
一种开放源代码的关系型数据库管理系统(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的目的是完全兼容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)开发
1、数据和表定义文件(.frm)是二进制兼容的
2、所有客户端API、协议和结构都是完全一致的
3、所有文件名、二进制、路径、端口等都是一致的
4、所有的MySQL连接器,比如PHP、Perl、Python、Java、.NET、MyODBC、Ruby以及MySQL C connector等在MariaDB中都保持不变
5、mysql-client包在MariaDB服务器中也能够正常运行
6、共享的客户端库与MySQL也是二进制兼容的
主要有几种:rpm、源码包、二进制免编译
rpm包和二进制免编译包类似,但是rpm包安装无法指定安装路径,默认/usr/,而二进制免编译包则可以指定路径
将下载好的源码包放在/usr/local/src下
点此下载Mysql5.6.35源码包
点此下载Mysql5.6.35二进制包
[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/
[root@localhost mysql]# useradd -s /sbin/nologin -M mysql
[root@localhost mysql]# mkdir -p /data/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
[root@localhost mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql
[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
[root@localhost mysql]# /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql --datadir=/data/mysql &
kill对象是进程ID
killall对象是进程名字
优选killall,更加安全。会先停止当前写读操作,然后将内存中的数据慢慢写入磁盘中,直到所有数据写完才会杀死进程。
如果使用killall关闭mysql花费时间较长,表示中数据量较大,需要等待数据写完才能kill,此时千万不能使用kill -9 强制杀死进程
点此下载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
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
[root@localhost apache2.4]# /usr/local/apache2.4/bin/httpd -M
[root@localhost apache2.4]# /usr/local/apache2.4/bin/apachectl -M
模块分为static、shared
静态(static)和扩展(shared)的区别在于:
静态模块被编译在主二进制(/apache2.4/bin/httpd)中
扩展模块的文件路径在:/usr/local/apache2.4/modules
当前主流版本为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
需要安装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配置文件适合在开发环境
点此下载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
httpd主配置文件/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,则修改
AllowOverride none
Require all denied
</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
[root@localhost ~]# vim /usr/local/apache2.4/htdocs/test.php
编辑内容为:
phpinfo()
?>
浏览器访问:http://192.168.1.11/test.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
[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
一台服务器可以访问多个网站,每个网站都是一个虚拟主机
概念:域名(主机名)、DNS、解析域名、hosts
任何一个域名解析到这台机器,都可以访问的虚拟主机就是默认虚拟主机
[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>
[root@localhost ~]# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
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
每一个80>代表一台虚拟主机
ServerAdmin 定义管理员邮箱
DocumentRoot 定义虚拟主机根目录
ServerName 定义主机名
ServerAlias 定义主机别名,可以多个
ErrorLog 定义错误日志
CustomLog 定义访问日志
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
[root@localhost ~]# vim /data/www/temence.com/test.php
"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
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
80>
DocumentRoot "/data/www/temence.com"
ServerName temence.com
//指定认证的目录
AllowOverride AuthConfig //这个相当于打开认证的开关
AuthName "temence.com user auth" //自定义认证的名字,作用不大
AuthType Basic //认证的类型,一般为Basic
AuthUserFile /data/.htpasswd //指定密码文件所在位置
require valid-user //指定需要认证的用户为全部可用用户
生成认证密码
[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
浏览器验证
针对单个用户认证
DocumentRoot "/data/www/temece.com"
ServerName www.temence.com
AllowOverride AuthConfig
AuthName "temence.com user auth"
AuthType Basic
AuthUserFile /data/.htpasswd
require valid-user
把temence.com域名跳转到www.temence.com,使用301永久重定向
.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规则,当满足上面的条件时,这条规则才会执>行
[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
访问日志记录用户的每一个请求
ErrorLog "logs/temence.com-error_log"
CustomLog "logs/temence.com-access_log" common
[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
使用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
日志一直记录总有一天会把整个磁盘占满,所以有必要让它自动切割,并删除老的日志文件。此处的日志切割为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
浏览器访问网站的图片时会把静态的文件缓存在本地电脑里,这样下次再访问时就不用去远程下载了。
[root@www ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
添加配置如下:
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"
检测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状态码
通过判断request请求头的refer是否来源于本站。
HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。
[root@www ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
#添加目录
SetEnvIfNoCase Referer "http://temence.com" local_ref #设置白名单
SetEnvIfNoCase Referer "^$" local_ref #设置空的referer为白名单,浏览器输入新的网址,referer为空
"\.(txt|doc|mp3|zip|rar|jpg|gif|png)"> #设置哪些元素文件需要设置白名单
Order Allow,Deny #order设置规则顺序,先allow,后deny
Allow from env=local_ref #允许local_ref定义的域名访问
检查配置文件和重新加载
[root@www ~]# /usr/local/apache2.4/bin/apachectl -t
[root@www ~]# /usr/local/apache2.4/bin/apachectl graceful
-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
虚拟主机的某个核心目录不想被其他人或者部分人访问,有两种办法,1.启用用户认证;2.设置Directory访问控制
[root@www ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
/data/www/temence.com/admin/>
Order deny,allow
Deny from all
Allow from 127.0.0.1
检查配置文件和重新加载
[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
提供了基于文件名的访问控制,filename参数应当是一个文件名或是一个包含通配符的字符串
[root@www ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.con
"admin.php(.*)">
Order deny,allow
Deny from all
Allow from 127.0.0.1
检查配置文件和重新加载
[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对文件或者一个包含通配符的字符还进行访问控制,更加灵活。
扩展
当已经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
[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
搜索extension=关键字,下面添加配置
extension = redis.so
查看模块是否加载
[root@www phpredis-develop]# /usr/local/php/bin/php -m |grep redis
redis