2009年6月

Apache2中增加header

有时候,因为特殊需要,需要在Apache的配置里额外增加一些header,供后台程序来处理
Apache2的mod_headers模块提供了2个方法:

1.Header:设置response的header
2.RequestHeader:设置request的header

注意两者的区别,如果想增加request的header,则必须要用RequestHeader指令,如:
RequestHeader add X-VIP-SCHEME 'https'

如果要增加response的header,则用Header指令:
Header set X-VIP-SCHEME 'https'
这种方式设置的header,能通过Httpwatch观测到的。
另:虽然Header指令也提供了early选项,文档上这么说的
“Early mode is designed as a test/debugging aid for developers. Directives defined using the early keyword are set right at the beginning of processing the request. ”
但如果想在apache的后端服务程序中拿到设置的header,使用Header early指令无论如何也不行的,今天郁闷了很长时间.....

最后,还是采用了RequestHeader来实现.....

顺便提一下,目前apache2的中文文档关于RequestHeader的指令,翻译的有笔误,把request给翻译成了“响应头”
后来还是看了官方的英文文档,才大概明白两者的区别.....

Apache和Nginx的SSL证书的生成及配置

1.生成私钥文件:

  

openssl genrsa -des3 -out server.key 1024


   这种方式,会要求你Enter PEM pass,需要输入私钥加密密码,在apache中配置了SSL后启动443时,会要求输入这个密码的
  不过,你可以这样把密码给去掉
  

openssl rsa -in server.key -out my-server.key


   然后把2个key文件给mv一下

  或者,可以把上2个步骤合为一个:
  

openssl genrsa -out server.key 1024


   这样生成的私钥文件,是不包含密码的

2.生成CSR请求文件:
  

openssl req -new -key server.key -out server.csr


   根据提示填入DN信息,即可在该目录下产生server.csr (证书请求)和server.key
   •  Country Name:您所在国家的ISO标准代号,中国为CN
   •  State or Province Name:您单位所在地省/自治区/直辖市
  •  Locality Name:您单位所在地的市/县/区
  •  Organization Name:是您单位/机构/企业合法的名称
  •  Organizational Unit Name:部门名称
  •  Common Name:为证书的通用名,这里应是您主机的全称,例如:www.itrus.com.cn。这个名称必须与通过浏览器访 问您网站的URL完全相同。这一点十分重要,否则您的用户会发现您服务器证书的通用名与站点的名字不匹配,用户就会怀疑您的证书的真实性
  •  Email Address:地址是您单位的邮件地址
  •  "extra"attributes可以不必输入

3.把CSR文件提交到对应的根证书CA那里(如:verisign),请求证书CRT文件,保存为server.crt。

4.如果您申请的是全球服务器证书(如:verisign),需要安装中间级证书,以构成一个证书链,使浏览器信任您的证书。
  如果不是,则可以跳过这一步。

  对于verisign,在如下页面获得中间证书:
  http://www.verisign.com/support/verisign-intermediate-ca/secure-site-intermediate/index.html
   将中间级证书存成intermediate.crt。

5.配置Apache或nginx:
  Apache的配置:
  

vi extra/httpd-ssl.conf:


ServerName test.sohu.com:443

SSLCertificateFile "/usr/local/apache2/conf/server.crt"
SSLCertificateKeyFile "/usr/local/apache2/conf/server.key"
SSLCACertificateFile "/usr/local/apache2/conf/intermediate.crt"
....


   Nginx的配置:
  

server {
listen 443;
server_name test.sohu.com;

ssl on;
ssl_certificate server.crt;
ssl_certificate_key server.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
....
}



以上是新申请ssl证书的步骤
对于证书快过期了,更新证书的情况,只需要替换对应的server.crt文件即可
  

Nginx的location匹配规则

Nginx的Location可以有以下几个匹配:

1. =   严格匹配这个查询。如果找到,停止搜索。

2. ^~ 匹配路径的前缀,如果找到,停止搜索。

3. ~   为区分大小写的正则匹配  

4. ~* 为不区分大小写匹配



例子:



location = / {

# matches the query / only.

# 只匹配 / 查询。

[ configuration A ]

}

location / {

# matches any query, since all queries begin with /, but regular

# expressions and any longer conventional blocks will be

# matched first.

# 匹配任何查询,因为所有请求都已 / 开头。但是正则表达式规则和长的块规则将被优先和查询匹配。

[ configuration B ]

}

location ^~ /images/ {

# matches any query beginning with /images/ and halts searching,

# so regular expressions will not be checked.

# 匹配任何已 /images/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试。

[ configuration C ]

}

location ~* ".(gif|jpg|jpeg)$ {

# matches any request ending in gif, jpg, or jpeg. However, all

# requests to the /images/ directory will be handled by

# Configuration C.

# 匹配任何已 gif、jpg 或 jpeg 结尾的请求。然而所有 /images/ 目录的请求将使用 Configuration C。

[ configuration D ]

}


如果要定义多个location,则可以有2种方式:



  1. 使用/ :location / { client_max_body_size 200m; proxy_connect_timeout 30; proxy_set_header Host $http_host; proxy_set_header x-forwarded-for $remote_addr; proxy_pass http://127.0.0.1:8008; } location /tmp/{ root /; internal; } 采用这种方式,/tmp可以放在/的下面,因为“/是匹配任何查询,但是正则表达式规则和长的块规则将被优先和查询匹配”

  2. 使用~ /* : location ~ /tmp/ { root /tmp; internal; } location ~ /* { client_max_body_size 20m; proxy_connect_timeout 30; fastcgi_pass fpass; include fastcgi_params; } 采用这种方式,/tmp则必须放在~ /*这个前面,因为~是正则匹配的,正则匹配是有顺序的,只要匹配上就不会再往下匹配了。除非在conf中有定义=或者^~,也就是说=和^~的优先级最高,如果匹配上,就不会再去匹配其它的规则了。


总之,引用Nginx的官方文档的匹配规则:




  1. Directives with the = prefix that match the query exactly. If found, searching stops.

  2. All remaining directives with conventional strings, longest match first. If this match used the ^~ prefix, searching stops.

  3. Regular expressions, in order of definition in the configuration file.

  4. If #3 yielded a match, that result is used. Else the match from #2 is used.


注意:正则表达式的匹配是有顺序的,按顺序匹配。其它的匹配理论上讲是只有优先级,而没有顺序的。

twisted中factory和protocol的结合

twisted中的factory和对应的protocol结合大概有2种方式:

1.在factory中定义:
  protocol = POP3ClientProtocol
   这种方式默认是在twisted的prtocol.py中的buildProtocol方法中来生成对应的protocol实例,代码如下:
  def buildProtocol(self, addr):
         p = self.protocol()
         p.factory = self
         return p
   这样,在protocol的init方法中是无法得到当前factory对象的,只能是在protocol的某个事件回调函数里去拿到factory
   经常,我们需要在factory和protocol之间传递一些参数,这种方式就比较麻烦,因为不确定在什么时间才能拿到那些参数的值。

2.在factory中重写buildProtocol方法:
  def buildProtocol(self, addr):
        pr = POP3ClientProtocol(self)
        self.p = pr
        return pr
   这样,在生成protocol实例时,就可以把当前的factory给传递过去,因此,在protocol的init方法中是能得到当前factory对象
   从而,也能在init时就顺利的拿到factory传递的一些参数了


第二种方式其实更灵活一下吧

Mysql的批量导出数据

大概有以下几种:
1.select * from test into outfile '/opt/a.txt'
   之前一直以为这个语句在Client上运行时,会在Client对应的路径下生成txt,今天才发现是不多的
  它只能在Mysql的Server上运行,生成后的结果也是在Server对应的路径下
2.mysqldump --quick -t score product_info >product_info.txt
   这样虽然也能导出数据,但它导出的是insert的语句,不是一行一行的记录
3.mysql -N -e 'select * from companyinfo' > a.txt
   这个可以导出文本格式的文件

最新文章

最近回复

  • feifei435:这两个URI实际是不一样的
  • zsy: git push origin 分支 -f 给力!
  • 冼敏兵:简单易懂,good fit
  • Jack:无需改配置文件,看着累! # gluster volume se...
  • Mr.j:按照你的方法凑效了,折腾死了。。。。
  • zheyemaster:补充一句:我的网站路径:D:\wamp\www ~~菜鸟站长, ...
  • zheyemaster:wamp2.5(apache2.4.9)下局域网访问403错误的...
  • Git中pull对比fetch和merge | 炼似春秋:[…] 首先,我搜索了git pull和git fe...
  • higkoo:总结一下吧, 性能调优示例: gluster volume s...
  • knowaeap:请问一下博主,你维护的openyoudao支持opensuse吗

分类

归档

其它