httpd
-
http服务器程序:
-
httpd (apache)
nginx
lighttpd
-
httpd (apache)
-
httpd的特性:
-
高度模块化: core + modules
DSO:dynamic shared object(模块的动态加载)
MPM:Multipath processing Modules (多路处理模块)-
prefork:多进程模型,每个进程响应一个请求;
- 一个主进程:负责生成子进程及回收子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
- n个子进程:每个子进程处理一个请求;
- 工作模型:会预先生成几个空闲进程,随时等待用于响应用户请求;最大空闲和最小空闲;
-
worker:多进程多线程模型,每线程处理一个用户请求;
- 一个主进程:负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
- 多个子进程:每个子进程负责生成多个线程;
- 每个线程:负责响应用户请求;
-
并发响应数量:m*n
m:子进程数量
n:每个子进程所能创建的最大线程数量;
-
event:事件驱动模型,多进程模型,每个进程响应多个请求;
- 一个主进程 :负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
-
子进程:基于事件驱动机制直接响应多个请求;
httpd-2.2: 仍为测试使用模型;httpd-2.4:event可生产环境中使用;
-
prefork:多进程模型,每个进程响应一个请求;
-
高度模块化: core + modules
-
httpd功能特性:
CGI:Common Gateway Interface(支持动态网站的接口)
虚拟主机:IP,PORT, FQDN
反向代理
负载均衡
路径别名
丰富的用户认证机制:basic、digest
支持第三方模块 -
安装httpd
-
rpm包:CentOS 发行版中直接提供;
编译安装:定制新功能,或其它原因;
-
rpm包:CentOS 发行版中直接提供;
-
CentOS 6:httpd-2.2
程序环境:-
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf -
服务脚本:
/etc/rc.d/init.d/httpd
脚本配置文件:/etc/sysconfig/httpd -
主程序文件:当使用时启动
/usr/sbin/httpd(prefork)
/usr/sbin/httpd.event
/usr/sbin/httpd.worker -
日志文件:/var/log/httpd/
access_log:访问日志
error_log:错误日志 -
站点文档:
/var/www/html -
模块文件路径:
/usr/lib64/httpd/modules -
服务控制和启动:
chkconfig httpd on|off
service httpd {start|stop|restart|status|configtest|reload}
-
配置文件:
-
CentOS 7:httpd-2.4
-
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
模块相关的配置文件:/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配置
-
配置的实现方式
- 编辑:/etc/httpd/conf/httpd.conf
- 在/etc/httpd/conf.d/下配置模块化的文件
-
主配置文件:/etc/httpd/conf/httpd.conf,配置段的划分
### Section 1: Global Environment 全局环境 ### Section 2: 'Main' server configuration 主服务器配置段 ### Section 3: Virtual Hosts 虚拟主机配置 主服务器和虚拟服务器不能同时生效; httpd-2.2,需要手动关闭一个; httpd-2.4,两者之间可自动关闭;
-
配置格式:
-
directive value
-
directive:指令;不区分字符大小写;
value:指令的值;为路径时,是否区分字符大小写,取决于文件系统;
-
directive:指令;不区分字符大小写;
-
配置块
示例: <Directory /> AllowOverride none Require all denied </Directory> 内部指令的生效范围只对此配置块描述的范围有效;
-
directive value
-
常用配置:
-
修改监听的IP和PORT
Listen [IP-address:]portnumber [protocol]- 省略IP表示为0.0.0.0;
-
Listen指令可重复出现多次;
Listen 80
Listen 8080 - 修改监听socket,重启服务进程方可生效;
- 限制其必须通过ssl通信时,protocol需要定义为https;
-
持久连接(保持连接,长连接)
Persistent Connection:tcp连续建立后,每个资源获取完成后不全断开连接,而是继续等待其它资源请求的进行;-
如何使其连接时不至于过长?
-
数量限制 or 时间限制
副作用:对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到正常响应;
折衷:使用较短的持久连接时长,以及较少的请求数量;主配置文件/etc/httpd/conf/httpd.conf中没有相关设置;可以新建一个配置文件,在/etc/httpd/conf.d/ KeepAlive On|Off 是否使用长连接 KeepAliveTimeout 15 超时时长 MaxKeepAliveRequests 100 连接时请求的资源的多少 注意:httpd-2.4的KeepAliveTimeout可以是毫秒级; KeepAliveTimeout num[ms]
- 编辑完文件后,检查文件:httpd -t
-
-
测试:
telnet WEB_SERVER_IP PORT
GET /URL HTTP/1.1
Host: WEB_SERVER_IP示例: telnet 172.16.0.67 GET /index.html HTTP/1.1 host:172.16.0.67
-
-
MPM
-
httpd-2.2,不支持同时编译多个MPM模块,所以只能编译选定要使用的那个;CentOS 6的rpm包为此专门提供了三个应用程序文件,httpd(prefork), httpd.worker, httpd.event,分别用于实现对不同的MPM机制的支持;确认现在使用的是哪下程序文件的方法:ps aux | grep httpd
-
更换使用httpd程序,以支持其它MPM机制;
/etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.{worker,event}#HTTPD=/usr/sbin/httpd.worker HTTPD=/usr/sbin/httpd.worker 选择启用哪一个模块; 默认使用的为/usr/sbin/httpd,其为prefork的MPM模块;
注意:重启服务进程方可生效
-
-
httpd-2.4更换MPM模块;编辑/etc/httpd/conf.modules.d/00-mpm.conf;选择要使用MPM的LoadModule。
-
查看httpd程序的模块列表:
查看静态编译的模块:
~]# httpd -l
查看静态编译及动态编译的模块:
~]# httpd -M -
MPM配置:编辑/etc/httpd/conf/httpd.conf
prefork的配置: <IfModule prefork.c> StartServers 8 MinSpareServers 5 MaxSpareServers 20 ServerLimit 256 MaxClients 256 MaxRequestsPerChild 4000 </IfModule>
worker的配置: <IfModule worker.c> StartServers 4 MaxClients 300 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 </IfModule>
-
统计网站浏览量的指标:PV,UV,IP
PV:Page View
UV: User View;独立的用户浏览量
IP:独立的IP浏览量
-
-
DSO
使用httpd -M显示有(shared)的模块都可以使用LoadModule实现动态装载;/etc/httpd/conf.modules.d/*.conf
配置指定实现模块加载:LoadModule <mod_name> <mod_path>
模块文件路径可使用相对路径:相对于ServerRoot(默认/etc/httpd) -
定义'Main' server的文档页面路径
ServerName 此处的名字主要是用来标识主机认为自己是服务于谁的;跟真正的主机名没关机;若没有定义会反解IP地址 语法格式: ServerName [scheme://]fully-qualified-domain-name[:port] DocumentRoot "" 文档路径映射: DoucmentRoot指向的路径为URL路径的起始位置;其相当于站点URL的根路径; URL PATH与FileSystem PATH不是等同的,而是存在一种映射关系; URL / --> FileSystem /var/www/html/ /images/logo.jpg --> /var/www/html/images/logo.jpg
-
站点访问控制常见机制
可基于两种机制指明对哪些资源进行何种访问控制-
文件系统路径:
如果是针对于一个目录下的所有资源进行控制: <Directory ""> ... </Directory> 如果是针对于一个文件或一组文件: <File ""> ... </File> <FileMatch "PATTERN"> ... </FileMatch>
-
URL路径:
<Location ""> ... </Location> <LocationMatch "PATTERN"> ... </LocationMatch>
-
<Directory>中“基于源地址”实现访问控制:
-
控制页面资源允许、拒绝指定的主机:
-
httpd-2.2:order和allow、deny
order:定义allow、deny的生效次序;写在后面的表示默认法则;
Allow from IP|NetAddr | Deny from IP|NetAddr
NetAddr格式:
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0 -
httpd-2.4:
基于IP控制:
Require ip IP地址或网络地址
Require not ip IP地址或网络地址
基于主机名控制:
Require host 主机名或域名
Require not host 主机名或域名要放置于<RequireAll>配置块中或<RequireAny>配置块中;
-
-
控制页面资源允许所有来源的主机可访问:
httpd-2.2 <Directory ""> ... Order allow,deny Allow from all </Directory> httpd-2.4 <Directory ""> ... Require all granted </Directory>
-
控制页面资源拒绝所有来源的主机可访问:
httpd-2.2 <Directory ""> ... Order allow,deny Deny from all </Directory> httpd-2.4 <Directory ""> ... Require all denied </Directory>
-
Options:定义特定目录下的资源如何被访问;后跟1个或多个以空白字符分隔的“选项”列表;
可用选项: Indexes:允许索引;指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户;取消后,给出路径可以查看,没有路径不支持查看; FollowSymLinks:允许跟踪符号链接文件所指向的源文件; None:什么都不允许; All:除了MultiViews之外的所有选项;
-
-
-
定义站点主页面:
DirectoryIndex index.html index.html.var -
定义路径别名
格式:Alias /URL/ "/PATH/TO/SOMEDIR/" -
设定默认字符集
AddDefaultCharset UTF-8
中文字符集:GBK, GB2312, GB18030 -
日志设定
日志类型:访问日志 和 错误日志-
错误日志:
配置文件/etc/httpd/conf/httpd.conf中:ErrorLog "logs/error_log"
日志文件:/etc/httpd/logs/error_log -
访问日志:
/etc/httpd/conf/httpd.conf中的格式: LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined CustomLog logs/access_log combined %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”的值;即发出请求的应用程序;
-
-
基于用户的访问控制
-
认证质询:
WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码; -
认证:
Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源;
认证方式有两种:
basic:明文
digest:消息摘要认证比较老的浏览器不一定适用 -
安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告知用户认证的原因;
-
用户的账号和密码存放于何处?
虚拟账号:仅用于访问某服务时用到的认证标识-
文本文件;
SQL数据库;
ldap目录存储;
-
文本文件;
-
basic认证配置示例:
-
定义安全域
<Directory ""> Options None AllowOverride None AuthType Basic AuthName "String“ AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE" Require user username1 username2 ... </Directory>
允许账号文件中的所有用户登录访问:Require valid-user
-
提供账号和密码存储(文本文件)
使用专用命令完成此类文件的创建及用户管理
htpasswd [options] /PATH/TO/HTTPD_PASSWD_FILE username
-c:自动创建此处指定的文件,因此,仅应该在此文件不存在时使用;
-m:md5格式加密
-s: sha格式加密
-D:删除指定用户
-b:批模式添加用户
htpasswd -b [options] /PATH/TO/HTTPD_PASSWD_FILE username password -
另外:基于组账号进行认证;
-
定义安全域
<Directory ""> Options None AllowOverride None AuthType Basic AuthName "String“ AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE" AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE" Require group grpname1 grpname2 ... </Directory>
-
创建用户账号和组账号文件;
组文件:每一行定义一个组
GRP_NAME: username1 username2 …
-
定义安全域
-
定义安全域
-
认证质询:
-
虚拟主机
-
站点标识: socket
-
IP相同,但端口不同;
IP不同,但端口均为默认端口;
FQDN不同;请求报文首部中的Host: www.magedu.com
-
IP相同,但端口不同;
-
有三种实现方案:
基于ip:为每个虚拟主机准备至少一个ip地址;
基于port:为每个虚拟主机使用至少一个独立的port;
基于FQDN:为每个虚拟主机使用至少一个FQDN;
注意(专用于httpd-2.2):一般虚拟机不要与中心主机混用;因此,要使用虚拟主机,得先禁用'main'主机;
禁用方法:注释中心主机的DocumentRoot指令即可; -
虚拟主机的配置方法:三种方案可以混用
<VirtualHost IP:PORT> ServerName FQDN DocumentRoot "" </VirtualHost>
适用于中心主机的指令同样适用于虚拟主机:
ServerAlias:虚拟主机的别名;可多次使用; ErrorLog: CustomLog: <Directory ""> ... </Directory> Alias ...
-
基于IP的虚拟主机示例:
<VirtualHost 172.16.100.6:80> ServerName www.a.com DocumentRoot "/www/a.com/htdocs" </VirtualHost> <VirtualHost 172.16.100.7:80> ServerName www.b.net DocumentRoot "/www/b.net/htdocs" </VirtualHost> <VirtualHost 172.16.100.8:80> ServerName www.c.org DocumentRoot "/www/c.org/htdocs" </VirtualHost>
-
基于端口的虚拟主机:
<VirtualHost 172.16.100.6:80> ServerName www.a.com DocumentRoot "/www/a.com/htdocs" </VirtualHost> <VirtualHost 172.16.100.6:808> ServerName www.b.net DocumentRoot "/www/b.net/htdocs" </VirtualHost> <VirtualHost 172.16.100.6:8080> ServerName www.c.org DocumentRoot "/www/c.org/htdocs" </VirtualHost>
-
基于FQDN的虚拟主机:
<VirtualHost 172.16.100.6:80> ServerName www.a.com DocumentRoot "/www/a.com/htdocs" </VirtualHost> <VirtualHost 172.16.100.6:80> ServerName www.b.net DocumentRoot "/www/b.net/htdocs" </VirtualHost> <VirtualHost 172.16.100.6:80> ServerName www.c.org DocumentRoot "/www/c.org/htdocs" </VirtualHost>
注意:如果是httpd-2.2,则使用基于FQDN的虚拟主机时,需要事先使用指令:NameVirtualHost IP:PORT
-
-
status
查看是否装载:httpd -M | grep status
状态路径:/etc/httpd/conf.modules.d/00-base.conf
装载模块:LoadModule status_module modules/mod_status.sohttpd-2.2 <Location /server-status> SetHandler server-status Order allow,deny Allow from 172.16 </Location>
httpd-2.4 <Location /server-status> SetHandler server-status <RequireAll> Require ip 172.16 </RequireAll> </Location>
-
curl命令
-
curl是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE及LDAP等协议。curl支持HTTPS认证,并且支持HTTP的POST、PUT等方法, FTP上传, kerberos认证,HTTP上传,代理服务器, cookies, 用户名/密码认证, 下载文件断点续传,上载文件断点续传, http代理服务器管道( proxy tunneling), 甚至它还支持IPv6, socks5代理服务器,,通过http代理服务器上传文件到FTP服务器等等,功能十分强大。
-
curl [options…]
curl的常用选项:-
-A/–user-agent 设置用户代理发送给服务器
–basic 使用HTTP基本认证
–tcp-nodelay 使用TCP_NODELAY选项
-e/–referer 来源网址
–cacert CA证书 (SSL)
–compressed 要求服务端返回是压缩的格式,仅仅只是传输过程中的压缩,但客户端也可接收压缩格式;
-H/–header 自定义首部信息传递给服务器
-I/–head 只显示响应报文首部信息
–limit-rate 设置传输速度
-u/–user 设置服务器的用户和密码
-0/–http1.0 使用HTTP 1.0
-
-A/–user-agent 设置用户代理发送给服务器
-
elinks命令
elinks [OPTION]… [URL]…
-dump: 不进入交互式模式,而直接将URL的内容输出至标准输出;
-
-
user/group
指定以哪个用户的身份运行httpd服务进程(子进程或线程);/etc/httpd/conf/httpd.conf User apache Group apache
当某个服务需要使用管理员的身份运行时,可以切换身份:SUexec机制
-
使用mod_deflate模块压缩页面优化传输速度
-
适用场景:
(1) 节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持;
(2) 压缩适于压缩的资源,例如文件文件;首先确认mod_deflate模块是启用的:~]# httpd -M | grep deflate 设置输出过滤器 SetOutputFilter DEFLATE # mod_deflate configuration # Restrict compression to these MIME types AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE application/x-javascript AddOutputFilterByType DEFLATE text/javascript AddOutputFilterByType DEFLATE text/css # Level of compression (Highest 9 - Lowest 1) DeflateCompressionLevel 9 # Netscape 4.x has some problems. BrowserMatch ^Mozilla/4 gzip-only-text/html # Netscape 4.06-4.08 have some more problems BrowserMatch ^Mozilla/4\.0[678] no-gzip # MSIE masquerades as Netscape, but it is fine BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
-
-
https(http over ssl)
- 先是TCP的三次握手
- ssl协议握手,建立ssl会话
- 进行ssl会话
-
断开连接,进行tcp的四次挥手;
-
SSL会话的简化过程
- 客户端发送可供选择的加密方式,并向服务器请求证书;
- 服务器端发送证书以及选定的加密方式给客户端;
-
客户端取得证书并进行证书验正:
-
如果信任给其发证书的CA:
(a) 验正证书来源的合法性;用CA的公钥解密证书上数字签名;
(b) 验正证书的内容的合法性:完整性验正
(c) 检查证书的有效期限;
(d) 检查证书是否被吊销;
(e) 证书中拥有者的名字,与访问的目标主机要一致;
-
如果信任给其发证书的CA:
- 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换;
- 服务用此密钥加密用户请求的资源,响应给客户端;
注意:SSL会话是基于IP地址创建;所以单IP的主机上,仅可以使用一个https虚拟主机;
-
-
配置httpd支持https:
(1) 为服务器申请数字证书; 测试:通过私建CA发证书 (a) 创建私有CA (b) 在服务器创建证书签署请求 (c) CA签证 (2) 配置httpd支持使用ssl,及使用的证书; # yum -y install mod_ssl 配置文件:/etc/httpd/conf.d/ssl.conf DocumentRoot ServerName SSLCertificateFile SSLCertificateKeyFile (3) 测试基于https访问相应的主机; # openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]
-
httpd自带的工具程序
- htpasswd:basic认证基于文件实现时,用到的账号密码文件生成工具;
- apachectl:httpd自带的服务控制脚本,支持start和stop;
- apxs:由httpd-devel包提供,扩展httpd使用第三方模块的工具;
-
rotatelogs:日志滚动工具;在时间、空间上控制
第一轮:access.log 第二轮: access.log, access.1.log 第三轮: access.log, acccess.1.log, access.2.log
- suexec:访问某些有特殊权限配置的资源时,临时切换至指定用户身份运行;
-
httpd的压力测试工具
命令行:ab, webbench, http_load, seige
图形化:jmeter, loadrunnertcpcopy:网易开发,复制生产环境中的真实请求,并将之保存下来;
ab [OPTIONS] URL
-n:总请求数;
-c:模拟的并行数;
-k:以持久连接模式 测试;
-
httpd-2.4:
-
新特性:
(1) MPM支持运行为DSO机制;以模块形式按需加载;
(2) event MPM生产环境可用;
(3) 异步读写机制;
(4) 支持每模块及每目录的单独日志级别定义;
(5) 每请求相关的专用配置;
(6) 增强版的表达式分析式;
(7) 毫秒级持久连接时长定义;
(8) 基于FQDN的虚拟主机也不再需要NameVirutalHost指令;
(9) 新指令,AllowOverrideList;
(10) 支持用户自定义变量;
(11) 更低的内存消耗; -
新模块:
(1) mod_proxy_fcgi
(2) mod_proxy_scgi
(3) mod_remoteip -
安装httpd-2.4
依赖于apr-1.4+, apr-util-1.4+, [apr-iconv]
apr: apache portable runtime-
CentOS 6:
-
默认:apr-1.3.9, apr-util-1.3.9
-
开发环境包组:Development Tools, Server Platform Development
开发程序包:pcre-devel -
编译安装步骤:
(1) apr-1.4+ # ./configure --prefix=/usr/local/apr # make && make install (2) apr-util-1.4+ # ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr # make && make install (3) httpd-2.4 # ./configure --prefix=/usr/local/apache24 --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork # make && make install 自带的服务控制脚本:apachectl
-
-
CentOS 7:
-
~]# yum install httpd
-
配置文件:
/etc/httpd/conf/httpd.conf /etc/httpd/conf.modules.d/*.conf /etc/httpd/conf.d/*.conf
-
配置应用:
-
切换使用的MPM
编辑配置文件/etc/httpd/conf.modules.d/00-mpm.conf,启用要启用的MPM相关的LoadModule指令即可。
-
基于IP的访问控制
允许所有主机访问:Require all granted 拒绝所有主机访问:Require all deny 控制特定的IP访问: Require ip IPADDR:授权指定来源的IP访问; Require not ip IPADDR:拒绝 控制特定的主机访问: Require host HOSTNAME:授权指定来源的主机访问; Require not host HOSTNAME:拒绝 HOSTNAME: FQDN:特定主机 domin.tld:指定域名下的所有主机 <RequireAll> Require all granted Require not ip 172.16.100.2 </RequireAll>
-
虚拟主机
基于FQDN的虚拟主机也不再需要NameVirutalHost指令; <VirtualHost *:80> ServerName www.b.net DocumentRoot "/apps/b.net/htdocs" <Directory "/apps/b.net/htdocs"> Options None AllowOverride None Require all granted </Directory> </VirtualHost> 注意:任意目录下的页面只有显式授权才能被访问;
-
ssl
-
KeepAliveTimeout #ms
毫秒级持久连接时长定义;
-
切换使用的MPM
-
-
原创文章,作者:s,如若转载,请注明出处:http://www.178linux.com/77498