Web Server - httpd配置二
- 3.1 httpd配置
- 3.1.1 基于用户的访问控制
- 3.1.2 basic认证配置示例:
- 1. 添加用户
- 2. 添加网页文件
- 3. 定义安全域
- 4. 修改父目录权限
- 5. 访问效果
- 6. 在配置文件中定义一个".htaccess"隐藏文件
- 7. 添加组
- 3.1.3 虚拟主机
- 1. 构建方案
- 2. 基于IP的虚拟主机示例
- 3. 基于端口的虚拟主机
- 4. 基于FQDN的虚拟主机
- 5. 开启status功能
- 3.2 httpd的功能特性:
- 3.2.1 CGI:Common gateway interface
- 3.2.2 ScriptAlias 指令,配置脚本执行目录
- 3.2.3 使用mod_deflate模块压缩页面优化传输速率
- 3.2.4 https(http over ssl),使用mod_ssl支持https
- 3.3 常用命令、工具
- 3.3.1 常用命令
- 3.3.2 常用工具
3.1 httpd配置
3.1.1 基于用户的访问控制
认证质询:
WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供帐号及密码
认证:
Authorization:客户端用户填入帐号和密码后在此发送请求报文;认证通过时,则服务器发送响应的资源
认证方式:
basic:明文
digest:消息摘要认证
安全域:
需要用户认证后方能访问的路径;应该通过名称对其进行标示,仪表告知用户认证的原因
用户的帐号和密码存放在何处?
虚拟帐号:仅用于访问某服务时用到的认证标示
存储:文本文件(httpd-tools/htpasswd加密工具),SQL数据库,ldap目录存储
添加用户:
使用专用命令完成此类文件的创建及用户管理,格式
htpasswd [options] /path/to/dir username passwd
-c 自动创建此处制定文件,仅应该在此文件不存在时使用
-m:md5格式加密
-s:sha格式加密
-D:删除指定用户
-b:在命令行中一并输入用户名和密码而不是根据提示输入密码
-p:明文密码
默认md5加密 -m
htpasswd -b -c /tmp/test.users tom 123456
创建用户tom,密码1234567,并创建密码文件test.users
添加组:
[root@k8s-node-02 apache]# cat /usr/local/apache/conf/users.group
testgrp: tom jason #每一行定义一个组,组中的用户用空格分开
配置文件:
httpd支持自定义配置文件,即不必把所有配置文件都写入主配置文件
user/group:进程安全上下文,一个进程是否能访问某个文件,取决于2者:
1.运行这个进程的用户身份,
2.文件的属主属组
指定以那个用户的身份运行httpd服务进程
/etc/httpd/httpd.conf
user apache
group apache
配置文件中指定user为apache
Suexec:访问服务器其他非apache用户权限,只是一个解决方案,并不安全
3.1.2 basic认证配置示例:
基于用户搭建
1. 添加用户
[root@k8s-node-02 conf]# htpasswd -c -b ./users.passwd tom 123456
Adding password for user tom
[root@k8s-node-02 conf]# cat users.passwd
tom:$apr1$oyXRu1eD$PFtacQ2r/ioGiwZ9yJ4k8/
2. 添加网页文件
[root@k8s-node-02 apache]# cat htdocs/doc/d.html
<h1>hello python!</h1>
3. 定义安全域
<Directory "/usr/local/apache/htdocs/doc/">
Options None
AllowOverride None
AuthType Basic
AuthName "input account and passwd"
AuthUserFile "/usr/local/apache/conf/users.passwd"
#Require valid-user
Require user tom
</Directory>
允许帐号文件中的所有用户登陆访问;
Require valid-user
4. 修改父目录权限
如果仅添加控制块并不能起作用,因为父目录的权限是允许全部访问,而子目录继承父目录权限。所以还应该把父目录权限进行修改,账号密码才能起作用
DocumentRoot "/usr/local/apache/htdocs"
<Directory "/usr/local/apache/htdocs">
...
Options Indexes FollowSymLinks
...
AllowOverride None
...
Require all denied
Require user tom
</Directory>
5. 访问效果
6. 在配置文件中定义一个".htaccess"隐藏文件
[root@k8s-node-02 apache]# cat htdocs/doc/.htaccess
AuthType Basic
AuthName "Welecon to Login"
AuthUserFile "/usr/local/apache/conf/users.passwd"
Require user jason tom
此处我们允许jason和tom用户访问,若允许账号验证文件的所有用户均有权限访问可直接写"Require valid-user"即可。
为什么".htaccess"文件客户端看不到呢?
<Files ".ht*">
Require all denied
</Files>
7. 添加组
基于组帐号进行认证
<Directory "">
Options None
AllowOverride None
AuthType Basic
AuthName "String"(提示用户为什么认证)
AuthUserFile "/PATH/TO/DIR"(/tmp/test.users)
AuthGroupFIle "/paht/to/group_file"
Require group groupname1 grpname2...
</Directory>
配置
[root@k8s-node-02 apache]# cat /usr/local/apache/conf/users.group #添加组
testgrp: tom jason
...
<Directory "/usr/local/apache/htdocs/doc/">
Options None
AllowOverride None
AuthType Basic
AuthName "please input account and passwd"
AuthUserFile "/usr/local/apache/conf/users.passwd"
AuthGroupFile "/usr/local/apache/conf/users.group" #配置组文件路径
#Require valid-user
#Require user tom
Require group testgrp #设置组权限
</Directory>
3.1.3 虚拟主机
站点标识:socket
- IP相同,端口不同;
- IP不同,端口均为默认
- IP和端口相同,FQDN不同
1. 构建方案
创建虚拟主机有三种实现方案:
- 基于IP:
为每个虚拟主机准备至少一个ip- 基于端口:
为每个虚拟主机使用至少一个独立port- 基于FQDN:
为每个虚拟主机使用至少一个FQDN
注意:http2.2 一般虚拟主机不要与中心主机户混用,要使用虚拟主机,先禁用main主机
禁用方法:注释中心主机的DocumentRoot指令即可
2. 基于IP的虚拟主机示例
① 在本机添加三个IP,并制作网页
ip address add 192.168.0.10/24 dev ens33
ip address add 192.168.0.11/24 dev ens33
ip address add 192.168.0.12/24 dev ens33
mkdir /www;cd /www;mkdir {10..12};
echo 'welcome 10.com' > 10/index.html
echo 'welcome 10.com' > 11/index.html
echo 'welcome 10.com' > 12/index.html
② 修改主配置文件,取消对virtual host的配置文件路径注释
# Virtual hosts
Include conf/extra/httpd-vhosts.conf
③ 编辑conf/extra/httpd-vhosts.conf
[root@k8s-node-02 conf]# cat extra/httpd-vhosts.conf
<VirtualHost 192.168.0.10:80>
ServerName "www.10.com" #域名
DocumentRoot "/www/10/htdocs" #文档路径
<Directory "/www/10/htdocs"> #授权
Options None
Require all granted
</Directory>
</VirtualHost>
<VirtualHost 192.168.0.11:80>
ServerName www.11.com
DocumentRoot "/www/11/htdocs"
<Directory "/www/11/htdocs">
Options None
Require all granted
</Directory>
</VirtualHost>
<VirtualHost 192.168.0.12:80>
ServerName www.12.com
DocumentRoot "/www/12/htdocs"
<Directory "/www/12/htdocs">
Options None
Require all granted
</Directory>
</VirtualHost>
④ 检查语法并重启httpd
httpd -t
systemctl restart httpd
⑤ 测试
[root@k8s-node-02 conf]# curl 192.168.0.10
welcome 10.com
[root@k8s-node-02 conf]# curl 192.168.0.11
welcome 11.com
[root@k8s-node-02 conf]# curl 192.168.0.12
welcome 12.com
3. 基于端口的虚拟主机
添加监听端口:Listen 8082
[root@k8s-node-02 extra]# cat httpd-vhosts.conf
Listen 8082
Listen 8083
<VirtualHost *:80>
ServerName "www.10.com"
DocumentRoot "/www/10/htdocs"
<Directory "/www/10/htdocs">
Options None
Require all granted
</Directory>
ErrorLog "logs/www.10.com-error_log"
CustomLog "logs/www.10.com_log" common
</VirtualHost>
<VirtualHost *:8082>
ServerName www.11.com
DocumentRoot "/www/11/htdocs"
<Directory "/www/11/htdocs">
Options None
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:8083>
ServerName www.12.com
DocumentRoot "/www/12/htdocs"
<Directory "/www/12/htdocs">
Options None
Require all granted
</Directory>
</VirtualHost>
笔者基于端口配置不好用,鼓捣半天也没解决,先躺着,回头再来解决。
4. 基于FQDN的虚拟主机
修改ServerName,配置/etc/hosts
[root@k8s-node-02 extra]# cat httpd-vhosts.conf
<VirtualHost 192.168.0.10:80>
ServerName "www.10.com"
DocumentRoot "/www/10/htdocs"
<Directory "/www/10/htdocs">
Options None
Require all granted
</Directory>
ErrorLog "logs/www.10.com-error_log"
CustomLog "logs/www.10.com_log" common
</VirtualHost>
<VirtualHost 192.168.0.10:80>
ServerName www.11.com
DocumentRoot "/www/11/htdocs"
<Directory "/www/11/htdocs">
Options None
Require all granted
</Directory>
</VirtualHost>
<VirtualHost 192.168.0.10:80>
ServerName www.12.com
DocumentRoot "/www/12/htdocs"
<Directory "/www/12/htdocs">
Options None
Require all granted
</Directory>
</VirtualHost>
[root@k8s-node-02 extra]# cat /etc/hosts
192.168.0.10 www.10.com
192.168.0.10 www.11.com
192.168.0.10 www.12.com
[root@k8s-node-02 extra]# curl www.10.com
welcome 10.com
[root@k8s-node-02 extra]# curl www.11.com
welcome 11.com
[root@k8s-node-02 extra]# curl www.12.com
welcome 12.com
5. 开启status功能
1.加载mod_status.so模块
①编辑httpd.conf文件vim /usr/local/apache/conf/httpd.conf
②查看行 LoadModuls status_module modules/mod_status.so 前是否有注释符号#,如果有则去掉,如果没有则直接进行下一步操作。
2.加载status模块的配置文件
①编辑httpd.conf文件vim /usr/local/apache/conf/httpd.conf
②查看行 Include conf/extra/httpd-info.conf 前是否有注释符号#,如果有则去掉,如果没有则直接进行下一步操作。
3.开启详细状态功能
①编辑httpd-info.conf文件vim /usr/local/apache/conf/extra/httpd-info.conf
②查看行 ExtendedStatus On 前是否有注释符号#,如果有则去掉,如果没有则直接进行下一步操作。
设置完这些,重启apache服务后我们就可以通过域名/server-status查看apache允许状态了,接下来我们来配置针对status页面做认证
关于httpd-info.conf配置内容
① http2.2
<Location /server-status>
SetHandler server-status
Order allow,deny
Allow from 172.16
</Location>
② http2.4
<Location /server-status>
SetHandler server-status
Require ip 172.16
</Location>
3.2 httpd的功能特性:
3.2.1 CGI:Common gateway interface
CGI脚本由服务器调用, 基于浏览器的数据输入. 其工作原理如下:
1 一个URL指向一个CGI脚本. 一个CGI脚本的URL能如普通的URL一样出现,区别于.htm/.html静态URL,CGI的URL是动态URL。如http://xxxx.com/cgiurl
2 服务器CGI接收浏览器的请求, 按照那个URL指向对应的脚本文件(注意文件的位置和扩展名),执行CGI脚本.
3 CGI脚本执行基于输入数据的操作,包括查询数据库、计算数值或调用系统中其他程序.
4 CGI脚本产生某种Web服务器能理解的输出结果.
5 服务器接收来自脚本的输出并且把它传回浏览器,让用户了解处理结果
3.2.2 ScriptAlias 指令,配置脚本执行目录
将URL映射到文件系统位置,并将目标指定为CGI脚本。例:Script Alias "cgi-bin" "/usr/local/apache/cgi-bin/"
表示访问 http://www.itwish.cn/cgi-bin/test
时,目录映射地址为/usr/local/apache/cgi-bin/test
语法1:ScriptAlias [URL-path] file-path|directory-path
# 定义/cgi-bin/ 目录映射到 /web/cgi-bin/ 目录 ,1)功能等同于2) ,注意结尾的"/"
1)
ScriptAlias "/cgi-bin/" "/web/cgi-bin/"
2)
Alias "/cgi-bin/" "/web/cgi-bin/"
<Location "/cgi-bin">
SetHandler cgi-script
Options +ExecCGI
</Location>
主配置文件:
[root@VM httpd]# vi httpd.conf # 调整配置文件
<IfModule mpm_prefork_module>
LoadModule cgi_module modules/mod_cgi.so #根据不同工作模式,打开不同的cgi模块
</IfModule>
<IfModule alias_module>
#
ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"
# 定义目录/cgi-bin/ 目录映射到 /usr/local/apache/cgi-bin/ 目录
</IfModule>
<Directory "/usr/local/apache/cgi-bin"> # 定义目录属性
AllowOverride none
Options none
Require all granted
</Directory>
创建测试脚本
[root@VM cgi-bin]# vi test1 # 在cgi-bin目录中创建test1 bash 脚本
#!/bin/bash
cat << EOF
Content-Type: text/html
# 注意改行为空行
<pre>
<h1>The hostname is `hostname`. </h1> # 显示主机名 ,使用bash命令 hostname 实现
The time is `date`. # 显示当前访问日期 ,使用bash命令 date 实现
</pre>
# 改行为空行
EOF
[root@VM cgi-bin]# vi test2 # 在cgi-bin目录中创建test2 perl 脚本
#!/usr/bin/perl
print "content-type: text/html","\n\n";
print "<HTML>","\n";
print "<HEAD>","\n";
print "<TITLE>Perl</TITLE>","\n";
print "</HEAD>","\n";
print "<BODY>","\n";
print "<H1>Hello World</H1>","\n";
print "</BODY>","\n";
print "</HTML>","\n";
[root@VM ]# chmod o+x /usr/local/apache/cgi-bin/{test1,test2} # 注意 ,一定要给与脚本执行权限
[root@VM cgi-bin]# curl http://192.168.71.253/cgi-bin/test1 # 测试 test1 脚本执行状况
<pre>
<h1>The hostname is VM. </h1>
The time is Wed Aug 15 19:26:56 CST 2018.
</pre>
[root@k8s-node-02 apache]# curl http://192.168.71.253/cgi-bin/test2 # 测试test2 perl脚本执行状况
<HTML>
<HEAD>
<TITLE>Perl</TITLE>
</HEAD>
<BODY>
<H1>Hello World</H1>
</BODY>
</HTML>
3.2.3 使用mod_deflate模块压缩页面优化传输速率
使用场景:
1.节约带宽
2.压缩适合于压缩的资源
SetOutputFilter DEFLATE 设置过滤器
AddOutputFIlterByType DEFLATE text/html
...
DeflateCompressionLevel 9 压缩比
BrowserMatch ^Mozilla/4 gizp-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
3.2.4 https(http over ssl),使用mod_ssl支持https
ssl会话简化流程:
- 客户端发送可供选择的加密方式,并向服务器请求证书
- 服务器端发送证书以及选定的加密方式给客户端
- 客户端取得证书并进行证书验证
如果信任给其发证书CA:
a,验证证书来源的合法性,用CA的公钥解密证书上的数字签名
b,验证证书内容的合法性;完整性
c,检查证书的有效期限
d,检查证书是否被吊销
e,证书中拥有者的名字,与访问的目标主机要一致 - 客户端生成临时会话密钥(对称密钥),并使用服务器的公钥加密此数据发送给服务器,完成密钥交换
- 服务器用此密钥加密用户请求的资源,响应客户端
注意:ssl会话是基于ip地址创建;所以单ip的主机上,仅可以使用一个https虚拟主机
yum install mod_ssl
术语:PKI CA CRL X.509(V1,v2,v3)
配置httpd支持https:
- 为服务器申请数字证书
测试:通过私建CA发证书
a,创建私有ca
b,在服务器创建证书签署请求
c,ca签证
- 配置httpd支持使用ssl,及使用证书
配置文件:/etc/httpd/conf.d/ssl.conf
DocumentRoot
ServerName
SSLCertificateFile
SSLCertificateKeyFile
- 测试基于https访问相应的主机
openssl s_client [-connect host:port][-cert filename][-CApath directroy][-CAfile filename]
3.3 常用命令、工具
3.3.1 常用命令
部分命令仅限yum安装使用
yum install httpd –y #安装httpd
yum info httpd #查看httpd安装包信息
yum list all http*
rpm -ql httpd-tools
yum repolist
yum clean all
yum install httpd-manual
httpd -t #httpd语法测试
配置文件:/etc/httpd/conf
log:/var/log/httpd
网页文件:/var/www/html,默认根
ss -ntl : port 80
默认页:/etc/httpd/conf.d/welcome.conf
loadmodule
httpd -M |grep mpm
httpd.worker -M切换模式
httpd -l 列出模块
3.3.2 常用工具
http 2.4命令行客户端工具
- curl命令
curl - transfer a URL
curl [options] [URL...]
options:
-A:-A, --user-agent STRING模拟自己是什么用户代理的 *
--basic使用http基本认证
--tcp-nodelay使用TCP_NODELAY
-e/--referer<url>:上一跳 *
--cacert<file> ca证书(ssl)
--compressed要求返回是压缩格式 *
-H/--header<line>自定义首部信息传递给服务器
-I/--head 只显示响应报文首部信息
--limit-rate<rate>设置传输速率
-u/--user[:password]设置服务器的用户密码
-0(零)/--http1.0 使用http1.0
- elinks:
elinks [options] url
-dump 一次显示,直接结束,不进入交互模式
- httpd自带的工具等
htpasswd
apachectl
rotatelogs:日志滚动工具dd
suexec:访问某些有特殊权限配置的资源时,临时切换至指定用户运行
ab:apache bench
- httpd的压力测试工具
ab,webbench,http_load,selge
jmeter loadrunner
tcpcopy
- 网站指标:
css:级别样式表
pv:page view,一次页面访问,一个页面有10个资源,100W次的资源请求,=10W次页面访问
uv:user view,独立的用户浏览量,
ip:ip地址 ,每个ip地址访问量,小于uv