HTTP-常用配置
Posted xsuid
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP-常用配置相关的知识,希望对你有一定的参考价值。
前言
这篇主要介绍HTTP服务程序环境
可能有一些介绍不到,博主能力有限,欢迎大神来纠正改进
HTTP协议从http/0.9到如今的http/2.0中间发生了很大的改变,现在主流的事http/1.1
在很多面试当主就会问起http协议各个版本的不同之处,这里就不介绍它们之间的区别了,有想要了解的可以百度下,面试的时候看下
HTTP工作机制:
http请求:http request
http响应:http response
一次http事务:请求<-->响应
在上篇中基本简单说了下https://www.cnblogs.com/xsuid/p/9451811.html
http服务器程序:
httpd apache
nginx
lighttpd
Httpd介绍
httpd:
20世纪90年代初,国家超级计算机应用中心NCSA开发
特性:
高度模块化:core + modules
DSO: Dynamic Shared Object 动态加/卸载
MPM:multi-processing module多路处理模块
MPM工作模式
prefork:
1、多进程I/O模型,每个进程响应一个请求,默认模型
2、个主进程:生成和回收n个子进程,创建套接字,不响应请求
3、多个子进程:工作work进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求,最大不超过1024个
如图:
worker:
1、复用的多进程I/O模型,多进程多线程,IIS使用此模型
2、一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求:m*n
如图:
event:
1、事件驱动模型(worker模型的变种)
2、一个主进程:生成m个子进程,每个进程直接响应n个请求,并发响应请求:m*n,有专门的线程来管理这些keep-alive类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请求处理能力
如图:
备注:MPM模式也是面试中常问的问题
HTTP安装
版本
CentOS 6:默认2.2版本(官方以停止支持)
CentOS 7:默认2.4版本
安装方式
rpm:centos发行版,稳定,建议使用
编译:定制或特殊需求
备注:后面会介绍编译安装----
HTTP-CentOS 7程序环境
新版本2.4特性
MPM支持运行为DSO机制;以模块形式按需加载
event MPM生产环境可用
异步读写机制
支持每模块及每目录的单独日志级别定义
每请求相关的专用配置
增强版的表达式分析式
毫秒级持久连接时长定义
基于FQDN的虚拟主机不需要NameVirutalHost指令
新指令,AllowOverrideList
支持用户自定义变量
更低的内存消耗
配置文件:
/etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf
检查配置语法:
httpd –t service httpd configtest
模块相关的配置文件:
/etc/httpd/conf.modules.d/*.conf
systemd unit file:
/usr/lib/systemd/system/httpd.service
主程序文件:
/usr/sbin/httpd httpd-2.4支持MPM的动态切换
日志文件:
/var/log/httpd access_log:访问日志 error_log:错误日志
站点文档:
/var/www/html
模块文件路径:
/usr/lib64/httpd/modules
服务控制:
systemctl enable|disable httpd.service systemctl {start|stop|restart|status} httpd.service
查看模块列表
查看静态编译的模块
httpd -l
查看静态编译及动态装载的模块
httpd –M
动态模块加载:不需重启即生效
动态模块路径 /usr/lib64/httpd/modules
Httpd 2.4常见配置
备注:在这我用两台主机进行实验,分别是:192.168.43.57、192.168.43.67,57当http服务器,67当客户端,首先yum安装HTTP服务器
1、版本号修改
备注:要是别人查询到你的网站事用http那个版本,是不是不好,容易利用版本漏洞进行攻击,所以让他不显示版本号
1、首先得有个主页,在这我就随便创建个index.httml
echo /var/www/html/index.html > /var/www/html/index.html
2、我们先来看一下没有进行版本设置时候得情况,在67主机上
curl -I 192.168.43.57
版本信息一目了然
3、在服务器端(57)隐藏版本信息设置
cd /etc/httpd/conf.d/ vim texe.conf
备注:写在主配置文件里也可,推荐写在以上目录下,方便来管理,主配置文件中标记了/conf.d/目录,写在/conf.d/目录下得配置优先生效
ServerTokens Prod # 写入
systemctl restart httpd
systemctl reload httpd
#重启服务最好用reload
4、再次测试验证
OK
2、修改监听的IP和Port
1) 省略IP表示为本机所有IP
2) Listen指令至少一个,可重复出现多次
示例:
Listen 192.168.1.100:8080
Lsten 80
3、持久连接
Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成,默认关闭持久连接
断开条件:数量限制:100
时间限制:以秒为单位, httpd-2.4 支持毫秒级
副作用:对并发访问量较大的服务器,持久连接功能会使用有些请求得不到响应
折衷:使用较短的持久连接时间
设置:
KeepAlive On|Off KeepAliveTimeout 15 MaxKeepAliveRequests 100
测试:
telnet 192.168.43.57 80
4、切换使用的MPM-开启100个线程
1、编辑
vim /etc/httpd/conf.modules.d/00-mpm.conf
2、重读配置文件或重启服务
systemctl reload httpd systemctl restart httpd
3、查看确认
httpd –M |grep mpm 重启服务生效 pstree -p|grep httpd 查看进程和线程
备注:
1)设置进程为100个,在我们
StartServers 100
2)重启服务并查看
systemctl reload httpd ps aux
5、定义HTTP主目录
1、默认得主目录在
/var/www/html/
2、更改主目录
1)首先创建目录
mkdir /data/website -pv
2)创建index.html首页
echo /data/website/index.html > /data/website/index.html
3)设置配置文件
vim /etc/httpd/conf.d/texe.conf
DocumentRoot "/data/website" <Directory "/data/website"> Require all granted </Directory>
4)重启服务
5)测试
注意:SELinux和iptables的状态
6、定义站点主页面
默认是找index.html文件最为主页得,也可更改把以下代码加入texe.conf配置文件就可
DirectoryIndex index.php # 值可以是多个。找步到第一个找第二个
7、基于IP的访问控制:
1、conf结尾的文件只能特定IP才能访问(如只允许192.168.43.67)
<FilesMatch ".+.(conf|ini)$"> <RequireAny> Require all denied ##拒绝所有 require ip 192.168.43.67 ##只允许 </RequireAny> </FilesMatch>
2、重启服务
备注:
加上这项
options indexes
说明要是这个网站主页面访问不了就显示目录下所有文件列表
也可限定目录只对特定用户访问
<location /admin> ##URL路径 <RequireAny> Require all denied require ip 192.168.31.6 </RequireAny> </location>
8、自定义日志格式
日志类型:
访问日志
错误日志
错误日志:
路径:ErrorLog logs/error_log(这是相对路径基于/etc/httpd/)
推荐设置为:LogLevel warn(级别,从警报级别开始记录)
LogLevel 可选值:
debug, info, notice, warn,error
crit, alert, emerg
备注:最往后严重性越高
访问日志
1、定义日志格式:
LogFormat "%h %l %u %{%Y-%m-%d %H:%M:%S}t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" testlog
备注:根据环境需求来定义
2、使用日志格式:
CustomLog "logs/access_log" testlog
参考帮助:
http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
或
man 3 strftime
9、设定默认字符集
AddDefaultCharset UTF-8 中文字符集:GBK, GB2312, GB18030
10、定义路径别名
意思是说:
当用户访问192.168.43.57/data目录时,出现的数据不在website/data目录下,其实是在/website/app/stud目录下
实现方式:
Alias /data /app/stud
备注:别忘了授权文件夹
<Directory "/app/stud"> Require all granted </Directory>
重启服务
11、实现身份验证
说明:只有经过验证的用户才能访问某个目录
认证方式两种:
basic:明文
digest:消息摘要认证,兼容性差
安全域:
需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告知用户认证的原因
用户的账号和密码
虚拟账号:仅用于访问某服务时用到的认证标识
存储:文本文件,SQL数据库,ldap目录存储,nis等
备注:用虚拟用户来访问特定的目录,虚拟账号可以放到文件里或数据库里
方法一
说明:我们针对admin目录来访问
1、修改配置文件:
vim /etc/httpd/conf.d/test.conf
<Directory /data/website/admin> AuthType Basic ##验证方式 AuthName "Secure login" ##加的一段话,只要经过验证的用户才能访问 AuthUserFile "/etc/httpd/conf.d/.htpasswd" ##存放位置加‘.’是隐藏改目录,要是目录不存在,就创建出来 Require user bob ##希望所访问的用户 </Directory>
2、创建用户
htpasswd -c /etc/httpd/conf.d/.htpasswd alice htpasswd /etc/httpd/conf.d/.htpasswd bob htpasswd /etc/httpd/conf.d/.htpasswd jack
备注:第一次创建用户必须加“-c”之后就不需要加了
3、重启服务
方法二
1、在要设置权限的目录下创建一个文件存放验证信息
vim /data/website/admin/.htaccess
AuthType Basic AuthName "Secure login" AuthUserFile "/etc/httpd/conf.d/.htpasswd" Require user bob
2、编辑配置文件
vim /etc/httpd/conf.d/test.conf
<Directory /data/website/admin> AllowOverride authconfig #允许覆盖 </Directory>
3、重启服务
基于组验证
示例: <Directory "/www/htdocs/admin"> Options None AllowOverride None AuthType Basic AuthName "Administator private" AuthUserFile "/etc/httpd/conf.d/.htpasswd" AuthGroupFile "/etc/httpd/conf.d/.htgroup" Require group g1 </Directory>
创建用户
和上面创建方法一样
给用户分组
备注:
在/etc/httpd/conf.d目录下创建
ctrl+D结束
备注:
远程客户端和用户验证的控制
Satisfy ALL|Any
ALL 客户机IP和用户验证都需要通过才可以
Any客户机IP和用户验证,有一个满足即可
12、ServerSignature On | Off | EMail
说明:
当客户请求的网页并不存在时,服务器将产生错误文档,缺省情况下由于打开了 ServerSignature选项,错误文档的最后一行将包含服务器的名字、Apache的版本等信息
如果不对外显示这些信息,就可以将这个参数设置为Off
设置为Email,将显示ServerAdmin 的Email提示
13、status页面
说明:
用来判断服务器的状态
依赖于这个模块
httpd -M |grep status_module
1、编辑配置文件
<Location /status> SetHandler server-status Order allow,deny Allow from 172.18 </Location>
2、重启服务
3、测试
192.168.43.57/status
14、虚拟主机
说明:在一台物理机上实现多个网站
有三种实现方式:
基于ip:为每个虚拟主机准备至少一个ip地址
基于port:为每个虚拟主机使用至少一个独立的port
基于FQDN:为每个虚拟主机使用至少一个FQDN
备注:假如有三台虚拟主机分别是“www.a.com、www.b.com、www.c.com” 分别在web1、web2、web3文件夹中
准备
1)首先创建三个文件夹
mkdir /data/web{1,2,3}
2)创建三个主页
echo /data/web1 > /data/web1/index.html echo /data/web2 > /data/web2/index.html echo /data/web3 > /data/web3/index.html
基于端口实现
分别对应8001、8002、8003
1、编辑配置文件
vim /etc/httpd/conf.d/texe.conf
listen 8001 #端口 listen 8002 # listen 8003 # <virtualhost *:8001> #定义 documentroot /data/web1 #主站点 servername www.a.com <directory /data/web1> #定义授权 require all granted # 都授权 </directory> </virtualhost> <virtualhost *:8002> documentroot /data/web2 servername www.b.com <directory /data/web2> require all granted </directory> </virtualhost> <virtualhost *:8003> documentroot /data/web3 servername www.c.com <directory /data/web3> require all granted </directory> </virtualhost>
2、重启服务
3、测试
基于IP地址实现
1、在物理机上增加三个IP地址
ip a a 192.168.43.101/24 dev ens33 ip a a 192.168.43.102/24 dev ens33 ip a a 192.168.43.103/24 dev ens33
2、修改配置文件
vim /etc/httpd/conf.d/texe.conf
<virtualhost 192.168.31.101:80> documentroot /data/web1 servername www.a.com <directory /data/web1> require all granted </directory> </virtualhost> <virtualhost 192.168.31.102:80> documentroot /data/web2 servername www.b.com <directory /data/web2> require all granted </directory> </virtualhost> <virtualhost 192.168.31.103:80> documentroot /data/web3 servername www.c.com <directory /data/web3> require all granted </directory> </virtualhost>
3、重启服务并测试
基于FQDN(主机头)实现
说明:想要主机名访问必须使用DNS解析或hosts文件解析
在这我们写到hosts文件中
vim /etc/hosts
1、编辑配置文件
vim /etc/httpd/conf.d/texe.conf
<virtualhost *:80> documentroot /data/web2 servername www.b.com <directory /data/web2> require all granted </directory> ErrorLog "logs/b_error_log" #错误日志分开 CustomLog "logs/b_access_log" combined #访问日志分开 </virtualhost> <virtualhost *:80> documentroot /data/web3 servername www.c.com <directory /data/web3> require all granted </directory> ErrorLog "logs/c_error_log" CustomLog "logs/c_access_log" combined </virtualhost> <virtualhost *:80> documentroot /data/web1 servername www.a.com ServerAlias a.com *.a.com #别名也就是泛域名 <directory /data/web1> require all granted </directory> ErrorLog "logs/a_error_log" CustomLog "logs/a_access_log" combined </virtualhost>
2、重启服务并测试
备注:如果用IP地址访问,那么配置文件中谁靠前谁就是默认地址
15、实现https加密访问
说明:要是你的网站涉及到“¥”那么就必须加https加密访问
生产中是向CA机构花钱申请的,在这里我们自己搭建一个CA服务器,我们用67当CA服务器
1、CA服务器端(67)安装yum包
yum install mod_ssl
2、httpd服务器申请证书
cd /etc/pki/CA
1)生成私钥
(umask 077;openssl genrsa -out private/cakey.pem 2048)
2)自签名
openssl req -new -x509 -key private/cakey.pem -out cacert.pem
3)CA主机创建目录
touch index.txt echo 01 > serial #存放序列号
4)在57HTTP服务器主机创建目录来存放证书与私钥并生产自己的私钥
cd /etc/httpd/conf.d/ # 在这个目录下创建存放目录 mkdir ssl
[[email protected]_05 ssl]# (umask 077;openssl genrsa -out heepd.key 2048)
5)57HTTP主机生成请求
openssl req -new -key heepd.key -out httpd.csr
6)CA服务器给HTTP颁发证书
备注:把57主机生成的申请文件scp传送给CA主机
scp httpd.csr 192.168.43.67:/etc/pki/CA/
CA给HTTP签名
openssl ca -in httpd.csr -out certs/httpd.csr #颁发证书
7)把HTTP的证书和CA的证书传送到(57)HTTP服务器
scp certs/httpd.csr cacert.pem 192.168.43.57:/etc/httpd/conf.d/ssl/
8)修改ssl.cof配置文件
[[email protected]_05 conf.d]# vim ssl.conf
9)重启服务测试
16、http跳转到https
说明:当我们输入 “www.a.com” 自动跳转到”https://www.a.com”
1、修改配置文件
[[email protected]_05 conf.d]# vim texe.conf
RewriteEngine on #启动这个引擎 rewritecond %{SERVER_PORT} !^443 #条件跳转--如果不是443的时候我就进行跳转 RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=301] #这是跳转规则
2、重启测试
17、使用mod_deflate模块压缩页面优化传输速度
适用场景:
(1) 节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持
(2) 压缩适于压缩的资源,例如文本文件
1、编辑配置文件
vim /etc/httpd/conf.d/texe2.conf
AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/html DeflateCompressionLevel 9 SetOutputFilter DEFLATE
2、重启测试
http协议常用的状态码
200: 成功,请求数据通过响应报文的entity-body部分发送;OK
301: 请求的URL指向的资源已经被删除;但在响应报文中通过首部Location指明了资源现在所处的新位置;Moved Permanently
302: 响应报文Location指明资源临时新位置 Moved Temporarily
304: 客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此响应状态码通知客户端;Not Modified
401: 需要输入账号和密码认证方能访问资源;Unauthorized
403: 请求被禁止;Forbidden
404: 服务器无法找到客户端请求的资源;Not Found
500: 服务器内部错误;Internal Server Error
502: 代理服务器从后端服务器收到了一条伪响应,如无法连接到网关;Bad Gateway
503 – 服务不可用,临时服务器维护或过载,服务器无法处理请求
504 – 网关超时
结语:后续更精彩
以上是关于HTTP-常用配置的主要内容,如果未能解决你的问题,请参考以下文章
[AndroidStudio]_[初级]_[配置自动完成的代码片段]