在这篇博客中,小编我将详细的讲解一下linux下web服务器的使用,相信这对于web网站维护人员来说是非常有用的,在linux下实现web服务器的软件有很多,最常用的就是apache啦,小编这里使用的就是5.4自带的apache 2.2.3,小编将从多个方面来讲解apache的配置以及使用,内容会比较多啦,希望读者你能耐心哈。
小编我先列出要实现哪些个项目:
1.apache的安装及启动
2.基本个人站点的实现
3.资源性web服务器的搭建
4.web网站的安全性
5.虚拟站点实现(相当实用啊)
6.web网站的日志监控(两种工具实现webalizer awstats)
7.未完待续。。。。。。
Project 1:apache的安装及启动
这里我直接使用linux 5.4自带的apache啦
#yum install httpd
之后就可以启动apache啦
# service httpd start
可以将其设置为开机启动
# chkconfig --level 35 httpd on
检查以下端口的监听情况
# netstat -tupln|grep httpd
在浏览器中输入http://127.0.0.1试试看
说明最基本的web服务器已经能使用啦
到这里安装基本上就完成了,很简单吧,当然小编还需要读者记住以下几个重要的目录和文件,在后期的项目实现会经常用到的
/etc/httpd/ apache服务器的配置目录
/etc/httpd/conf/httpd.conf apache服务器的配置文件
/var/www/html apache服务器默认的web站点目录
/var/log/httpd/ apache服务器的运行日志目录
当然也可以使用源码安装,那就比较麻烦了,不过小编也写过这样的博客,无私奉上啦http://wnqcmq.blog.51cto.com/5200614/1160274
Project 2:基本个人站点的实现
小编我个人比较喜欢web网站开发啦,经常会自己做一些自己的小网站玩玩,当初在window下使用IIS很随意就可以搭建一个web环境来挂网站,如今在linux下一样也能实现啦,那么就来简单的实现一下吧。
setp 1:编写一个简单的web页面(就是一句简单的话),但是要放在web站点的默认根目录啦
# echo "My web site" > /var/www/html/index.html
step 2:在打开浏览器输入http://127.0.0.1试试
是我要的结果啦,原理是当直接访问本机时,web服务器会自动在web站点根目录去寻找index.html页面来加载,当然这个是可以改的,这与httpd.conf文件配置有关
# vim /etc/httpd/conf/httpd.conf
找到391行
391 DirectoryIndex index.html index.html.var
如果你的主页不是上面所列举的,可以自行将主页文件名添加进去即可
这里读者会想啦,我想修改一下自己的web站点目录咋办呢,那么找到281行
281 DocumentRoot "/var/www/html"
这里将你所要定的文件目录替换进去就行了
Project 3:资源性web服务器的搭建
资源性网站是很实用的,我们可以简单的将资源目录挂在web服务器上让用户实现轻松的下载,实现步骤如下:
step 1:修改httpd.conf文件,添加以下内容
Alias /pub "/tmp/pub"
//这里设置一个别名,让用户容易记
<Directory "/tmp/pub">
Options Indexes //这个选项很重要啦,实现目录浏览
Allow from all
//访问权限相关,这里设置允许所有
</Directory>
保存退出,当然上面的/tmp/pub目录是要存在的,如果不存在要建立
# mkdir /tmp/pub
然后将一些资源拷贝到该目录下即可
step 2:重启apache服务器
# service httpd restart
step 3:在浏览器输入http://127.0.0.1/pub试试看呗
看到文件了吧,很简单了吧,赶紧动手吧,这个相当的容易,至少小编觉得比搭建ftp服务器easy啦。
Project 4:web网站的安全性
谈到安全性,读者就应该想想为啥要实现安全性啦,这个可是个大问题,就比如上面的两个实现项目,有可能服务器的管理者或者客户需求并不希望一些非法用户或者非法IP看到设置好的网站,别担心,apache服务器提供有访问控制的功能,能轻松实现合法用户(服务提供者信赖的用户)或者信赖IP访问浏览、非法用户或者非法IP拒绝的特性,那么下面就来实现吧。
具体实现安全性的参数可以从httpd.conf文件中找到,就在323-333行之间
看到那个“AllowOerride”选项了吧,那就是控制验证的开关“All”表示开启,“None”表示关闭,还有下面的“Allow”选项,那就是控制访问IP的,还有一个比较重要的文件.htaccess(站点根目录下)文件,这个是用于描述访问控制的文件,里面内容会设置一些基本的访问规则,内容格式如下
authuserfile /var/www/.htpasswd //合法用户的用户名和密码,用工具生成
authtype basic [md5] //认证类型
authname "please input your name and password"//登录提示
require valid-user //所有.htpasswd文件中的用户都能访问,也可以指定特定用户名
实现需求:允许user1、user2用户登录浏览网站,不允许192.168.1.1的主机访问/pub目录
step 1:编辑httpd.conf文件,web站点目录的安全选项设置为如下内容
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride All //身份认证
Order allow,deny //注意顺序
Allow from all //允许所有IP地址
</Directory>
<Directory "/tmp/pub">
Options Indexes
Allowoverride All
Order allow,deny
Allow from all
Deny from 192.168.1.1
</Directory>
step 2:编辑网站根目录下的.htaccess文件(默认不存在)
# vim /var/www/html/.htaccess 内容如下
authuserfile /var/www/.htpasswd
authtype basic
authname "please input your name and password"
require valid-user
step 3:生成.htpasswd文件(使用htpasswd指令),这里的用户不是系统的登录用户,是随意生成的
# cd /var/www
htpasswd使用格式
htpasswd [ -c ] [ -m ] [ -D ] passwdfile username
小编这里使用-c选项,比如小编要允许user1、user2用户登录,密码都是123
# htpasswd -c .htpasswd user1 //首次使用要加-c参数
然后输入密码123
# htpasswd .htpasswd user1
然后输入密码123
setp 4:重新启动apache服务器
# service httpd restart
setp 5:测试
在客户主机(192.168.1.1)浏览器输入http://192.168.1.10
看到了吧,让你输入用户名密码啦,提示信息也是小编实现设置的,那么输入user1试试呗
看到页面啦,小编圈的表示是登录之后的结果,普通不会有的
在客户机(192.168.1.1)浏览器输入http://192.168.1.10/pub试试
拒绝了吧,和小编预期的一致啊,读者可以换一个IP试试,那就可以访问啦,并且还要输入用户名和密码啦,小编就不演示啦哈
Project 5:虚拟站点的实现
小编觉得这个是very very userful,你想啊,如果你在IDC工作,服务器是面向N多个用户的吧,可是IP是有限的,不可能一台服务器就挂一个网站吧,那还咋赚钱啊,想挂多个站点,可以由以下五种途径解决啦,不过前四种的用法缺陷很多,小编就不细讲,这里提一下,主要实现第五种,虚拟主机头
1.物理目录
2.虚拟目录
目录可以在任何位置 名称可以使用别名
/test 别名/public
Alias /public "/test"
<Directory "/test">
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
3.基于多个ip地址
<VirtualHost 主机ip1:80>
ServerAdmin [email protected] //管理员邮箱
DocumentRoot /tmp/website1 //网站主目录
ServerName www.website1.com //网站域名
ErrorLog logs/website1-error_log
//错误日志
CustomLog logs/website1-access_log common //成功日志,至于“common”小编会在后面的日志监控中详细讲到
</VirtualHost>
<VirtualHost 主机ip2:80>
ServerAdmin [email protected] //管理员邮箱
DocumentRoot /tmp/website2 //网站主目录
ServerName www.website2.com //网站域名
ErrorLog logs/website2-error_log
//错误日志
CustomLog logs/website2-access_log common
</VirtualHost>
4.基于端口
Listen 80
Listen 81
<VirtualHost 主机ip:80>
ServerAdmin [email protected] //管理员邮箱
DocumentRoot /tmp/website1 //网站主目录
ServerName www.website1.com //网站域名
ErrorLog logs/website1-error_log
//错误日志
CustomLog logs/website1-access_log common
</VirtualHost>
<VirtualHost 主机ip:81>
ServerAdmin [email protected] //管理员邮箱
DocumentRoot /tmp/website2 //网站主目录
ServerName www.website2.com //网站域名
ErrorLog logs/website2-error_log
//错误日志
CustomLog logs/website2-access_log common
</VirtualHost>
5.基于主机头
少量ip 多个名字 标准端口 多个站点
step 1:修改httpd.conf文件,添加以下内容
<VirtualHost *:80 >
ServerAdmin [email protected] //管理员邮箱
DocumentRoot /tmp/website1 //网站主目录
ServerName www.website1.com //网站域名
ErrorLog logs/website1-error_log
//错误日志
CustomLog logs/website1-access_log combined
</VirtualHost>
<VirtualHost *:80>
ServerAdmin [email protected] //管理员邮箱
DocumentRoot /tmp/website2 //网站主目录
ServerName www.website2.com //网站域名
ErrorLog logs/website2-error_log
//错误日志
CustomLog logs/website2-access_log combined
</VirtualHost>
去掉972行NameVirtualHost *:80的注释
step 2:建立website1和website2的站点目录和测试主页
# mkdir /tmp/website1 /tmp/website2
# echo “Here is website1”>/tmp/website1/index.html
# echo “Here is website2”>/tmp/website2/index.html
step 3:重新启动apache服务器
# service httpd restart
step 4:集中测试
因为没有在外部因特网测试,所以要修改客户机的hosts文件,加入以下条目
192.168.1.10 www.website1.com
192.168.1.10 www.website2.com
打开客户机浏览器访问http://www.website1.com
访问http://www.website2.com试试
漂亮,搞定,当然要实现访问安全性的话可以将安全选项加进配置节点就是了
Project 6:web网站的日志监控(两种工具实现webalizer awstats)
这个对于IDC的管理人员来说是必不可少的啊,不可能天天手工去分析服务器的运行日志吧,这里就使用两种常用的工具webalizer 和awstats,在可是做之前,小编我要��嗦以下理论啦,不然读者你做是做成了,以后还是会遗忘啦。
【日志简介】
1、日志格式类型
Apache的NCSA日志格式。NCSA格式又分为NCSA普通日志格式(CLF)和NCSA扩展日志格式(ECLF)两类,目前最常用的是NCSA扩展日志格式(ECLF)及基于自定义类型的Apache日志格式,所以这里主要介绍的是NCSA扩展日志格式(ECLF)。
2、常见日志格式的组成
访问主机(remotehost)显示主机的IP地址或者已解析的域名。
标识符(Ident) 由identd或直接由浏览器返回浏览者的EMAIL或其他唯一标示,因为涉及用户邮箱等隐私信息,目前几乎所有的浏览器就取消了这项功能。
授权用户(authuser)用于记录浏览者进行身份验证时提供的名字,如果需要身份验证或者访问密码保护的信息则这项不为空,但目前大多数网站日志这项也都是为空的。
日期时间(date)一般的格式形如[22/Feb/2010:09:51:46 +0800],即[日期/月份/年份:小时:分钟:秒钟 时区],占用的的字符位数也基本固定。
请求(request)即在网站上通过何种方式获取了哪些信息,也是日志中较为重要的一项,主要包括以下三个部分:请求类型(METHOD)常见的请求类型主要包括GET/POST/HEAD这三种;请求资源(RESOURCE)显示的是相应资源的URL,可以是某个网页的地址,也可以是网页上调用的图片、动画、CSS等资源;协议版本号(PROTOCOL)显示协议及版本信息,通常是HTTP/1.1或HTTP/1.0。
状态码(status)用于表示服务器响应状态,通常1xx的状态码表示继续消息;2xx表示请求成功;3xx表示请求的重定向;4xx表示客户端错误;5xx表示服务器错误。
传输字节数(bytes)即该次请求中一共传输的字节数。
来源页面(referrer)用于表示浏览者在访问该页面之前所浏览的页面,只有从上一页面链接过来的请求才会有该项输出,如果是新开的页面则该项为空。上例中来源页面是google,即用户从google搜索的结果中点击进入。
用户代理(agent)用于显示用户的详细信息,包括IP、OS、Bowser等。
对于上述的日志格式的具体使用,httpd.conf文件中是有所体现的
在httpd.conf里可以看到一行这样的配置
LogFormat "%h %l %u %t /"%r/" %>s %b /"%{Referer}i/" /"%{User-Agent}i/"" common 的日志记录格式
请求本身的情况将通过在格式字符串中放置各种"%"转义符的方法来记录,它们在写入日志文件时,根据下表的定义进行转换:
%a 远端IP地址
%A 本机IP地址
%B 除HTTP头以外传送的字节数
%b 以CLF格式显示的除HTTP头以外传送的字节数,也就是当没有字节传送时显示’-’而不是0。
%{Foobar}C 在请求中传送给服务端的cookieFoobar的内容。
%D 服务器处理本请求所用时间,以微为单位。
%{FOOBAR}e 环境变量FOOBAR的值
%f 文件名
%h 远端主机
%H 请求使用的协议
%{Foobar}i 发送到服务器的请求头Foobar:的内容。
%l 远端登录名(由identd而来,如果支持的话),除非IdentityCheck设为"On",否则将得到一个"-"。
%m 请求的方法
%{Foobar}n 来自另一个模块的注解Foobar的内容。
%{Foobar}o 应答头Foobar:的内容。
%p 服务器服务于该请求的标准端口。
%P 为本请求提供服务的子进程的PID。
%{format}P 服务于该请求的PID或TID(线程ID),format的取值范围为:pid和tid(2.0.46及以后版本)以及hextid(需要 APR1.2.0及以上版本)
%q 查询字符串(若存在则由一个"?"引导,否则返回空串)
%r 请求的第一行
%s 状态。对于内部重定向的请求,这个状态指的是原始请求的状态,—%>s则指的是最后请求的状态。
%t 时间,用普通日志时间格式(标准英语格式)
%{format}t 时间,用strftime(3)指定的格式表示的时间。(默认情况下按本地化格式)
%T 处理完请求所花时间,以秒为单位。
%u 远程用户名(根据验证信息而来;如果返回status(%s)为401,可能是假的)
%U 请求的URL路径,不包含查询字符串。
%v 对该请求提供服务的标准ServerName。
%V 根据UseCanonicalName指令设定的服务器名称。
%X 请求完成时的连接状态:X= 连接在应答完成前中断。
+= 应答传送完后继续保持连接。
-= 应答传送完后关闭连接。
(在1.3以后的版本中,这个指令是%c,但这样就和过去的SSL语法:%{var}c冲突了)
%I 接收的字节数,包括请求头的数据,并且不能为零。要使用这个指令你必须启用mod_logio模块。
%O 发送的字节数,包括请求头的数据,并且不能为零。要使用这个指令你必须启用mod_logio模块。
修饰符
可以紧跟在"%"后面加上一个逗号分隔的状态码列表来限制记录的条目。例如,"%400,501{User-agent}i" 只记录状态码400和501发生时的User-agent头内容;不满足条件时用"-"代替。状态码前还可以加上"!"前缀表示否 定,"%!200,304,302{Referer}i"记录所有不同于200,304,302的状态码发生时的Referer头内容。
"<"和">"修饰符可以用来指定对于已被内部重定向的请求是选择原始的请求还是选择最终的请求。默认情况下,%s, %U, %T, %D, %r 使用原始请求,而所有其他格式串则选择最终请求。例如,%>s 可以用于记录请求的最终状态,而 %<u 则记录一个已经被内部重定向到非认证资源的请求的原始认证用户
示例
一些常见的格式串:
通用日志格式(CLF)
"%h %l %u %t /"%r/" %>s %b"
带虚拟主机的通用日志格式
"%v %h %l %u %t /"%r/" %>s %b"
NCSA扩展/组合日志格式
"%h %l %u %t /"%r/" %>s %b /"%{Referer}i/" /"%{User-agent}i/""
Referer日志格式
"%{Referer}i -> %U"
Agent(Browser)日志格式
"%{User-agent}i"
3、日志格式扩展
apache日志格式可以自定义来配置其输出格式,常见的基于NCSA扩展日志格式(ECLF)自定义添加的包括域名(domain)和cookie。其中域名在一个网站拥有二级域名或者子域名时,可以更好地区分日志;而cookie可以作为用户的身份标识。
【具体实现】
工具一:Webalizer
官方下载地址小编我已经附上webalizer-2.23-05-src.tar.bz2
step 1:解压缩软件包,并安装
# tar -jxvf webalizer-2.23-05-src.tar.bz2 -C /usr/local/src/
切换到源码目录下
# cd /usr/local/src/webalizer-2.23-05/
老三步,安装软件
# ./configure --sysconfdir=/etc
# make
# make install
安装是比较容易的,小编很是庆幸啊,5.4好像自己带的也有这个日志分析工具,读者如果不喜欢源码安装可以直接使用yum来安装的偶
step 2:安装是安装好了,小编要开始设置分析啦,还记得小编建立的website1站点么,我就针对于它来分析啦,分析的这个过程吗小编我写了一个小脚本让系统的例行工作调度帮着做了,脚本如下:
# mkdir /etc/cron.web
# vim /etc/cron.web/web
#!/bin/bash
run=/usr/local/bin/webalizer
$run -F clf -p -n " " -t "www.website1.com" -o /tmp/website1/log /var/log/httpd/website1-access_log
说明:
-F clf 指明我们的web日志格式为标准的一般日志文件格式(Common Logfile Format)
-p 指定使用递增模式,这就是说每作一次分析后,webalizer会生产一个历史文件,这样下一次分析时就可以不分析已经处理过的部分。这样我们就可以在短时间内转换我们的日志文件,而不用担心访问量太大时日志文件无限增大了。
-n “ “ 指定服务器主机名为空,这样输出结果会美观一些。
-o “www.website1.com” 指定输出结果标题. 这里的标题是个目录,小编自己创建的
# mkdir /tmp/website1/log
/var/log/httpd/website1-access_log:指定日志文件
然后在/etc/crontab中加入以下内容 ,然日志分析工具每1分钟分析一次
*/1 * * * * root run-parts /etc/cron.web
step 3:集中测试
在客户主机浏览器持续刷新website站点
一分钟后在服务器主机浏览器输入小编开始设置的标题(www.website1.com/log)来查看结果
完成任务啦
工具二:AWStatus
Awstats 是在Sourceforge上发展很快的一个基于Perl的WEB日志分析工具,是一个免费非常简洁而且强大有个性的网站日志分析工具。它可以统计您站点的如下信息:①访问量,访问次数,页面浏览量,点击数,数据流量等②精确到每月、每日、每小时的数据 ③访问者国家 ④访问者IP ⑤Robots/Spiders的统计⑥访客持续时间⑦对不同Files type 的统计信息⑧Pages-URL的统计⑨访客操作系统浏览器等信息⑩其它信息(搜索关键字等等)
相对于刚才介绍的日志分析工具Webalizer,AWStats的优势在于:
①界面友好:可以根据浏览器直接调用相应语言界面(有简体中文版)
②基于Perl:并且很好的解决了跨平台问题,系统本身可以运行在GNU/Linux上或Windows上(安装了ActivePerl后);分析的日志直接支持Apache格式 (combined)和IIS格式(需要修改)。Webalizer虽然也有Windows平台版,但目前已经缺乏 维护;AWStats完全可以实现用一套系统完成对自身站点不同WEB服务器:GNU/Linux/Apache和Windows/IIS服务器的统一统计。
③效率比较高:AWStats输出统计项目比Webalizer丰富了很多,速度仍可以达到Webalizer的1/3左右,对于一个日访问量 百万级的站点,这个速度都是足够的;
④配置/定制方便:系统提供了足够灵活但缺省也很合理的配置规则,需要修改的缺省配置不超过3,4项就可以开始运行,而且修改和扩展的插件 比较多;
⑤AWStats的设计者是面向精确的"Human visits"设计的,因此很多搜索引擎的机器人访问都被过滤掉了,因此有可能比其他日志统计工具统计的数字要低,来自公司内部的访问也可以通过IP过滤 设置过滤掉。
⑥提供了很多扩展的参数统计功能:使用ExtraXXXX系列配置生成针对具体应用的参数分析会对产品分析非常有用。
附上awstats-7.1.1.tar.gz
step 1:解压缩awstats-7.1.1.tar.gz
# tar -zxvf awstats-7.1.1.tar.gz -C /usr/local/src/
切换到目录下
# cd /usr/local/src/awstats-7.1.1/
切换到tools目录下
# cd tools/
然后开始执行交互式安装
# perl awstats_configure.pl
读者英文应该比我好啊,问你是不是要将工具安装到标准目录,当然“y”
这里在找apache的配置文件,那小编就给它路径啦/etc/httpd/conf/httpd.conf
这里询问你是否要awstats的配置文件,当然要创建
这里询问要分析站点的域名啦,给它就是了www.website1.com
这里问你要将配置文件放在哪,默认给了文件目录,那就默认好了
这里信息告知没法自动执行一个更新数据库的脚本,要小编安装完成之后自行执行,分析其原因是系统在解压缩源码的时候没有给足权限导致,小编可以后续自行执行即可,这里给出了两种方案,其中第一句是更新www.website1.com,而第二句是在有多个站点情况下,将所有的站点都作更新.我在此不做这个操作.回车.
到这里配置还没算完成,我们还要更新数据啊,那就执行安装过程中提示的语句啦
这里提示说没有找到/var/lib/awstats目录,创建就是了
# mkdir /var/lib/awstats
这里又提示说没有找到日志文件,那就创建呗
# touch /var/log/httpd/mylog.log
好了,到这配置就结束了
step 2:集中测试排错
在浏览器中输入http://localhost/awstats/awstats.pl?config=www.website1.com
打开httpd.conf看看最后有关设置权限的说明
这里明确指出我们可以访问wwwroot,那么为什还是拒绝呢,其实这里是解压源码时出来的目录,系统并未给与写和执行权限,那么小编为了实验方便,就打开城门吧
# chmod -R 777 /usr/local/src/awstats-7.1.1/wwwroot/
再次刷新刚刚的页面试试,出来了吧唉呀呀,这个就是很漂亮很友好啊
然后读者多点点会发现并未记录有数据啊细心的读者可能注意到,小编刚刚为了首次让数据库更新成功而创建了一个mylog.log,这个日志文件可并非我的站点产生的,所以不会有数据的,解决方法有两总,要么将我们的站点日志文件的指向改为mylog.log,要么就把awsatas配置文件的分析日志指向website1-access_log.log,小编这里选择后者
# vim /etc/awstats/awstats.www.website1.com.conf
找到51行,修改为如下内容
LogFile="/var/log/httpd/website1-access_log"
再次执行更新
这次有了83行的更新啦,再次刷新浏览器试试
看到统计图了吧,这下小编的目的达到了
step 3:优化设置
这样每一次都必须手都更新数据信息不是很麻烦吗,小编写了一个脚本,然例行计划任务帮忙做就是了,作为管理员的小编只要定点的查看就是了,相应的实现步骤如下
# vim /etc/cron.web/web1 //之前小编已经建立过目录了
#!/bin/bash
run=/usr/local/src/awstats-7.1.1/wwwroot/cgi-bin
/awstats.pl
$run -config=www.website1.com -update
# chmod a+x web1
# echo “* 00 * * * root run-parts /etc/cron.web” >> /etc/crontab
好了,到此项目六的所有内容就完成了
Project 7:未完待续。。。。。。