一:HTTP协议

   超文本传输协议 (HTTP-Hypertext transfer protocol) 是一种详细规定了浏览器和万维网服务器之间互相通信的规则,传送协议。是一个标准的C/S架构,无状态协议(每次连接都需要三次握手四次断开)默认监听在TCP的80端口,传输协议文本为HTML。HTTP协议版本号0.9:简单的文本传输协议,1.0:支持图片,语音,视频,等多种格式文件传输;HTTP1.1支持持久连接 关于HTTP协议可参考博文http://slayer.blog.51cto.com/4845839/1665255

     二:HTTPD

   httpd是Apache服务进程名称.它具有众多的功能特性

 

丰富用户认证. 支持基本认证和摘要认证.
支持CGI: 原生支持perl CGI  
支持虚拟主机:  基于端口, IP , 主机名.
反向代理,:  支持负载均衡的效果. 
支持用户站点.
支持路径别名.
支持第三方模块

高度模块化: core + module
DSO:
MPM: 多到处理模块
  prefork: 预先生成子进程.
     select(), 并发能力上线为1024
  work: 一个线程响应一个进程. 每个进程生成多个线程.
  event: 基于事件的响应方式, 一个线程响应N个请求.
     event-driven: 事件驱动.





   三:web服务器搭建

 基于HTTP协议的web服务器有Apache,今天的服务器搭建配置就是基于Apache2.2版本。

      1)准备好yum源,进行yum install  httpd安装。

      2) 编辑主配置文件vim /etc/httpd/conf/httpd.conf

ServerTokens OS            
ServerRoot "/etc/httpd"         服务器运行目录
PidFile run/httpd.pid              守护进程都有一个守护文件
Timeout 60                            

KeepAlive Off                       是否启用持久连接  (有利也有弊 , 有利是不用重复三次握手四次断开, 不利是占用空间.)
MaxKeepAliveRequests 100 使用持久连接最大的请求个数
KeepAliveTimeout 15            持久连接时间上的限定

<IfModule prefork.c>               
     StartServers         8           刚启动时启动几个进程
     MinSpareServers      5      最少空闲进程.  任何时刻都会有5个进程是空闲的.
     MaxSpareServers    20     最大空闲进程.
     ServerLimit        256         对多server个数
     MaxClients        256         最多clients 个数.
     MaxRequestsPerChild 4000   一个进程在一个生命周期内最多处理多少次的用户请求.
</IfModule> 


<IfModule worker.c> 
       StartServers 4 
       MaxClients 300           所允许最大用户并发数 
       MinSpareThreads 25   最少空闲线程数
       MaxSpareThreads 75   最多空闲线程数
       ThreadsPerChild 25     每个进程最多启动线程数.
       MaxRequestsPerChild 0    不限定 
</IfModule> 

Listen 80    监听的端口  0.0.0.0:80
Listen 8080    可以有多个Listen  修改后需要重启服务

LoadModule auth_basic_module modules/mod_auth_basic.so   指定装载的模块. 
LoadModule auth_digest_module modules/mod_auth_digest.so 
LoadModule authn_file_module modules/mod_authn_file.so 
LoadModule authn_alias_module modules/mod_authn_alias.so 
LoadModule authn_anon_module modules/mod_authn_anon.so 
LoadModule authn_dbm_module modules/mod_authn_dbm.so 
LoadModule authn_default_module modules/mod_authn_default.so 
LoadModule authz_host_module modules/mod_authz_host.so 
LoadModule authz_user_module modules/mod_authz_user.so 
LoadModule authz_owner_module modules/mod_authz_owner.so 
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so 
LoadModule authz_dbm_module modules/mod_authz_dbm.so 
LoadModule authz_default_module modules/mod_authz_default.so 
LoadModule ldap_module modules/mod_ldap.so 
LoadModule authnz_ldap_module modules/mod_authnz_ldap.so 
LoadModule include_module modules/mod_include.so 
LoadModule log_config_module modules/mod_log_config.so 
LoadModule logio_module modules/mod_logio.so 
LoadModule env_module modules/mod_env.so 
LoadModule ext_filter_module modules/mod_ext_filter.so 
LoadModule mime_magic_module modules/mod_mime_magic.so 
LoadModule expires_module modules/mod_expires.so 
LoadModule deflate_module modules/mod_deflate.so 
LoadModule headers_module modules/mod_headers.so 
LoadModule usertrack_module modules/mod_usertrack.so 
LoadModule setenvif_module modules/mod_setenvif.so 
LoadModule mime_module modules/mod_mime.so 
LoadModule dav_module modules/mod_dav.so 
LoadModule status_module modules/mod_status.so 
LoadModule autoindex_module modules/mod_autoindex.so 
LoadModule info_module modules/mod_info.so 
LoadModule dav_fs_module modules/mod_dav_fs.so 
LoadModule vhost_alias_module modules/mod_vhost_alias.so 
LoadModule negotiation_module modules/mod_negotiation.so 
LoadModule dir_module modules/mod_dir.so 
LoadModule actions_module modules/mod_actions.so 
LoadModule speling_module modules/mod_speling.so 
LoadModule userdir_module modules/mod_userdir.so 
LoadModule alias_module modules/mod_alias.so 
LoadModule substitute_module modules/mod_substitute.so 
LoadModule rewrite_module modules/mod_rewrite.so 
LoadModule proxy_module modules/mod_proxy.so 
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so 
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so 
LoadModule proxy_http_module modules/mod_proxy_http.so 
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so 
LoadModule proxy_connect_module modules/mod_proxy_connect.so 
LoadModule cache_module modules/mod_cache.so 
LoadModule suexec_module modules/mod_suexec.so 
LoadModule disk_cache_module modules/mod_disk_cache.so 
LoadModule cgi_module modules/mod_cgi.so 
LoadModule version_module modules/mod_version.so 

Include conf.d/*.conf 

User apache 
Group apache 

ServerAdmin root@localhost       出错故障显示的邮箱地址. 
UseCanonicalName Off 
DocumentRoot "/var/www/html"   指定站点根目录 

<Directory />                                站点路径访问控制  根
    Options FollowSymLinks           
    AllowOverride None 
</Directory> 

<Directory "/var/www/html"> 
    Options Indexes FollowSymLinks    没有主页时把网站内容以列表形式呈现给用户.可以用来下载.   followsymlinks 跟踪符号连接.不起用前面添加-
    AllowOverride None   支持在.htaccess   
    Order allow,deny  基于IP做访问控制.    允许可通过的,拒绝所有.
    Allow from all    允许所有访问   Allow from 172.16.0.0/16  .  只允许这个网段才可以访问.
</Directory> 

<IfModule mod_userdir.c> 
# 
# UserDir is disabled by default since it can confirm the presence 
# of a username on the system (depending on home directory 
# permissions). 
# 
UserDir disabled 
# 
# To enable requests to /~user/ to serve the user's public_html 
# directory, remove the "UserDir disabled" line above, and uncomment 
# the following line instead: 
# 
#UserDir public_html 

</IfModule> 
    DirectoryIndex index.html index.html.var    默认主页面.
    AccessFileName .htaccess 
   <Files ~ "^\.ht"> 
       Order allow,deny 
       Deny from all 
       Satisfy All 
  </Files> 

TypesConfig /etc/mime.types 
DefaultType text/plain 
<IfModule mod_mime_magic.c> 
MIMEMagicFile conf/magic 
</IfModule> 

HostnameLookups Off 

ErrorLog logs/error_log 
LogLevel warn    日志警告级别
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined   
LogFormat "%h %l %u %t \"%r\" %>s %b" common 
LogFormat "%{Referer}i -> %U" referer 
LogFormat "%{User-agent}i" agent 

CustomLog logs/access_log combined    #选择的是combined 日志记录模式

ServerSignature On 

Alias /icons/ "/var/www/icons/"     访问映射的路径  跟根路径没有关系 配置此处后,如果在跟下也同样创建一个目录.创建的目录无效.

<Directory "/var/www/icons"> 
    Options Indexes MultiViews FollowSymLinks 
    AllowOverride None 
    Order allow,deny 
    Allow from all 
</Directory> 

<IfModule mod_dav_fs.c> 
   # Location of the WebDAV lock database. 
   DAVLockDB /var/lib/dav/lockdb 
</IfModule> 

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"   指定cgi-bin路径

<Directory "/var/www/cgi-bin"> 
   AllowOverride None 
   Options None 
   Order allow,deny 
   Allow from all 
</Directory> 

IndexOptions FancyIndexing VersionSort NameWidth=* HTMLTable Charset=UTF-8 
AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip 
AddIconByType (TXT,/icons/text.gif) text/* 
AddIconByType (IMG,/icons/image2.gif) image/* 
AddIconByType (SND,/icons/sound2.gif) audio/* 
AddIconByType (VID,/icons/movie.gif) video/* 
AddIcon /icons/binary.gif .bin .exe 
AddIcon /icons/binhex.gif .hqx 
AddIcon /icons/tar.gif .tar 
AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv 
AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip 
AddIcon /icons/a.gif .ps .ai .eps 
AddIcon /icons/layout.gif .html .shtml .htm .pdf 
AddIcon /icons/text.gif .txt 
AddIcon /icons/c.gif .c 
AddIcon /icons/p.gif .pl .py 
AddIcon /icons/f.gif .for 
AddIcon /icons/dvi.gif .dvi 
AddIcon /icons/uuencoded.gif .uu 
AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl 
AddIcon /icons/tex.gif .tex 
AddIcon /icons/bomb.gif core 
AddIcon /icons/back.gif .. 
AddIcon /icons/hand.right.gif README 
AddIcon /icons/folder.gif ^^DIRECTORY^^ 
AddIcon /icons/blank.gif ^^BLANKICON^^ 
DefaultIcon /icons/unknown.gif 
ReadmeName README.html 
HeaderName HEADER.html 
AddLanguage cs .cz .cs 
AddLanguage da .dk 
AddLanguage de .de 
AddLanguage el .el 
AddLanguage en .en 
AddLanguage eo .eo 
AddLanguage es .es 
AddLanguage et .et 
AddLanguage fr .fr 
AddLanguage he .he 
AddLanguage hr .hr 
AddLanguage it .it 
AddLanguage ja .ja 
AddLanguage ko .ko 
AddLanguage ltz .ltz 
AddLanguage nl .nl 
AddLanguage nn .nn 
AddLanguage no .no 
AddLanguage pl .po 
AddLanguage pt .pt 
AddLanguage pt-BR .pt-br 
AddLanguage ru .ru 
AddLanguage sv .sv 
AddLanguage zh-CN .zh-cn 
AddLanguage zh-TW .zh-tw 
ForceLanguagePriority Prefer Fallback 

AddDefaultCharset UTF-8  默认编码格式

AddType application/x-compress .Z 
AddType application/x-gzip .gz .tgz 
AddType application/x-x509-ca-cert .crt 
AddType application/x-pkcs7-crl .crl 
AddHandler type-map var 
AddType text/html .shtml 
AddOutputFilter INCLUDES .shtml 
Alias /error/ "/var/www/error/" 

<IfModule mod_negotiation.c> 
<IfModule mod_include.c> 

<Directory "/var/www/error"> 
  AllowOverride None 
  Options IncludesNoExec 
  AddOutputFilter Includes html 
  AddHandler type-map var 
  Order allow,deny 
  Allow from all 
  LanguagePriority en es de fr 
  ForceLanguagePriority Prefer Fallback 
</Directory> 
</IfModule> 
</IfModule> 

BrowserMatch "Mozilla/2" nokeepalive 
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0 
BrowserMatch "RealPlayer 4\.0" force-response-1.0 
BrowserMatch "Java/1\.0" force-response-1.0 
BrowserMatch "JDK/1\.0" force-response-1.0 
BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully 
BrowserMatch "MS FrontPage" redirect-carefully 
BrowserMatch "^WebDrive" redirect-carefully 
BrowserMatch "^WebDAVFS/1.[0123]" redirect-carefully 
BrowserMatch "^gnome-vfs/1.0" redirect-carefully 
BrowserMatch "^XML Spy" redirect-carefully 
BrowserMatch "^Dreamweaver-WebDAV-SCM1" redirect-carefully


      3)如果想要修默认主页面文件存放位置编辑下面的documentroot选项就可以了。

DocumentRoot "/var/www/html"


      4)查看默认主页的命名

DirectoryIndex index.html 
所以在/var/www/html文件夹下创建index.html文件


                 

      5)检查HTTP配置文件是否有语法错误

httpd -t


   


    6)打开浏览器测试一下吧。

wKiom1Pm2jfTUJw0AACKWlzWEUw672.jpg


   三:基于用户名做访问控制

    1)在主配置文件内写入如下配置文件信息(305行处)


   

      <directory "/var/www/html/admin">
                options none    #没有任何选项
                allowoverride authconfig #是否允许否改
                authtype basic #认证类型
                authname "admin area" #认证名称
                authuserfile /etc/httpd/conf/.htpasswd #认证时使用的文本文件
                require valid-user #允许哪些用户登录. valid-user:所有用户都可认证.
      <directory>




    2)在/etc/httpd/conf/文件夹下创建.htpasswd文件

       

第一次创建时用htpasswd -c -m  /etc/var/httpd/conf/.htpassed [用户名] 。
第二次创建时不需要在加入-c选项。
   参数选择
     -D  :删除用户
     -c : 如果文件不存在则进行创建
     -m : 以MD5方式编码存储用户密码信息.

       创建后该文件内的用户名是明文的账号密码是加密的.

wKioL1Pm4q7CHXcNAAGn5U4OROk087.jpg

    3)重启一下httpd服务:service httpd restart

wKioL1Pm4yTCAvl7AAB7NRuKfrg305.jpg

    4)打开浏览器测试下服务是否启用

wKioL1Pm5HHgCJPgAAEXBlXKha0239.jpg

   5)输入密码成功访问

wKiom1Pm47WT2RXDAAD3K2O726o393.jpg


   6)基于组名进行认证

   <directory "/var/www/html/admin">
                options none    #没有任何选项
                allowoverride authconfig #是否允许否改
                authtype basic #认证类型
                authname "admin area" #认证名称
                authuserfile /etc/httpd/conf/.htpasswd #认证时使用的文本文件
                authuserfile /etc/httpd/conf/.htgroup  #认证的组名
                require group test #允许哪些组可以认证
                
    <directory>
      
    编辑.htgroup
    
    test: tom blair   #如此格式







  

四:虚拟主机

  虚拟主机:在web服务器内创建多个虚拟主机,停供不同的站点进行访问。

要实现虚拟主机可以通过以下方式实现 

 有基于端口的虚拟主机;
 有基于IP的配置主机;
 有基于主机名的虚拟主机。
 
 
 <VirtualHost IP:PORT>    IP:PORT   基于IP:基于端口
     ServerName       主机名
     DocumentAlias    根目录
     ServerAlias       
     ErrorLog         错误日志
     CustomLog
 </VirtualHost>

   1)在创建虚拟主机之前要先确定把真实主机先注销掉,虚拟主机和真实主机不能同时存在。

#   DocumentRoot "/var/www/html"      注销


   2)基于端口:的虚拟主机:本次以80端口和8080端口为例。在配置文件内增加监听端口信息。

Listen 80
Listen 8080       端口不同


     在主配置文件下添加虚拟主机配置信息。(DNS配置请参考前面文章或修改访问主机的host文)

wKiom1Pm6UOTiGakAADTDGW5qxM588.jpg

        测试能否访问

wKioL1Pm6oCCjiAoAACktcJRr5g983.jpg

wKiom1Pm6XTxCzpUAACp9th7c8A789.jpg

   3)基于IP地址:为服务器添加新的IP信息

wKioL1Pm68HBR6yHAAA6XSx9EBw503.jpg

        修改主配置文件的虚拟主机配置信息

wKiom1Pm66Lyq3SRAADJTwNYlHI589.jpg


        测试能否访问

wKioL1Pm7VrTmXlXAACktcJRr5g501.jpg

wKioL1Pm7WuBYBjcAACrAT5WrIE149.jpg


    4)基于主机名称:基于主机名称的虚拟主机首先要打开虚拟主机的namevirtualhost文件

wKioL1Pm7nzwoH_VAABGEeFlcU4194.jpg


        修改主配置文件的虚拟主机信息

wKioL1Pm747Ack1CAAC9sokm_Qw476.jpg

        测试能否访问

wKioL1Pm79qS9jD9AACjCMjfPbc049.jpg

wKiom1Pm7vaSK0_7AACtODT8i9g881.jpg


   五:https安全连接

     基于https安全连接能够让信息在传输过程中进行加密,保障信息传输的安全性,由于传输的信息要先经过加密才能传输,所以会降低传输的效率。

     1)由于https安全要基于mod_ssl模块,所以要先确定此模块安装完成没有。

yum install mod_ssl

rpm -ql mod_ssl

/etc/httpd/conf.d/ssl.conf
/usr/lib64/httpd/modules/mod_ssl.so
/var/cache/mod_ssl
/var/cache/mod_ssl/scache.dir
/var/cache/mod_ssl/scache.pag
/var/cache/mod_ssl/scache.sem

查看下主配置文件
LoadModule ssl_module modules/mod_ssl.so   加载的模块名
Listen 443  监听的端口
SSLPassPhraseDialog  builtin
SSLSessionCache         shmcb:/var/cache/mod_ssl/scache(512000)  缓存信息
SSLSessionCacheTimeout  300   超时时长
SSLMutex default
SSLRandomSeed startup file:/dev/urandom  256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin

<VirtualHost _default_:443>
   ErrorLog logs/ssl_error_log   日志记录
   TransferLog logs/ssl_access_log
   LogLevel warn
   SSLEngine on     是否启用ssl
   SSLProtocol all -SSLv2  
   SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
   SSLCertificateFile /etc/pki/tls/certs/localhost.crt      存储SSL证书文件的路径(需根据实际情况修改)
   SSLCertificateKeyFile /etc/pki/tls/private/localhost.key 存储SSL的密钥路径(需根据时间情况修改)

<Files ~ "\.(cgi|shtml|phtml|php3?)$">
    SSLOptions +StdEnvVars
</Files>

<Directory "/var/www/cgi-bin">
    SSLOptions +StdEnvVars
</Directory>

SetEnvIf User-Agent ".*MSIE.*" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0

CustomLog logs/ssl_request_log \
          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>

     2)为服务器端生成私钥;并为其停供证书(请参考前面的openssl博文内容)http://slayer.blog.51cto.com/4845839/1534131

     

     3)配置https的主配置文件vim /etc/httpd/conf.d/ssl.conf

wKiom1Pm_BeTmtHkAACdi6kJZtY189.jpg

     4) 修改配置文件的密钥及证书信息

        

wKioL1Pm_WfhiB-oAAFxXKihTZ4979.jpg

  5)把CA的公钥导入浏览器中

wKioL1Pm_gaTxxyrAAFTHD1zBvk806.jpg


   6)进行访问测试

wKiom1Pm_XvhEywZAAFO45K3A-g087.jpg


   7)通过命令行进行测试

# openssl s_client -connect IP:PORT -CAfile /path/to/ca_certificate


  


六:httpd 程序自带的工具介绍

 httpd:

      -t  :测试配置文件

      -l  :列出静态模块

      -D  DUMP_MODULES 理出DSO模块   http -D  DUMP_MODULES  查看加载的模块

      -M:

      -D DUMP_VHOSTS:列出虚拟主机

htpasswd:为基于文件的basic认证创建和更新用户账号信息

apachectl: 脚本,  httpd服务控制工具

ab:  httpd 的基准性能测试工具

apxs: 让apache可以扩展使用第三方模块的工具.

htcacheclean: 磁盘缓存清理工具.

httxt2dbm: 为rewrite map创建格式文件.

rotatelogs: 不关闭httpd而切换其使用日志文件工具.平滑实现日志切割

suexec: user apache ; group apache


用ab工具做基准性能功能测试.

    -c   #: 模拟并发多少的请求

    -n   #: 总的请求数.

ab -c 2000 -n 10000  #每次请求2000个总共发出10000个请求.

突然发出这么大的请求可能主机由于内部的限定的响应进程数不能够完成,此时需要调整内部响应进程数的限制.

 

资源限定分为下面两种.

   软限定:  可临时超出一定时长的上线

   硬限定:  绝对不可能超出的上线.


ulimit  可以临时调整打开的限制进程数.  

   -n: 能同时打开的文件数

   -u: 能同时启动的进程数

要想永久修改次限定的值需要修配置改文件,/etc/security/limits.conf  或者 /etc/security/limits.d/*.conf