3、Web server 之httpd2.2 配置说明
http协议实现的程序
静态(httpd, nginx, lighttpd)
动态 (IIS, tomcat, jetty, jboss, resin, websphere, weblogic, oc4j)
客户端工具 (telnet, elinks, curl) 纯文本协议访问工具
HTTPD配置(端口、别名、访问控制、MPM、keep-alive、dso、DocumentRoot、DirectoryIndex、默认字符集、虚拟主机、mod_deflate模块、HTTPS配置)
HTTPD工具(htpasswd, apxs, rotatelogs, suexec),HTTPD压力测试(ab, webbench, http_load, jmeter, loadrunner, tcpcopy)
ASF: Apache Software Foundation Apache 软件基金会
FSF: Free Software Foundaton 自由软件基金会
ASF赖以起家的是: httpd<命名:apache>
HTTP安装
httpd(2)
CentOS 6 默认提供rpm包 2.2版本
CentOS 7 默认提供rpm包 2.4版本 (默认未安装)
CentOS 6 httpd程序环境(rpm安装)
/etc/httpd //ServerRoot 服务器根目录 /etc/httpd/conf.d //配置片段目录 /etc/httpd/conf/httpd.conf //主配置 /etc/httpd/logs //日志目录 /etc/httpd/modules //模块目录 /etc/httpd/run //运行中的进程的数据 /etc/rc.d/init.d/httpd //服务脚本 /etc/sysconfig/httpd //服务脚本配置 /usr/lib/httpd/modules /usr/lib/httpd/modules/mod_actions.so //DSO机制,动态共享对象 /usr/sbin/apachectl //apachectl程序
主程序文件:
/usr/sbin/httpd //MPM为IO,串行响应的进程 /usr/sbin/httpd.event //MPM为复用I/O模型,并行响应的进程 <2.2的httpd,event不成熟> /usr/sbin/httpd.worker //MPM............................. //ps axu | fgrep httpd可查看 /usr/share/doc/httpd-2.2.15 //<DOCUMENTATION> /usr/share/doc/httpd-2.2.15/ABOUT_APACHE /usr/share/doc/httpd-2.2.15/CHANGES /usr/share/doc/httpd-2.2.15/LICENSE /usr/share/doc/httpd-2.2.15/NOTICE /usr/share/doc/httpd-2.2.15/README /usr/share/doc/httpd-2.2.15/VERSIONING /usr/share/man/man8/apachectl.8.gz //<MAN Document> /usr/share/man/man8/htcacheclean.8.gz /usr/share/man/man8/httpd.8.gz /usr/share/man/man8/rotatelogs.8.gz /usr/share/man/man8/suexec.8.gz /var/cache/mod_proxy //<缓存目录> /var/lib/dav //<程序运行中的数据> /var/log/httpd //《日志目录》 access_log:访问日志
errot_log: 错误日志
/var/run/httpd //《运行中的httpd进程的数据》 /var/www/error/ //错误页面html网页存放目录
站点文档目录 /var/www/html //DocuRoot目录,资源路径的根映射的位置
httpd配置文件
配置文件的组成:
3.1、修改监听的IP和Port
Listen [IP:] PORT :
注:Listen 端口 ----- 省略IP 表示监听于所有网卡的IP
Listen指令,可以使用多次,用于监听不同地址的不同端口之上
e.g
Listen 192.168.1.105:8080 //监听在改IP的8080端口之上,能与此IP通信的主机才能访问此进程
Listen 80 //监听在所有接口的IP之上
注:修改端口后一定要重启, service httpd reload
3.2、持久连接
a)Persistent Connection :连接建立,每个资源获取完成后,不会断开连接,而是继续等待其它的请求完成
一个pv(自引用多个链接指向)多个资源,每个资源都需要一个请求
非持久连接:请求pv时,每个资源请求时,都需要建立tcp连接。<1.0默认>
持久连接:请求pv时,首个资源需要建立tcp连接,不断开情况下,继续完成后续请求
b)如何断开?
-
- 限制:到达一定时间[def:75s]后,tcp连接自动断开。httpd-2.4支持毫秒级别
- 数量限制:资源获取数量[def:100个]到达一定值时,tcp连接自动断开
c)副作用:并发访问量过大场景,时间或数量限制过大时,可能会导致后续的请求被[拒绝服务],可以关闭或调整时间或数量限制
折中:使用较短的持久连接时间
e)<默认配置:关闭持久连接功能
f)测试连接的关闭,显示结果
非持久连接测试结果显示:
持久连接测试结果显示:
3.3 、MPM 多路处理模块---并发响应模块
注: httpd-2.2 不支持同时编译多个模块,所以只能编译时确定一个;rpm安装的包提供三个二进制程序文件,分别用于实现对不同MPM机制的支持
确认方法: ps aux | grep httpd 查看相应文件
默认为/usr/sbin/httpd ,其使用prefork
1)查看当前使用的模块
2)查看装载的模块
3)更换MPM模块----/etc/sysconfig/httpd
更改为worker # awk '$1 != "#" && $0 !~ /^[[:space:]]*$/{print}' /etc/sysconfig/httpd #HTTPD=/usr/sbin/httpd.worker HTTPD=/usr/sbin/httpd.worker #OPTIONS= #HTTPD_LANG=C #PIDFILE=/var/run/httpd/httpd.pid # service httpd restart # ps axu | fgrep httpd root 20183 0.0 1.4 11716 3560 ? Ss 22:02 0:00 /usr/sbin/httpd.worker apache 20298 0.0 1.2 289448 3000 ? Sl 22:02 0:00 /usr/sbin/httpd.worker 更改为event # awk '$1 != "#" && $0 !~ /^[[:space:]]*$/{print}' /etc/sysconfig/httpd #HTTPD=/usr/sbin/httpd.worker HTTPD=/usr/sbin/httpd.event #OPTIONS= #HTTPD_LANG=C #PIDFILE=/var/run/httpd/httpd.pid # service httpd restart # ps axu | fgrep httpd root 20360 0.6 1.4 12184 3556 ? Ss 22:04 0:00 /usr/sbin/httpd.event apache 20363 0.0 1.1 289916 2916 ? Sl 22:04 0:00 /usr/sbin/httpd.event apache 20364 0.0 1.1 289916 2904 ? Sl 22:04 0:00 /usr/sbin/httpd.event apache 20365 0.0 1.1 289916 2904 ? Sl 22:04 0:00 /usr/sbin/httpd.event
MPM配置详解 /etc/httpd/conf/httpd.conf <网站的承载能力有一定影响>
# prefork MPM # StartServers: 启动服务器后,预留的进程数 # MinSpareServers: minimum number of server processes which are kept spare # MaxSpareServers: maximum number of server processes which are kept spare # ServerLimit: 服务器的生命周期内为MaxClients准备的最大值 # MaxClients: 最大并发数 # MaxRequestsPerChild: 每个进程最大响应请求数 <IfModule prefork.c> StartServers 8 #服务启动时服务进程数 MinSpareServers 5 #最小空闲进程数 MaxSpareServers 20 #最大空闲进程数 ServerLimit 256 #服务器进程数量最大值 MaxClients 256 #最大并发请求数 MaxRequestsPerChild 4000 #一个服务器进程最多能够响应多少次的请求 </IfModule> # worker MPM # StartServers: 启动服务预留进程数 # MaxClients: 最大并发数 # MinSpareThreads: 最小并发数 # MaxSpareThreads: maximum number of worker threads which are kept spare # ThreadsPerChild: 每个进程内的线程数 # MaxRequestsPerChild: 每个线程最多响应请求数 <IfModule worker.c> StartServers 4 #不包含主控进程 MaxClients 300 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 #每个进程所能够启动的线程数 MaxRequestsPerChild 0 //0表示没有上限 </IfModule> 配置:影响网站的承载能力
PV承载量= \(每秒请求资源数 * 86400 \)/每个页面的资源数 //满载工作
考虑:全天满负荷运行?带宽使用大小200k?
300*86400/50=40W
带宽:每个PV消耗多少KB * PV承载量
PV :Page View 页面计数
UV:User View 用户数量计数(独立IP数量)
3.4、DSO
配置指令实现模块加载
使用语法:LoadModule <模块名> <模块路径>
模块路径可使用相对地址:相对于serverroot [/etc/httpd] (CentOS 6)
/etc/httpd/modules ----->/usr/lib64/httpd/modules
重载配置文件,实现启动或禁用模块
查看此模块已经被装载 # httpd -M | fgrep deflate_module deflate_module (shared) 禁用 (配置文件注释) # vim /etc/httpd/conf/httpd.conf #LoadModule deflate_module modules/mod_deflate.so 重载 # service httpd reload 查看 # httpd -M | fgrep deflate_module Syntax OK
3.5、定义"Main" server 的文档页面路径
注:先关掉selinux再测试-----setenforce 0
文档路径映射:
DocumentRoot 指向的路径为URL路径的起始位置:
DocumentRoot "/var/www/html" /var/www/html/index.html -----> http://www.magedu.com/test/index.html 注: #setenforing 0 #iptables -F 2.2版本修改DocumentRoot,不需要授权 2.4版本修改DocumentRoot 需要对文件系统目录授权
注意:
① 可以写多行,但是下边的会覆盖上边的,最后还是使用下边的,写到子配置文件一样,因为子配置文件Include conf.d/*.conf在这行设置的上边,会被这行设置覆盖。
3.6、站点访问控制
a)可基于两种类型的路径指明对那些资源进行访问控制
文件系统路径:
DocumentRoot "/var/www/html"
<Directory "">...</Directory>
<Files "">...</File>
e.g
<Files ~ "^\.ht"> Order allow,deny Deny from all Satisfy All </Files>
URL路径:
<Location "">...</Location>
b)访问控制机制:
基于来源地址:Order , allow from 地址,deny from 地址
基于用户账号控制 :LogFormat :%u
c)基于用户访问控制的实现
安全域:需要用户认证后方能访问的路径
应该通过名称对其进行标识,并用于告知用户认证的原因
用户的账号和密码存储与何处
虚拟账号:仅用于访问某服务时用到的认证标识(跟操作系统里面的账号没有任何关系)
定义在/etc/httpd/conf/httpd.conf文件中
认证质询:
WWW-Authenticate :响应码为401 ,拒绝客户端请求,并说明要求客户提供账号和密码
认证:
Authorization :客户端用户填入账号和密码后再次发送请求报文;认证通过,则服务器发送响应的资源
认证类型:
basic :明文,放入https中进行【通用:浏览器大多数较老,不支持digest认证】//弹窗认证
digest :消息摘要 发送账号及密码对应的md5码至服务器,服务器将md5码与存储的对应的md5码对比
表单认证-----登录淘宝时输入的账号密码类型
密码存储位置:文件、数据库、ldap、nis、认证系统
- ) 基于basic认证实现(了解)
- 定义安全域
<Directory ""> Options None #访问目录中的文件特性 AllowOverride None AuthType Basic #认证类型 AuthName "STRING" #安全域 AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE" #密码储存位置 Require user <username1> <username2> ... #可登录的用户
# Require group GROUP1 GROUP2 ... #基于组来认证是需要此步骤 </Directory>
允许账号文件中的所有用户登录访问:
Require valid-user
- 提供账号和密码存储(文本文件)
使用htpasswd命令进行管理
htpasswd [options] passwordfile username
-
- -c: 自动创建passwordfile,因此,仅应该在添加第一个用户时使用;
- -m: md5加密用户密码;
- -s: sha1加密用户密码;
- -D: 删除指定用户
e.g
# echo "hello" > /www/htdocs/admin/index.html <Directory "/www/htdocs/admin"> Options None AllowOverride None AuthType Basic AuthName "Administrator private" AuthUserFile "/etc/httpd/conf.d/.htpasswd" Require valid-user </Directory> # httpd -t # service httpd reload # htpasswd -c -m /etc/httpd/conf.d/.htpasswd tom #第一次创建用户需-c # htpasswd -m /etc/httpd/conf.d/.htpasswd obama # htpasswd -m /etc/httpd/conf.d/.htpasswd obama
基于组进行认证实现
vim /etc/httpd/conf.d/.htgroup 创建组文件并建立组名 weblogic :tom obama <Directory "/www/htdocs/admin"> Options None AllowOverride None AuthType Basic AuthName "Administrator private" AuthUserFile "/etc/httpd/conf.d/.htpasswd" AuthGroupFile "/etc/httpd/conf.d/.htgroup" Require group weblogic </Directory> 要提供:用户账号文件和组文件; 组文件:每一行定义一个组 GRP_NAME:user1 user2 user3 ...
3.7、默认主页面
DirectoryIndex index.html index.html.var
自左向右,依次匹配给出目录下的文件,存在时,显示
3.8、 Directory 中“基于来源地址”实现控制”
<Directory "/var/www/html"> Options Indexes FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory>
a)Options 选项
所有可用特性:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
常用选项:None, ALL
Indexes : 索引 ----- 允许索引 没有默认主页面时,显示欢迎界面【注:docroot与directory 修改路径要相同】
FollowSymLinks :索引的文件是symolic link 时,允许跟踪符合链接文件
SymLinksifOwnerMatch :属主匹配-----符号链接文件的属主与原文件属主为同一个用户时,才允许跟踪
MultiViews :是否允许多视图 内容协商:启动后性能差
ExecCGI :是否允许CGI接口
b)AllowOverride ---是否允许覆盖选项 (了解)
选项值:FileInfo AuthConfig Limit None ALL
是否允许当前的配置去覆盖每一个网站页面下的一个隐藏文件(./htaccess )
./htaccess 每个目录访问控制:灵活 但对性能影响非常大不启用
c)基于来源地址的访问控制机制
Order :检查次序 写在后面的位默认法则
Order allow,deny (白名单)
Order deny ,allow(黑名单)
Allow from
deny from
后接 来源IP地址
NetAddr :表示172.16网络的方式
通配符:*.magedu.com
修改配置文件如下信息及其显示结果:
3.9 日志设置
官网地址:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html
http://httpd.apache.org/docs/2.2/logs.html
a)错误日志
日志为链接路径:/etc/httpd/logs ----->/var/log/httpd/
b)访问日志
CustomLog logs/access_log combined
日志文件路径<相对于ServerRoot> 日志格式名<logformat>
LogFormat格式
- combined 格式:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined #组合格式包含下面是三个格式 LogFormat "%h %l %u %t \"%r\" %>s %b" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent
- combinedio
#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
记录日志时候,会根据这一次用户的请求 把这些宏替换成对应的相关信息
e.g
192.168.1.105 - tom [18/Sep/2017:02:59:24 +0800] "GET /admin/ HTTP/1.1" 304 11 "-" "Mozilla/5.0
%h remote host 客户端IP地址
%l remote logname 登录的用户名,mod_ident模块为空时,用 “_” 表示
%u remote user 用户访问控制的basic,digst认证的用户名为空时,用 “_” 表示
%t Time the request was received 服务器收到请求的时间
%r First line of request 请求报文的首行
%>s Status 响应状态码
%b :响应报文的大小,单位是字节,不包括响应报文首部
%{Referer}i :请求报文当中“referer”首部的值;当前页面(资源)的访问入口,即从哪个页面的超链接跳转而来
“ _ ” 网站有名--直接从浏览器键入的,而不是从网页超链接跳转过去的
“不为空时,网站的广告有效”
%{User-Agent}i :请求报文当中“User-Agent”首部的值;即发出请求用到的应用程序
用户代理:发起请求的用到的进程<elink,ab,telnet,浏览器, curl>搜索引擎是爬虫爬出来的
10、路径别名
Alias /URL/ "/PATH/TO/SOMEDIR/"
注:URL后面存在“/” 时,路径后必须存在“/”
/URL/被匹配是从资源路径的根起始的
E.g
- DocumentRoot "/www/htdocs"
http://www.magedu.com/download/bash-4.4.2-3.el6.x84_64.rpm
--->/www/htdocs/download/bash-4.4.2-3.el6.x84_64.rpm
- Alias /bbs/ "/forum/htdocs/"
http://www.magedu.com/bbs/index.html ---> /forum/htdocs/index.html
例如:/www/forum 此处DocumentRoot为/www/forum 文件系统路径:/www/forum/bbs/upload/a.rar 则URL路径为:http://Server_IP/bbs/upload/a.rar # mkdir -p /www/forum # echo "This is a new site location" > /www/forum/index.html # vi /etc/httpd/conf/httpd.conf ###修改为 /www/forum # service httpd reload # curl http://192.168.21.10 This is a new site location
11、字符集设定 (了解)
AddDefaultCharset UTF-8
全球:UTF-8
国标:GBK,GB2312 ,GB18030 <中文>
源文件中的编码应该与服务器的编码相同
四、虚拟主机
虚拟主机的类型
- 基于IP :一个服务器有多个IP (实践中很少使用)
- 基于PORT :同一个IP,有多个PORT (实践中很少使用)
- 基于主机名hostname :同一个IP,有多个Host
基于名称完成不同虚拟主机的识别
封装时: HTTP首部、TCP首部、IP首部、帧首部..
Host: 浏览器键入的主机名 //"应用层首部"中附加,非通信子网
注:一般虚拟主机不可与中心主机混用,所以要使用虚拟主机,需先禁用中心主机
4.1、配置前提
httpd2.2版本 注释中心主机DocumentRoot ,并启动 ServerName :NameVirtualHost *:80 httpd2.4版本 注释中心主机DocumentRoot
4.2、每个虚拟主机都有专用配置格式
实例1 基于IP地址
a) 在配置文件的最后写入一下字段:
<VirtualHost 192.168.1.105:80> ServerName web1.douma.com DocumentRoot "/data/web1" </VirtualHost> <VirtualHost 192.168.1.25:80> ServerName web2.douma.com DocumentRoot "/data/web2" </VirtualHost>
b) 然后创建对应位置:
mkdir -pv /data/web{1,2}
echo "web1 > /data/web1/index.html"
echo "web2 > /data/web2/index.html"
c) 添加一块网卡:
ip addr add 192.168.1.25/24 dev eth0
显示添加网卡:ip addr list
实例:基于port实现
a) 配置文件的最后写入一下字段:
<VirtualHost 192.168.1.105:8080> ServerName web3.douma.com DocumentRoot "/data/web3" </VirtualHost>
<VirtualHost 192.168.1.105> ServerName web4.douma.com DocumentRoot "/data/web4" </VirtualHost>
mkdir -pv /data/web{3,4}
echo "web3 > /data/web3/index.html"
echo "web4 > /data/web4/index.html"
b) 开启监听8080端口
Listen :8080
实例3、基于Hostname实现
a) 要开启NameVirtualHost:80 项 修改配置文件 NameVirtualHost 192.168.1.105:80
注:选中部分要求一致
<VirtualHost 192.168.1.105:80>
ServerName web3.douma.com
DocumentRoot "/data/web3"
</VirtualHost>
<VirtualHost 192.168.1.105:80>
ServerName web4.douma.com
DocumentRoot "/data/web4"
</VirtualHost>
c) 编辑/etc/hosts文件 添加如下内容
192.168.1.105 web3.douma.com
192.168.1.105 web4.douma.com
d)测试 curl http://
web3.douma.com
内置的status页面
web的子功能
访问结果显示如下:
开启扩展信息:
再互联网上访问上述信息:需基于账号实现访问控制
CentOS 7
默认运行级别
[root@localhost ~]# systemctl get-default
multi-user.target
修改运行级别
[root@localhost ~]# systemctl set-default
https://blog.51cto.com/sonlich/1968229
https://blog.51cto.com/11010461/2109162
https://www.cnblogs.com/dannylinux/articles/7999156.html
https://www.aliyun.com/1111/2019/group-buying-share?ptCode=BD1104468FD85A9BBC32DA64D3419891647C88CF896EF535&userCode=sllkyfo6&share_source=copy_link