-- http (hyper text transfer protocol) 协议 web 服务器 survey.netcraft.net --此网站会有每月份的世界上网站使用的WEB服务器的使用率统计 www.apache.org apache a patch server nginx engine X IIS lighttpd IBM apache软件基金会 redhat oracle websphere tomcat jboss weblogic 静态网站 动态网站 java jsp .net php # vim /etc/httpd/conf/httpd.conf ServerTokens OS --向客户端提供一些服务器和信息 [root@li ~]# curl -I http://10.1.1.35 HTTP/1.1 200 OK Date: Tue, 06 Mar 2012 02:03:38 GMT Server: Apache/2.2.3 (Red Hat) Content-Type: text/html;charset=ISO-8859-1 ServerTokens Prod[uctOnly]:服务器会发送(比如):Apache ServerTokens Major:服务器会发送(比如):Apache/2 ServerTokens Minor:服务器会发送(比如):Apache/2.2 ServerTokens Min[imal]:服务器会发送(比如):Apache/2.2.11 ServerTokens OS:服务器会发送(比如):Apache/2.2.11(Unix) ServerTokens Full:服务器会发送(比如):Apache/2.2.11(Unix)PHP/5.2.8 serverRoot "/etc/httpd" --存放配置文件一主目录 PidFile run/httpd.pid --pid文件 Timeout 120 --连接超时时间 KeepAlive Off --一般是短时间下载文件比较多的网站 在ON的时候 一次连接多次请求 MaxKeepAliveRequests 100 KeepAliveTimeout 15 ------------------------------ keepalive参数修改小测试 off 的情况, 别人刷新你的一个页面 netstat -nt |grep :80 可以看到一个IP有多次连接 或者使用netstat -nt |grep :80 |awk -F: '{print $8}' |sort |uniq -c 命令来查看 on的情况, 别人刷新页面 netstat -nt |grep :80 可以看到一个IP只有一次连接(15秒后再刷新会产生新连接) 两分钟左右不刷新,TIME_WAIT连接断开 ------------------------------------- Listen 80 --监听端口 --预派生模式 ,lamp一般用这种 StartServers 8 MinSpareServers 5 MaxSpareServers 20 ServerLimit 256 MaxClients 256 --最大并发数 MaxRequestsPerChild 4000 [root@li ~]# httpd -l Compiled in modules: core.c prefork.c --可以看到rhel5里带的rpm版apache运行在prefork模式 http_core.c mod_so.c ----------------------- rpm里prefork模式和worker模式都在配置文件里,为什么只使用prefork? # cd /usr/sbin/ # mv httpd httpd.prefork # mv httpd.worker httpd # /etc/init.d/httpd restart # httpd -l Compiled in modules: core.c worker.c --现在换成worker模式了 http_core.c mod_so.c --在源码编译版的apache里,使用哪一种模式就留着他的配置段,把别的模式注释掉就可以了 总的来说,prefork方式速度要稍高于worker,然而它需要的cpu和memory资源也稍多于worker ----------------------------------------------------- Listen 80 --监听端口 下面的都属于叫DSO dynamic shared object 动态共享模块 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 .................................. Include conf.d/*.conf --表示conf.d/下的*.conf配置文件生效 User apache Group apache --以什么身份运行 ServerAdmin root@localhost --管理邮箱 DocumentRoot "/var/www/html" --网站家目录 DirectoryIndex index.html index.html.var --定义主页文件 AccessFileName .htaccess --网页加密 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 # firefox file:///var/www/manual/index.html --文档路径 /etc/init.d/httpd start 使用浏览器:输入自己的IP,或者127.0.0.1回环地址会看到一个红帽的欢迎页面 --------------------------------------------------- # /etc/init.d/httpd restart Stopping httpd: [ OK ] Starting httpd: httpd: apr_sockaddr_info_get() failed for lafite.uplooking.com httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName [ OK ] --上面这个警告是因为你的主机名没有梆定到/etc/hosts文件里才会出现的;因为apache服务在很多地方要用到你的主机名(如日志) ===================================================== 例一:建立网站主页 在网站根目录下 建立一个主页文件 echo 'main page' > /var/www/html/index.html http://127.0.0.1/ --就可以看到main page的信息,也就是直接访问到主页 把主页文件写成html标签的格式如下: 笔记站点

欢迎来我的网站!@_@

例二:修改网站根目录 vim /etc/httpd/conf/httpd.conf 292: DocumentRoot "/www" --修改网站根目录为/www 317: --把这个也对应的修改为/www /etc/init.d/httpd reload --重装启apache服务 mkdir /www echo 'new main page' > /www/index.html http://127.0.0.1/ --看到新网站根目录下的new main page信息 --注意,不要开启selinux,否则换新的家目录的话,会造成报目录不存在的错误 例三:修改主页类型或者主页名 DirectoryIndex index.php index.html.var /etc/init.d/httpd reload 使用浏览器访问,发现没有返回主页信息,因为上面的意思为:先找网站家目录下的index.php,不存在话,再找index.html.var,都不存在,就表示找不到主页 echo 'php main page' > /www/index.php 再使用浏览器访问,就会返回php main page信息 elinks 10.1.1.45 --elinks是一个文本模式的web浏览器 例四:修改语言集和字符集 DefaultLanguage zh-CN --默认语言集打开注释,并改为简体中文zh-CN LanguagePriority zh-CN en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv zh-TW --语言优先级,把zh-CN写到最前 AddDefaultCharset UTF-8 --字符编码,如果中文的话,有可能需要改为gb2312或者gbk,因你的网站文件的默认编码而异 常见的可以显示中文的字符集有:gbk,gb2312,gb18030,utf-8 --扩展: windows默认gb2312 linux默认utf-8 windows里文件内容的结束符和linux下不一样 \n linux下 \r\n windows下 所以把windows的文件拿到linux写脚本进行字符处理会出现问题 解决方法: dos2unix unix2dos ---------------------------------- 关于apache的标签,容器(访问控制) directory (目录) files(文件) location (位置,url) --对/www目录进行的控制 Options Indexes FollowSymLinks --允许列表,符号链接 AllowOverride None --不使用.htaccess控制 Order allow,deny Allow from all --针对/www目录的访问权限的控制,这两句代表允许所有访问 --容器结束 indexes --指当找不到默认的主页文件时,就把此目录下的文件或者目录以列表形式显示出来 FollowSymlinks --允许符号链接,扩展了网站根目录,允许链接到网站根目录以外 allowoverride none --可以把none改为all来允许.htaccess控制 order allow,deny --指定的是先允许,后拒绝 allow from all --指定允许所有 例五:把网站的文件修改成目录列表的形式 条件1. Options Indexes FollowSymLinks --相应目录要有indexes参数 条件2. 没有主页文件 条件3. 符合上面两个条件,就会访问到redhat的欢迎页面 vim /etc/httpd/conf.d/welcome.conf --注释掉这个欢迎页面,或者是删除它 /etc/init.d/httpd reload elinks 127.0.0.1 --可以看到是以列表形式显示了 例六:访问权限控制 --注意这些访问权限控制是针对容器的 Order allow,deny Allow from all --允许所有 Order allow,deny deny from all --拒绝所有 Order allow,deny allow from all deny from 10.1.1.10 --允许所有,但拒绝此IP Order deny,allow deny from all allow from 10.1.1.10 --拒绝所有,但允许此IP Order allow,deny allow from all deny from all --拒绝所有 Order allow,deny deny from all allow from all --还是拒绝所有 Order allow,deny deny from all allow from 10.1.1.10 --仍然是拒绝所有 练习:在你的家目录/www目录下新建一个bbs目录,也就是/www/bbs,再在/www/bbs里建立一个index.html测试文件,使用directory目录容器控制这个子目录允许10.1.1.10访问,其它都拒绝 --不能嵌套,所以这里写绝对路径 order deny,allow deny from all allow from 10.1.1.10 --可以把10.1.1.10换成.cluster.com这个表示cluster.com这个域下的所有主机名都不能访问(需要hosts文件和DNS来支持) --加上这段话,不要嵌套在/www的目录容器里 例七.files 容器 --针对文件的控制 Options Indexes FollowSymLinks AllowOverride None Order allow,deny Allow from all --表示10这个客户端不能访问/www/1,而且如果要控制/www/bbs/1这个文件,不能在这里写成,需要在/www/bbs这个目录的directory容器里再嵌套files标签来控制 order allow,deny allow from all deny from 10.1.1.10 order allow,deny deny from all --这种写法没有生效,不对,所以要files容器嵌套到目录容器内部,要上面的那种写法 --下面这段是apache的默认的一个files容器的配置示例 --以.ht开头的文件不被客户端用户看到 Order allow,deny Deny from all 例:网站下所有目录(包括子目录)以aaa开头的文件都不能被访问 Order allow,deny Deny from all 练习:网站下所有目录(包括子目录)以.txt结尾的文件都不能被访问 Order allow,deny Deny from all 练习:网站下所有.gif .jpeg .png的图片都被拒绝 Order allow,deny Deny from all 例八:location 容器 order allow,deny deny from all --这是对http://IP/bbs 这种URL来进行权限控制 --location容器有时候和directory有可能重合,并且配置有冲突,(如果一个是允许,一个是拒绝,无论是location拒绝,还是directory拒绝,最终结果都是拒绝的)下面这种情况,http://IP/bbs是不能访问的 order allow,deny deny from all order allow,deny allow from all --注意:在rhel6里,有细微变化,location的优先级要高 例九:对mod_status和mod_info这两个DSO配置服务器的信息查看 176 LoadModule status_module modules/mod_status.so 890 891 SetHandler server-status 892 Order deny,allow 893 Deny from all 894 Allow from 10.1.1.10 895 178 LoadModule info_module modules/mod_info.so 902 903 SetHandler server-info 904 Order deny,allow 905 Deny from all 906 Allow from 10.1.1.10 907 http://IP/server-status http://IP/server-info 例十:对网站目录使用apache的基本验证功能 .htaccess 第一种做法: 1。 # vim /www/.htaccess   --对哪个目录进行限制,就在哪个目录下建立此文件 authname "please input your username and password! @_@" authtype basic authuserfile /etc/httpd/userpasswd require valid-user 2。 # htpasswd -c /etc/httpd/userpasswd aaa  --创建此文件,并加入一个用户,自定义密码,注意此用户与系统普通用户无关 New password: Re-type new password: Adding password for user aaa # htpasswd /etc/httpd/userpasswd bbb  --再增加一个用户 New password: Re-type new password: Adding password for user bbb # cat /etc/httpd/userpasswd aaa:JscuRCtWV0Sh. bbb:C6wrx4pFco/lk --密码为密文 3。 # vim /etc/httpd/conf/httpd.conf Options Indexes FollowSymLinks AllowOverride all --改成all,支持.htaccess加密 Order allow,deny Allow from all 4。 # /etc/init.d/httpd restart http://IP 访问时,需要验证 再次访问需要清空浏览器缓存才需要验证 第二种做法: # vim /etc/httpd/conf/httpd.conf Options Indexes FollowSymLinks AllowOverride None --none不用改成all Order allow,deny Allow from all authname "please input your username and password! @_@" authtype basic authuserfile /etc/httpd/userpasswd require valid-user --把这四句直接加到这个目录标签里 2, # htpasswd -c /etc/httpd/userpasswd aaa 3, # /etc/init.d/httpd restart --重启后,验证,也可以 例十一: apache的alias跳转 # vim /etc/httpd/conf/httpd.conf Alias /yum "/yum" Options Indexes MultiViews FollowSymLinks AllowOverride None Order allow,deny Allow from all # vim /etc/yum.repos.d/local.repo [server] name=server baseurl=http://10.1.1.10/yum/ enabled=1 gpgcheck=0 [HighAvailability] name=HighAvailability baseurl=http://10.1.1.10/yum/HighAvailability/ enabled=1 gpgcheck=0 [LoadBalancer] name=LoadBalancer baseurl=http://10.1.1.10/yum/LoadBalancer/ enabled=1 gpgcheck=0 [ResilientStorage] name=ResilientStorage baseurl=http://10.1.1.10/yum/ResilientStorage/ enabled=1 gpgcheck=0 [ScalableFileSystem] name=ScalableFileSystem baseurl=http://10.1.1.10/yum/ScalableFileSystem/ enabled=1 gpgcheck=0 例十二: 错误页面 ls /var/www/error/404.jpg --准备一个图片放到这个位置 # vim /etc/httpd/conf/httpd.conf --修改主配置文件,指向你的这个图片路径 ErrorDocument 404 /error/404.jpg # /etc/init.d/httpd restart ==================================== 虚拟主机 --用apache或nginx就可以做 一台服务器跑多台web服务 VPS virtual private server 虚拟专用服务器 --使用虚拟化技术来做 云服务器 虚拟主机(用web服务器来做)--》 VPS (虚拟化) --》 云服务器 (云计算) 使用虚拟化技术(vitural sever 或者 vmware EXS server )把一台服务器分隔成几个服务器,每个都拥有独立的CPU资源,内存资源,磁盘资源,独立IP等 mkdir /www/aaa mkdir /www/bbb mkdir /www/ccc echo "aaa main page" > /www/aaa/index.html echo "bbb main page" > /www/bbb/index.html echo "ccc main page" > /www/ccc/index.html 例十三:基于IP的虚拟主机 NameVirtualHost *:80 DocumentRoot /www/aaa ServerName 10.1.1.36 ErrorLog logs/36-error_log CustomLog logs/36-access_log common DocumentRoot /www/bbb ServerName 10.1.1.37 ErrorLog logs/37-error_log CustomLog logs/37-access_log common DocumentRoot /www/ccc ServerName 10.1.1.38 ErrorLog logs/38-error_log CustomLog logs/38-access_log common [root@36 ~]# ifconfig eth0:0 10.1.1.37 netmask 255.255.255.0 [root@36 ~]# ifconfig eth0:1 10.1.1.38 netmask 255.255.255.0 [root@36 ~]# /etc/init.d/httpd restart 验证: http://10.1.1.36/ http://10.1.1.37/ http://10.1.1.38/ --实际情况每个IP使用DNS对应自己的域名 缺点很明显:浪费IP地址资源 例十四:基于端口的虚拟主机 Listen 80 --这一句默认就有,不用再加 Listen 8000 Listen 8080 DocumentRoot /www/aaa ServerName 10.1.1.36 ErrorLog logs/36-error_log CustomLog logs/36-access_log common DocumentRoot /www/bbb ServerName 10.1.1.36 ErrorLog logs/37-error_log CustomLog logs/37-access_log common DocumentRoot /www/ccc ServerName 10.1.1.36 ErrorLog logs/38-error_log CustomLog logs/38-access_log common /etc/init.d/httpd restart 验证: http://10.1.1.36/ http://10.1.1.36:8000/ http://10.1.1.36:8080/ 缺点:客户端访问时输入端口不方便,对客户端来说不够透明:还有就是开放端口多了,安全性降低 客户端 | | 路由器 | | 防火墙 | | 反向代理或缓存 (如:squid) | | 网站 例十五:基于域名的虚拟主机 --需要DNS的cname记录的支持,或者A记录 aaa.web.com bbb.web.com ccc.web.com --以下架构是DNS服务器和apache服务器的IP在同一台机器10.1.1.36上,也可以考虑分成两台服务器来做 [root@36 ~]# yum install bind* -y [root@36 ~]# vim /var/named/chroot/etc/named.conf options { directory "/var/named"; }; zone "web.com" IN { type master; file "data/master.web.com.zone"; }; [root@36 ~]# vim /var/named/chroot/var/named/data/master.web.com.zone $TTL 86400 @ IN SOA sdfasdfsa. sfddsafas. ( 2011032601 120 240 360 86400 ) IN NS sdfsafasfddfsa.web.com. aaa IN A 10.1.1.36 --这里为apache服务器的IP bbb IN CNAME aaa ccc IN CNAME aaa [root@36 ~]# /etc/init.d/named restart [root@36 ~]# vim /etc/httpd/conf/httpd.conf NameVirtualHost *:80 DocumentRoot /www/aaa ServerName aaa.web.com ErrorLog logs/aaa-error_log CustomLog logs/aaa-access_log common DocumentRoot /www/bbb ServerName bbb.web.com ErrorLog logs/bbb-error_log CustomLog logs/bbb-access_log common DocumentRoot /www/ccc ServerName ccc.web.com ErrorLog logs/ccc-error_log CustomLog logs/ccc-access_log common [root@36 ~]# /etc/init.d/httpd restart --以下是客户端的验证 [root@li data]# vim /etc/resolv.conf nameserver 10.1.1.36 --DNS指向DNS服务器的IP http://aaa.web.com/ http://bbb.web.com/ http://ccc.web.com/ 补充: 1。上面三个域名,那么我直接用IP是能否访问,访问的是哪一个?为什么? 答案:哪个虚拟主机在最前面,直接使用IP访问的就是哪一个 2。配置了虚拟主机后,那么我原来的DocumentRoot里指的原网站家目录是否还可用? 如果不可用,如何解决? 答案:不能用。 除非再为原家目录再建立一个虚拟主机 =================================================================== 扩展部分 使用第三方模块 实现apache限速 mod-cband-0.9.7.2.tgz mod_cband.pdf --官方PDF文档 解压并CD进去进行编译 tar xvf mod-cband-0.9.7.2.tgz -C /usr/src/ cd /usr/src/mod-cband-0.9.7.2/ ./configure ;make ;make install 确认/etc/httpd/conf/httpd.conf里是否自动加载了下面这句话 LoadModule cband_module /usr/lib/httpd/modules/mod_cband.so 针对虚拟主机new.cluster.com进行限速 NameVirtualHost *:80 DocumentRoot /www/aaa ServerName news.cluster.com ErrorLog logs/aaa.com-error_log CustomLog logs/aaa.com-access_log common cbandlimit 100M --指网站允许的总的下载流量 cbandperiod 1W --清空时间 cbandspeed 1024 10 30 --当前总带宽,每秒可以同时连接10个,最大的总连接数,1024在这里除以8就是kb每秒的单位 cbandremotespeed 10kb/s 3 3 --针对单一客户端下载速度为10kb/s,每秒可以同时3个连接,最多一个IP生成3个连接 sethandler cband-status --使用http://IP/cband-status访问控制状态 sethandler cband-status-me ----使用http://IP/cband-status-me访问控制状态 /etc/init.d/httpd restart dd if=/dev/zero of=/www/aaa/123 bs=1M count=1000 --创建一个大点的文件,做下载测试 wget http://news.cluster.com/123 --使用wget下载,发现被限速了 使用下面的URL地址访问状态信息页面 http://news.cluster.com/cband-status http://news.cluster.com/cband-status-me ========================================================== 问题: 现在有需求要对apache做每天一次的日志轮转,你怎么实现? 1,使用logrotate来做 2,自己写脚本 #!/bin/bash mv /var/log/httpd/access_log /var/log/httpd/access_log.`date -d "-1 days" +%F`.log touch /var/log/httpd/access_log kill -HUP `cat /etc/httpd/run/httpd.pid` 把上面脚本放到crontab里0点执行 3. www.cronolog.org 软件包: cronolog-1.6.2.tar.gz cronolog.pdf cronosplit.pdf 解压到任意目录,我这里是/usr/src/ # tar xvf cronolog-1.6.2.tar.gz -C /usr/src # cd /usr/src # cd /usr/src/cronolog-1.6.2/ 编译安装 # ./configure ;make ;make install 1,先注释掉虚拟主机,虚拟主机需要每个都配,为了方便,这里注意掉,使用原来的web服务器配置 vim /etc/httpd/conf/httpd.conf 修改: CustomLog logs/access_log combined 改成: CustomLog "|/usr/local/sbin/cronolog /opt/%Y/%m/%d/access_log" combined --注意格式不要写错 重启apache后,过几秒,或者访问一下apache 就会在/opt下产生了 -------------------------------- 扩展:apache防DDos(distributed deny of service)攻击