Apache原理,配置文件详解及实验搭建
一.引子
终于来到了我们网络服务的重头戏,web服务器的搭建和管理。笔者也耐不住自己颤抖的小手,web服务器绝对是我们运维行业里面的重中之重,接下来笔者的章节安排是这样的。根据重要性和逻辑性,依次整理出三种web容器(Apache.Nginx,tomcat)的基础知识,面试常见题目,以及最终汇总一篇Apache,tomcat,Nginx的优缺点汇总。接下来这一两周,笔者会不断抽时间给出一个尽可能通俗易懂的版本供大家参考
apache服务器是目前使用范围最广的web服务器,既然是使用最广的,说明apache有它的独特优势。apache是一款不断打补丁而不断完善的web服务器,经过这么久的完善和打补丁,apache性能十分稳定。下面开始我们apache服务器的学习。当然我们还是用源码包来搭建我们的apache服务器。
二.Apche服务器的基本概念
1、相关概念
协议:超文本传输协议 - HTTP 协议
核心:超文本标记语言 - HTML 语言
URL:统一资源定位符 - http:// 或 https://**
端口:80端口(http) 443端口(https)
2、环境搭建方式
Linux + apache + mysql + php LAMP
Linux + nginx + mysql + php LNMP
windows + IIS + SQLserver + ASP
3、安装方式
源码包:编译安装,详细编译安装过程参照下面实验搭建或者参考上一篇LAMP环境架构
RPM包:yum -y install httpd
4、Apache 的主配置文件
源码包:/usr/local/apache2/etc/httpd.conf
/usr/local/apache2/etc/extra/
RPM 包:/etc/httpd/conf/httpd.conf
5、默认网页保存位置
源码包:/usr/local/apache2/htdocs
RPM 包安装:/var/www/html
6、日志保存位置
源码包:/usr/local/apache2/logs
RPM 包:/var/log/httpd
7、模块加载
a、静态编译:在使用./configure 编译的时候,如果不指定某个模块为动态,即没有使用:enable-mods-shared=module或者enable-module=shared 这个2个中的一个,那么所有的默认模块为静态。 那么何谓静态? 其实就是编译的时候所有的模块自己编译进 httpd 这个文件中(我们启动可以使用这个执行文件,如: ./httpd & ) ,启动的时候这些模块就已经加载进来了,也就是可以使用了, 通常为: 来配置。所以大家看到的配置都是
b、动态编译:就是编译的时候,使用enable-module=shared 或者enable-modules-shared=module 来动态编译。 那么什么是动态? 静态是直接编译进httpd中, 那么动态显然就不编译进去了,也就是你启动的时候根本不会加载这个模块, 而是给你一个module.so 文件,你一定要使用 loadmodule 这个语法来加载,这个模块才有效。
8.Apache 工作方式:
prefork:一个管理进程管理多个工作进程,一个工作进程管理一个线程 ,一个线程维持一个连接
worker:一个管理进程管理多个工作进程 ,一个工作进程管理多个线程, 一个线程维持一个连接
event:与worker模式很像,解决了在keepalive场景下,长期被占用的线程资源浪费问题。
三.基于配置文件的Apache服务器实验搭建及作用(ALC访问控制,虚拟主机,地址跳转,HTTPS加密访问)
1.源码安装Apache:
根据LMAP安装
yum -y install lrzsz
rz -e 将apache的三个环境镜像软件上传
tar -zxf httpd-2.4.7.tar.gz
tar -zxf apr-1.4.6.tar.gz
tar -zxf apr-util-1.4.1.tar.gz
解压所有软件包
cp -a apr-1.4.6 httpd-2.4.7/srclib/apr
cp -a apr-util-1.4.1 httpd-2.4.7/srclib/apr-util
yum -y install openssl openssl-devel zlib zlib-devel pcre-devel (加密库,压缩库正则表达式)
yum -y install gcc gcc-c++ make cmake
cd httpd-2.4.7
./configure --prefix=/usr/local/apache2 --enable-rewrite --enable-so --enable-headers --enable-expires --with-mpm=worker --enable-modules=most --enable-deflate --enable-ssl
make -j 4 && make install -j 4
2.配置文件详解:
(1)vim /usr/local/apache2/conf/httpd.conf
a.安装目录:
ServerRoot “/usr/local/apache2”
b.监听端口:
Listen 80
c.动态共享对象:在 Apache 需要对应模块的时候从外存加载至内存给 Apache 提供对应功能
d.静态共享对象:随着 Apache 启动就加载至内存提供功能
e,.管理员邮件: 发送报警邮件
f.指定当前的 main Server 的域名
g.目录声明区域:
h.AllowOverride 特殊权限开关 None(关闭)/All(开启)
i.apache的ACL 不允许所有人访问/
j.DocumentRoot 指定 Apache 默认站定路径:
k.声明目录权限:
l.允许所有人都可以访问列出的目录:(建议不要开启)
m.可以访问软链接
(2) cd /usr/local/apache2/htdocs
a.index.html(apache主页文件)
在index.html添加什么内容都可以显示
b.代表不允许访问(在没有主页文件的情况下不允许访问)
c.允许所有用户访问:
d.DirectoryIndex 指定当前站点的默认主页
在主页文件中写多个,从左到右依次匹配,如果都没有,并且Indexes被关闭,就会报错
e.不允许访问这个文件:
f.别名(相当于简化路径):
3.ACL 访问控制列表
目的:对用户的访问进行管理,防止恶意连接。
(1)基于用户名密码的认证方案
a…在 /usr/local/apache2/htdocs 目录下创建文件 .htaccess 添加以下信息:系统会寻找.htaccess文件
b.只要在用户目录下(与apache用户地址有关)创建.htaccess文件就可以实现用户目录访问。
vim .htaccess
authname "welcome to apahce"
authtype basic:
authuserfile /usr/local/apache2/htdocs/a.psd
require valid-user
c.添加apache用户,与系统用户无关
/usr/local/apache2/bin/htpasswd -c /usr/local/apache2/htdocs/a.psd zhangsan
#改用户名密码:
/usr/local/apache2/bin/htpasswd -m /usr/local/apache2/htdocs/a.psd lisi
d.vim /usr/local/apache2/conf/httpd.conf
在这个目录下开启关闭DocumentRoot “/usr/local/apache2/htdocs”
特殊权限开关 None(关闭)/All(开启
AllowOverride ALL
e.使用windows浏览器查看,需要用户名和密码
(2)基于客户端地址的认证方案(打回快照)
vim /usr/local/apache2/conf/httpd.conf
a、允许个别,拒绝所有
require all granted
require ip 192.168.26.12
只允许IP为192.168.26.12的IP访问apache。
b、拒绝个别,允许所有
Require all granted
Require not ip 192.168.21.11
不允许IP为192.168.21.11的IP访问apache
4.虚拟主机:(基于域名,基于端口,基于IP,结合使用)
作用:将多个站点配置在同一台apache服务器里,保证资源利用的最大化
两者必须以下有一个不同
域名
IP
PORT(端口)
(1.)虚拟主机:基于IP
www.hongfuxuexiao.com 宏福学校的主站
www.hongfu.com 宏福集团的主站
实验步骤:
a…vim /usr/local/apache2/conf/httpd.conf
取消注释:(加载两个配置文件)
b.vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
DocumentRoot "/usr/local/apache2/htdocs/hongfu.com"
ServerName www.hongfu.com
ErrorLog "logs/www.hongfu.com-error_log"
CustomLog "logs/www.hongfu.com-access_log" common
</VirtualHost>
<Directory "/usr/local/apache2/htdocs/hongfu.com">
options indexes followsymlinks
AllowOverride All
Require all granted
</Directory>
<VirtualHost *:80>
DocumentRoot "/usr/local/apache2/htdocs/hongfuxuexiao.com"
ServerName www.hongfuxuexiao.com
ErrorLog "logs/www.hongfuxuexiao.com-error_log"
CustomLog "logs/www.hongfuxuexiao.com-access_log" common
</VirtualHost>
<Directory "/usr/local/apache2/htdocs/hongfuxuexiao.com">
options indexes followsymlinks
AllowOverride All
Require all granted
</Directory>
c.创建网页文件存放目录:
cd /usr/local/apache2/htdocs/
rm -rf *
mkdir /usr/local/apache2/htdocs/hongfuxuexiao.com
mkdir /usr/local/apache2/htdocs/hongfu.com
chown -R apache:apache
d.添加内容:
echo “hongfuxuexiao123” > hongfuxuexiao.com/index.html
echo “hongfu123456” > hongfu.com/index.html
e.重启服务:
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
f.换11虚拟机测试:
vim /etc/hosts(添加IP和域名)
测试:curl www.hongfu.com
(2)、虚拟主机: 基于端口
测试环境 www.hongfuxue.com 4561
生产环境 www.hongfuxue.com 80
a.vim /usr/local/apache2/conf/httpd.conf
取消注释:同上一个实验
b. cd /usr/local/apache2/conf
vim extra/httpd-vhosts.conf
权限声明:
<VirtualHost *:80>
DocumentRoot "/data/web1"
ServerName www.hongfuxuexiao.com
ErrorLog "logs/www.hongfuxuexiao.com-error_log"
CustomLog "logs/www.hongfuxuexiao.com-access_log" common
</VirtualHost>
<Directory "/data/web1">
options indexes followsymlinks
allowoverride All
require all granted
</Directory>
<VirtualHost *:4561>
DocumentRoot "/data/web2"
ServerName www.hongfuxuexiao.com
ErrorLog "logs/www.hongfuxuexiao.com:4561-error_log"
CustomLog "logs/www.hongfuxuexiao.com:4561-access_log" common
</VirtualHost>
<Directory "/data/web2">
options indexes followsymlinks
allowoverride All
require all granted
</Directory>
c.创建存放网页文件的目录:
mkdir /data
mkdir web1 web2
echo “www.hongfu:80” >> web1/index.html
echo “www.hofsdf:4561” >> web2/index.html
cd /
将用户改为apache
vim httpd.conf
id apache
chown -R apache:apache /data
d.添加监听端口
vim /etc/httpd.conf
e.重启服务:
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
f.换11虚拟机:
vim /etc/hosts
添加主机域名(同上)
访问时添加端口
curl www.hongfuxuexiao.com:4561
(3)、基于 IP 地址
a.vim /usr/local/apache2/conf/httpd.conf
取消注释:
b. cd /usr/local/apache2/conf
vim extra/httpd-vhosts.conf
c.创建目录:
mkdir /data
mkdir web1 web2
echo “www.hongfu192.168.21.13” >> web1/index.html
echo “www.hofsdf192.168.21.100” >> web2/index.html
cd /
chown -R apache:apache /data
d.添加网卡或者添加子接口:
ifconfig eth0:0 192.168.21.100 netmask 255.255.255.0
e.重启服务:
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
f.换11虚拟机:
vim /etc/hosts
添加主机域名(同上)
测试(同上)
(4)、结合使用: 不同端口不同域名
两个域名
www.baidu.com:80
www.baidu.com:2222
www.sina.com:80
www.sina.com:3333
a,.vim /usr/local/apache2/conf/httpd.conf
取消注释:同上
b. cd /usr/local/apache2/conf
vim extra/httpd-vhosts.conf
<VirtualHost *:80>
DocumentRoot "/data/baidu-80"
ServerName www.baidu.com
ErrorLog "logs/baidu.com-80-error_log"
CustomLog "logs/baidu.com-80-access_log" common
</VirtualHost>
<Directory "/data/baidu-80">
options indexes followsymlinks
allowoverride All
require all granted
</Directory>
<VirtualHost *:2222>
DocumentRoot "/data/baidu-2222"
ServerName www.baidu.com
ErrorLog "logs/baidu.com-2222-error_log"
CustomLog "logs/baidu.com-2222-access_log" common
</VirtualHost>
<Directory "/data/baidu-2222">
options indexes followsymlinks
allowoverride All
require all granted
</Directory>
<VirtualHost *:80>
DocumentRoot "/data/sina-80"
ServerName www.sina.com
ErrorLog "logs/sina.com-80-error_log"
CustomLog "logs/sina.com-80-access_log" common
</VirtualHost>
<Directory "/data/sina-80">
options indexes followsymlinks
allowoverride All
require all granted
</Directory>
<VirtualHost *:3333>
DocumentRoot "/data/sina-3333"
ServerName www.sina.com
ErrorLog "logs/sina.com-3333-error_log"
CustomLog "logs/sina.com-3333-access_log" common
</VirtualHost>
<Directory "/data/sina-3333">
options indexes followsymlinks
allowoverride All
require all granted
</Directory>
c.创建目录:
mkdir /data
cd /data
mkdir baidu-80 baidu-2222 sina-80 sina-3333
echo “www.baidu.com:2222” >> baidu-2222/index.html
echo “www.baidu.com:80” >> baidu-80/index.html
echo “www.sina.com:80” >> sina-80/index.html
echo “www.sina.com:3333” >> sina-3333/index.html
cd /
chown -R apache:apache /data
d.重启服务:
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
e.换11虚拟机:
vim /etc/hosts
添加域名,主机并测试(同上)
5、地址跳转:(访问一个网站跳转到另一个网站上)
目的:就是实现URL的跳转和隐藏真实地址,基于Perl语言的正则表达式规范。平时帮助我们实现拟静态,拟目录,域名跳转,防止盗链等 。
实验:www.hongfuxuexiao.com跳转到www.hfxx.com上
a.vim /usr/local/apache2/conf/httpd.conf
b. cd /usr/local/apache2/conf
vim extra/httpd-vhosts.conf
<VirtualHost *:80>
DocumentRoot "/data/hongfuxuexiao"
ServerName www.hongfuxuexiao.com
ErrorLog "logs/hongfuxuexiao.com-error_log"
CustomLog "logs/hongfuxuexiao.com-access_log" common
</VirtualHost>
<Directory "/data/hongfuxuexiao">
options indexes followsymlinks
allowoverride All
require all granted
</Directory>
<VirtualHost *:80>
DocumentRoot "/data/hfxx"
ServerName www.hfxx.com
ErrorLog "logs/hfxx.com-error_log"
CustomLog "logs/hfxx.com-access_log" common
</VirtualHost>
<Directory "/data/hfxx">
options indexes followsymlinks
allowoverride All
require all granted
</Directory>
c.创建目录:
mkdir /data
mkdir hongfuxuexiao
mkdir hfxx
echo “hfxx123” >> hfxx/index.html
cd hongfuxuexiao/
vim .htaccess
d.给权限:
chown -R apache:apache data/
e.重启服务:
/usr/local/apache2/bin/apachectl start
f.vim /etc//hosts
添加主机并测试
6.HTTPS加密访问
HTTPS作用:它会在传输时自动进行加密,避免资料在途中被第三方撷取而获得重要内容(例如密码或其他隐私信息)。
1、HTTPS加密认证过程:
(1).单向认证和双向认证
a.单向认证:C 认证 S 是否安全,并且进行加密传输
b.双向认证:C 与 S 进行双向认证安全性,并且进行加密传输(Kubernetes 进行双向认证)
(2)加密方案
a.对称加密:加密算法 加密密钥 一致
b.非对称加密:私钥(解密数据) 公钥(加密数据)
(3)HTTPS 单向加密访问
a.对称加密:加密算法 S 确认 用于 C和 S 传输数据的数据加密 明文传输
密钥 C > S 通过证书加密传输 密文 用于 C S 传输数据的数据解密
b.非对称加密:证书 (S > C) 认证服务器是否可行(浏览器 ca) 加密对称加密的加密密钥
私钥 存储于服务器本地 解密 C 发来的加密的对称加密的密钥
2.HTTPS加密认证实验流程:
(1).创建私钥:
openssl genrsa -des3 -out server.key 1024
(2).创建证书请求:
openssl req -new -key server.key -out server.csr
输入刚刚创建的私钥密码
(3).创建正式证书:
openssl x509 -req -days 365 -sha256 -in server.key -signkey server.key -out servernew.crt
localhost:完全合格域名:
(4).复制公钥和私钥到apache下:
cp server.key /usr/local/apache2/conf/
cp servernew.crt /usr/local/apache2/conf/server.crt
(5).打开主配置文件:
vim /usr/local/apache2/conf/httpd.conf
取消注释
(6).打开sslwen文件:
vim /usr/local/apache2/conf/extra/httpd-ssl.conf
(7).重启服务:
/usr/local/apache2/bin/apachectl start
(8).启动Linux图形化界面,将IP和域名写入hosts文件中并测试
7.apache的日志切割功能
作用:做好日志的管理,防止日志文件内容过多占用资源,且不方便管理。
(1).设置日志文件目录名称以及日志格式的配置
vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
ErrorLog "logs/error.log"
CustomLog "logs/access.log" combined
日志显示格式书写(参照http.conf)
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
(2)apache设置日志分割
ErrorLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/aaa-error_%Y%m%d.log 86400"
CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/aaa-access_%Y%m%d.log 86400" combined
ErrorLog是错误日志,CustomLog是访问日志。|就是管道符,意思是把产生的日志交给rotatelog这个工具,而这个工具就是apache自带的切割日志的工具。-l的作用是校准时区为UTC,也就是北京时间。86400,单位是秒,正好是一天,那么日志会每天切割一次。而最后面的combined为日志的格式,在httpd.conf中有定义。
内容有点多,但是重要的内容基本都在里面了,一通整理,笔者眼睛也有点吃不消了。最重要的还是配置文件,配置文件内容的含义理解了,整个apache服务器的基本所有内容也就迎刃而解了。(感谢大家的阅读,浏览不易,感谢三连)