一: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)打开浏览器测试一下吧。
三:基于用户名做访问控制
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方式编码存储用户密码信息.
创建后该文件内的用户名是明文的账号密码是加密的.
3)重启一下httpd服务:service httpd restart
4)打开浏览器测试下服务是否启用
5)输入密码成功访问
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文)
测试能否访问
3)基于IP地址:为服务器添加新的IP信息
修改主配置文件的虚拟主机配置信息
测试能否访问
4)基于主机名称:基于主机名称的虚拟主机首先要打开虚拟主机的namevirtualhost文件
修改主配置文件的虚拟主机信息
测试能否访问
五: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
4) 修改配置文件的密钥及证书信息
5)把CA的公钥导入浏览器中
6)进行访问测试
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