18、Apache服务器

--   web 服务器   survey.netcraft.net     --此网站会有每月份的世界上网站使用的WEB服务器的使用率统计   www.apache.org     apache a patch server nginx IIS lighttpd       IBM websphere tomcat   jboss     weblogic         [root@li ~]# yum install httpd* -y     [root@dns share]# rpm -qa |grep httpd httpd-manual-2.2.3-31.el5 --文档包 httpd-2.2.3-31.el5 --主程序包 httpd-devel-2.2.3-31.el5 --开发包       # rpm -qa |grep httpd --rhel6.3下的结果 httpd-manual-2.2.15-15.el6_2.1.noarch httpd-tools-2.2.15-15.el6_2.1.x86_64 httpd-devel-2.2.15-15.el6_2.1.x86_64 httpd-2.2.15-15.el6_2.1.x86_64     # 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       serverRoot "/etc/httpd" --存放配置文件一主目录   PidFile run/httpd.pid --pid文件   Timeout 120 --连接超时时间   KeepAlive Off --一般是短时间下载文件比较多的网站  在ON的时候 一次连接多次请求     MaxKeepAliveRequests 100     KeepAliveTimeout 15   ------------------------------   keepalive参数修改小测试     off 的情况,别人刷新你的一个页面   netstat -nt |grep :80    可以看到一个IP有多次连接     on的情况,别人刷新页面     netstat -nt |grep :80    可以看到一个IP只有一次连接(15秒后再刷新会产生新连接)     两分钟左右不刷新,TIME_WAIT连接断开   -------------------------------------     Listen 80 --监听端口   <IfModule prefork.c> --预派生模式 ,lamp一般用这种 StartServers       8 MinSpareServers    5 MaxSpareServers   20 ServerLimit      256 MaxClients       256 --最大并发数 MaxRequestsPerChild  4000 </IfModule>     [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里,使用哪一种模式就留着他的配置段,把别的模式注释掉就可以了   ----------------------------------------------------- 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回环地址会看到一个红帽的欢迎页面           例一:建立网站主页 在网站根目录下  建立一个主页文件  echo 'main page' > /var/www/html/index.html   http://127.0.0.1/ --就可以看到main page的信息,也就是直接访问到主页   把主页文件写成html标签的格式如下: <html> <head> <title>笔记站点</title> </head> <body> <center><h1>欢迎来我的网站!@_@</h1></center> </body> </html>       例二:修改网站根目录   vim /etc/httpd/conf/httpd.conf   281:  DocumentRoot "/www" --修改网站根目录为/www 306: <Directory "/www"> --把这个也对应的修改为/www   mkdir /www /etc/init.d/httpd reload --重装启apache服务           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,因你的网站文件的默认编码而异     ----------------------------------     关于apache的标签,容器(访问控制)   directory (目录)    file(文件)  location (位置,url)     <Directory "/www"> --对/www目录进行的控制 Options Indexes FollowSymLinks  --允许列表,符号链接 AllowOverride None --不使用.htaccess控制 Order allow,deny Allow from all --针对/www目录的访问权限的控制,这两句代表允许所有访问 </Directory> --容器结束   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 2.2.2.35 --允许所有,但拒绝35       Order allow,deny     allow from all     deny from all --拒绝所有       Order allow,deny     deny from all     allow from all --还是拒绝所有,读取的顺序由order决定     练习:在/www目录下新建一个bbs目录,也就是/www/bbs,再在/www/bbs里建立一个index.html文件,使用directory目录容器控制拒绝35访问,别的都允许     <Directory "/www/bbs"> --不能嵌套,所以这里写绝对路径    order allow,deny    allow from all    deny from 10.1.1.35 --可以把10.1.1.35换成.cluster.com这个表示cluster.com这个域下的所有主机名都不能访问(需要hosts文件和DNS来支持) </Directory> --加上这段话,不要嵌套在/www的目录容器里     例七.files 容器 --针对文件的控制     <Directory "/www">     Options Indexes FollowSymLinks     AllowOverride None     Order allow,deny     Allow from all <files "1"> --表示35这个客户端不能访问/www/1,而且如果要控制/www/bbs/1这个文件,不能在这里写成<files "bbs/1">,需要在/www/bbs这个目录的directory容器里再嵌套files标签来控制     order allow,deny     allow from all     deny from 10.1.1.35   </files> </Directory>     <files "/www/1">     order allow,deny     deny from all </files> --这种写法没有生效,不对,所以要files容器嵌套到目录容器内部,要上面的那种写法       --下面这段是apache的默认的一个files容器的配置示例 <Files ~ "^\.ht"> --以.ht开头的文件不被客户端用户看到     Order allow,deny     Deny from all </Files>     例:网站下所有目录(包括子目录)以ule开头的文件都不能被访问   <Files ~ "^ule">     Order allow,deny     Deny from all </Files>     练习:网站下所有目录(包括子目录)以.txt结尾的文件都不能被访问   <Files ~ "\.txt$">     Order allow,deny     Deny from all </Files>       练习:网站下所有.gif   .jpeg    .png的图片都被拒绝       <Files ~ "\.(gif|jpeg|png)$">     Order allow,deny     Deny from all </Files>       例八:location 容器     <Location "/bbs">         order allow,deny         deny from all </Location> --这是对http://IP/bbs    这种URL来进行权限控制     --location容器有时候和directory有可能重合,并且配置有冲突,(如果一个是允许,一个是拒绝,无论是location拒绝,还是directory拒绝,最终结果都是拒绝的)下面这种情况,http://IP/bbs是不能访问的   <Location "/bbs">       order allow,deny       deny from all </Location>     <Directory "/www/bbs">    order allow,deny    allow from all </Directory>       --注意:在rhel6里,有细微变化,location的优先级要高       例九:对mod_status和mod_info这两个DSO配置服务器的信息查看     176 LoadModule status_module modules/mod_status.so   890 <Location /server-status> 891     SetHandler server-status 892     Order deny,allow 893     Deny from all 894     Allow from 10.1.1.35 895 </Location>   178 LoadModule info_module modules/mod_info.so     902 <Location /server-info> 903     SetHandler server-info 904     Order deny,allow 905     Deny from all 906     Allow from 10.1.1.35 907 </Location>     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   <Directory "/www">     Options Indexes FollowSymLinks     AllowOverride all --改成all,支持.htaccess加密     Order allow,deny     Allow from all </Directory>     4。 # /etc/init.d/httpd restart     http://IP 访问时,需要验证   再次访问需要清空浏览器缓存才需要验证       第二种做法:   # vim /etc/httpd/conf/httpd.conf   <Directory "/www"> 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 --把这四句直接加到这个目录标签里   </Directory>     2, # htpasswd -c /etc/httpd/userpasswd  aaa   3, # /etc/init.d/httpd restart --重启后,验证,也可以       练习:针对家目录下的一个子目录打开验证     ====================================   虚拟主机 --用apache或nginx就可以做   一台服务器跑多台web服务     VPS   virtual  private  server   虚拟专用服务器 --使用虚拟化技术来做     使用虚拟化技术(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   <VirtualHost *:80>     DocumentRoot /www/aaa     ServerName 10.1.1.36     ErrorLog logs/36-error_log    CustomLog logs/36-access_log common </VirtualHost>   <VirtualHost *:80>     DocumentRoot /www/bbb     ServerName 10.1.1.37     ErrorLog logs/37-error_log    CustomLog logs/37-access_log common </VirtualHost>   <VirtualHost *:80>     DocumentRoot /www/ccc     ServerName 10.1.1.38     ErrorLog logs/38-error_log    CustomLog logs/38-access_log common </VirtualHost>   [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   <VirtualHost *:80>     DocumentRoot /www/aaa     ServerName 10.1.1.36     ErrorLog logs/36-error_log    CustomLog logs/36-access_log common </VirtualHost> <VirtualHost *:8000>     DocumentRoot /www/bbb     ServerName 10.1.1.36     ErrorLog logs/37-error_log    CustomLog logs/37-access_log common </VirtualHost> <VirtualHost *:8080>     DocumentRoot /www/ccc     ServerName 10.1.1.36     ErrorLog logs/38-error_log    CustomLog logs/38-access_log common </VirtualHost>   /etc/init.d/httpd restart   验证: http://10.1.1.36/ http://10.1.1.36:8000/ http://10.1.1.36:8080/     缺点:客户端访问时输入端口不方便,对客户端来说不够透明:还有就是开放端口多了,安全性降低           客户端   |   | 路由器   |   | 防火墙   |   | 反向代理   |   |   网站     例十四:基于域名的虚拟主机     --需要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 <VirtualHost *:80>     DocumentRoot /www/aaa     ServerName aaa.web.com     ErrorLog logs/aaa-error_log    CustomLog logs/aaa-access_log common </VirtualHost> <VirtualHost *:80>     DocumentRoot /www/bbb     ServerName bbb.web.com     ErrorLog logs/bbb-error_log    CustomLog logs/bbb-access_log common </VirtualHost> <VirtualHost *:80>     DocumentRoot /www/ccc     ServerName ccc.web.com     ErrorLog logs/ccc-error_log    CustomLog logs/ccc-access_log common </VirtualHost>     [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限速       /share/soft/lamp/apache_source/mod-cband-0.9.7.2.tgz /share/soft/lamp/apache_source/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 <VirtualHost *: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个连接 <location /cband-status>   sethandler cband-status --使用http://IP/cband-status访问控制状态 </location> <location /cband-status-me>   sethandler cband-status-me   ----使用http://IP/cband-status-me访问控制状态 </location> </VirtualHost>   /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         ==========================================================   网站的日志切割     www.cronolog.org     软件包位置: ls /share/soft/soft/log/ 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下产生了     关于日志合并   因为有些日志分析软件,它是只分析access.log;当要分析多个网站的access.log的总流量,就需要把它们的access.log合并一起,再由分析软件去分析这个合并的log文件     # sort -m -k 4 -o  newaccess.log access_log access_log1     或者使用awstats这样的日志分析软件去做日志合并         ==============================     ================================   练习:   把自己系统对应的版本的iso里的文件挂载并拷贝到一个目录里(比如为/yum目录), 把ftp用户家目录设置为此目录,ftp保持默认配置(主要是要求允许匿名用户可登录,可下载就可以) 使其开机自动启动             2,继续配置你的httpd,让客户端在访问http://你的IP/yum  这个URL时, 会跳转到你的系统上的ftp用户的家目录(此家目录里放的就是iso里面所有文件   Alias /yum      "/yum" --前面的/yum为跳转路径,后面的/yum为根下的实际的yum目录,里面是iso的所有的包   <Directory "/yum">     Options Indexes MultiViews FollowSymLinks     AllowOverride None     Order allow,deny     Allow from all </Directory>     3,将你所有的虚拟机或真实机的/etc/yum.repos.d/rhel-source.repo配置成ftp或者http式的yum,使它们能够使用你的配置正确的安装和移除软件包   [rhel-source] name=rhel6.3 baseurl=http://172.16.2.35/yum enabled=1 gpgcheck=0        
上一篇:nginx只允许内网ip访问,禁止外网访问


下一篇:基于visual Studio2013解决面试题之0905子串数量