一、httpd:俗称Apache,以高度模块化设计的,即core+modules。
1、Apache重要特性:
(1)、DSO:Dynamic Shared Object,因Apache是高度模块化设计的,所以模块可以动态编译,即使编译后也可以设置是否启用。
(2)、MPM:Multipath Processing Module多道处理模块,并非一个模块,而是一种特定的统称,是针对“Web请求过程的接收请求来设计的,这块是Apache的核心,当然了面试必问”。
(2.1)、prefork:
预先创建进程,即进程池,一个进程一个请求。需要定义最大空闲数(注意:最大不能超过1024),最小空闲数。
(2.2)、worker:
一个进程多个线程,一个线程一个请求。
同一个进程的线程可以共享资源,可见可以提高性能,但线程间需要切换浪费时间。
总之,worker和prefork两个相比不分伯仲。
(2.3)、event:
enent-driven事件驱动模型,一个线程响应多个请求。
事件驱动主要目的在于实现单线程响应多个请求。
可见大大提高了性能。
2、httpd版本:apache的官方站点:httpd.apache.org。
httpd-1.3(很少用)
httpd-2.0(很少用)
httpd-2.2(常用)
httpd-2.4(常用):从2.4开始才支持event特性。
3、httpd的功能特性
(1)、路径别名:alias
(2)、用户认证:authentication
(3)、虚拟主机:virtual host,在一个物理主机上可以配置多个站点服务。
(4)、反向代理(代理服务器,用户访问先访问代理):如负载均衡
(5)、用户站点:
(6)、CGI:Common Gateway Interface
4、初次启动httpd会报主机名和ip地址不一致的错误,即未配置host
(4.1)、查看主机名的命令: #hostname
(4.2)、请在/etc/hosts中配置如192.168.1.120 www.test.com
(4.3)、主机名配置文件在/etc/sysconfig/network中
NETWORKING=yes
HOSTNAME=主机名
5、安装httpd :#yum -y install httpd
(5.1)、服务脚本:/etc/rc.d/init.d/httpd
脚本配置文件:/etc/sysconfig/httpd
(5.2)、运行目录:/etc/httpd
(5.3)、配置文件:
(5.3.1)、主配置文件:/etc/httpd/conf/httpd.conf
全局配置
主机配置:用于仅提供一个站点时
虚拟主机配置:用户提供多个站点时
备注:可见主机配置和虚拟主机配置不能同时启用。
(5.3.2)、扩展配置文:件/etc/httpd/conf.d/*.conf
配置文件语法测试:#service httpd configtest或者#httpd -t
配置文件生效方式:绝大多数修改配置文件后,可执行#service httpd reload来生效,
如果修改了监听的端口或地址必须重启服务才行。
(5.4)、Socket:80/tcp
(5.5)、文档跟目录:/var/www/html
(5.6)、CGI目录:/var/www/cgi-bin
二、httpd的主配置文件:/etc/httpd/conf/httpd.conf
1、执行#grep "Section" httpd.conf可以清楚地看到httpd.conf分为三段,如下:
### Section 1: Global Environment
### Section 2: 'Main' server configuration
### Section 3: Virtual Hosts
(1)、全局配置(Global Environment)
(2)、主机配置(Main Server configuration):仅用于提供一个站点时。
(3)、虚拟主机配置(Virtual Hosts):用户提供多个站点时。
注:主机配置和虚拟主机配置不能同时启用。
2、主要的配置介绍如下:
(1)、监听套接字:
Listen [IP:]port
此命令可以出现多次,用于指定监听多个不同的套接字。
Listen 80,本机所有地址(一个主机可以配置多个IP)的80端口,默认监听套接字方式。
Listen 192.168.127.137:8080,本机192.168.127.137的8080端口
(2)、配置使用长连接keep alive
KeepAlive {On|Off}
KeepAliveTimeout 2 (长连接时请求超时时间,单位为秒)
MaxKeepAliveRequests 50 (长连接时最大的请求数。)
注:只要满足任何一个条件就会断开持久链接。
(3)、MPM:Apache 2.2上仅支持prefork和worker,其中默认为prefork,
要想使用worker请修改配置#vi /etc/sysconfig/httpd中的#HTTPD=/usr/sbin/httpd.worker
可以通过执行#httpd -l 查看httpd支持的MPM,执行结果如下:
core.c
prefork.c
http_core.c
mod_so.c
在#httpd -l的结果里可以看到此httpd默认支持的MPM为prefork。
prefork(主进程---子进程):预先创建进程,即进程池,一个子进程一个请求。
需要定义最大空闲数(注意:最大不能超过1024),最小空闲数。
由一个而且唯一的一个主进程来负责子进程的生命周期。
<IfModule prefork.c>
StartServers 8:默认启动的工作子进程数
MinSpareServers 5:最少空闲子进程数
MaxSpareServers 20:最大空闲子进程数
ServerLimit 256:最大活动子进程数,正在服务的。
MaxClients 256:并发请求的最大数
MaxRequestsPerChild 4000:每个子进程在生命周期内所能服务的最多请求个数。
</IfModule>
worker(主进程---子进程---线程):一个子进程多个线程,一个线程一个请求。
由一个而且唯一的一个主进程来负责子进程的生命周期。
子进程负责自己线程的生命周期。
<IfModule worker.c>
StartServers 4:默认启动的子进程数
MinSpareThreads 25:最少空闲线程数
MaxSpareThreads 75:最大空闲线程数
ThreadsPerChild 25:每个子进程可生成的线程数
MaxRequestsPerChild 0:每个子进程在生命周期内所能最多服务的请求个数,0表示不限定。
MaxClients 300:并发请求的最大数
</IfModule>
(4)、DSO模块的加载方式:LoadModule module_name /path/to/module
相对路径:如果使用相对路径,则对于ServerRoot所定义的位置而言;
绝对路径:如LoadModule php5_module /usr/lib64/httpd/modules/php5.so
httpd -M:列出已经装载的所有DSO以及非DSO模块,非DSO显示为static,DSO的显示为SHARED。
httpd -l:列出支持使用的非DSO模块。
注:让服务重载配置文件方能生效,#service httpd reload。
(5)、配置站点根目录以及页面访问属性:
站点根目录:DocumentRoot "/path/to/somewhere",如:DocumentRoot "/www/html"
DocumentRoot中的文件并非所有的都能被正常被访问,还受“页面访问属性以及控制”的 限制。
页面访问属性以及控制:
<Directory "/path/to/somewhere">
Options FollowSymLinks
AllowOverride None
</Directory>
如:Directory共两大项配置Options和AllowOverride,详情如下。
<Directory "/www/html">
Options:Options可以指定多个,用空格分隔,具体如下:
None:所有选项都不启用,web站点使用None
All:所有选项都启用
Indexes:缺少默认页面时即index页面,
允许将站点跟目录中的所有文件以列表形式返回给用户,web站点禁用之。
FollowSymLinks:允许访问符号链接所指向的原始文件,web站点禁用之。
ExecCGI:允许使用mod_cgi模块执行CGI脚本。
Includes:允许使用mod_include模块实现服务器端包含(SSI)
MultiViews:允许使用mod_negotiation实现内容协商,比如客户端说我支持中文,服务端可以提 供中文、英文等,则经内容协商返给客户端中文的。
AllowOverride {None|ALL|Limit|FileInfo...}:表示下面(Order、Allow、Deny)基于IP的访问控制属性是否被禁用,All禁用,None不禁用,只有为None时基于IP访问控制属性Order、Allow、Deny才有效。
Order {allow,deny|deny,allow}控制次序。
allow,deny:允许访问的外的均被拒绝,即白名单;
deny,allow:除拒绝外的均可访问,即黑名单。
Allow from all,基于白名单设置的选项,表示允许所有的IP均可访问此站点。
Deny from 192.1.1.2,基于黑名单设置的选项,表示设置的参数不允许访问此站点。
Deny from 192.1.1.3,基于黑名单设置的选项,表示设置的参数不允许访问此站点。
</Directory>
注意:Allow from和Deny from两个参数的值取最佳匹配:从列表中找出最小的能匹配的访问者的地址的条目为最终生效的,其格式可以配置如下:
192.1
192.1.1.2
192.1.1.2/24
192.1.1.2/255.255.255.0
(6)、定义默认主页面:依次找主页,直至找到为止。
DirectoryIndex index.php index.html home.html default.html
(7)、用户目录(目前很少用,一般禁用之):
如果期望让每个用户(linux用户)都可以创建个人站点:http://Server_IP/~UserName/
<IfModule mod_userdir.c>
UserDir disabled:禁止
UserDir public_html:是用户家目录下的目录名称,所有位于此目录下的文件均可通过前述的访问路径进行访问。
</IfModule>
注意:用户的家目录要赋予运行httpd的用户拥有执行权限。
(8)、配置日志功能:
(8.1)、日志路径:/var/log/httpd
(8.2)、访问日志,其需要记录的内容需要自定义。
CustomLog "/path/to/access_log_file" LogFormat_Name
%h:客户端地址
%l:远程登录名,通常为-
%u:认证时的远程用户名,没认证为-
%t:收到请求时的时间
%r:请求报文的启始行,即<method><request-URL><version>
%b:响应报文的长度,单位为字节
%>s:响应状态码,如,200成功
%{Header_name}i:记录指定请求报文首部的内容,
如%{Referer}i:此请求的父请求;
%{User-Agent}i:用户浏览器。
详情请参考apache官网。
在httpd.conf中的配置如下:
CustomLog logs/access_log combined
(8.3)、错误日志:在httpd.conf中的配置如下:
ErrorLog logs/error_log
(9)、路径别名:
Alias /images/ "/data/imgs/":意味着访问http://server_ip/images时,其页面文件来自于/data/imgs/
注意:/images后有/,那么/data/imgs后必须有/,两个一定保持一致。
(10)、设置默认字符集:
AddDefaultCharset UTF-8
3、CGI:Common Gateway Interface:
(1)、Apache调用一种可执行文件,并且可执行文件返回时必须以Content-type:text/html开头;
并且这种可执行文件必须以管理员的身份执行;在运行linux时,以管理员的身份运行是非常危险的,所以现在动态网站很少使用CGI。因此大家对CGI了解即可。
(2)、可执行文件的路径必须定义在ScriptAlias /URL/ "/path/to/somewhere"下:只要定义在/path/to/somewhere下的文件都是可执行文件,都可以被Apache直接调用执行。
并且这些文件必须以管理员身份运行。
linux默认ScriptAlias为:ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
(3)、CGI所依赖的两个模块为:mod_alias和mod_cgi。
如:我们在/var/www/cgi-bin/目录下创建一个文件cgitest,内容如下:
#!/bin/bash
cat <<EOF
Content-type:text/html
<pre>
The hostname is :`hostname`.
The time is :`date`.
</pre>
EOF
,那么我们在浏览器下访问http://192.168.127.147/cgi-bin/cgitest 显示内容如下:
The hostname is :www.a.com
The time is: Tue Mar 23 11:12:56 CST 2015
4、基于用户的访问控制-HTTP认证:对于这种资源(网页)不是所有的IP都能访问,必须输入一个合法的账号/密码才可访问。
A、虚拟用户:为了获取服务的特定资源的用户,这种用户不是系统用户。
B、认证类型(auth):
a、basic基本认证:账号、密码明文发送。目前经常用。
basic认证依赖的模块auth_basic_module modules/mod_auth_basic.so
b、digest摘要认证:hash编码之后发送,很多浏览器不支持,很少用。
digest依赖的模块auth_digest_module modules/mod_auth_digest.so
C、认证提供者(authn):账号、密码的存放位置。
依赖的模块ahtun_*_module modules/mod_authn-*.so
D、授权机制(authz):根据什么进行授权。
依赖的模块ahtuz_*_module modules/mod_authz-*.so
E、如何配置基于用户授权:案例-做基本认证
<Directory "/www/html/fin">
Options None
AllowOverride AuthConfig
AuthType Basic
AuthName "Private Area 请提供账户和密码"
AuthUserFile /etc/httpd/conf/.htpasswd
Require valid-user
</Directory>
注意1:.htpasswd为隐藏文件。
注意2:Require valid-user:/etc/httpd/conf/.htpasswd下的所有合法用户
Require user zhangsan:只允许/etc/httpd/conf/.htpasswd下的zhangsan
注意3:用命令htpasswd创建认证用户,如下:
#htpasswd -c -m /etc/httpd/conf/.htpasswd tom
#htpasswd -m /etc/httpd/conf/.htpasswd jerry
注意4:AuthName "Private Area 请提供账户和密码"为“弹出对话框的提示信息”。
F、如何配置基于组的访问控制-HTTP认证-案例:
<Directory "/www/html/fin">
Options None
AllowOverride AuthConfig
AuthType Basic
AuthName "Private Area 请提供账户和密码"
AuthUserFile /etc/httpd/conf/.htpasswd
AuthGroupFile /etc/httpd/conf/.htgroup
Require group GroupName
</Directory>
组文件.htgroup需要手工创建:
组名: 用户1 用户2 用户3
5、虚拟主机Virtualhost:一个物理服务器服务多个站点。
(1)、实现虚拟主机的方法如下:
a、基于不同IP实现不同的虚拟主机,IPV4已基本用完,并且多个IP浪费资源。-->变化IP
<Virtualhost 192.168.1.101:80>
ServerName www.a.com
DocumentRoot "/web/a/html"
</Virtualhost>
<Virtualhost 192.168.1.102:80>
ServerName www.b.org
DocumentRoot "/web/b/html"
</Virtualhost>
b、基于不同port实现不同的虚拟主机,Web站点默认端口为80,如果用不同Port则不太合适。--变化Port
<Virtualhost 192.168.1.101:80>
ServerName www.a.com
DocumentRoot "/web/a/html"
</Virtualhost>
<Virtualhost 192.168.1.101:8080>
ServerName www.b.com
DocumentRoot "/web/b/html"
</Virtualhost>
c、基于不同主机名(FQDN)实现不同的虚拟主机,最节省资源。-->变化ServerName,需要配置/etc/hosts文件
注意:http2.2实现虚拟主机需要启用NameVirtualHost *:80
<Virtualhost *:80>
ServerName www.a.com
DocumentRoot "/web/a/html"
</Virtualhost>
<Virtualhost *:80>
ServerName www.b.com
DocumentRoot "/web/b/html"
</Virtualhost>
(2)、实现虚拟主机步骤:
a、要实现"虚拟主机",必须取消“中心主机”,即注释掉 #DocumentRoot "/www/html/"
b、配置Virtualhost:
<Virtualhost IP:port>
ServerName ...
DocumentRoot ...
<Directory "">
...
</Directory>
</Virtualhost>
c、http2.2实现虚拟主机需要启用NameVirtualHost *:80
d、每个虚拟主机可以单独配置:用户认证、访问日志、错误日志、别名、脚本别名等。
三、https的实现:
https的来源:因http发送和请求都是有以明文方式传输的,对于网上银行、支付宝、财付通等账户信息以明文方式传输太不安全,所以才提出http的加密方式传输即https
网上银行、支付宝、财付通,基于ssl/tls
ssl:Secure Socket Layer,常用的版本为sslv3
tls:Transport Layer Security,常用的版本为tlsv1
1、X509.3证书格式:
证书格式的版本号
证书序列号
证书签名算法
证书颁发者
有效期
持有者名称
持有者公钥
其他扩展信息:基本约束、使用策略、密钥使用的限制
CA签名
2、PKI:Public Key Infrastructure
签证机构(CA)
证书撤销列表(CRL)发布机构
端实体(申请者)
注册机构(RC)
证书存取库
3、SSL握手要完成的工作:
交换协议版本号
选择双方都支持的加密方式
对两端实现身份验证
进行密钥交换
4、http VS https:
(1)、http:文本协议,80/tcp。
(2)、https:二进制格式的协议,443/tcp。
(3)、SSL会话是基于IP地址实现,因此不支持在基于FQDN的虚拟主机上实现。
5、https验证一般指客户端验证服务端证书,验证的内容:
日期检测:证书是否在有效期内
证书颁发者的可信度
证书的签名检测
持有者的身份检测
5、httpd实现https:基于mod_ssl模块实现对ssl的支持。
(1)、准备好服务器的私钥和证书
(2)、安装mod_ssl模块
#yum -y install mod_ssl
(3)、配置/etc/httpd/conf.d/ssl.conf
配置使用ssl的虚拟主机
Servername
DocumnetRoot
配置证书和私钥
SSLCertificatFile 证书文件
SSLCertificatKeyFile 密钥文件
(4)、重启httpd服务
(5)、测试
#openssl s_client -connect IP:port -CAfile /path/to/CA_certificate_file
四、服务器status页面:apache的内生的status页面,这些页面可以观察服务器的运行状态,所以要限定访问。
1、配置文件系统路径访问属性
<Directory "">
</Directory>
2、配置URL访问属性
<Location /server-status>
SetHandler server-status
AuthType basic
AuthName "Server Stauts"
AuthUserFile /etc/httpd/conf/.htpasswd
Require valid-user
</Location
如果要配置其属性的URL能映射到某具体的文件系统路径,建议使用<Directory>而非<Location>;
否则使用<Location>,如服务器status页面,显示的是服务器的运行状态,status页面在服务器上根本不存在,因此这些信息不实所有的人都能看到的,所以要限定访问(限定方法:基于用户认证AuthType或者基于IP的认证,见上面)。
五、curl命令:在命令行模式下去探测服务器工作状态的工具。
它基于URL的语法在命令行模式下工作的文件传输工具,它支持FTP、FTPS、HTTP、TELNET、FILE、LADP、DICT等等协议。支持HTTPS认证,并且支持HTTP的POST、PUT等方法,FTP上传,HTTP上传,下载文件断点续传,上传文件断点续传,http代理服务器管道,甚至还支持IPv6,socks5代理服务器等等,功能非常强大。
常用的命令选项:
1、-I/--head:只获取响应报文首部信息。如:curl -I http://www.baidu.com
2、-e/--referer <URL>:来源网址。
如:curl -e http://www.google.com.hk/index.html http://www.baidu.com,即通过www.google.com.hk/index.html访问www.baidu.com。
3、-A/--user-agent <string>:设置客户端浏览器名称
六、使用mod_deflate模块压缩页面优化传输速度。
注:使用场景:CPU比较空闲,而带宽比较紧张是使用压缩;如果CPU比较忙,而带宽比较空闲时就不需要使用压缩。
1、通常只压缩纯文本文件,如html/css/js/plain等,对于二进制文件如mp3,jpg等压缩效果不明显。
2、配置mod_deflate:
(1)、启用:SetOutputFilter DEFLATE
(2)、配置:
<IfModule mod_deflate.c>
#指定对哪些格式的文件进行压缩,可以写在一行,用空格隔开
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/x-javascript
#压缩级别 Level of compression (1-9,Highest 9),默认6
DeflateCommpressionLevel 9
#有些浏览器不支持压缩,通常如下:
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
</IfModule mod_deflate.c>
七、安装Apache后自动会安装一些工具,比较重要的工具有:
1、apachectl:apache服务器控制工具,apachectl start|restart|stop
2、压力模拟测试工具ab,测试结果只能作为参考:
-c :模拟的并发数即链接数
-n :总请求数
注意:-c的值小于等于-n的值才有效。
如:ab -c 100 -n 5000 http://www.baidu.com/index.html
3、apxs:apache的扩展工具,编译第三方模块或者在编译安装apache时未安装某模块,要想使用此模块都需要使用apxs。
4、rotatelogs:不关闭apahce手动滚动日志文件。