Linux进阶——httpd
为了能让http顺利使用,在20世纪90年代初,伊利诺大学的国家超级电脑应用中心开发出来一个基于http协议的服务httpd软件,很快就领导了www的服务市场。但是后来由于httpd这个软件没有得到很好的发展,就有一群志同道合的技术爱好者发起了一个计划来改善原先的httpd服务功能,改良的软件就叫Apache。之后Apache就成了主流的web服务器软件。目前市面上主流的CentOS系统是6,7.CentOS6默认安装httpd-2.2,而CentOS7默认安装httpd-2.4。本篇出现的httpd都是2.4也就是在Centos7上
Httpd的特性
高度模块化:core + modules
DSO: Dynamic Shared Object 动态加/卸载
MPM:multi-processing module多路处理模块
MPM工作模式
prefork:多进程I/O模型
每个进程响应一个请求,默认模型一个主进程:生成和回收n个子进程,创建套接字,不响应请求多个子进程:工作work进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求,最大不超过1024个
worker:复用的多进程I/O模型
多进程多线程,IIS使用此模型一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求:m*n
event:事件驱动模型(worker模型的变种)
一个主进程:生成m个子进程,每个进程直接响应n个请求,并发响应请求:m*n,有专门的线程来管理这些keep-alive类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请求处理能力
安装httpd
很简单yum –y install httpd
我们已经可以启动服务了,确保关闭了防火墙,与selinux
/etc/httpd/conf/httpd.conf 主配置文件
/etc/httpd/conf.d/*/conf 子配置文件
/etc/httpd/conf.modules.d/*.conf 模块相关配置文件
/usr/sbin/httpd/ 主程序文件
/var/log/httpd/ 日志文件
Access_log 访问日志文件
Error_log 错误日志文件
/var/www/html 站点文档
Systemctl start httpd 服务控制systemd控制
我们看一下主配置文件:(一旦修改配置文件需重启服务使之生效)
Vim /etc/httpd/conf/httpd.conf
配置格式:
directive value
directive:不区分字符大小写;
value:为路径时,是否区分字符大小写,取决于文件系统;
常用配置:
要用于指定Apache的安装路径,此选项参数值在安装Apache时系统会自动把Apache的路径写入。Windows安装时,该选项的值为Windows安装的路径,Linux安装时该选项值为编译时选择的路径
Listen主要侦听web服务端口状态,默认为:80,即侦听所有的地址的80端口,注意这里也可以写成IP地址的侦听形式,不写即默认的地址:0.0.0.0(Listen可出现多次)
子配置文件路径(相对路径)
此选项主要用指定Apache服务的运行用户和用户组
指定Apache默认的服务器名以及端口
根目录下所有的访问权限控制,默认Apache对根目录访问都是拒绝访问
上述参数一般情况下我们不需要个更改
Apache默认网站根目录的设置以及相关的权限访问设置,默认对网站的根目录具有访问权限,此选项默认值即可
注意:主配置文件中出现的每一路径都需要对其进行认证(不过不需如他一样级级认证),别名除外
设置Apache默认支持的首页,默认只支持:index.html首页,如要支持其他类型的首页,需要在此区域添加:
DirectoryIndex index.html index.php index.php表示支持index.php类型首页(若目录下同时存在多种,谁再前谁优先级最高,这个警示index.html优先)
主要是针对.ht文件访问控制,默认为具有访问权限,此区域文件默认即可
10、日志设定
错误日志:
ErrorLog logs/error_log
LogLevel warn
Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
访问日志:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog logs/access_log combined
LogFormat format strings:
%h:客户端IP地址;
%l:Remote User, 通常为一个减号(“-”);
%u:Remote user (from auth; may be bogus if return status (%s) is 401);非为登录访问时,其为一个减号;
%t:服务器收到请求时的时间;
%r:First line of request,即表示请求报文的首行;记录了此次请求的“方法”,“URL”以及协议版本;
%>s:响应状态码;
%b:响应报文的大小,单位是字节;不包括响应报文的http首部;
%{Referer}i:请求报文中首部“referer”的值;即从哪个页面中的超链接跳转至当前页面的;
%{User-Agent}i:请求报文中首部“User-Agent”的值;即发出请求的应用程序;
后面的选项大多为加载模块的配置,也保持默认即可,我们可以发现这个文件我没们基本不用更改,事实也就是如此我们不可能把私人文件的配置放在主配置文件中,一般都放在子配置文件中,也就是/etc/httpd/conf.d/*/conf 中,此外我们在跟大家提供一些没有的
定义路径别名
格式:Alias /URL/ "/PATH/TO/SOMEDIR/"
DocumentRoot "/www/htdocs"
http访问的路径:http://www.magedu.com/download/bash-4.4.2-3.el6.x86_64.rpm 真实路径/www/htdocs/download/bash-4.4.2-3.el6.x86_64.rpm
Alias /download/ "/rpms/pub/"
http访问的路径:http://www.magedu.com/download/bash-4.4.2-3.el6.x86_64.rpm 真实目录/rpms/pub/bash-4.4.2-3.el6.x86_64.rpm
别名的定义可以使我们不需要修改DocumentRoot从而访问新的文件目录
别名的优先级是高于真实路径的,以上为例,若/www/htdocs存在/rpms目录,也就是真实存在/www/htdocs/rpm与/rpms两个目录如果定义别名 Alias /download/ "/rpms"
若访问http://www.magedu.com/download/则实际映射目录为/rpms而不是/www/htdocs/rpm,所以别名的目录名字一定慎重
设定默认字符集
AddDefaultCharset UTF-8
中文字符集:GBK, GB2312, GB18030
实现访问控制
基于ip
vim /etc/httpd/conf/httpd.conf
#实现黑名单
<RequireAll>
Require all granted #允许所有主机访问
Require not ip 192.168.75.7 #不允许192.168.75.7访问
</RequireAll>
#实现白名单
<RequireAny> #不允许任何ip访问
Require ip 192.168.75.7 #只允许192.168.75.7访问
</RequireAny>
基于AllowOverride实现认证
在httpd中自带用户认证机制(好吧我们一般用表单认证,这玩意太low了),当然搭一个后台只有管理员可登陆的网页管理员认证机制也是可以的。
vim /etc/httpd/conf/httpd.conf
<Directory "/var/www/html/admin">
AllowOverride none
AuthType Basic
AuthName "Please login"
AuthUserfile "/etc/httpd/conf/.htpasswd"
Require user xiaofan
Require valid-user
</Directory>
htpasswd -b -c -m /etc/httpd/conf/.htpasswd xiaofan centos
Adding password for user xiaofan
htpasswd -b -m /etc/httpd/conf/.htpasswd xiaochen centos
Adding password for user xiaochen
这玩意还可以实现组的访问控制
vim /etc/httpd/conf/httpd.conf
<Directory "/var/www/html/admin">
AllowOverride none
AuthType Basic
AuthName "Please login"
AuthUserfile "/etc/httpd/conf/.htpasswd"
AuthGroupfile "/etc/httpd/conf/.htgroup"
Require group xiaofanzhijia
</Directory>
vim /etc/httpd/conf/.htgroup
xiaofanzhijia: xiaofan xiaochen
虚拟主机
apache默认不需要虚拟主机是可以正常访问的,虚拟主机主要是解决多个域名访问的问题。比如你的站点要配置多个域名,可以通过虚拟主机实现,如果只是一个域名,就不需要配置虚拟主机了
基于端口
蠢外人在访问你的网站时还待知道你的端口是啥??http://www.baidu.com:8080 ??这样访问
vim /etc/httpd/conf.d/vhost.conf
Listen 8080
Listen 9090
<VirtualHost *:8080>
DocumentRoot "/app/website1"
<Directory "/app/website1">
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:9090>
DocumentRoot "/app/website2"
<Directory "/app/website2">
Require all granted
</Directory>
</VirtualHost>
基于ip
vim /etc/httpd/conf.d/vhost.conf <VirtualHost 192.168.153.17:80> DocumentRoot "/app/website1" <Directory "/app/website1"> Require all granted </Directory> </VirtualHost> <VirtualHost 192.168.153.27:80> DocumentRoot "/app/website2" <Directory "/app/website2"> Require all granted </Directory>
ifconfig ens34:0 192.168.75.17/24 ifconfig ens34:1 192.168.75.27/24
我们这是虚拟机随便该网卡,加ip地址,但是现实中ip有多紧张,你家老板真财大气粗
基于域名的虚拟主机
这才是我们最常用的虚拟主机创建方式,http传输有请求报文(有火狐浏览器的小伙伴可以自己看看),请求报文的起始行中会有网站的域名,我们的配置文件会根据此信息判断客户访问的那个网页
vim /etc/httpd/conf.d/vhost.
<VirtualHost *:80> ServerName www.baidu.com DocumentRoot "/app/website1" CustomLog "logs/www.baidu.com_access_log" combined <Directory "/app/website1"> Require all granted </Directory> </VirtualHost> <VirtualHost *:80> DocumentRoot "/app/website2" CustomLog "logs/bbs.baidu.com_access_log" combined <Directory "/app/website2"> Require all granted </Directory> </VirtualHost>
其实我们建议买一的服务器大家自己搭一下试试,没那么简单,若真没钱我们可以用虚拟机图形界面化自带的浏览器,只需更改/etc/hosts文件,就可以实现访问自己的虚拟主机,
当然更改winds的hosts文件可以实现在Windows端浏览器的访问 找这个文件 C:\Windows\System32\drivers\etc\hosts win10的可能对此文件不支持改写,更改下就行