HTTP-常用配置

2018-08-10 23:39:52来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折


前言

这篇主要介绍HTTP服务程序环境

可能有一些介绍不到,博主能力有限,欢迎大神来纠正改进

HTTP协议从http/0.9到如今的http/2.0中间发生了很大的改变,现在主流的事http/1.1

image

在很多面试当主就会问起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个

如图:

image

worker:

1、复用的多进程I/O模型,多进程多线程,IIS使用此模型

2、一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求:m*n

如图:

image

event:

1、事件驱动模型(worker模型的变种)

2、一个主进程:生成m个子进程,每个进程直接响应n个请求,并发响应请求:m*n,有专门的线程来管理这些keep-alive类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请求处理能力

如图:

image

备注: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

image


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

image

版本信息一目了然

3、在服务器端(57)隐藏版本信息设置

cd /etc/httpd/conf.d/
vim texe.conf

备注:写在主配置文件里也可,推荐写在以上目录下,方便来管理,主配置文件中标记了/conf.d/目录,写在/conf.d/目录下得配置优先生效

ServerTokens Prod
# 写入
systemctl restart httpd
systemctl reload httpd
#重启服务最好用reload

4、再次测试验证

image

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

image

4、切换使用的MPM-开启100个线程

1、编辑

vim /etc/httpd/conf.modules.d/00-mpm.conf

image

2、重读配置文件或重启服务

systemctl reload httpd
systemctl restart httpd

3、查看确认

httpd –M |grep mpm
重启服务生效
pstree -p|grep httpd 查看进程和线程

备注:

1)设置进程为100个,在我们

image

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

image

DocumentRoot "/data/website"
<Directory "/data/website">
Require all granted
</Directory>

4)重启服务

5)测试

image

注意: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>

创建用户

和上面创建方法一样

给用户分组

image

备注:

在/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.comwww.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、测试

image

基于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、重启服务并测试

image

基于FQDN(主机头)实现

说明:想要主机名访问必须使用DNS解析或hosts文件解析

在这我们写到hosts文件中

vim /etc/hosts

image

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、重启服务并测试

image

备注:如果用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
[root@centos7_05 ssl]# (umask 077;openssl genrsa -out heepd.key 2048)

5)57HTTP主机生成请求

openssl req -new -key heepd.key -out httpd.csr

image

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配置文件

[root@centos7_05 conf.d]# vim ssl.conf

image

9)重启服务测试

image

image

image

16、http跳转到https

说明:当我们输入 “www.a.com” 自动跳转到”https://www.a.com

1、修改配置文件

[root@centos7_05 conf.d]# vim texe.conf


RewriteEngine on  #启动这个引擎
rewritecond %{SERVER_PORT} !^443 #条件跳转--如果不是443的时候我就进行跳转
RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=301] #这是跳转规则

2、重启测试

image

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 – 网关超时


结语:后续更精彩

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:一次服务器磁盘空间不足导致的一些列问题

下一篇:atlas+mysql部署mysql读写分离