站点:httpd.apache.org

1)web请求的基本过程

    建立连接

    接受请求

    处理请求

    获取资源

    构建响应

    发送响应

    记录日志

2)web服务器输入输出结构

    单线程I/O模型

    多线程I/O结构模型

    复用的I/O结构:单个线程响应多个请求

    复用多线程的I/O结构:多个线程,每个线程响应多个请求

3)http:模块化

    core+modules:模块化设计

    DSO:dynamic shared object动态装载模块

    MPM:multipath processin module多道处理模块,非一个模块,而是对一种特性的称谓。

4)常用的工作模式:

    prefork模式使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接。在大多数平台上,Prefork MPM在效率上要比Worker MPM要高,但是内存使用大得多。prefork的无线程设计在某些情况下将比worker更有优势:它可以使用那些没有处理好线程安全的第三方模块,并且对于那些线程调试困难的平台而言,它也更容易调试一些。

    worker模式使用多个子进程,每个子进程有多个线程。每个线程在某个确定的时间只能维持一个连接。通常来说,在一个高流量的HTTP服务器上,Worker MPM是个比较好的选择,因为Worker MPM的内存使用比Prefork MPM要低得多。但worker MPM也由不完善的地方,如果一个线程崩溃,整个进程就会连同其所有线程一起"死掉".由于线程共享内存空间,所以一个程序在运行时必须被系统识别为"每个线程都是安全的"

    event:一个线程响应多个请求。

5)httpd配置文件参数详解。

1,监听套接字。

    Listen [ip:]port

默认80

可以出现多次,用于指定监听多个不同的套接字。

例如:

    Listen 80

Listen 192.168.1.1:8080

grep "Section" /etc/httpd/conf/httpd.conf 
### Section 1: Global Environment  全局配置
### Section 2: 'Main' server configuration  主服务器
### Section 3: Virtual Hosts 虚拟主机

keepalived off关闭了持久连接

on开启后相关联的是超时和限制最大请求连接数。

2)配置使用keep alive

keepAlived{on|off}

keepalivedtimeout 2超时时间

maxkeepaliverequests 50最大请求连接数。

3)MPM

httpd -l查看默认模块。

vim /etc/sysconifg/httpd

HTTPD=/usr/sbin/httpd.worker直接改配置文件。重启即可更换工作模式。

<IfModule prefork.c>判断模块是否存在。httpd -l查看模块

StartServers       8默认启动的工作进程数
MinSpareServers    5最少空闲进程数
MaxSpareServers   20最大空闲进程数
ServerLimit      256最大活动进程数
MaxClients       256最大并发连接数
MaxRequestsPerChild  4000每个子进程在生命周期内所能够服务的最多请求个数;每个子进程最大所允许服务的请求个数。

</IfModule>   

<IfModule worker.c>
StartServers         4启动的子进程的个数
MaxClients         300并发请求的最大数
MinSpareThreads     25最小空闲线程数
MaxSpareThreads     75最大空闲线程数
ThreadsPerChild     25每个子进程最多生成的线程数
MaxRequestsPerChild  0每个子进程在生命周期内所能服务的最多请求个数,0表示不限定。
</IfModule> 

4)DSO模块的加载方式。

LoadModule module_name /path/to/module

httpd -M列出已装载的所有dso模块

httpd -l:列出支持使用的非dso模块

取消模块也是在配置文件中,把加载的模块用#号取消。

5)配置站点根目录

DocumentROot /path/to/somewhere默认是var/www/html

6)配置页面访问属性

<Directory "/path/to/somewhere">

Options:

    Indexes:缺少指定默认页面时,允许将目录中的所有文件以列表形式返回给用户。

    FollowSymlinks:允许跟随符号链接所指向的原始文件。

    None:所有选项都不启用

    All:所有都启用

    ExecCGI:允许使用mod_cgi模块执行cgi脚本。

    Includes:允许使用mod_include模块实现服务器的包含(杀死);

    Multviews:允许使用mod_negotiation实现内容协商。

SymlinksIfownermatch:在连接文件属主属组与原始文件的属主属组相同时,允许跟随符号链接所指向的原始文件。

</Directory>

7)基于主机的访问控制。

 <Directory "/path/to/somewhere">

    options

    Allowoverride None

order Allow,deny没有允许的都拒绝,order deny allow没有拒绝的都允许。

    allow

    deny

<directory>

order allow,deny表示允许所有人

allow from all         

二者都匹配或二者都无法匹配项时,则以后者为准,否则,则以匹配到的为准。

最佳匹配:从列表中找到最小的能匹配到访问者的地址的条目为最终生效的。

8)定义默认主页面

directoryIndex index.php index.html 一次寻找。

9)用户目录

用户创建个人站点。http://server_ip/~username/

Userdir disable表示禁止

userdir public_html

 public_html是用户目录下的目录名称,所有位于此目录中的文件均可通过前述的访问路径进行访问。 用户的家目录得赋予运行httpd进程的用户拥有执行权限;
UserDir disable这个禁用掉。
在配置文件中开启UserDir public_html就能使用用户的家目录了。
useradd hadoop
su - hadoop
mkdir /home/public_html 
vim /home/public_html/创建网页
setfacl -m u:apache:x /home/hadoop

10)配置日志功能。

 

/var/log/httpd/
 access.log:访问日志,其需要记录的内容需要自定义。
 error.log:错误日志
 访问日志:
  CustomLog ”/path/to/access_log_file" LogFormat_Name
  LogFormat 

httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats 日志访问链接

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent} 
%h:客户端地址
%l:远程登录名,通常为-
%u:认证时的远程用户名,没有认证时为-
%t:收到请求的时间。
%r:请求报文的起始行。
%>s:响应状态码。
%b:响应报文的长度,单位为字节数。
%{HEader_Name}i:记录指定请求报文首部的内容(value)
%U:表示请求的Url。
错误日志:
 ErrorLog

11)路径别名

Alias /p_w_picpaths/ "/data/imgs"    定义别名。
访问p_w_picpaths的内容来自imgs

Alias /alias/ "/path/to/somewhere"
意味着访问http://Server_IP/alias/时,其页面文件来自于/path/to/somewhere这个位置
12)设定默认字符集。
AddDefaultCharset UTF-8有时需要改变字符集。

13)CGI脚本路径别名
 URL --》FileSystem Directory

CGI:通用网关接口,一种协议。Common Gateway Interface。
CGI:web和某个环境下的应用程序进行通信,从通信环境中获取结果。
mod_alias实现别名的
mod_cgi:实现cgi解析的。
Content-Type:text/html
SUID,SGID。
ScriptAlias /URL/ "/path/to/somewhere/"

#/bin/bash
cat <<EOF
content-Type: text/html
<pre>
<h1>The hostname is: `hostname`.</h1>
The time is: `date`.
</pre>
EOF

14)基于用户的访问控制

请求--》质询--》认证--》成功。

认证类型(auth)

    basic:基本认证,账号和密码明文发送。

    digest:摘要认证,hash编码之后发送。

    认证提供者(authentication provider):账号和密码的存放位置。

    授权机制(authentication):根据什么进行授权。

1)编辑配置文件爱呢,为需要的认证的目录配置认证机制。

<Directory "/var/www/html/shun">

Options None

AllowOveride AuthConfig

AuthType Basic

AuthName "private Area" 访问时的提示信息。

AuthUserFIle /etc/httpd/conf/.htpasswd

Require valid-user

</Directory>

mkdir shun创建目录,目录下方需要的网页。

htpasswd -c -m /etc/httpd/conf/.htpasswd shun
-c 是清空用户,第一次创建用户需要添加。后续在创建去掉即可。

2)使用htpasswd命令生成认证库

    -c创建文件。

    -m:密码基于md5编码存储。

3)基于组进行认证。

<Directory "/var/www/html/shun">

Options None

AllowOveride AuthConfig

AuthType Basic

AuthName "private Area" 访问时的提示信息。

AuthUserFIle /etc/httpd/conf/.htpasswd

AuthGroupFIle /etc/httpd/conf/.htgroup

Require group GroupName

</Directory>

15)虚拟主机

如果一个物理服务器上需要提供多个站点,使用虚拟主机的话必须先取消中心主机,中心主机指的是网站的默认目录documentroot "/var/www/html注释掉。

1)基于不同的ip实现不同的虚拟主机

    变化ip

<VirtualHost 172.16.100.7:80>

    ServerName www.benet.com

    DocumentRoot  "/web/benet.com/htdocs"根站点

</VirtualHost>

<VirtualHost 172.16.100.8:80>

    ServerName www.accp.com

    DocumentRoot  "/web/accp.com/htdocs"根站点

</VirtualHost>

mkdir -pv /web/benet.com/htdocs/
vim index.html
<h1>www.benet.com</h1>
httpd -t 检查语法

启动各自访问看结果。

2)基于不同的port实现不同的虚拟主机

    变化的port

<VirtualHost 172.16.100.8:8080>

    ServerName www.shunzi.com

    DocumentRoot  "/web/shunzi.com/htdocs"根站点

</VirtualHost>

3)基于不同的FQDN(主机名)实现不同的虚拟主机。

    变化servername的值

ps:

    NameVirtualHost *:80基于主机名的必须把这行的注释去掉。

4)基于虚拟主机也可以做网页认证。

 <virtualhost >
 ServerName
 DocumentRoot ""
 <Directory "" >
  Options
     可以做网页认证
 </Directory>
 ServerAlias
 ServerAdmin
</virtualhost>

虚拟主机的单独配置一般的选项

    用户认证

    访问日志

    错误日志

    别名

    脚本别名

16)基于htps协议

x509.3证书格式

    证书格式版本号

    证书序列号

    证书签名算法

    证书颁发者

    有效期

    持有者名称

    持有者的公钥

    其他扩展信息

        基本约束

        证书策略

        密钥的使用限制

    ca签名

PKI:public key Infrastructure

    申请者

    注册机构(RC)

    签证机构(CA)

    证书撤销列表(CRL)

    证书存取库

SSL握手要完成的工作

    交换协议版本号

    选择双方都支持的加密方式

    对两端实现身份验证

    密钥交换

http:文本协议,活动在tcp中的80端口

https:二进制格式的协议,活动在tcp中的443端口

ssl回话基于ip地址进行,不支持在基于FQDN的虚拟主机上实现。

客户端验证服务器证书步骤:

    日期的检测,证书是否在有效期内。

    证书颁发者的可信度

    证书的签名检测

    持有者的身份检测

httpd:基于mod_ssl模块实现对ssl的支持。

1)准备好服务器的私钥和证书。

 

(umask 077;openssl genrsa 2048 > private/cakey.pem)

cd /etc/pki/CA

touch index.txt serial crlnumber

echo 01 > serial 

openssl req -new -x509 -key private/cakey.pem -days 3655 -out cacert.pem

2)安装mod_ssl模块

yum -y install mod_ssl

3)配置/etc/httpd/conf.d/ssl.conf

    配置使用ssl的虚拟主机

    配置证书和私钥

 SSLCertificatFile证书文件
 SSLCertificatKeyFile密钥文件

4)重启服务。

5)测试

openssl s_client -connect IP:port -CAfile /path/to/CA_certificate_file

通过https访问试试能不能加密访问

17)服务器status页面:

内生的status信息,且此信息可以通过web予以显示。

配置文件系统路径访问属性

    <Directory [~] "">

    </Directory>

    <File [~] "">

    </File>

配置URL访问属性

    <Location [~] "">

    </Location>

    <LocationMatch "">

    </LocationMatch>

如果某要配置其属性的url能映射到某具体文件系统路径,建议使用<Directory>

vim httpd.conf

<Location /server-status>

    Sethandler server-status

    AuthTyepe Basic

    AuthName “Server status”

    AuthUserFile “/etc/httpd/conf/.htpasswd"

    Require valid-user   做认证

    Order deny,allow

    Allow from all

</Location>

访问http://ip/erver-status

做过认证后需要密码了。

18)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的常用选项:

    -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 <user[:password]>设置服务器的用户和密码
    -0/--http1.0 使用HTTP 1.0

19)使用mod_deflate模块压缩页面优化传输速度 

vim /etc/httpd/conf.d/deflate.conf自己定义压缩

SetOutputFilter DEFAULT启动过滤器完成压缩

AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/javascript
BrowserMatch ^Mozilla/4 gzip-only-text/html  
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
DeflateCompressionLevel 9
启动httpd浏览器访问测试显示是gzip压缩格式。

20)httpd

   Apache 服务器。
  apachectl
   Apache HTTP 服务器控制工具。
  ab
   Apache HTTP 服务器性能基准工具。
  apxs
   Apache 扩展工具。
  configure
   配置源代码。
  dbmmanage
   为基本认证创建和更新 DBM 格式的用户认证文件。
  htcacheclean
   清理磁盘缓存。
  htdigest
   为摘要认证创建和更新用户认证文件。
  htdbm
   操作 DBM 密码数据库。
  htpasswd
   为基本认证创建和更新用户认证文件。
  httxt2dbm
   为 RewriteMap 创建 dbm 文件。
  logresolve
   将 Apache 日志文件中的 IP 地址解析到主机名称。
  rotatelogs
   不关闭 Apache 而切换日志文件。
  suexec
   执行外部程序前切换用户。  

21)资源限定

    软限制:可以超出的限制,但仅超出一定时长。

    硬限制:绝对不能超出的限制

ulimit

    -n显示或限定能打开的最大的文件句炳数。

    -u所能够运行的最多进程数。

vim /etc/security/limits.conf  配置硬链接永久生效。
apache          hard    nofile          65535
apache          hard    nproc           30000
ulimit -n 65535
ulimit -u 30000让配置生效。 

22)压力测试ab工具。

-c:模拟最大并发数

-n:总的请求数

-c的值一定要小于或者等于-n的值。

ab -c 100 -n 15000 http://127.0.0.1/index.html 最大并发100次,总共请求15000.

ps:

    常见的httpd.conf的参数。如上。下一章解释源码编译安装apache。