一、下载discuz!(LAMP的安装的教程可参考http://laowang.me/lamp-part-built-environment.html
mkdir /data/www cd /data/www wget http://download.comsenz.com/DiscuzX/3.2/Discuz_X3.2_SC_GBK.zip unzip Discuz_X3.2_SC_GBK.zip mv upload/* .
二、配置第一个虚拟主机
删除httpd.conf中的这行前面的#号
#Include conf/extra/httpd-vhosts.conf
vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
加入如下配置:
DocumentRoot "/data/www" ServerName www.123.com
三、配置mysql,给Discuz!增加一个账户
给mysql root账户设置密码,然后命令行进入mysql,创建新的库,并创建一个新的帐号对该库有所有权限:
> create database discuz; > grant all on discuz.* to '123'@'localhost' identified by '123456'; > quit
四、安装Discuz!
先绑定hosts (ip地址是做实验的那台机)
192.168.1.5 www.123.com
浏览器输入:
www.123.com/install/
根据提示,修改对应目录的权限
cd /data/www chown daemon:daemon data uc_server/data uc_client/data config // 让这几个目录支持apache运行帐号可写
五、为某个虚拟主机配置用户认证
虚拟主机配置文件中,需要加入(test目录自己新建一个)
AllowOverride AuthConfig
然后在虚拟主机的主目录,即DocumentRoot目录下
vi /data/www/test/.htaccess
加入
AuthName "frank share web" // AuthName可以随便写 AuthType Basic AuthUserFile /data/www/test/.htpasswd require valid-user
保存后,然后创建apache的验证用户
/usr/local/apache2/bin/htpasswd -c /data/www/test/.htpasswd test
#第一次创建用户要用到-c 参数 第2次添加用户,就不用-c参数
重启apache,即可。
打开浏览器访问:http://www.123.com/test可以看出效果,有时候没有效果并不是设置不对,而是本机有网站的缓存。
到此,你已经配置完成。下面介绍另一种方式:
vi http.conf
在相应的虚拟主机配置文件段加入:
AllowOverride AuthConfig AuthName "自定义的" AuthType Basic AuthUserFile /data/www/test/.htpasswd require valid-user
保存后,然后创建apache的验证用户
htpasswd -cm /data/.htpasswd test
增加第二个用户的时候,就不要加-c了,因为-c是创建的意思,如果加上会把这个文件覆盖。
六、配置域名跳转、重定向
需求:要把访问域名 www.domain1.com 的域名转发到 www.domain2.com 上
实现:
在相关的虚拟主机中增加
RewriteEngine on RewriteCond %{HTTP_HOST} ^www.domain1.com$ RewriteRule ^/(.*)$ http://www.domain2.com/$1 [R=301,L]
如果是多个域名重定向到一个域名
RewriteEngine on RewriteCond %{HTTP_HOST} ^www.domain.com [OR] RewriteCond %{HTTP_HOST} ^www.domain1.com$ RewriteRule ^/(.*)$ http://www.domain2.com/$1 [R=301,L]
域名我们一般都是用301跳转,301是永久重定向,302则是临时重定向。
七、配置apache的访问日志
Apache文档已经给出了所有可用于格式串的变量及其含义,下面是其译文:
%...a
: 远程IP地址
%...A
: 本地IP地址
%...B
: 已发送的字节数,不包含HTTP头
%...b
: CLF格式的已发送字节数量,不包含HTTP头。例如当没有发送数据时,写入‘-’而不是0。
%...{FOOBAR}e
: 环境变量FOOBAR的内容
%...f
: 文件名字
%...h
: 远程主机
%...H
请求的协议
%...{Foobar}i
: Foobar的内容,发送给服务器的请求的标头行。
%...l
: 远程登录名字(来自identd,如提供的话)
%...m
请求的方法
%...{Foobar}n
: 来自另外一个模块的注解“Foobar”的内容
%...{Foobar}o
: Foobar的内容,应答的标头行
%...p
: 服务器响应请求时使用的端口
%...P
: 响应请求的子进程ID。
%...q
查询字符串(如果存在查询字符串,则包含“?”后面的部分;否则,它是一个空字符串。)
%...r
: 请求的第一行
%...s
: 状态。对于进行内部重定向的请求,这是指*原来*请求 的状态。如果用%...>s,则是指后来的请求。
%...t
: 以公共日志时间格式表示的时间(或称为标准英文格式)
%...{format}t
: 以指定格式format表示的时间
%...T
: 为响应请求而耗费的时间,以秒计
%...u
: 远程用户(来自auth;如果返回状态(%s)是401则可能是伪造的)
%...U
: 用户所请求的URL路径
%...v
: 响应请求的服务器的ServerName
%...V
: 依照UseCanonicalName设置得到的服务器名字
在所有上面列出的变量中,“...”表示一个可选的条件。如果没有指定条件,则变量的值将以“-”取代。分析前面来自默认httpd.conf文件的 LogFormat指令示例,可以看出它创建了一种名为“common”的日志格式,其中包括:远程主机,远程登录名字,远程用户,请求时间,请求的第一 行代码,请求状态,以及发送的字节数。
有时候我们只想在日志中记录某些特定的、已定义的信息,这时就要用到“...”。如果在“%”和变量之间放入了一个或者多个HTTP状态代码,则只有当请 求返回的状态代码属于指定的状态代码之一时,变量所代表的内容才会被记录。例如,如果我们想要记录的是网站的所有无效链接,那么可以使用:
LogFormat %404{Referer}i BrokenLinks
反之,如果我们想要记录那些状态代码不等于指定值的请求,只需加入一个“!”符号即可。
现在来实际操作一次,编辑httpd.conf主配置文件。
找到:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
我们可以改一下看看效果,首先复制它粘贴到下一行。
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\"" test
上面是去掉了User-Agent combined 改成了 test 名称可以随便改,但是引用的时候也要对得上。
再来编辑 vim httpd-vhosts.conf 添加
CustomLog "/tmp/test.log" test
保存重启apache,访问看效果。
192.168.1.108 - - [27/Mar/2016:15:34:06 +0800] "GET /static/image/common/online_member.gif HTTP/1.1" 304 - "http://www.123.com/forum.php"
已经没有 User-Agent 了。
Apache不记录图片等静态文件
现在来让apache的日志文件里不记录图片文件,如果磁盘很小,访问量大,那么这种无意义的日志很快就会挤爆我们的磁盘空间,所以我们应该配置不记录图片文件。
编辑httpd.conf主配置文件找到:
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
在后面加上图片文件的类型
SetEnvIf Request_URI \.gif$ gif-image SetEnvIf Request_URI \.GIF$ gif-image SetEnvIf Request_URI \.jpg$ gif-image SetEnvIf Request_URI \.JPG$ gif-image SetEnvIf Request_URI \.png$ gif-image SetEnvIf Request_URI \.js$ gif-image SetEnvIf Request_URI \.bmp$ gif-image SetEnvIf Request_URI \.css$ gif-image SetEnvIf Request_URI \.mid$ gif-image SetEnvIf Request_URI \.swf$ gif-image SetEnvIf Request_URI \.mmf$ gif-image SetEnvIf Request_URI \.wma$ gif-image SetEnvIf Request_URI \.midi$ gif-image
记日志时
CustomLog /usr/local/apache/logs/access.log combined env=!gif-image
gif-image是个容器,但是URI有匹配的图片文件时,例如定义的.JPG,.PNG,便可以丢掉gif-image里不记录。
这一种是全局的,那再来介绍一种适合虚拟主机使用的。
把以下内容添加到 httpd-vhosts.conf 文件里:
SetEnvIf Request_URI ".*\.gif$" image-request SetEnvIf Request_URI ".*\.jpg$" image-request SetEnvIf Request_URI ".*\.png$" image-request SetEnvIf Request_URI ".*\.bmp$" image-request SetEnvIf Request_URI ".*\.swf$" image-request SetEnvIf Request_URI ".*\.js$" image-request SetEnvIf Request_URI ".*\.css$" image-request CustomLog "/logs/access.log" combined env=!image-request
Apache 的日志切割
随着服务器运行的天数越来越长,网站的日志肯定越来越多,占用了很大的磁盘空间,而且所有日志都放在一个文件里,也不方便查看,所以这里介绍一下日志切割。
apache的日志是可以自动切割的,默认就自带了一个rotatelogs工具。
rotatelogs的使用方法:
方法一: 使用 cronolog 为每一天建立一个新的日志
CustomLog "|bin/cronolog logs/access_%Y%m%d.log" combined
也可以按小时
CustomLog "|bin/cronolog logs/access_%Y%m%d%h.log" combined
方法二:使用 rotatelogs 每一天记录一个日志
CustomLog "|bin/rotatelogs -l logs/access_%Y%m%d.log 86400" combined
每小时
CustomLog "|bin/rotatelogs -l logs/access_%Y%m%d%H.log 3600" combined
再看apache rotatelogs语法
rotatelogs [ -l ] logfile [ rotationtime [ offset ]] | [ filesizeM ]
选项
-l
使用本地时间代替GMT时间作为时间基准。注意:在一个改变GMT偏移量(比如夏令时)的环境中使用-l会导致不可预料的结果。所以一定要加上-l 否则出现的日志时间和实际时间是相差8小时的。
logfile
它加上基准名就是日志文件名。如果logfile中包含”%”,则它会被视为用于strftime()的格式字符串;否则它会被自动加上以秒为单位的”.nnnnnnnnnn”后缀。这两种格式都表示新的日志开始使用的时间。
rotationtime
日志文件滚动的以秒为单位的间隔时间。
offset
相对于UTC的时差的分钟数。如果省略,则假定为”0″并使用UTC时间。比如,要指定UTC时差为”-5小时”的地区的当地时间,则此参数应为”-300″。
filesizeM
指定以filesizeM文件大小滚动,而不是按照时间或时差滚动。
Apache 日志中记录代理IP以及真实客户端IP
默认情况下log日志格式为:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
其中%h 是记录访问者的IP,如果在web的前端有一层代理,那么这个%h其实就是代理机器的IP,这不是我们想要的。在这种情况下,
%{X-FORWARDED-FOR}i 字段会记录客户端真实的IP。所以log日志改为:
LogFormat "%h %{X-FORWARDED-FOR}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
Apache只记录指定URI的日志
现在的需求是,把类似请求 www.aaa.com/aaa/... 这样的请求才记录日志。
在httpd.conf 或者 相关的虚拟主机配置文件中添加
SetEnvIf Request_URI "^/aaa/.*" aaa-request CustomLog "|/usr/local/apache/bin/rotatelogs -l /usr/local/apache/logs/aaa-access_%Y%m%d.log 86400" combined env=aaa-request
这样就可以了。这个原理和不记录图片等静态访问的日志是一样的。
Apache日志记录客户端请求的域名
正常情况下,根本就没有必要记录这一项,毕竟咱们大都根据虚拟主机来设置相应的访问日志,但也有个别的情况,比如
ServerName *.abc.com
这样泛解析的形式,所以有必要记录一下用户请求的域名到底是哪个。
而apache的LogFormat 中正好有一项值满足了这个需求。即 %V 这里是大写的V ,小写的v 记录的是咱们在虚拟主机中设置的ServerName ,这个的确是没有必要记录的。