• {{ item.name }}
  • Home
  • Linux
  • Programming
    • Python
  • Life
  • Other
  • Tools
  • 投资者该如何参与优秀的区块链项目- NuLink社区圆桌会议
  • 什么是NuLink?- 项目中文社区与项目研究组成员 Rookie 对话实录
  • NuLink 融资 400 万美元用于开发隐私保护技术
  • NuLink的零知识证明介绍(1)
  • 用bitwarden_rs搭建属于自己的密码管理器
  • 修复 CentOS vps 网卡失效
  • 记录用mac给Nexus6P刷Android10的错误
  • Centos 6.8启用 TCP BBR拥塞控制算法
  • Nginx 启用HTTP2功能
  • Mac 安装adb工具
  • WordPress 默认编辑器代码按钮

LAMP第二部分-apache的配置

  • iansiu
  • 2016-03-28
  • 0

一、下载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 ,这个的确是没有必要记录的。

© 2023 laowang's blog
Theme by Wing