LAMP介绍
Linux+Apache(httpd)+MySQL+PHP
PHP网站(Google、淘宝、百度、51cto博客、猿课论坛)
三个角色可以在一台机器、也可以分开(httpd和PHP要在一起)
httpd、PHP、MySQL三者如何工作
MySQL/Mariadb介绍
MySQL是一个关系型数据库,由mysql ab公司开发,mysql在2008年被sun公司收购(10亿刀),2009年sun公司被oracle公司收购(74亿刀)
MySQL官网https://www.mysql.com 最新版本5.7GA/8.0DMR
MySQL5.6变化比较大,5.7性能上有很大提升
Mariadb为MySQL的一个分支,官网https://mariadb.com/最新版本10.2 MariaDB主要由SkySQL公司(现更名为MariaDB公司)维护,SkySQL公司由MySQL原作者带领大部分原班人马创立.
Mariadb5.5版本对应MySQL的5.5,10.0对应MySQL5.6
Community 社区版本,Enterprise 企业版,GA(Generally Available)指通用版本,在生产环境中用的,DMR(Development Milestone Release)开发里程碑发布版,RC(Release Candidate)发行候选版本,Beta开放测试版本,Alpha内部测试版本
MySQL的几个常用安装包:rpm、源码、二进制免编译
mysql二进制安装包基本操作流程:
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 #解压
mv mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysql #把解压的文件移动到我们指定目录并更名
cd /usr/local/mysql
useradd mysql #创建用户
mkdir /data/ #创建mysql数据文件存放目录
./scripts/mysql_install_db --user=mysql --datadir=/data/mysql #初始化
cp support-files/my-default.cnf /etc/my.cnf #拷贝Mysql默认配置文件
cp support-files/mysql.server /etc/init.d/mysqld #拷贝mysql启动文件
vi /etc/init.d/mysqld #定义basedir和datadir
/etc/init.d/mysqld start #启动
下载到指定目录:
解压:
移动目录,创建mysql(我这里之前做过),创建/data/目录:
初始化:
拷贝配置文件和启动脚本:
vim /etc/init.d/mysqld 编辑启动脚本:
加入开机启动服务列表:
/etc/init.d/mysql start (servce mysqld start)启动服务:
MariaDB安装
它的安装和mysql类似:
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
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、datadir、conf以及启动参数
/etc/init.d/mariadb start
解压:
移动解压文件→初始化:
拷贝配置文件和启动脚本:
vim /usr/local/mariadb/my.cnf 编辑配置文件:
vim /etc/init.d/mariadb 编辑启动脚本:
启动:
注:这里因为装了mysql又来装mariadb,所有为了不冲突安装路径自己改了哈,如果只是mariadb的话路径都和mysql一样。
安装Apache
Apache是一个基金会的名字,httpd才是我们要安装的软件包,早期它的名字就叫apache
Apache官网www.apache.org
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)
apr安装:
cd /usr/local/src/apr-1.6.3
./configure --prefix=/usr/local/apr
make && make install
注:这里由于我之前安装过,可能出现的有些会不一样,只需要最后检查一下就可以了,下面也是。
apr-util安装:
cd /usr/local/src/apr-util-1.6.1
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make && make install
安装httpd:
这里有个包需要提前安装:
yum install -y prce-devel 注意看自己错误提示!
cd /usr/local/src/httpd-2.4.29
./configure \ #这里的反斜杠是脱义字符,加上它我们可以把一行命令写成多行
--prefix=/usr/local/apache2.4 \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr-util \
--enable-so \
--enable-mods-shared=most
make && make install
ls /usr/local/apache2.4/modules
/usr/local/apache2.4/bin/httpd -M #查看加载的模块
编译:
安装:
Apache下面的模块:
查看Apache安装的模块:
启动,检查:
PHP5安装
PHP官网www.php.net
当前主流版本为5.6/7.1
环境配置:
rpm -ivh 'http://www.lishiming.net/data/attachment/forum/epel-release-6-8_64.noarch.rpm'
yum install -y libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel libjpeg libjpeg-devel libpng libpng-devel freetype-devel libmcrypt-devel
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
make && make install
cp php.ini-production /usr/local/php/etc/php.ini
编译:
安装:
注:这里由于我之前安装过,所以没有什么错误,这里一般会缺少很多包!
查看加载的模块:
php以模块的形式存在于Apache中:
最后就是复制配置文件:
cp php.ini-production /usr/local/php/etc/php.ini
PHP7安装
cd /usr/local/src/
wget http://cn2.php.net/distributions/php-7.1.6.tar.bz2
tar zxf php-7.1.6.tar.bz2
cd php-7.1.6
./configure --prefix=/usr/local/php7 --with-apxs2=/usr/local/apache2.4/bin/apxs --with-config-file-path=/usr/local/php7/etc --with-pdo-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-bz2 --with-openssl --with-mcrypt --enable-soap --enable-gd-native-ttf --enable-mbstring --enable-sockets --enable-exif
make && make install
ls /usr/local/apache2.4/modules/libphp7.so
cp php.ini-production /usr/local/php7/etc/php.ini
编译:
安装:
vim /usr/local/apache2.4/conf/httpd.conf
apache与php结合
流程:
httpd主配置文件/usr/local/apache2.4/conf/httpd.conf
vim /usr/local/apache2.4/conf/httpd.conf //修改以下4个地方
ServerName 去掉前面的#号
Require all denied 修改为granted
AddType application/x-httpd-php .php 增加
DirectoryIndex index.html index.php 增加
/usr/local/apache2.4/bin/apachectl -t //测试语法
/usr/local/apache2.4/bin/apachectl start //启动服务
netstat -lntp
curl localhost
vim /usr/local/apache2.4/htodcs/1.php //增加如下内容
<?php
phpinfo();
?>
curl localhost/1.php
这里由于我们装了2个php,所以需要先禁掉一个:
php5测试:
vim /usr/local/apache2.4/htdocs/1.php
php7测试:
刷新:
这里我们的php就算成功和apache结合了!
Apache默认虚拟主机
一台服务器可以访问多个网站,每个网站都是一个虚拟主机
概念:域名(主机名)、DNS、解析域名、hosts
任何一个域名解析到这台机器,都可以访问的虚拟主机就是默认虚拟主机
配置:
vim /usr/local/apache2/conf/httpd.conf //搜索httpd-vhost,去掉#
vim /usr/local/apache2/conf/extra/httpd-vhosts.conf //改为如下
<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>
/usr/local/apache2/bin/apachectl –t
/usr/local/apache2/bin/apachectl graceful
创建测试目录和文件:
[root@cc-01 ~]# mkdir /data/wwwroot/
[root@cc-01 ~]# mkdir /data/wwwroot/abc.com
[root@cc-01 ~]# mkdir /data/wwwroot/111.com
[root@cc-01 ~]# vim /data/wwwroot/abc.com/index.php
[root@cc-01 ~]# vim /data/wwwroot/111.com/index.php
测试:
在本地机测试:
1.需要编辑本地机的host:
这样才能让网址指向我们的ip地址:
浏览器测试:
httpd的用户认证
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf //把111.com那个虚拟主机编辑成如下内容
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/111.com"
ServerName 111.com
<Directory /data/wwwroot/111.com> //指定认证的目录
AllowOverride AuthConfig //这个相当于打开认证的开关
AuthName "111.com user auth" //自定义认证的名字,作用不大
AuthType Basic //认证的类型,一般为Basic,其他类型阿铭没用过
AuthUserFile /data/.htpasswd //指定密码文件所在位置
require valid-user //指定需要认证的用户为全部可用用户
</Directory>
</VirtualHost>
/usr/local/apache2.4/bin/htpasswd -cm /data/.htpasswd cc
/usr/local/apache2.4/bin/htpasswd -m /data/.htpasswd zhangsan
重新加载配置-t , graceful
curl -x127.0.0.1:80 111.com //状态码为401
curl -x127.0.0.1:80 -ucc:123456 111.com //状态码为200
浏览器测试:
还可以针对单个文件进行认证
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/111.com"
ServerName 111.com
<FilesMatch 123.php>
AllowOverride AuthConfig
AuthName "111.com user auth"
AuthType Basic
AuthUserFile /data/.htpasswd
require valid-user
</FilesMatch>
</VirtualHost>
重新加载配置-t , graceful
curl测试:
主页能够访问
123.php出现401
输入用户名:密码 状态码为200,访问OK
浏览器测试:
访问主站:
访问123.php
输入用户名和密码:
域名跳转(重定向)
需求,把2111.com.cn域名跳转到111.com,配置如下:
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/111.com"
Servername 111.com
ServerAlias www.example.com 2111.com.cn
<IfModule mod_rewrite.c> //需要mod_rewrite模块支持
RewriteEngine on //打开rewrite功能
RewriteCond %{HTTP_HOST} !^111.com$ //定义rewrite的条件,主机名(域名)不是www.123.com满足条件
RewriteRule ^/(.*)$ http://111.com/$1 [R=301,L] //定义rewrite规则,当满足上面的条件时,这条规则才会执行 ,301永久重定向,302临时重定向,L表示last。
</IfModule>
</VirtualHost>
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf 配置vhosts:
vim /usr/local/apache2.4/conf/httpd.conf 打开重定向模块:
检查,重启:
curl测试:
主站测试
2111.com.cn测试
浏览器测试:
Apache访问日志
访问日志记录用户的每一个请求
vim /usr/local/apache2.4/conf/httpd.conf //搜索LogFormat
User-Agent:用户代理 Referer:是第一次打开的页面网址
默认日志
把虚拟主机配置文件改成如下:
检查,刷新,curl访问,页面访问:
然后查看日志:
测试2:
把我们的网址写入博客,在通过博客点进去
然后查看日志:
从猿课我们能看到Referer成功了!
访问日志不记录指定类型的文件
网站大多元素为静态文件,如图片、css、js等,这些元素可以不用记录
把虚拟主机配置文件改成如下:
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/www.123.com"
ServerName www.123.com
ServerAlias 123.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 "logs/123.com-access_log" combined env=!img
</VirtualHost>
重新加载配置文件 -t, graceful
上传图片到111.com/ 目录下,并测试:
tail /usr/local/apache2.4/logs/111.com-access_log
如下图所示,我们的图片记录没有显示在日志里面:
访问志不记录指定类型的
访问日志切割
日志一直记录总有一天会把整个磁盘占满,所以有必要让它自动切割,并删除老的日志文件
把虚拟主机配置文件改成如下:
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/www.123.com"
ServerName www.123.com
ServerAlias 123.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/123.com-access_%Y%m%d.log 86400" combined env=!img
</VirtualHost>
注:86400 为一天时间,单位秒
重新加载配置文件 -t, graceful
测试-浏览器访问:
ls /usr/local/apache2.4/logs 检查是否出现新的切割日志文件
注:以后每天凌晨就会出现一个新的日志 (我们就可以做任务计划,把时间久远的日志删掉)
配置静态元素过期时间
浏览器访问网站的图片时会把静态的文件缓存在本地电脑里,这样下次再访问时就不用去远程下载了,但是多了会增加我们的内存负荷,所以我们需要给它们定义过期时间,到了时间自动删除,这样就能节省我们的内存空间
配置如下:
<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>
需要在主配文件打开expires模块:
vim /usr/local/apache2.4/conf/httpd.conf
浏览器测试:
ctrl+F5 强制刷新,清空缓存:
curl测试:
配置防盗链
通过限制referer来实现防盗链的功能
配置文件增加如下内容:
<Directory /data/wwwroot/111.com>
SetEnvIfNoCase Referer "http://111.com" local_ref
SetEnvIfNoCase Referer "http://aaa.com" local_ref
SetEnvIfNoCase Referer "^$" local_ref
<filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)">
Order Allow,Deny
Allow from env=local_ref
</filesmatch>
</Directory>
curl测试:
浏览器测试:
更改白名单测试:
测试孔referer:
测试:
访问控制 – Directory
核心配置文件内容
<Directory /data/wwwroot/111.com/admin/>
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Directory>
curl测试状态码为403则被限制访问了:
访问控制 – FilesMatch
核心配置文件内容
<Directory /data/wwwroot/111.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
</Directory>
curl测试时直接返回了php源代码,并未解析
进一步限制,不允许php访问:
curl测试:
访问控制 – user_agent
user_agent可以理解为浏览器标识
核心配置文件内容:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC]
RewriteRule .* - [F]
</IfModule>
测试:
curl -A "cc cc" 指定user_agent
curl常用选项:-I显示http头文件信息 -x指定ip:port -A指定user_agent(浏览器标识)