MySQL安装
MySQL的几个常用安装包:rpm、源码、二进制免编译
把下载的包保存在这个目录里:cd /usr/local/src 所以要先进入这个目录下
第一步,下载源码包:
wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
第二步,解压:
tar zxvf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
第三步,把解压的这个目录移动到usr、local下并改名为mysql:
mv mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysql
第四步,进入到这个目录下:
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
第七步,拷贝配置文件,配置文件在ls /support-files/my-default.cnf里边(模板配置文件)
把它拷贝到/etc/下,改名叫my.cnf(mysqld的配置文件就叫my.cnf固定放在etc下)
cp support-files/my-default.cnf /etc/my.cnf
第八步,拷贝启动脚本
cp support-files/mysql.server /etc/init.d/mysqld
第九步,编辑配置文件
vi /etc/init.d/mysqld
定义basedir和datadir 在配置文件最下边
basedir=/usr/local/mysql datadir=/data//mysql
第十步,添加到系统服务中去,让他开机启动:
chkconfig --add mysqld 查看一下:chkconfig --list
第十一步,启动服务: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
查看监听端口:netstat -lntp(默认监听3306端口)
停掉服务命令:service mysqld stop
也可以用命令行的方法启动:
但是用平时的命令停不了需要:停掉服务命令: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 以及启动参数
最后在启动脚本定义:搜 /start 大概在300行,定义一下,加上下边的的内容:定义的是配置文件所在的路径,目的是不和mysql产生冲突,假如说你的机器上只安装了mariadb就不需要自定义--defaults这个参数
启动它:/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.27.tar.gz
wget http://mirrors.hust.edu.cn/apache/apr/apr-1.5.2.tar.gz
wget http://mirrors.hust.edu.cn/apache/apr/apr-util-1.5.4.tar.gz
apr和apr-util是一个通用的函数库,它让httpd可以不关心底层的操作系统平台,可以很方便地移植(从linux移植到windows)
第二步,解压这三个包:
tar zxvf httpd-2.4.27.tar.gz
tar zxvf apr-util-1.5.4.tar.gz
tar zxvf apr-1.5.2.tar.gz
第三步,安装apr:
1.先进到apr-1.5.2目录下:cd /usr/local/src/apr-1.5.2
2.安装apr:./configure --prefix=/usr/local/apr
成功
3.make && make install
他下边会有四个目录:ls /usr/local/apr
安装apr-util:
1.进到目录下:cd /usr/local/src/apr-util-1.6.1
2.安装:./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
3.make && make install
编译httpd:
1.进到目录下:cd /usr/local/src/httpd-2.4.34
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
3.make && make install
bin下是启动文件
这个是核心的二进制文件
conf配置文件所在目录
htdocs是存放访问页,等启动httpd之后访问网站时默认的网站会放到这个目录下
模块目录 ls /usr/local/apache2.4/modules 每个模块都代表着一个功能
/usr/local/apache2.4/bin/httpd -M //查看阿帕奇加载的模块
命令行启动apache:/usr/local/apache2.4/bin/apachectl start
查看有没有启动:ps aux |grep hpptd
查看端口号:netstat -lntp(httpd默认监听80端口)
安装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.30.tar.gz
第三步,解压:tar zxf php-5.6.30.tar.gz
第四步,进到目录下:cd 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
参数解释:
·--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
错误2
yum install -y openssl-devel
错误3
yum install bzip2-devel
错误4
yum install -y libjpeg-devel
问题5
yum install -y libpng-devel
问题6
yum install -y freetype-devel
问题7
缺少 libmcrypt-devel 库,但是在CentOS源不能安装libmcrypt-devel,由于版权的原因没有自带mcrypt的包。
若没有安装过eprl扩展源,则必须先安装epel-release包:yum install -y epel-release
再来安装 libmcrypt-devel 包:yum install -y libmcrypt-devel
成功标志:echo $?
make && make install
查看PHP目录/usr/local/php/
PHP核心的二进制文件,在/usr/local/php/bin/目录下
查看/usr/local/apache2.4/modules/libphp5.so文件大小
这个就是我们想要的扩展模块,apache和php结合起来,是通过这个.so 文件实现的
/usr/local/php/bin/php -m#查看php加载的模板都有哪些,这些加载的模块都是静态的
[root@aaa-01 php-5.6.30]# /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
· PHP是作为Apache的模块存在的
· 查看Apache的模块
· 可以看到最下方的 php5_module (shared) ,这个说明php是做为httpd 的一个扩展模块形式存在的
· Apache需要去执行php的文件,需要借助于php module ,需要这个模块,需要这个.so 文件
· 若是把 .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)
/usr/local/apache2.4/conf/httpd.conf //这是Apache的配置文件
去搜索php5.so,会发现自动增加了一行
若想使用文件中的那一个模块,将前面的 # 号去除即可使用
若想不使用哪个模块,只需要加一个 # 号即可
第六步 安装完PHP之后,需要把配置文件拷贝到指定路径下:
/usr/local/php/bin/php -i |less -i 可以查看到PHP的一些信息,包括编译参数,Configuration File 的路径
cp php.ini-production /usr/local/php/etc/php.ini
两个配置文件
· php.ini-development 这个是测试环境用的
· php.ini-production 这个是线上生产环境用的
这时再来查看/usr/local/php/bin/php -i |less发现他已经加载了路径
安装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
查看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
小常识:一台机器上安装两个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,就在另一个前面加 # 号注释掉,然后保存
Apache和PHP结合,Apache默认虚拟主机
配置http支持PHP
编辑一下httpd主配置文件/usr/local/apache2.4/conf/httpd.conf
vim /usr/local/apache2.4/conf/httpd.conf //修改以下4个地方
第一步,搜索:ServerName 把这个服务打开,前边的井号去掉
去掉之后他就不会在提示下面的错误信息了
第二步,增加一行配置,搜索:Require all denied 改成:Require all granted
第三步,搜AddType加上下边这条命令:
AddType application/x-httpd-php .php 加他的目的是为了能让php能解析
第四步,增加索引页,搜索Index,加上下边语句:
DirectoryIndex index.html index.php
每次写完配置文件都要执行一下这两步!!
检查配置文件语法是否正确,加上-t选项 /usr/local/apache2.4/bin/apachectl -t 重新加载配置文件,加上graceful /usr/local/apache2.4/bin/apachectl graceful
提示错误
原因:是因为在最后调用了两个PHP,加载了两个PHP,导致冲突
解决方法:只需要注释掉一个PHP即可
vim /usr/local/apache2.4/conf/httpd.conf
搜索php5.so,会看到有两行,注释一个即可
第五步,写一个脚本看看阿帕奇能不能解析PHP:
vi /usr/local/apache2.4/htdocs/1.php #脚本内容如下:
写完在浏览器上访问一下IP加1.php:192.168.232.132/1.php 只要能出下边的页面就证明能解析
如果不能解析那么你就检查一下Apache配置文件:
第一项,看看php5有没有加载:
/usr/local/apache2.4/bin/apachectl -M
如果没有加载php5,你就要看看他有没有这个模块,有没有这个文件:
ls /usr/local/apache2.4/modules/libphp5.so
如果有文件也没有显示,查看配置文件里边有没有加载php5:
vim /usr/local/apache2.4/conf/httpd.conf 搜索libphp5.so
在查看配置文件里有没有加AddType这一行:搜索AddType
AddType application/x-httpd-php .php
/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 //增加如下内容
curl localhost/test.php
http的默认虚拟主机
一台服务器可以访问多个网站,每个网站都是一个虚拟主机
任何一个域名解析到这个主机台机器,都可以访问的虚拟主机就是默认虚拟主机
概念:域名(主机名)、DNS、解析域名、hosts
window下边的hosts在C:\Windows\System32\drivers\etc路径下,可以定义一个域名指向到一个IP,例如
定义完在windows上边ping一下它确实指向了定义的IP上,如果不指定他会指向到一个公网IP上
配置虚拟主机
编辑配置文件:vim /usr/local/apache2.4/conf/httpd.conf 搜索httpd-vhosts,去掉#
因为配置文件仅仅能定义一个ServerName,所以现在打开一个二级配置文件
二级配置文件就是虚拟主机配置文件
在这个配置文件里,是可以定义多个ServerName的
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf//改为如下
ServerAdmin [email protected] #这个是要定义邮箱,要不要无所谓可以删掉 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 #访问日志 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
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 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
更改完配置文件创建对应的目录:
mkdir /data/wwwroot/
mkdir /data/wwwroot/abc.com
mkdir /data/wwwroot/111.com
然后在对应的站点根目录下创建一个比如说:index.php
vim /data/wwwroot/abc.com/index.php 给abc.com里边定义如下
vim /data/wwwroot/111.com/index.php 给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
所谓虚拟主机就是:任何一个域名解析到这个ip上他都会去访问这个默认虚拟主机
在主配置文件中,httpd.conf里面,打开了虚拟主机配置文件,也就是删除到 # 号,那虚拟主机配置就生效了,一旦虚拟主机配置文件生效,那主配置文件里面所定义的DocumentRoot以及ServerName失效
虚拟主机配置文件一旦打开,可以定义很多个VirtualHost,每一个VirtualHost都都有一个对应的 DocumentRoot 和 ServerName ,每一个VirtualHost都代表着一个站点,都是一个虚拟主机。在虚拟主机里面有一个特殊的默认虚拟主机,所谓默认虚拟主机就是无论任何域名解析到这个IP上,都会去访问默认虚拟主机
httpd的用户认证
假如说访问123.com的时候有个需求,你能让你直接访问,需要输入用户名密码,验证通过之后呢才能访问,这样做的目的是为了增加安全性
在第二个上更改因为第一个是默认虚拟主机
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf //把123.com那个虚拟主机编辑成如下内容
//指定认证的目录 AllowOverride AuthConfig //这个相当于打开认证的开关 AuthName "111.com user auth" //自定义认证的名字,作用不大 AuthType Basic //认证的类型,一般为Basic,其他类型阿铭没用过 AuthUserFile /data/.htpasswd //指定密码文件所在位置,这个要记住一会要生成他的密码文件 require valid-user //指定需要认证的用户为全部可用用户 生成他的密码文件,-c创建密码文件,-m指定密码加密类型,比如说用户叫awei,输入两次密码
/usr/local/apache2.4/bin/htpasswd -c -m /data/.htpasswd awei假如说你想在创建一个用户比如zhangsan,那就不需要-c创建密码文件了,因为刚才已经创建了,直接-m加用户名就可以/usr/local/apache2.4/bin/htpasswd -m /data/.htpasswd zhangsan
可以查看到生成的密码cat /data/.htpasswd
重新加载配置-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表示需要用户验证
指定用户密码:curl -x127.0.0.1:80 -uawei:123456789 111.com //状态码为200
格式为:-u指定用户:用户密码 解释:下边的例子用户是aming密码是lishiming
在电脑浏览器上测试
先在Windows上绑定hosts,window下边的hosts在C:\Windows\System32\drivers\etc路径下
绑定完浏览器输入111.com,输入用户密码就可以访问到了
还可以针对单个文件进行认证
比如说访问123.php时再认证
AllowOverride AuthConfig
AuthName "123.com user auth"
AuthType Basic
AuthUserFile /data/.htpasswd
require valid-user
重新加载配置-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 写入:
在虚拟机上: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,配置如下:
//需要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跳转一次 可以再这增加一个测试域名
重新加载配置-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
检查配置文件语法是否正确,加上-t选项 /usr/local/apache2.4/bin/apachectl -t 重新加载配置文件,加上graceful /usr/local/apache2.4/bin/apachectl graceful3.在查看有没有模板:/usr/local/apache2/bin/apachectl -M|grep -i rewrite
curl -x127.0.0.1:80 2111.com.cn //状态码为301,你发现他自动跳转到了111.com
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的网站)把虚拟主机配置文件改成如下: 把默认的common格式改成combined
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
DocumentRoot "/data/wwwroot/www.123.com"
ServerName www.123.com
ServerAlias 123.com
CustomLog "logs/123.com-access_log" combined
重新加载配置文件 -t,graceful
在访问:curl -x127.0.0.1:80 -I 123.com
查看日志:tail /usr/local/apache2.4/logs/123.com-access_log
访问日志不记录静态文件
网站大多元素为静态文件,如图片、css、js等,这些元素可以不用记录
把虚拟主机配置文件改成如下:
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$" imgCustomLog "logs/111.com-access_log" combined env=!img (只要符合这个条件的请求都不会记录到条件里)
重新加载配置文件 -t, graceful
测试
mkdir /data/wwwroot/111.com/images //创建目录,并在这目录下上传一个图片rz
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
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
重新加载配置文件 -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/以日期为后缀的新日志文件
查看新生成的日志文件内容,会看到就是刚刚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这个状态码就意味着他不会去服务器下载
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" 测试
查看一下expaire模块服务是否开启:
/usr/local/apache2.4/bin/apachectl -M |grep expaire
没开启需要编辑配置文件搜索:expires_module 把前边的#去掉
vim /usr/local/apache2.4/conf/httpd.conf
重新加载一下,在查看一下服务:
/usr/local/apache2.4/bin/apachectl graceful
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
配置防盗链
通过限制referer来实现防盗链的功能
不是我认识的referer我就不允许你访问,比如说有一个第三方网站,本来图片是他自己的图片,但是这个图片的访问地址是A域名,而他在B域名里边去引用,这样是不允许的,只能在A域名里去访问才可以,这样图片会控制在我们的服务器上,第三方的站点没办法引用
解释:
盗链是指在自己的页面上展示一些并不在自己服务器上的内容。通常的做法是通过技术手段获得它人服务器上的资源地址,绕过别人的资源展示页面,直接在自己的页面上向最终用户提供此内容。比较常见的是一些小站盗用大站的资源(图片、音乐、视频、软件等),对于这些小站来说,通过盗链的方法可以减轻自己服务器的负担,因为真实的空间和流量均是来自别人的服务器。
防盗链系统就是防范盗链的系统,防止别人通过一些技术手段绕过本站的资源展示页面,盗用本站的资源,让绕开本站资源展示页面的资源链接失效。实施防盗链系统后,因为屏蔽了那些盗链的间接资源请求,从而可以大大减轻服务器及带宽的压力
配置文件增加如下内容
#本站点的目录,实际上就是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也设为白名单,这里先注释掉 #定义规则,这种格式的图片设置白名单 Order Allow,Deny #Order顺序, Allow from env=local_ref 用电脑访问
如果我们想要直接在浏览器中访问111.com/qq.png,可以将虚拟主机配置文件中空referer行前的注释符去掉
然后检查配置文件是否有语法错误,并重新加载配置文件
这样就可以在浏览器中正常访问了
curl测试:
用curl模拟referer,-e指定referer
curl -e "http://www.aminglinux.com/123.html" 自定义referer
访问控制-Directory
以目录的形式
核心配置文件内容
Order deny,allow 以这顺序为主,哪个在前边就先执行哪个
Deny from all 先拒绝
Allow from 127.0.0.1 在允许
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
针对文件或者链接
核心配置文件内容
Order deny,allow
Deny from all
Allow from 127.0.0.1
访问控制-禁止php解析
核心配置文件内容
php_admin_flag engine off
Order allow,deny
Deny from all
curl测试时直接返回了php源代码,并未解析
访问控制-user_agent
user_agent可以理解为浏览器标识
CC是一种访问***,它利用很多个肉鸡访问,是很有规律的访问,这时我们需要用user_agent来控制。
核心配置文件内容
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR] //NC:表示忽略大小写 OR:或者
RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC]
RewriteRule .* - [F]
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
把这个写进去:
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所在的路径打开它进行配置
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