Apache 的 order deny allow 设置说明

Allow和Deny可以用于apache的conf文件或者.htaccess文件中(配合Directory, Location, Files等),用来控制目录和文件的访问授权。
所以,最常用的是:
Order Deny,Allow
Allow from All

注意“Deny,Allow”中间只有一个逗号,也只能有一个逗号,有空格都会出错;单词的大小写不限。

上面设定的含义是先设定“先检查禁止设定,没有禁止的全部允许”,而第二句没有Deny,也就是没有禁止访问的设定,直接就是允许所有访问了。这个主要是用来确保或者覆盖上级目录的设置,开放所有内容的访问权。

按照上面的解释,下面的设定是无条件禁止访问:
Order Allow,Deny
Deny from All

如果要禁止部分内容的访问,其他的全部开放:
Order Deny,Allow
Deny from ip1 ip2
或者
Order Allow,Deny
Allow from all
Deny from ip1 ip2

apache会按照order决定最后使用哪一条规则,比如上面的第二种方式,虽然第二句allow允许了访问,但由于在order中allow 不是最后规则,因此还需要看有没有deny规则,于是到了第三句,符合ip1和ip2的访问就被禁止了。注意,order决定的“最后”规则非常重要,下面是两个错误的例子和改正方式:

Order Deny,Allow
Allow from all
Deny from domain.org
错误:想禁止来自domain.org的访问,但是deny不是最后规则,apache在处理到第二句allow的时候就已经匹配成功,根本就不会去看第三句。
解决方法:Order Allow,Deny,后面两句不动,即可。

Order Allow,Deny
Allow from ip1
Deny from all
错误:想只允许来自ip1的访问,但是,虽然第二句中设定了allow规则,由于order中deny在后,所以会以第三句deny为准,而第三句的范围中又明显包含了ip1(all include ip1),所以所有的访问都被禁止了。
解决方法一:直接去掉第三句。
解决方法二:
Order Deny,Allow
Deny from all
Allow from ip1

总结:Order Deny,Allow中,后一个是一定会被执行的(有相应的allow或deny语句时),如果没有则按照语义分析。

此文为转载,原文地址不详

配置apache密码认证

apache提供了一系列的认证,授权,访问控制模块,我们这里选用最方便的mod_auth_basic,mod_authn_file,mod_authz_user这三个模块实现目录或文件需要输入用户和密码认证。
1、生成密码文件
示例:

  1. htpasswd -c /var/www/.htpasswd centos

/var/www/.htpasswd是密码文件的位置
centos是添加授权的用户
htpasswd工具详细使用说明:http://lamp.linux.gov.cn/Apache/ApacheMenu/programs/htpasswd.html
2、配置httpd.conf文件

  1. <directory /var/www/html/centos>
  2. AuthType basic
  3. AuthBasicProvider file
  4. AuthUserFile /var/www/.htpasswd
  5. Require valid-user
  6. </directory>

这里是当访问centos目录时需要认证。
参考:http://lamp.linux.gov.cn/Apache/ApacheMenu/howto/auth.html

多规则替换过滤nginx模块nginx_substitutions_filter

本文介绍一个nginx第三方模块nginx_substitutions_filter,此模块作用是替换过滤响应主体,nginx也有一个类似这样的原生模块,但有一个缺点,就是只能使用一条规则,而nginx_substitutions_filter则不限规则数量。

安装方法

  1. cd /tmp
  2. yum install subversion
  3. svn checkout http://substitutions4nginx.googlecode.com/svn/trunk/ substitutions4nginx-read-only

在编译nginx时加上:

  1. ./configure –add-module=/tmp/substitutions4nginx-read-only

使用方法

有两条指令:subs_filter_types,subs_filter
subs_filter_types
语法: subs_filter_types mime-type [mime-types]
默认:subs_filter_types text/html
适用区域:http, server, location
subs_filter_types是用来指令需要替换的文件类型,默认是text/html类型。此模块无法处理经过压缩的内容,虽然能与gzip filter模块兼容,但无法处理反向代理返回的内容。当需要处理反向代理的内容时,可以使用如下语句禁用压缩:

  1. proxy_set_header Accept-Encoding "";

subs_filter
语法;subs_filter 源字段串 目标字段串 [gior]
默认:无
适用区域:http, server, location
subs_filter指令允许在nginx响应输出内容时替换源字段串(正则或固定)为目标字符串。第三个标志含意如下:
g(默认): 替换所有匹配的字段串。
i: 执行区分大小写的匹配。
o: 仅替换首个匹配字符串。
r: 使用正则替换模式,默认是固定模式。
模块官网:http://code.google.com/p/substitutions4nginx/

Nginx+tomcat整合安装配置

上次我们使用了apache来处理静态,tomcat来处理jsp程序,现在我们尝试使用处理静态更高效的nginx,通过nginx的代理模块,将jsp的处理传递给tomcat。

安装JRE

http://www.oracle.com下载JRE软件。

  1. wget http://download.oracle.com/otn-pub/java/jdk/7u2-b13/jre-7u2-linux-i586.tar.gz
  2. tar xzf jre-7u2-linux-i586.tar.gz
  3. mv jre1.7.0_02/ /usr/local/jre

tomcat安装

到http://tomcat.apache.org/下载tomcat

  1. wget http://labs.renren.com/apache-mirror/tomcat/tomcat-7/v7.0.23/bin/apache-tomcat-7.0.23.tar.gz
  2. tar xzf apache-tomcat-7.0.23.tar.gz
  3. mv apache-tomcat-7.0.23 /usr/local/tomcat

设置环境变量

  1. vi /etc/profile

在文件末尾增加:

  1. export JRE_HOME=/usr/local/jre

执行source命令使生效

  1. source /etc/profile

tomcat根目录设置

1.打开tomcat安装目录下面conf目录下的server.xml文件。
2.找到如下文字:

  1. <Host name="localhost" appBase="webapps"
  2.        unpackWARs="true" autoDeploy="true">

3.在上面找到的文字后面添加如下内容

  1. <Context path="" docBase="/usr/local/nginx/html" debug="0" reloadable="true" />

/usr/local/nginx/html即为根目录地址。

安装nginx

  1. yum install pcre-devel zlib-devel
  2. cd /tmp
  3. wget http://nginx.org/download/nginx-1.0.14.tar.gz
  4. tar xzf nginx-1.0.14.tar.gz
  5. cd nginx-1.0.14
  6. ./configure –prefix=/usr/local/nginx
  7. make && make install

在nginx.conf中的server区块中加入:

  1. location ~ .(jsp|jspx|do){
  2.             proxy_set_header Host $host;
  3.             proxy_set_header X-Forwarded-For $remote_addr;
  4.             proxy_pass http://127.0.0.1:8080;
  5.         }

程序启动

  1. /usr/local/nginx/sbin/nginx
  2. /usr/local/tomcat/bin/startup.sh

nginx配置反向代理

nginx配置反向代理很简单,只需要在nginx.conf配置文件加入server区块。

  1. server {
  2.         listen       80;
  3.         server_name  devops.webres.wang;
  4.  
  5. location / {
  6.                 proxy_pass              http://1.2.3.4; //后端ip地址
  7.                 proxy_redirect          off;  //关闭后端返回的header修改
  8.                  proxy_set_header       Host            $host;  //修改发送到后端的header的host
  9.                 proxy_set_header        X-Real-IP       $remote_addr; //设置真实ip
  10.                 proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
  11.                 }
  12.         }

 

BIND高速缓存DNS服务器配置

配置高速缓存DNS服务器非常的简单,首先当然是安装好bind9了,假设我们的bind安装目录为/usr/local/bind/,我们建立一个主配置文件named.conf。

  1. vi /usr/local/bind/etc/named.conf

写入如下内容:

  1. options {
  2. directory "/usr/local/bind/etc/";
  3. forward only;//所有请求转发到forwarders列表
  4. forwarders { 8.8.8.8;8.8.4.4; };//定义转发请求目的IP
  5. allow-query {any;};//允许所有客户查询
  6. };

这样就完成了高速缓存DNS服务器的配置。

联通电信智能DNS(BIND)配置

本次主要学习通过BIND 9的view功能实现不同地址解析不同的IP,即智能DNS。首先安装BIND9,不懂的请看BIND DNS服务器的安装与主从DNS配置的安装部分安装。

acl文件配置

在配置智能DNS之前,我们需要获取联通电信最新的IP段,并制作成acl文件,这里提供直接提供文件下载,并上传到主从两台dns的/usr/local/bind/etc/目录下。
电信:CHINANET.acl
联通:CNC.acl
当然如果你想获取更新的IP段,可以根据这个脚本实现。http://devops.webres.wang/2012/02/automatic-get-unicom-chinanet-new-ip-ranges/

主DNS配置

named.conf配置

首先生成一个控制key,和三个用于主从同步的key。

  1. rndc-confgen -a
  2. rndc-confgen -a -c /etc/cnc.key -k cnc
  3. rndc-confgen -a -c /etc/chinanet.key -k chinanet
  4. rndc-confgen -a -c /etc/any.key -k any

并也把生成的/etc/cnc.key,/etc/chinanet.key和/etc/any.key传到从服务器。
然后创建named.conf。

  1. vi /usr/local/bind/etc/named.conf

写入如下代码:

  1. include "/etc/rndc.key";//加载rndc.key用于rndc命令
  2. //下面加载的三个key文件用在三个视图里的zone的主从同步。
  3. include "/etc/cnc.key";
  4. include "/etc/chinanet.key";
  5. include "/etc/any.key";
  6. controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { "rndckey"; }; };//定义controls以能使用rndc命令管理bind。
  7. include "/usr/local/bind/etc/CNC.acl"; //cnc acl
  8. include "/usr/local/bind/etc/CHINANET.acl"; //chinanet acl
  9. //定义bind日志
  10. logging {
  11. channel default_syslog { syslog local2; severity notice; };
  12. channel audit_log { file "/var/log/bind.log"; severity notice; print-time yes; };
  13. category default { default_syslog; };
  14. category general { default_syslog; };
  15. category security { audit_log; default_syslog; };
  16. category config { default_syslog; };
  17. category resolver { audit_log; };
  18. category xfer-in { audit_log; };
  19. category xfer-out { audit_log; };
  20. category notify { audit_log; };
  21. category client { audit_log; };
  22. category network { audit_log; };
  23. category update { audit_log; };
  24. category queries { audit_log; };
  25. category lame-servers { audit_log; };
  26. };
  27. options {
  28.     directory "/usr/local/bind/etc";
  29. pid-file "/usr/local/bind/var/run/bind.pid";
  30. transfer-format many-answers;
  31. interface-interval 0;
  32. allow-query { any; };
  33. };
  34.  
  35. view "view_CNC" {
  36. match-clients { key cnc;CNC; };//匹配带key cnc或CNC里的IP段
  37. server 23.19.81.194 {keys cnc;}; //向从服务器发送消息时,用 cnc 加密
  38. zone "qbtop.com" {
  39. type master;
  40. file "qbtop.com.cnc.zone";
  41. allow-transfer { key cnc; };//只允许用 cnc加密过的 zone transfer 请求
  42. };
  43. };
  44.  
  45. view "view_CHINANET" {
  46. match-clients { key chinanet;CHINANET; };
  47. server 23.19.81.194 {keys chinanet;};
  48. zone "qbtop.com" {
  49. type master;
  50. file "qbtop.com.chinanet.zone";
  51. allow-transfer { key chinanet; };
  52. };
  53. };
  54.  
  55. view “view_any” {
  56. match-clients { key any;any; };
  57. server 23.19.81.194 {keys any;};
  58. zone "qbtop.com" {
  59. type master;
  60. file "qbtop.com.any.zone";
  61. allow-transfer { key any; };
  62. };
  63. };

zone文件配置

分别在/usr/local/bind/etc/目录下创建三个文件,qbtop.com.cnc.zone,qbtop.com.chinanet.zone,qbtop.com.any.zone,分别对应联通zone,电信zone和其它zone。
zone内容如下,唯一区别的是IP的不同。

  1. $TTL 3600
  2. @ IN SOA ns1.qbtop.com. hostmaster.qbtop.com. (
  3. 2012022301  ; Serial
  4. 3600 ; Refresh
  5. 900 ; Retry
  6. 3600000 ; Expire
  7. 3600 ) ; Minimum
  8. @ IN NS ns1.qbtop.com.
  9. @ IN NS ns2.qbtop.com.
  10. ns1 IN A 23.19.81.191
  11. ns2 IN A 23.19.81.194
  12. @   IN A 1.1.1.1
  13. www IN A 1.1.1.1

从DNS配置

创建目录slaves

  1. mkdir /usr/local/bind/etc/slaves

创建named.conf文件。

  1. vi /usr/local/bind/etc/named.conf

写入如下代码:

  1. include "/etc/cnc.key";
  2. include "/etc/chinanet.key";
  3. include "/etc/any.key";
  4. include "/usr/local/bind/etc/CNC.acl";  //cnc acl
  5. include "/usr/local/bind/etc/CHINANET.acl"; //chinanet acl
  6. logging {
  7. channel default_syslog { syslog local2; severity notice; };
  8. channel audit_log { file "/var/log/bind.log"; severity notice; print-time yes; };
  9. category default { default_syslog; };
  10. category general { default_syslog; };
  11. category security { audit_log; default_syslog; };
  12. category config { default_syslog; };
  13. category resolver { audit_log; };
  14. category xfer-in { audit_log; };
  15. category xfer-out { audit_log; };
  16. category notify { audit_log; };
  17. category client { audit_log; };
  18. category network { audit_log; };
  19. category update { audit_log; };
  20. category queries { audit_log; };
  21. category lame-servers { audit_log; };
  22. };
  23. options {
  24.     directory "/usr/local/bind/etc";
  25. pid-file "/usr/local/bind/var/run/bind.pid";
  26. transfer-format many-answers;
  27. interface-interval 0;
  28. allow-query { any; };
  29. };
  30.  
  31. view "view_CNC" {
  32. match-clients { key cnc;CNC; };
  33. server 23.19.81.191 {keys cnc;};
  34. zone "qbtop.com" {
  35. type slave;
  36. file "slaves/qbtop.com.cnc.zone";
  37. masters { 23.19.81.191; };
  38. };
  39. };
  40.  
  41. view "view_CHINANET" {
  42. match-clients { key chinanet;CHINANET; };
  43. server 23.19.81.191 {keys chinanet;};
  44. zone "qbtop.com" {
  45. type slave;
  46. file "slaves/qbtop.com.chinanet.zone";
  47. masters { 23.19.81.191; };
  48. };
  49. };
  50.  
  51. view “view_any” {
  52. match-clients { key any;any; };
  53. server 23.19.81.191 {keys any;};
  54. zone "qbtop.com" {
  55. type slave;
  56. file "slaves/qbtop.com.any.zone";
  57. masters { 23.19.81.191; };
  58. };
  59. };

至此,联通电信主从智能DNS已经配置完成,你可以使用如下多线路ping工具检测:
http://ping.chinaz.com/
http://www.webkaka.com/Ping.aspx
http://17ce.com/
http://ping.aizhan.com/

Linux下脚本上传文件到dropbox

这里介绍一个可以上传文件到dropbox的脚本。不用安装,直接运行即可把文件上传到dropbox。
脚本地址:https://github.com/andreafabrizi/Dropbox-Uploader
也可以在本站直接下载:dropbox_uploader.sh
脚本使用方法:
语法:./dropbox_uploader.sh [OPTIONS]…
选项:-u [USERNAME] dropbox用户
-p [PASSWORD] dropbox密码
-f [FILE/FOLDER] 待上传的文件
-d [REMOTE_FOLDER] dropbox的目录,默认是 “/”
-v 返回详细进程模式
例子:
./dropbox_uploader.sh -u [email protected] -f /etc/passwd -v
./dropbox_uploader.sh -u [email protected] -f /var/backup/ -v
也可以在dropbox_uploader.sh文件填写好用户和密码,之后运行脚本时就不用再定义用户和密码。

使用AWStats分析Nginx和Apache日志

AWStats简介

Awstats是一个免费非常简洁而且强大有个性的统计工具。它可以统计您站点的如下信息:
   一:访问量,访问次数,页面浏览量,点击数,数据流量等
   二:精确到每月、每日、每小时的数据
   三:访问者国家
   四:访问者IP
   五:Robots/Spiders的统计
   六:纺客持续时间
   七:对不同Files type 的统计信息
   八:Pages-URL的统计
   九:访客操作系统浏览器等信息
   十:其它信息(搜索关键字等等)

下面我们来在CentOS配置AWStats来分析Nginx和Apache日志。

AWStats安装

  1. cd /tmp
  2. wget http://prdownloads.sourceforge.net/awstats/awstats-7.0.tar.gz
  3. tar xzf awstats-7.0.tar.gz
  4. mv awstats-7.0 /usr/local/awstats
  5. cd /usr/local/awstats/tools
  6. mkdir /etc/awstats /var/lib/awstats

AWStats配置

执行awstats_configure.pl脚本进行配置。

  1. perl awstats_configure.pl

配置过程如下:
Config file path (‘none’ to skip web server setup):
none

—–> Need to create a new config file ?
Do you want me to build a new AWStats config/profile
file (required if first install) [y/N] ? y

—–> Define config file name to create
What is the name of your web site or profile analysis ?
Example: www.mysite.com
Example: demo
Your web site, virtual server or profile name:
> devops.webres.wang

—–> Define config file path
In which directory do you plan to store your config file(s) ?
Default: /etc/awstats
Directory path to store config file(s) (Enter for default):
> 回车

接着需要编辑配置文件awstats.devops.webres.wang.conf。

  1. vi /etc/awstats/awstats.devops.webres.wang.conf

只需要定义日志的路径,如:

  1. LogFile="/home/centos/log/access.log"

复制css和icon目录到网站根目录。

  1. cp -R /usr/local/awstats/wwwroot/css /home/www/default
  2. cp -R /usr/local/awstats/wwwroot/icon /home/www/default

手动执行命令更新日志统计数据库及生成静态文件到目录/home/www/default/awstats:

  1. /usr/local/awstats/tools/awstats_buildstaticpages.pl -config=devops.webres.wang -update -lang=cn -awstatsprog=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl -dir=/home/www/default/awstats

之后你就可以使用http://ip或域名/awstats/awstats.devops.webres.wang.html访问日志统计页面。
添加脚本awstats_buildstaticpages.pl到cron定时生成日志统计页面。

  1. crontab -e
  1. 58 23 * * *  /usr/local/awstats/tools/awstats_buildstaticpages.pl -config=devops.webres.wang -update -lang=cn -awstatsprog=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl -dir=/home/www/default/awstats

awstats_buildstaticpages.pl脚本使用说明:
语法:awstats_buildstaticpages.pl (awstats_options) [awstatsbuildstaticpages_options]
awstats_options可选参数为:
-config=configvalue:定义配置文件,如devops.webres.wang,就会搜索/etc/awstats/awstats.devops.webres.wang.conf文件。
-update :该选项定义生成静态页面之前先更新数据库。
-lang :统计页面的语言,如-lang=cn,语言为中文。
awstatsbuildstaticpages_options可选参数为:
-awstatsprog=pathtoawstatspl :定义awstats.pl路径。
-dir :定义输出静态页面的目录。
参考:http://awstats.sourceforge.net/docs/awstats_setup.html

关于nginx wordpress目录式永久链接斜杠的问题

我的wordpress一直以为是启用目录式的永久链接,如http://devops.webres.wang/2012/01/real-time-rsync-file-with-sersync/。今天当我用http://devops.webres.wang/2012/01/real-time-rsync-file-with-sersync这样的链接,即尾部少一斜杠时,文章照样能顺利地访问,这时候查看这个地址返回的状态码,是200,而不是我所想的301。虽说没什么影响,但为了链接规范与唯一性,决定做301处理。
在nginx的配置文件中加入如下跳转规则:

  1. if (!-f $request_filename){ rewrite ^/([^.]+[^/])$ http://$host/$1/ permanent; }