20个高效正则表达式

push 发表了文章 • 0 个评论 • 258 次浏览 • 2017-03-27 12:27 • 来自相关话题

1 . 校验密码强度​
密码的强度必须是包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间。
^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
2. 校验中文
字符串仅能是中文。
^[\\u4e00-\\u9fa5]{0,}$
3. 由数字、26个英文字母或下划线组成的字符串
^\\w+$
4. 校验E-Mail 地址
同密码一样,下面是E-mail地址合规性的正则检查语句。
 
[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[\\w](?:[\\w-]*[\\w])?
5. 校验身份证号码
下面是身份证号码的正则校验。15 或 18位。
15位:
^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$

18位:
^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$
6. 校验日期
“yyyy-mm-dd“ 格式的日期校验,已考虑平闰年。
^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$
7. 校验金额
金额校验,精确到2位小数。
^[0-9]+(.[0-9]{2})?$
8. 校验手机号
下面是国内 13、15、18开头的手机号正则表达式。(可根据目前国内收集号扩展前两位开头号码)
^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\\d{8}$
9. 判断IE的版本
IE目前还没被完全取代,很多页面还是需要做版本兼容,下面是IE版本检查的表达式。
^.*MSIE [5-8](?:\\.[0-9]+)?(?!.*Trident\\/[5-9]\\.0).*$
10. 校验IP-v4地址
IP4 正则语句。
\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b
11. 校验IP-v6地址
IP6 正则语句。
(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))
12. 检查URL的前缀
应用开发中很多时候需要区分请求是HTTPS还是HTTP,通过下面的表达式可以取出一个url的前缀然后再逻辑判断。
if (!s.match(/^[a-zA-Z]+:\\/\\//)) { s = 'http://' + s;}
13. 提取URL链接
下面的这个表达式可以筛选出一段文本中的URL。
^(f|ht){1}(tp|tps):\\/\\/([\\w-]+\\.)+[\\w-]+(\\/[\\w- ./?%&=]*)?
14. 文件路径及扩展名校验
验证windows下文件路径和扩展名(下面的例子中为.txt文件)
^([a-zA-Z]\\:|\\\\)\\\\([^\\\\]+\\\\)*[^\\/:*?"<>|]+\\.txt(l)?$
15. 提取Color Hex Codes
有时需要抽取网页中的颜色代码,可以使用下面的表达式。
^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$
16. 提取网页图片
假若你想提取网页中所有图片信息,可以利用下面的表达式。\\< *[img][^\\\\>]*[src] *= *[\\"\\']{0,1}([^\\"\\'\\ >]*)
17. 提取页面超链接
提取html中的超链接。
(<a\\s*(?!.*\\brel=)[^>]*)(href="https?:\\/\\/)((?!(?:(?:www\\.)?'.implode('|(?:www\\.)?', $follow_list).'))[^"]+)"((?!.*\\brel=)[^>]*)(?:[^>]*)>
18. 查找CSS属性
通过下面的表达式,可以搜索到相匹配的CSS属性。
^\\s*[a-zA-Z\\-]+\\s*[:]{1}\\s[a-zA-Z0-9\\s.#]+[;]{1}
19. 抽取注释
如果你需要移除HMTL中的注释,可以使用如下的表达式。
<!--(.*?)-->
20. 匹配HTML标签
通过下面的表达式可以匹配出HTML中的标签属性。
<\\/?\\w+((\\s+\\w+(\\s*=\\s*(?:".*?"|'.*?'|[\\^'">\\s]+))?)+\\s*|\\s*)\\/?> 查看全部
1 . 校验密码强度​
密码的强度必须是包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间。
^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$

2. 校验中文
字符串仅能是中文。
^[\\u4e00-\\u9fa5]{0,}$

3. 由数字、26个英文字母或下划线组成的字符串
^\\w+$

4. 校验E-Mail 地址
同密码一样,下面是E-mail地址合规性的正则检查语句。
 
[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[\\w](?:[\\w-]*[\\w])?

5. 校验身份证号码
下面是身份证号码的正则校验。15 或 18位。
15位:
^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$

18位:
^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$

6. 校验日期
“yyyy-mm-dd“ 格式的日期校验,已考虑平闰年。
^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$

7. 校验金额
金额校验,精确到2位小数。
^[0-9]+(.[0-9]{2})?$

8. 校验手机号
下面是国内 13、15、18开头的手机号正则表达式。(可根据目前国内收集号扩展前两位开头号码)
^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\\d{8}$

9. 判断IE的版本
IE目前还没被完全取代,很多页面还是需要做版本兼容,下面是IE版本检查的表达式。
^.*MSIE [5-8](?:\\.[0-9]+)?(?!.*Trident\\/[5-9]\\.0).*$

10. 校验IP-v4地址
IP4 正则语句。
\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b

11. 校验IP-v6地址
IP6 正则语句。
(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))

12. 检查URL的前缀
应用开发中很多时候需要区分请求是HTTPS还是HTTP,通过下面的表达式可以取出一个url的前缀然后再逻辑判断。
if (!s.match(/^[a-zA-Z]+:\\/\\//)) {    s = 'http://' + s;}

13. 提取URL链接
下面的这个表达式可以筛选出一段文本中的URL。
^(f|ht){1}(tp|tps):\\/\\/([\\w-]+\\.)+[\\w-]+(\\/[\\w- ./?%&=]*)?

14. 文件路径及扩展名校验
验证windows下文件路径和扩展名(下面的例子中为.txt文件)
^([a-zA-Z]\\:|\\\\)\\\\([^\\\\]+\\\\)*[^\\/:*?"<>|]+\\.txt(l)?$

15. 提取Color Hex Codes
有时需要抽取网页中的颜色代码,可以使用下面的表达式。
^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$

16. 提取网页图片
假若你想提取网页中所有图片信息,可以利用下面的表达式。
\\< *[img][^\\\\>]*[src] *= *[\\"\\']{0,1}([^\\"\\'\\ >]*)

17. 提取页面超链接
提取html中的超链接。
(<a\\s*(?!.*\\brel=)[^>]*)(href="https?:\\/\\/)((?!(?:(?:www\\.)?'.implode('|(?:www\\.)?', $follow_list).'))[^"]+)"((?!.*\\brel=)[^>]*)(?:[^>]*)>

18. 查找CSS属性
通过下面的表达式,可以搜索到相匹配的CSS属性。
^\\s*[a-zA-Z\\-]+\\s*[:]{1}\\s[a-zA-Z0-9\\s.#]+[;]{1}

19. 抽取注释
如果你需要移除HMTL中的注释,可以使用如下的表达式。
<!--(.*?)-->

20. 匹配HTML标签
通过下面的表达式可以匹配出HTML中的标签属性。
<\\/?\\w+((\\s+\\w+(\\s*=\\s*(?:".*?"|'.*?'|[\\^'">\\s]+))?)+\\s*|\\s*)\\/?>

Linux下怎么设置ssh代理socket5翻墙?

being 回复了问题 • 2 人关注 • 2 个回复 • 420 次浏览 • 2017-03-26 18:08 • 来自相关话题

Apache基本使用总结

Rock 发表了文章 • 0 个评论 • 275 次浏览 • 2017-03-26 17:53 • 来自相关话题

一、常用配置

1、修改监听的IP和Port
Listen[IP:]PORT
Listen 12.24.34.56:80
Listen 8080
# 省略ip表示监听本机所有IP;Listen可重复出现多次;2、持久连接
KeepAive On # 开启
MaxKeepAliveRequests 0 # 一个持久TCP最多允许的请求数,这里设置0表示不限制)
KeepAliveTimeout 15 # 表示15秒KeepAlive是什么东西?它是http协议的一部分,让我们复习一下没有KeepAlive的http请求,从客户在浏览器输入一个有效url地址开始,浏览器就会利用socket向url对应的web服务器发送一条TCP请求,这个请求成功一次就得需要来回握三次手才能确定,成功以后,浏览器利用socket TCP连接资源向web服务器请求http协议,发送以后就等着web服务器把http返回头和body发送回来,发回来后浏览器关闭socket连接,然后做http返回头和body的解析工作,最后呈现在浏览器上的就是漂亮的页面了。这里面有什么问题呢?TCP连接需要三次握手,也就是来回请求三次方能确定一个TCP请求是否成功,然后TCP关闭呢?来回需要4次请求才能完成!每次http请求就3次握手,4次拜拜,这来来回回的不嫌累啊,多少时间和资源都被浪费在socket连接关闭上了,能不能一次socket TCP连接发送多次http请求呢?于是KeepAlive就应运而生,http/1.0里需要客户端自己在请求头加入Connection:Keep-alive方能实现,在这里我们只考虑http1.1了,只需要设置一下Apache,让它默认就是Keep-Alive持久连接模式(Apache必须1.2+才能支持Keep-Alive)。在httpd.conf里找到KeepAive配置项,果断设置为On,MaxKeepAliveRequests果断为0(一个持久TCP最多允许的请求数,如果过小,很容易在TCP未过期的情况下,达到最大连接,那下次连接就又是新的TCP连接了,这里设置0表示不限制),然后对于mysql_pconnect最重要的选项KeepAliveTimeout设置为15(表示15秒), httpd-2.4支持毫秒级持久时间。
测试:
<?php
echo "Apache进程号:". getmypid();
?>很简单,获取当前PHP执行者(Apache)的进程号,用浏览器浏览这个页面,看到什么?对,有看到一串进程号数字,15秒内,连续刷新页面,看看进程号有无变化?木有吧?现在把手拿开,交叉在胸前,度好时间,1秒,2秒,3,...15,16。好,过了15秒了,再去刷新页面,进程号有没有变化?变了!又是一个新的Apache进程了,为什么15秒后就变成新的进程了?记得我们在Apache里设置的KeepAliveTimeout吗?它的值就是15秒。现在我们应该大致清楚了,在web服务器默认打开KeepAlive的情况下,客户端第一次http成功请求后,Apache不会立刻断开socket,而是一直监听来自这一客户端的请求,监听多久?根据KeepAliveTimeout选项配置的时间决定,一旦超过这一时间,Apache就会断开socket了,那么下次同一客户端再次请求,Apache就会新开一个进程来相应。所以我们之前15内不停的刷新页面,看到的进程号都是一致的,表明是浏览器请求给了同一个Apache进程。

浏览器是怎么知道不需要重新进行TCP连接就可以直接发送http请求呢?因为http返回头里就会带上Connection:keep-alive,Keep-alive:15两行,意思就是让客户端浏览器明白,这次socket连接我这边还没关闭呢,你可以在15内继续使用这个连接,并发送http请求,于是乎浏览器就知道应该怎么做了。
 
3、MPM参数
MultipathProcessModule:多道处理模块
prefork,worker,event
<IfModule prefork.c>
StartServers 8 #服务启动时启动的子进程数
MinSpareServers 5 #最少空闲子进程数
MaxSpareServers 20
ServerLimit 256 #同时启动的子进程数上限
MaxClients 256 #同时服务的客户端数上限(支持的并发数上限)
MaxRequestsPerChild 4000 #每个子进程在其生命周期内处理的请求数上限
</IfModule>

<IfModule worker.c>
StartServers 4 #服务启动时启动的子进程数
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25 #每个子进程可启动的线程数
MaxRequestsPerChild 0 #每个子进程可处理的请求数,0表示无限制
</IfModule>4、DSO
配置指令实现模块加载
LoadModule <mod_name> <mod_path>
#要卸载某个模块直接将其注释掉即可,不用重读配置文件就可立即生效;模块路径为相对于ServerRoot而言的路径
显示DSO动态装载的模块:
# httpd -D DUMP_MODULES
Loaded Modules:
core_module (static)
mpm_prefork_module (static)
http_module (static)
so_module (static)
auth_basic_module (shared)
auth_digest_module (shared)
authn_file_module (shared)
authn_alias_module (shared)
...
# httpd -l
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c
# httpd.worker -l
Compiled in modules:
core.c
worker.c
http_core.c
mod_so.c5、定义'Main'server的文档页面路径
DocumentRoot "/path/to/somefile"
文档路径映射:
DocumentRoot 指向的路径为URL路径的起始位置;
DocumentRoot "/var/www/html" #默认为这个位置
test/index.html-->http://HOST:PORT/test/index.html6、站点访问控制
可基于两种类型的路径指明对哪些资源进行访问控制
文件系统路径:
<Directory "/path/to/somewhere">
...
</Direcotry>
<File [~] "/path/to/somewhere">
...
</File>
基于URL访问路径做访问控制:
<Location"">
...
</Location>
#另外,路径可做模式匹配,但若非迫不得已不建议使用
#如果即能使用Diretoory控制,也能使用Location控制,建议使用Directory7、Directory中“基于来源地址”实现访问控制
(1)Options
所有可用特性:Indexes,Includes,FollowSymLinks,SymLinksifOwnerMatch
ExecCGI,MultiViews,None,All
Indexes:索引;在无默认主页面又无欢迎页时,将所有资源以列表形式呈现给用户。
危险,慎用;在选项前添加减号即为禁用。如-Indexes
FollowSymlinks:允许跟踪符号链接文件;
# vim /etc/httpd/conf/httpd.conf
<Directory "/www/html">
Options Indexes FollowSymLinks #默认是开启的
AllowOverride None
Order allow,deny
Allow from all
</Directory>
(2)AllowOverride
支持在每个页面目录下创建.htaccess用于实现对此目录中资源访问时的访问控制功能;
.htaccess文件会影响httpd的性能
(3)基于IP做访问控制机制
Order:检查次序
Order allow,deny
Allow form 192.168.10.0/24
form后面能够接受的地址格式:
IP,Network Address
网络地址格式较为灵活:
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.08、定义默认主页面DirecotryIndex index.htm lindex.html.var9、日志设定
ErrorLog "/path/to/error_log" #错误日志,路径为相对于ServerRoot而言的路径
LogLevel {debug|info|notice|warn|error|crit|alert|emerg}
指定级别及比其更高级别的信息都会被记录
LogFormat 格式 格式名
%h: 客户端地址
%l: 远程登录名,通常为-
%u: 认证时输入用户名,没有认证时为-
%t: 服务器收到 用户请求时的时间
%r:请求报名的起始行
%>s: 响应状态码
%b: 响应报文的长度,单位是字节
%{HEADER_NAME}i: 记录指定首部对应的值
例如 LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
#格式中若要使用引号则要使用反斜线转义
CustomLog "/path/to/access_log" LogFormat_Name10、路径别名
实现URL路径的映射,从而所访问的资源不再依赖于站点根目录。
Alias /URL/ "/path/to/somewhere/"
例如 Alias /images/ "/www/tupian/" #后面映射的路径是绝对路径,而不是相对于站点根目录而言的路径;此时若站点根目录(以/var/www/html为例)下也有一个images目录,那么将无法访问/var/www/html/images中的资源,因为images已被别名征用
# mkdir test hello
# cat test/a.html
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
# cat hello/b.html
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
# vim /etc/httpd/conf/httpd.conf
Alias /test/ "/www/html/hello/"
# service httpd restart
停止 httpd: [确定]
正在启动 httpd: [确定]

# curl http://localhost/test/a.html
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /test/a.html was not found on this server.</p>
<hr>
<address>Apache/2.2.15 (CentOS) Server at localhost Port 80</address>
</body></html>
# curl http://localhost/test/b.html
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb11、设定默认字符集AddDefaultCharset UTF-8
# 字符集:GBK,GB2312,GB1803012、基于用户的访问控制用户认证类型:
基本认证:Basic,明文发送
摘要认证:digest
虚拟用户:仅用于访问某服务或获取某资源的凭证;
账号和密码的存储机制:
文本文件:.htpasswd
SQL数据库
dbm:数据库引擎,提供API
ldap:
案例:基于文件做访问控制
(1)基于用户进行认证
<Directory />
Options none
AllowOverride AuthConfig
AuthType Basic
AuthName "admin area"
AuthBasicProvider file
AuthUserFile /etc/httpd/conf/.htpasswd
Require valid-user
</Directory>
# Require valid-user:文件中所有用户均可访问
# Require user USERNAME,... 指定用户访问
(2)提供认证文件
htpasswd [option] passwdfile username
选项:
-c:创建一个passwdfile,如果passwdfile已经存在,那么它会重新写入并删除原有内容
-m:以md5的格式编码存储用户的密码信息
-s:sha1加密用户密码;
-D:删除指定用户
(3)基于组认证
<Directory />
Options none
AllowOverride AuthConfig
AuthType Basic
AuthName "admin area"
AuthBasicProvider file
AuthUserFile /etc/httpd/conf/.htpasswd
AuthGroupFile /etc/httpd/conf/.htgroup
Require group GROUP_NAME
</Directory>
组文件(.htgroup)格式 组名:user1 user2 user3
例如:
# cd /var/www/html
# mkdir admin
# cat admin/admin.html
The user is admin.
# vim /etc/httpd/conf/httpd.conf
<Directory "/var/www/html/admin">
Options none
AllowOverride AuthConfig
AuthType Basic
AuthName "admin area"
AuthBasicProvider file
AuthUserFile /etc/httpd/conf/.htpasswd
Require valid-user
</Directory>
# htpasswd -c -m /etc/httpd/conf/.htpasswd bjwf #创建第一个用户时必须创建文件
New password:
Re-type new password:
Adding password for user bjwf
# htpasswd -m /etc/httpd/conf/.htpasswd tom #创建第二个用户
New password:
Re-type new password:
Adding password for user tom
# service httpd restart



13、虚拟主机有三种实现方案:
基于ip:为每个虚拟主机准备至少一个ip地址;
基于port:为每个虚拟主机准备至少一个专用port;实践中很少使用;
基于hostname:为每个虚拟主机准备至少一个专用hostname;
可混合使用上述三种方式中任意方式;
注意:一般虚拟主机莫与中心主机混用,所以,要使用虚拟主机,先禁用中心主机;
禁用中心主机:注释DocumentRoot
每个虚拟主机都有专用配置:
<VirtualHost"IP:PORT">
SeverName
DocumentRoot""
</VirtualHost>
ServerAlias:虚拟主机的别名;
ErrorLog
CustomLog
<Directory"">
</Directory>

示例1:基于ip
<VirtualHost172.16.100.6:80>
ServerName web1.magedu.com
DocumentRoot"/vhosts/web1/htdocs"
</VirtualHost>

<VirtualHost172.16.100.7:80>
ServerName web2.magedu.com
DocumentRoot "/vhosts/web2/htdocs"
</VirtualHost>
示例2:基于port
<VirtualHost172.16.100.7:80>
ServerNameweb2.magedu.com
DocumentRoot"/vhosts/web2/htdocs"
</VirtualHost>

<VirtualHost 172.16.100.7:8080>
ServerName web3.magedu.com
DocumentRoot "/vhosts/web3/htdocs"
</VirtualHost>
示例3:基于hostname
<VirtualHost 172.16.100.6:80>
ServerName web1.magedu.com
DocumentRoot "/vhosts/web1/htdocs"
</VirtualHost>

<VirtualHost 172.16.100.6:80>
ServerName web2.magedu.com
DocumentRoot "/vhosts/web2/htdocs"
</VirtualHost>

<VirtualHost 172.16.100.6:80>
ServerName web3.magedu.com
DocumentRoot "/vhosts/web3/htdocs"
</VirtualHost>
#注:一般要启用虚拟主机,最好是新建一个文档在/etc/httpd/conf.d/vhost.conf里面,这样一来虚拟主机
设定的参数可以随便修改,而且不会影响到主配置文件,而主配置文件httpd.conf中有个include的参数可以
将/etc/httpd/conf.d/*.conf都包含进来。示例:
# mkdir /var/www/html/{a.com,b.net,c.org} -pv
mkdir: 已创建目录 "/var/www/html/a.com"
mkdir: 已创建目录 "/var/www/html/b.net"
mkdir: 已创建目录 "/var/www/html/c.org"
# echo a.com > /var/www/html/a.com/index.html
# echo b.net > /var/www/html/b.net/index.html
# echo c.org > /var/www/html/c.org/index.html
# cat vhost.conf (基于IP的虚拟主机)
<VirtualHost 192.168.130.250:80>
ServerName www.a.com
DocumentRoot "/var/www/html/a.com"
</VirtualHost>

<VirtualHost 192.168.130.251:80>
ServerName www.b.net
DocumentRoot "/var/www/html/b.net"
</VirtualHost>

<VirtualHost 192.168.130.252:80>
ServerName www.c.org
DocumentRoot "/var/www/html/c.org"
</VirtualHost>
# curl http://192.168.130.250
a.com
# curl http://192.168.130.251
b.net
# curl http://192.168.130.252
c.org

# cat vhost.conf (基于主机名的虚拟主机)
NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.a.com
DocumentRoot "/var/www/html/a.com"
</VirtualHost>

<VirtualHost *:80>
ServerName www.b.net
DocumentRoot "/var/www/html/b.net"
</VirtualHost>

<VirtualHost *:80>
ServerName www.c.org
DocumentRoot "/var/www/html/c.org"
</VirtualHost>
# cat /etc/hosts
192.168.130.250 kvm.jlc.com
192.168.130.250 www.a.com
192.168.130.250 www.b.net
192.168.130.250 www.c.org
# curl http://www.a.com
a.com
# curl http://www.b.net
b.net
# curl http://www.c.org
c.org14、内置的status页面
handler:当文件被调用时,apache的内部表现形式,一般每种文件类型都有其隐式处理器
httpd内嵌有handler,其中有一个handler(server-status)用于输出当前httpd服务相关状态信息
启用handler要使用SetHandler指定# vim httpd.conf
<Location /server-status>
SetHandler server-status
Order allow,deny
Allow from 192.168.130.0/24
Allow from 192.168.120.0/24
Deny from all
</Location>
# httpd -t #检查配置文件语法
Syntax OK
# service httpd reload



15、curl命令
curl是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP,FTPS,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE及LDAP等协议。curl支持HTTPS认证,并且支持HTTP的POST、PUT等方法,FTP上传,kerberos认证,HTTP上传,代理服务器,cookies,用户名/密码认证,下载文件断点续传,上载文件断点续传,http代理服务器管道(proxy tunneling),甚至它还支持IPv6,socks5代理服务器,通过http代理服务器上传文件到FTP服务器等,功能十分强大。
用法:curl [option] URL
常用选项:
-A/--user-agent <string> 设置用户代理发送给服务器
-basic 使用HTTP基本认证
--tcp-nodelay 使用TCP_NODELAY选项
-e/--referer <URL> 来源网址
--cacert <file> CA证书 (SSL)
--compressed 要求返回是压缩的格式
-H/--header <line>自定义首部信息传递给服务器
-I/--head 只显示响应报文首部信息
--limit-rate <rate> 设置传输速度
-u/--user <user[:password]>设置服务器的用户和密码
-0/--http1.0 使用HTTP 1.016、使用mod_deflate模块压缩页面优化传输速度
SetOutputFilter DEFLATE
# mod_deflate configuration

# Restrict compression to these MIME types
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/css

# Level of compression (Highest 9 - Lowest 1)
DeflateCompressionLevel 9 #指定压缩比

# Netscape 4.x has some problems.
BrowserMatch ^Mozilla/4 gzip-only-text/html #针对特定浏览器的特殊指定

# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip

# MSIE masquerades as Netscape, but it is fine
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html17、https
http over ssl = https 443/tcp
一般使用的协议ssl: v3  tls: v1
 
SSL会话的简化过程:
(1) 客户端发送可供选择的加密方式,并向服务器请求证书;

(2) 服务器端发送证书以及选定的加密方式给客户端;

(3) 客户端取得证书并进行证书验正:

如果信任给其发证书的CA:
(a) 验正证书来源的合法性;用CA的公钥解密证书上数字签名;

(b) 验正证书的内容的合法性:完整性验正

(c) 检查证书的有效期限;

(d) 检查证书是否被吊销;

(e) 证书中拥有者的名字,与访问的目标主机要一致;

(4) 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换;

(5) 服务用此密钥加密用户请求的资源,响应给客户端;
注意:SSL会话是基于IP地址创建;所以单IP的主机上,仅可以使用一个https虚拟主机;
 
(1) 为服务器申请数字证书;
测试:通过私建CA发证书
(a) 创建私有CA

(b) 在服务器创建证书签署请求

(c) CA签证

(2) 配置httpd支持使用ssl,及使用的证书;

# yum -y install mod_ssl
配置文件:/etc/httpd/conf.d/ssl.conf
DocumentRoot
ServerName
SSLCertificateFile
SSLCertificateKeyFile(3) 测试基于https访问相应的主机;
# openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]示例:在一台主机上既当CA又有http1、httpd上生成证书
# mkdir /etc/httpd/ssl
# cd /etc/httpd/ssl
# (umask 077;openssl genrsa -out httpd.key 1024)
Generating RSA private key, 1024 bit long modulus
..........................................++++++
..............++++++
e is 65537 (0x10001)
[root@kvm ssl]# openssl req -new -key httpd.key -out httpd.csr -days 3655
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:BJ
Locality Name (eg, city) [Default City]:BJ
Organization Name (eg, company) [Default Company Ltd]:JLC
Organizational Unit Name (eg, section) []:JSB
Common Name (eg, your name or your server's hostname) []:www.bjwf.com
Email Address []:admin@bjwf.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
2、自建CA
# cd /etc/pki/CA
# (umask 077;openssl genrsa -out private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus
...............................................................+++
......+++
e is 65537 (0x10001)
[root@kvm CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3655
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:BJ
Locality Name (eg, city) [Default City]:BJ
Organization Name (eg, company) [Default Company Ltd]:JLC
Organizational Unit Name (eg, section) []:JSB
Common Name (eg, your name or your server's hostname) []:ca.bjwf.com
Email Address []:ca@bjwf.com
# touch index.txt serial #准备文件
# echo 01 > serial
# openssl ca -in httpd.csr -out httpd.crt -days 365 #CA签署证书
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Jun 23 08:06:22 2016 GMT
Not After : Jun 23 08:06:22 2017 GMT
Subject:
countryName = CN
stateOrProvinceName = BJ
organizationName = JLC
organizationalUnitName = JSB
commonName = www.bjwf.com
emailAddress = admin@bjwf.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
83:60:A6:B7:E5:EF:E1:50:A6:69:E2:BD:3A:60:50:AF:A6:36:1B:39
X509v3 Authority Key Identifier:
keyid:B2:5F:33:01:B3:1A:B5:B9:2B:0F:C0:A5:37:48:AE:FD:3E:49:09:5F

Certificate is to be certified until Jun 23 08:06:22 2017 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
3、配置https
# yum -y install mod_ssl
# cd /etc/httpd/conf.d
# vim ssl.conf
<VirtualHost 192.168.130.250:443>
...
DocumentRoot "/var/www/html/a.com"
ServerName a.com:443
...
SSLCertificateFile /etc/httpd/ssl/httpd.crt #指明服务器证书的位置
...
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key #指明服务器密钥的位置
...
</VirtualHost>
# httpd -t
Syntax OK
# service httpd restart #查看https服务端口是否监听
停止 httpd: [确定]
正在启动 httpd: [确定]
[root@kvm conf.d]# netstat -tnlp|grep 443
tcp 0 0 :::443 :::* LISTEN 15378/httpd
# openssl s_client -connect 192.168.130.250:443 -CAfile /etc/pki/CA/cacert.pem
CONNECTED(00000003)
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 1024 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES256-GCM-SHA384
Session-ID: 82D9C7A1676D82AB28F73C8C0A6322A023689B8F73491E3E78B73F7E
Session-ID-ctx:
Master-Key: 340D147D1F4B479A0226EC9708728C9D872BFAF1B20B02C3403C9EDA98578D4
Key-Arg : None
Krb5 Principal: None
PSK identity: None
PSK identity hint: None
TLS session ticket lifetime hint: 300 (seconds)
TLS session ticket:
0000 - 31 a3 1a 34 ba e5 11 99-77 6e e2 86 7b dc cf 3f 1..4....wn..{..?
0010 - d0 a9 3f 22 f0 77 4e ec-31 52 6b dd a7 70 41 44 ..?".wN.1Rk..pAD
0020 - e9 02 25 1f ee 24 56 d3-77 ac 56 10 e7 99 12 63 ..%..$V.w.V....c
0030 - 2e 8c d9 09 15 32 59 21-46 17 8e 77 de 0f ff e8 .....2Y!F..w....
0040 - 31 b4 e1 57 63 02 09 a1-31 42 8f f2 3f e3 49 c6 1..Wc...1B..?.I.
0050 - e7 66 ee 95 8b 1c 6a 7f-cc 8e 9b 5e 83 c2 c9 2f .f....j....^.../
0060 - 8e 26 62 1b 0b 39 4b 79-50 80 5e de c6 dc 01 f9 .&b..9KyP.^.....
0070 - 81 16 c7 3b 5a 90 3a a2-85 27 b4 7c ea 20 d5 83 ...;Z.:..'.|. ..
0080 - 7e fe 9f 37 8b b3 66 3e-e1 e8 a6 fd 32 9b d0 82 ~..7..f>....2...
0090 - 9f b0 be 7e a4 cf cf 6d-85 0d 93 ca 2b 70 c5 cf ...~...m....+p..
00a0 - 55 57 07 f7 bc fc 1d a2-df 30 d0 b6 05 6c 25 15 UW.......0...l%.
00b0 - ee 32 51 6c 87 51 25 b9-55 3b 96 d3 50 4a 03 b6 .2Ql.Q%.U;..PJ..

Start Time: 1466669780
Timeout : 300 (sec)
Verify return code: 0 (ok)
---

GET /index.html HTTP/1.1
HOST: www.a.com

HTTP/1.1 200 OK
Date: Thu, 23 Jun 2016 08:16:51 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Thu, 23 Jun 2016 06:27:07 GMT
ETag: "260639-6-535ec24af4cd1"
Accept-Ranges: bytes
Content-Length: 6
Connection: close
Content-Type: text/html; charset=UTF-8

a.com
closed




二、httpd自带工具

1、httpd:apache服务器程序
常用选项:
-t:测试配置文件
-l:显示静态编译进httpd的模块
-D DUMP_MODULES:列出DSO模块
-M:相当于-t -D DUMP_MODULES
-D DUMP_VHOSTS:列出所有虚拟主机
2、htpasswd:为基于文件的basic认证创建和更新用户认证文件
常用选项:
-c:创建一个passwdfile,如果passwdfile已经存在,那么它会重新写入并删除所有内容
-m:以md5的格式编码存储用户的密码信息
-s:sha1加密用户密码
-D:删除指定用户
3、apachectl:脚本,httpd服务控制工具
常用选项:
start:启用服务
stop:关闭服务
status:查看服务
configtest:测试服务配置文件
4、ab:apache benchmark,httpd的基准性能测试工具
用法:ab [options] [http[s]://]hostname[:port]/path/to/somefile
常用选项:
-c #:模拟的并发数
-n #:模拟的请求数,-n的值一定要大于等于-c的值
同类工具:http_load,webbench,seige
5、apxs:httpd得以扩展使用第三方模块的工具
6、htcacheclean:磁盘缓存清理工具
7、htdigest:为digest认证创建和更新用户认证文件
8、httxt2dbm:为rewrite map创建dbm格式的文件
9、rotatelogs:滚动日志,不关闭httpd而切换其使用日志文件的工具
access_log, access_log.1, access_log.2,
10、suexec:当httpd进程需要以另外的用户的身份去访问某些资源时,可以以suexec作临时切换;
 

三、资源限定

软限定:可临时超出一定时长的上限
硬限定:绝对不可超出的上限可以使用ulimit命令临时的修改各种资源的软限制:
ulimit -n [#]:显示或设置能同事打开的文件句柄数
linux内核允许普通用户最多同时打开1024个文件
ulimit -u [#]:显示或设备能同时启动的进程数
ulimit -a:显示当前资源限定的设定
要长期有效,需要修改配置文件
/etc/security/limits.conf
/etc/security/limits.d/*.conf

更多选项:参考博客文档收集
ulimit -a 用来显示当前的各种用户进程限制。
Linux对于每个用户,系统限制其最大进程数。为提高性能,可以根据设备资源情况,设置各linux用户
的最大进程数,下面我把某linux用户的最大进程数设为10000个:
ulimit -u 10000
其他建议设置成无限制(unlimited)的一些重要设置是:
数据段长度:ulimit -d unlimited
最大内存大小:ulimit -m unlimited
堆栈大小:ulimit -s unlimited
CPU 时间:ulimit -t unlimited
虚拟内存:ulimit -v unlimited
linux对用户有默认的ulimit限制,而这个文件可以配置用户的硬配置和软配置,硬配置是个上限。
超出上限的修改就会出“不允许的操作”这样的错误。


# ulimit -n
1024
# ulimit -n 65535
# ulimit -n
65535

#<domain> <type> <item> <value>
#

#* soft core 0
#* hard rss 10000
#@student hard nproc 20
#@faculty soft nproc 20
#@faculty hard nproc 50
#ftp hard nproc 0
#@student - maxlogins 4

# End of file
* soft noproc 10240
* hard noproc 10240
* soft nofile 10240
* hard nofile 10240 这就可以限定用户打开的最大线程及文件为10240个
 

四、AB测试

# ab -c 300 -n 3000 http://www.a.com/index.html
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking www.a.com (be patient)
Completed 300 requests
Completed 600 requests
Completed 900 requests
Completed 1200 requests
Completed 1500 requests
Completed 1800 requests
Completed 2100 requests
Completed 2400 requests
Completed 2700 requests
Completed 3000 requests
Finished 3000 requests


Server Software: Apache/2.2.15
Server Hostname: www.a.com
Server Port: 80

Document Path: /index.html
Document Length: 6 bytes #请求的资源大小

Concurrency Level: 300 #并发数
Time taken for tests: 0.630 seconds #测试的总时长
Complete requests: 3000 #请求总数
Failed requests: 0 #失败的请求
Write errors: 0
Total transferred: 816272 bytes #总共传输了多少字节
HTML transferred: 18006 bytes #整个场景中HTML内容传输量
Requests per second: 4760.79 [#/sec] (mean) #每秒处理的请求个数
Time per request: 63.015 [ms] (mean) #每处理一个并发单位所经过的时长
Time per request: 0.210 [ms] (mean, across all concurrent requests) #处理单个请求的时长
Transfer rate: 1265.01 [Kbytes/sec] received #传输速率

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 2 3.4 1 16
Processing: 1 47 129.2 18 608
Waiting: 1 47 129.2 18 608
Total: 8 49 131.4 19 619

Percentage of the requests served within a certain time (ms)
50% 19
66% 19
75% 20
80% 20
90% 21
95% 617
98% 618
99% 618
100% 619 (longest request)原文地址:http://79076431.blog.51cto.com/8977042/1792118   查看全部


一、常用配置


1、修改监听的IP和Port
Listen[IP:]PORT
Listen 12.24.34.56:80
Listen 8080
# 省略ip表示监听本机所有IP;Listen可重复出现多次;
2、持久连接
KeepAive On # 开启
MaxKeepAliveRequests 0 # 一个持久TCP最多允许的请求数,这里设置0表示不限制)
KeepAliveTimeout 15 # 表示15秒
KeepAlive是什么东西?它是http协议的一部分,让我们复习一下没有KeepAlive的http请求,从客户在浏览器输入一个有效url地址开始,浏览器就会利用socket向url对应的web服务器发送一条TCP请求,这个请求成功一次就得需要来回握三次手才能确定,成功以后,浏览器利用socket TCP连接资源向web服务器请求http协议,发送以后就等着web服务器把http返回头和body发送回来,发回来后浏览器关闭socket连接,然后做http返回头和body的解析工作,最后呈现在浏览器上的就是漂亮的页面了。这里面有什么问题呢?TCP连接需要三次握手,也就是来回请求三次方能确定一个TCP请求是否成功,然后TCP关闭呢?来回需要4次请求才能完成!每次http请求就3次握手,4次拜拜,这来来回回的不嫌累啊,多少时间和资源都被浪费在socket连接关闭上了,能不能一次socket TCP连接发送多次http请求呢?于是KeepAlive就应运而生,http/1.0里需要客户端自己在请求头加入Connection:Keep-alive方能实现,在这里我们只考虑http1.1了,只需要设置一下Apache,让它默认就是Keep-Alive持久连接模式(Apache必须1.2+才能支持Keep-Alive)。在httpd.conf里找到KeepAive配置项,果断设置为On,MaxKeepAliveRequests果断为0(一个持久TCP最多允许的请求数,如果过小,很容易在TCP未过期的情况下,达到最大连接,那下次连接就又是新的TCP连接了,这里设置0表示不限制),然后对于mysql_pconnect最重要的选项KeepAliveTimeout设置为15(表示15秒), httpd-2.4支持毫秒级持久时间。
测试:
<?php
echo "Apache进程号:". getmypid();
?>
很简单,获取当前PHP执行者(Apache)的进程号,用浏览器浏览这个页面,看到什么?对,有看到一串进程号数字,15秒内,连续刷新页面,看看进程号有无变化?木有吧?现在把手拿开,交叉在胸前,度好时间,1秒,2秒,3,...15,16。好,过了15秒了,再去刷新页面,进程号有没有变化?变了!又是一个新的Apache进程了,为什么15秒后就变成新的进程了?记得我们在Apache里设置的KeepAliveTimeout吗?它的值就是15秒。现在我们应该大致清楚了,在web服务器默认打开KeepAlive的情况下,客户端第一次http成功请求后,Apache不会立刻断开socket,而是一直监听来自这一客户端的请求,监听多久?根据KeepAliveTimeout选项配置的时间决定,一旦超过这一时间,Apache就会断开socket了,那么下次同一客户端再次请求,Apache就会新开一个进程来相应。所以我们之前15内不停的刷新页面,看到的进程号都是一致的,表明是浏览器请求给了同一个Apache进程。

浏览器是怎么知道不需要重新进行TCP连接就可以直接发送http请求呢?因为http返回头里就会带上Connection:keep-alive,Keep-alive:15两行,意思就是让客户端浏览器明白,这次socket连接我这边还没关闭呢,你可以在15内继续使用这个连接,并发送http请求,于是乎浏览器就知道应该怎么做了。
 
3、MPM参数
MultipathProcessModule:多道处理模块
prefork,worker,event
<IfModule prefork.c>
StartServers 8 #服务启动时启动的子进程数
MinSpareServers 5 #最少空闲子进程数
MaxSpareServers 20
ServerLimit 256 #同时启动的子进程数上限
MaxClients 256 #同时服务的客户端数上限(支持的并发数上限)
MaxRequestsPerChild 4000 #每个子进程在其生命周期内处理的请求数上限
</IfModule>

<IfModule worker.c>
StartServers 4 #服务启动时启动的子进程数
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25 #每个子进程可启动的线程数
MaxRequestsPerChild 0 #每个子进程可处理的请求数,0表示无限制
</IfModule>
4、DSO
配置指令实现模块加载
LoadModule <mod_name> <mod_path>
#要卸载某个模块直接将其注释掉即可,不用重读配置文件就可立即生效;模块路径为相对于ServerRoot而言的路径
显示DSO动态装载的模块:
# httpd -D DUMP_MODULES
Loaded Modules:
core_module (static)
mpm_prefork_module (static)
http_module (static)
so_module (static)
auth_basic_module (shared)
auth_digest_module (shared)
authn_file_module (shared)
authn_alias_module (shared)
...
# httpd -l
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c
# httpd.worker -l
Compiled in modules:
core.c
worker.c
http_core.c
mod_so.c
5、定义'Main'server的文档页面路径
DocumentRoot "/path/to/somefile"
文档路径映射:
DocumentRoot 指向的路径为URL路径的起始位置;
DocumentRoot "/var/www/html" #默认为这个位置
test/index.html-->http://HOST:PORT/test/index.html
6、站点访问控制
可基于两种类型的路径指明对哪些资源进行访问控制
文件系统路径:
<Directory "/path/to/somewhere">
...
</Direcotry>
<File [~] "/path/to/somewhere">
...
</File>
基于URL访问路径做访问控制:
<Location"">
...
</Location>
#另外,路径可做模式匹配,但若非迫不得已不建议使用
#如果即能使用Diretoory控制,也能使用Location控制,建议使用Directory
7、Directory中“基于来源地址”实现访问控制
(1)Options
所有可用特性:Indexes,Includes,FollowSymLinks,SymLinksifOwnerMatch
ExecCGI,MultiViews,None,All
Indexes:索引;在无默认主页面又无欢迎页时,将所有资源以列表形式呈现给用户。
危险,慎用;在选项前添加减号即为禁用。如-Indexes
FollowSymlinks:允许跟踪符号链接文件;
# vim /etc/httpd/conf/httpd.conf
<Directory "/www/html">
Options Indexes FollowSymLinks #默认是开启的
AllowOverride None
Order allow,deny
Allow from all
</Directory>
(2)AllowOverride
支持在每个页面目录下创建.htaccess用于实现对此目录中资源访问时的访问控制功能;
.htaccess文件会影响httpd的性能
(3)基于IP做访问控制机制
Order:检查次序
Order allow,deny
Allow form 192.168.10.0/24
form后面能够接受的地址格式:
IP,Network Address
网络地址格式较为灵活:
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
8、定义默认主页面
DirecotryIndex index.htm lindex.html.var
9、日志设定
ErrorLog "/path/to/error_log"   #错误日志,路径为相对于ServerRoot而言的路径
LogLevel {debug|info|notice|warn|error|crit|alert|emerg}
指定级别及比其更高级别的信息都会被记录
LogFormat 格式 格式名
%h: 客户端地址
%l: 远程登录名,通常为-
%u: 认证时输入用户名,没有认证时为-
%t: 服务器收到 用户请求时的时间
%r:请求报名的起始行
%>s: 响应状态码
%b: 响应报文的长度,单位是字节
%{HEADER_NAME}i: 记录指定首部对应的值
例如 LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
#格式中若要使用引号则要使用反斜线转义
CustomLog "/path/to/access_log" LogFormat_Name
10、路径别名
实现URL路径的映射,从而所访问的资源不再依赖于站点根目录。
Alias /URL/ "/path/to/somewhere/"
例如 Alias /images/ "/www/tupian/" #后面映射的路径是绝对路径,而不是相对于站点根目录而言的路径;此时若站点根目录(以/var/www/html为例)下也有一个images目录,那么将无法访问/var/www/html/images中的资源,因为images已被别名征用
# mkdir test hello
# cat test/a.html
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
# cat hello/b.html
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
# vim /etc/httpd/conf/httpd.conf
Alias /test/ "/www/html/hello/"
# service httpd restart
停止 httpd: [确定]
正在启动 httpd: [确定]

# curl http://localhost/test/a.html
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /test/a.html was not found on this server.</p>
<hr>
<address>Apache/2.2.15 (CentOS) Server at localhost Port 80</address>
</body></html>
# curl http://localhost/test/b.html
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
11、设定默认字符集
AddDefaultCharset UTF-8
# 字符集:GBK,GB2312,GB18030
12、基于用户的访问控制
用户认证类型:
基本认证:Basic,明文发送
摘要认证:digest
虚拟用户:仅用于访问某服务或获取某资源的凭证;
账号和密码的存储机制:
文本文件:.htpasswd
SQL数据库
dbm:数据库引擎,提供API
ldap:
案例:基于文件做访问控制
(1)基于用户进行认证
<Directory />
Options none
AllowOverride AuthConfig
AuthType Basic
AuthName "admin area"
AuthBasicProvider file
AuthUserFile /etc/httpd/conf/.htpasswd
Require valid-user
</Directory>
# Require valid-user:文件中所有用户均可访问
# Require user USERNAME,... 指定用户访问
(2)提供认证文件
htpasswd [option] passwdfile username
选项:
-c:创建一个passwdfile,如果passwdfile已经存在,那么它会重新写入并删除原有内容
-m:以md5的格式编码存储用户的密码信息
-s:sha1加密用户密码;
-D:删除指定用户
(3)基于组认证
<Directory />
Options none
AllowOverride AuthConfig
AuthType Basic
AuthName "admin area"
AuthBasicProvider file
AuthUserFile /etc/httpd/conf/.htpasswd
AuthGroupFile /etc/httpd/conf/.htgroup
Require group GROUP_NAME
</Directory>
组文件(.htgroup)格式 组名:user1 user2 user3
例如:
# cd /var/www/html
# mkdir admin
# cat admin/admin.html
The user is admin.
# vim /etc/httpd/conf/httpd.conf
<Directory "/var/www/html/admin">
Options none
AllowOverride AuthConfig
AuthType Basic
AuthName "admin area"
AuthBasicProvider file
AuthUserFile /etc/httpd/conf/.htpasswd
Require valid-user
</Directory>
# htpasswd -c -m /etc/httpd/conf/.htpasswd bjwf #创建第一个用户时必须创建文件
New password:
Re-type new password:
Adding password for user bjwf
# htpasswd -m /etc/httpd/conf/.htpasswd tom #创建第二个用户
New password:
Re-type new password:
Adding password for user tom
# service httpd restart
authes.png

13、虚拟主机
有三种实现方案:
基于ip:为每个虚拟主机准备至少一个ip地址;
基于port:为每个虚拟主机准备至少一个专用port;实践中很少使用;
基于hostname:为每个虚拟主机准备至少一个专用hostname;
可混合使用上述三种方式中任意方式;
注意:一般虚拟主机莫与中心主机混用,所以,要使用虚拟主机,先禁用中心主机;
禁用中心主机:注释DocumentRoot
每个虚拟主机都有专用配置:
<VirtualHost"IP:PORT">
SeverName
DocumentRoot""
</VirtualHost>
ServerAlias:虚拟主机的别名;
ErrorLog
CustomLog
<Directory"">
</Directory>

示例1:基于ip
<VirtualHost172.16.100.6:80>
ServerName web1.magedu.com
DocumentRoot"/vhosts/web1/htdocs"
</VirtualHost>

<VirtualHost172.16.100.7:80>
ServerName web2.magedu.com
DocumentRoot "/vhosts/web2/htdocs"
</VirtualHost>
示例2:基于port
<VirtualHost172.16.100.7:80>
ServerNameweb2.magedu.com
DocumentRoot"/vhosts/web2/htdocs"
</VirtualHost>

<VirtualHost 172.16.100.7:8080>
ServerName web3.magedu.com
DocumentRoot "/vhosts/web3/htdocs"
</VirtualHost>
示例3:基于hostname
<VirtualHost 172.16.100.6:80>
ServerName web1.magedu.com
DocumentRoot "/vhosts/web1/htdocs"
</VirtualHost>

<VirtualHost 172.16.100.6:80>
ServerName web2.magedu.com
DocumentRoot "/vhosts/web2/htdocs"
</VirtualHost>

<VirtualHost 172.16.100.6:80>
ServerName web3.magedu.com
DocumentRoot "/vhosts/web3/htdocs"
</VirtualHost>
#注:一般要启用虚拟主机,最好是新建一个文档在/etc/httpd/conf.d/vhost.conf里面,这样一来虚拟主机
设定的参数可以随便修改,而且不会影响到主配置文件,而主配置文件httpd.conf中有个include的参数可以
将/etc/httpd/conf.d/*.conf都包含进来。
示例:
# mkdir /var/www/html/{a.com,b.net,c.org} -pv
mkdir: 已创建目录 "/var/www/html/a.com"
mkdir: 已创建目录 "/var/www/html/b.net"
mkdir: 已创建目录 "/var/www/html/c.org"
# echo a.com > /var/www/html/a.com/index.html
# echo b.net > /var/www/html/b.net/index.html
# echo c.org > /var/www/html/c.org/index.html
# cat vhost.conf (基于IP的虚拟主机)
<VirtualHost 192.168.130.250:80>
ServerName www.a.com
DocumentRoot "/var/www/html/a.com"
</VirtualHost>

<VirtualHost 192.168.130.251:80>
ServerName www.b.net
DocumentRoot "/var/www/html/b.net"
</VirtualHost>

<VirtualHost 192.168.130.252:80>
ServerName www.c.org
DocumentRoot "/var/www/html/c.org"
</VirtualHost>
# curl http://192.168.130.250
a.com
# curl http://192.168.130.251
b.net
# curl http://192.168.130.252
c.org

# cat vhost.conf (基于主机名的虚拟主机)
NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.a.com
DocumentRoot "/var/www/html/a.com"
</VirtualHost>

<VirtualHost *:80>
ServerName www.b.net
DocumentRoot "/var/www/html/b.net"
</VirtualHost>

<VirtualHost *:80>
ServerName www.c.org
DocumentRoot "/var/www/html/c.org"
</VirtualHost>
# cat /etc/hosts
192.168.130.250 kvm.jlc.com
192.168.130.250 www.a.com
192.168.130.250 www.b.net
192.168.130.250 www.c.org
# curl http://www.a.com
a.com
# curl http://www.b.net
b.net
# curl http://www.c.org
c.org
14、内置的status页面
handler:当文件被调用时,apache的内部表现形式,一般每种文件类型都有其隐式处理器
httpd内嵌有handler,其中有一个handler(server-status)用于输出当前httpd服务相关状态信息
启用handler要使用SetHandler指定
# vim httpd.conf 
<Location /server-status>
SetHandler server-status
Order allow,deny
Allow from 192.168.130.0/24
Allow from 192.168.120.0/24
Deny from all
</Location>
# httpd -t #检查配置文件语法
Syntax OK
# service httpd reload
AapachStatus.png

15、curl命令
curl是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP,FTPS,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE及LDAP等协议。curl支持HTTPS认证,并且支持HTTP的POST、PUT等方法,FTP上传,kerberos认证,HTTP上传,代理服务器,cookies,用户名/密码认证,下载文件断点续传,上载文件断点续传,http代理服务器管道(proxy tunneling),甚至它还支持IPv6,socks5代理服务器,通过http代理服务器上传文件到FTP服务器等,功能十分强大。
用法:curl [option] URL
常用选项:
-A/--user-agent <string> 设置用户代理发送给服务器
-basic 使用HTTP基本认证
--tcp-nodelay 使用TCP_NODELAY选项
-e/--referer <URL> 来源网址
--cacert <file> CA证书 (SSL)
--compressed 要求返回是压缩的格式
-H/--header <line>自定义首部信息传递给服务器
-I/--head 只显示响应报文首部信息
--limit-rate <rate> 设置传输速度
-u/--user <user[:password]>设置服务器的用户和密码
-0/--http1.0 使用HTTP 1.0
16、使用mod_deflate模块压缩页面优化传输速度
SetOutputFilter DEFLATE
# mod_deflate configuration

# Restrict compression to these MIME types
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/css

# Level of compression (Highest 9 - Lowest 1)
DeflateCompressionLevel 9 #指定压缩比

# Netscape 4.x has some problems.
BrowserMatch ^Mozilla/4 gzip-only-text/html #针对特定浏览器的特殊指定

# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip

# MSIE masquerades as Netscape, but it is fine
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
17、https
http over ssl = https 443/tcp
一般使用的协议ssl: v3  tls: v1
 
SSL会话的简化过程:
(1) 客户端发送可供选择的加密方式,并向服务器请求证书;

(2) 服务器端发送证书以及选定的加密方式给客户端;

(3) 客户端取得证书并进行证书验正:

如果信任给其发证书的CA:
(a) 验正证书来源的合法性;用CA的公钥解密证书上数字签名;

(b) 验正证书的内容的合法性:完整性验正

(c) 检查证书的有效期限;

(d) 检查证书是否被吊销;

(e) 证书中拥有者的名字,与访问的目标主机要一致;

(4) 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换;

(5) 服务用此密钥加密用户请求的资源,响应给客户端;
注意:SSL会话是基于IP地址创建;所以单IP的主机上,仅可以使用一个https虚拟主机;
 
(1) 为服务器申请数字证书;
测试:通过私建CA发证书
(a) 创建私有CA

(b) 在服务器创建证书签署请求

(c) CA签证

(2) 配置httpd支持使用ssl,及使用的证书;

# yum -y install mod_ssl
配置文件:/etc/httpd/conf.d/ssl.conf
DocumentRoot
ServerName
SSLCertificateFile
SSLCertificateKeyFile
(3) 测试基于https访问相应的主机;
# openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]
示例:在一台主机上既当CA又有http
1、httpd上生成证书
# mkdir /etc/httpd/ssl
# cd /etc/httpd/ssl
# (umask 077;openssl genrsa -out httpd.key 1024)
Generating RSA private key, 1024 bit long modulus
..........................................++++++
..............++++++
e is 65537 (0x10001)
[root@kvm ssl]# openssl req -new -key httpd.key -out httpd.csr -days 3655
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:BJ
Locality Name (eg, city) [Default City]:BJ
Organization Name (eg, company) [Default Company Ltd]:JLC
Organizational Unit Name (eg, section) []:JSB
Common Name (eg, your name or your server's hostname) []:www.bjwf.com
Email Address []:admin@bjwf.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
2、自建CA
# cd /etc/pki/CA
# (umask 077;openssl genrsa -out private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus
...............................................................+++
......+++
e is 65537 (0x10001)
[root@kvm CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3655
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:BJ
Locality Name (eg, city) [Default City]:BJ
Organization Name (eg, company) [Default Company Ltd]:JLC
Organizational Unit Name (eg, section) []:JSB
Common Name (eg, your name or your server's hostname) []:ca.bjwf.com
Email Address []:ca@bjwf.com
# touch index.txt serial #准备文件
# echo 01 > serial
# openssl ca -in httpd.csr -out httpd.crt -days 365 #CA签署证书
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Jun 23 08:06:22 2016 GMT
Not After : Jun 23 08:06:22 2017 GMT
Subject:
countryName = CN
stateOrProvinceName = BJ
organizationName = JLC
organizationalUnitName = JSB
commonName = www.bjwf.com
emailAddress = admin@bjwf.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
83:60:A6:B7:E5:EF:E1:50:A6:69:E2:BD:3A:60:50:AF:A6:36:1B:39
X509v3 Authority Key Identifier:
keyid:B2:5F:33:01:B3:1A:B5:B9:2B:0F:C0:A5:37:48:AE:FD:3E:49:09:5F

Certificate is to be certified until Jun 23 08:06:22 2017 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
3、配置https
# yum -y install mod_ssl
# cd /etc/httpd/conf.d
# vim ssl.conf
<VirtualHost 192.168.130.250:443>
...
DocumentRoot "/var/www/html/a.com"
ServerName a.com:443
...
SSLCertificateFile /etc/httpd/ssl/httpd.crt #指明服务器证书的位置
...
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key #指明服务器密钥的位置
...
</VirtualHost>
# httpd -t
Syntax OK
# service httpd restart #查看https服务端口是否监听
停止 httpd: [确定]
正在启动 httpd: [确定]
[root@kvm conf.d]# netstat -tnlp|grep 443
tcp 0 0 :::443 :::* LISTEN 15378/httpd
# openssl s_client -connect 192.168.130.250:443 -CAfile /etc/pki/CA/cacert.pem
CONNECTED(00000003)
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 1024 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES256-GCM-SHA384
Session-ID: 82D9C7A1676D82AB28F73C8C0A6322A023689B8F73491E3E78B73F7E
Session-ID-ctx:
Master-Key: 340D147D1F4B479A0226EC9708728C9D872BFAF1B20B02C3403C9EDA98578D4
Key-Arg : None
Krb5 Principal: None
PSK identity: None
PSK identity hint: None
TLS session ticket lifetime hint: 300 (seconds)
TLS session ticket:
0000 - 31 a3 1a 34 ba e5 11 99-77 6e e2 86 7b dc cf 3f 1..4....wn..{..?
0010 - d0 a9 3f 22 f0 77 4e ec-31 52 6b dd a7 70 41 44 ..?".wN.1Rk..pAD
0020 - e9 02 25 1f ee 24 56 d3-77 ac 56 10 e7 99 12 63 ..%..$V.w.V....c
0030 - 2e 8c d9 09 15 32 59 21-46 17 8e 77 de 0f ff e8 .....2Y!F..w....
0040 - 31 b4 e1 57 63 02 09 a1-31 42 8f f2 3f e3 49 c6 1..Wc...1B..?.I.
0050 - e7 66 ee 95 8b 1c 6a 7f-cc 8e 9b 5e 83 c2 c9 2f .f....j....^.../
0060 - 8e 26 62 1b 0b 39 4b 79-50 80 5e de c6 dc 01 f9 .&b..9KyP.^.....
0070 - 81 16 c7 3b 5a 90 3a a2-85 27 b4 7c ea 20 d5 83 ...;Z.:..'.|. ..
0080 - 7e fe 9f 37 8b b3 66 3e-e1 e8 a6 fd 32 9b d0 82 ~..7..f>....2...
0090 - 9f b0 be 7e a4 cf cf 6d-85 0d 93 ca 2b 70 c5 cf ...~...m....+p..
00a0 - 55 57 07 f7 bc fc 1d a2-df 30 d0 b6 05 6c 25 15 UW.......0...l%.
00b0 - ee 32 51 6c 87 51 25 b9-55 3b 96 d3 50 4a 03 b6 .2Ql.Q%.U;..PJ..

Start Time: 1466669780
Timeout : 300 (sec)
Verify return code: 0 (ok)
---

GET /index.html HTTP/1.1
HOST: www.a.com

HTTP/1.1 200 OK
Date: Thu, 23 Jun 2016 08:16:51 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Thu, 23 Jun 2016 06:27:07 GMT
ETag: "260639-6-535ec24af4cd1"
Accept-Ranges: bytes
Content-Length: 6
Connection: close
Content-Type: text/html; charset=UTF-8

a.com
closed
CAError.png


二、httpd自带工具


1、httpd:apache服务器程序
常用选项:
-t:测试配置文件
-l:显示静态编译进httpd的模块
-D DUMP_MODULES:列出DSO模块
-M:相当于-t -D DUMP_MODULES
-D DUMP_VHOSTS:列出所有虚拟主机
2、htpasswd:为基于文件的basic认证创建和更新用户认证文件
常用选项:
-c:创建一个passwdfile,如果passwdfile已经存在,那么它会重新写入并删除所有内容
-m:以md5的格式编码存储用户的密码信息
-s:sha1加密用户密码
-D:删除指定用户
3、apachectl:脚本,httpd服务控制工具
常用选项:
start:启用服务
stop:关闭服务
status:查看服务
configtest:测试服务配置文件
4、ab:apache benchmark,httpd的基准性能测试工具
用法:ab [options] [http[s]://]hostname[:port]/path/to/somefile
常用选项:
-c #:模拟的并发数
-n #:模拟的请求数,-n的值一定要大于等于-c的值
同类工具:http_load,webbench,seige
5、apxs:httpd得以扩展使用第三方模块的工具
6、htcacheclean:磁盘缓存清理工具
7、htdigest:为digest认证创建和更新用户认证文件
8、httxt2dbm:为rewrite map创建dbm格式的文件
9、rotatelogs:滚动日志,不关闭httpd而切换其使用日志文件的工具
access_log, access_log.1, access_log.2,
10、suexec:当httpd进程需要以另外的用户的身份去访问某些资源时,可以以suexec作临时切换;

 


三、资源限定


软限定:可临时超出一定时长的上限
硬限定:绝对不可超出的上限
可以使用ulimit命令临时的修改各种资源的软限制:
ulimit -n [#]:显示或设置能同事打开的文件句柄数
linux内核允许普通用户最多同时打开1024个文件
ulimit -u [#]:显示或设备能同时启动的进程数
ulimit -a:显示当前资源限定的设定
要长期有效,需要修改配置文件
/etc/security/limits.conf
/etc/security/limits.d/*.conf

更多选项:参考博客文档收集
ulimit -a 用来显示当前的各种用户进程限制。
Linux对于每个用户,系统限制其最大进程数。为提高性能,可以根据设备资源情况,设置各linux用户
的最大进程数,下面我把某linux用户的最大进程数设为10000个:
ulimit -u 10000
其他建议设置成无限制(unlimited)的一些重要设置是:
数据段长度:ulimit -d unlimited
最大内存大小:ulimit -m unlimited
堆栈大小:ulimit -s unlimited
CPU 时间:ulimit -t unlimited
虚拟内存:ulimit -v unlimited
linux对用户有默认的ulimit限制,而这个文件可以配置用户的硬配置和软配置,硬配置是个上限。
超出上限的修改就会出“不允许的操作”这样的错误。


# ulimit -n
1024
# ulimit -n 65535
# ulimit -n
65535

#<domain> <type> <item> <value>
#

#* soft core 0
#* hard rss 10000
#@student hard nproc 20
#@faculty soft nproc 20
#@faculty hard nproc 50
#ftp hard nproc 0
#@student - maxlogins 4

# End of file
* soft noproc 10240
* hard noproc 10240
* soft nofile 10240
* hard nofile 10240 这就可以限定用户打开的最大线程及文件为10240个

 


四、AB测试


# ab -c 300 -n 3000 http://www.a.com/index.html
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking www.a.com (be patient)
Completed 300 requests
Completed 600 requests
Completed 900 requests
Completed 1200 requests
Completed 1500 requests
Completed 1800 requests
Completed 2100 requests
Completed 2400 requests
Completed 2700 requests
Completed 3000 requests
Finished 3000 requests


Server Software: Apache/2.2.15
Server Hostname: www.a.com
Server Port: 80

Document Path: /index.html
Document Length: 6 bytes #请求的资源大小

Concurrency Level: 300 #并发数
Time taken for tests: 0.630 seconds #测试的总时长
Complete requests: 3000 #请求总数
Failed requests: 0 #失败的请求
Write errors: 0
Total transferred: 816272 bytes #总共传输了多少字节
HTML transferred: 18006 bytes #整个场景中HTML内容传输量
Requests per second: 4760.79 [#/sec] (mean) #每秒处理的请求个数
Time per request: 63.015 [ms] (mean) #每处理一个并发单位所经过的时长
Time per request: 0.210 [ms] (mean, across all concurrent requests) #处理单个请求的时长
Transfer rate: 1265.01 [Kbytes/sec] received #传输速率

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 2 3.4 1 16
Processing: 1 47 129.2 18 608
Waiting: 1 47 129.2 18 608
Total: 8 49 131.4 19 619

Percentage of the requests served within a certain time (ms)
50% 19
66% 19
75% 20
80% 20
90% 21
95% 617
98% 618
99% 618
100% 619 (longest request)
原文地址:http://79076431.blog.51cto.com/8977042/1792118  

Redis高可用架构之Sentinel

Geek小A 发表了文章 • 0 个评论 • 234 次浏览 • 2017-03-25 19:09 • 来自相关话题

一、背景​  
公司的业务在大量的使用redis,访问量大的业务我们有在使用codis集群,redis 3.0集群,说到redis 3.0集群,我们线上已经跑了半年多了,集群本身没有出现过任务问题,但是由于我们这个业务是海外的,集群建在aws的ec2上,由于ec2的网络抖动或者ec2本身的原因,导致主从切换,目前aws的技术正在跟进,这个集群目前的QPS 50w+,集群本身已经做到了高可用和横向扩展,但是,实际情况一些小的业务没必要上集群,单个实例就可以满足业务需求,那么我们就要想办法如何保证单个实例的高可用,最近也在看相关的文档,做一些测试,大家有在使用redis主从+lvs 漂VIP的方案,也有使用redis主从+哨兵 漂VIP的方案,甚至有在代码逻辑做故障切换等等,各种各样的方案都有,下面我介绍一下redis主从+ 哨兵 漂VIP的方案,后面我们打算线上大规模的使用这个方案。
 
二、环境
#redis
100.10.32.54:6400 主库
100.10.32.55:6400 从库
100.10.32.250 VIP

#sentinel
100.10.32.54:26400 sentinel 本地节点
100.10.32.55:26400 sentinel 本地节点
100.10.32.57:26400 sentinel 仲裁节点
三、部署
1、安装
yum -y install redis2、撰写redis配置文件(100.10.32.54 和100.10.32.55)
vim /etc/redis_6400.conf

daemonize yes
pidfile "/var/run/redis_6400.pid"
port 6400
tcp-backlog 65535
bind 0.0.0.0
timeout 0
tcp-keepalive 0
loglevel notice
logfile "/var/log/redis/redis_6400.log"
maxmemory 8gb
maxmemory-policy allkeys-lru
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
dir "/data/redis/6400"
slave-serve-stale-data yes
slave-read-only yes
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 1283、撰写sentinel配置文件(100.10.32.54 、100.10.32.55 和100.10.32.57)
vim /etc/redis-sentinel6400.conf

daemonize yes
port 26400
dir "/data/redis/redis_sentinels"
pidfile "/var/run/redis/sentinel6400.pid"
logfile "/data/redis/redis_sentinels/sentinel6400.log"
sentinel monitor master6400 100.10.32.54 6400 2
sentinel down-after-milliseconds master6400 6000
sentinel failover-timeout master6400 18000
sentinel client-reconfig-script master6400 /opt/notify_master6400.sh ##仲裁节点无需添加这行配置,client-reconfig-script参数是在sentinel做failover的过程中调用脚本漂vip到新的master上PS:
关于sentinel 的一些工作原理和参数说明,请参阅:http://redisdoc.com/topic/sentinel.html  
 
4、撰写漂VIP的脚本(100.10.32.54 、100.10.32.55)
vim /opt/notify_master6400.sh

#!/bin/bash
MASTER_IP=$6
LOCAL_IP='100.10.32.54' #从库修改为100.10.32.55
VIP='100.10.32.250'
NETMASK='24'
INTERFACE='eth0'
if [ ${MASTER_IP} = ${LOCAL_IP} ]; then
/sbin/ip addr add ${VIP}/${NETMASK} dev ${INTERFACE}
/sbin/arping -q -c 3 -A ${VIP} -I ${INTERFACE}
exit 0
else
/sbin/ip addr del ${VIP}/${NETMASK} dev ${INTERFACE}
exit 0
fi
exit 1chmod +x /opt/notify_master6400.sh #赋予可执行权限PS:
这里大概说一下这个脚本的工作原理,sentinel在做failover的 过程中会传出6个参数,分别是<master-name>、 <role>、 <state>、 <from-ip>、 <from-port>、 <to-ip> 、<to-port>,其中第6个参数from-ip也就是新的master的ip,对应脚本中的MASTER_IP,下面的if判断大家应该都很了然了,如果MASTER_IP=LOCAL_IP,那就绑定VIP,反之删除VIP。
 
5、启动redis服务(100.10.32.54、100.10.32.55)
redis-server /etc/redis_6400.conf6、初始化主从(100.10.32.55)
redis-cli -p 6400 slaveof 10.10.32.54 64007、绑定VIP到主库(100.10.32.54)
/sbin/ip addr add 100.10.32.250/24 dev eth08、启动sentinel服务(100.10.32.54、100.10.32.55、100.10.32.57)
redis-server /etc/redis-sentinel6400.conf --sentinel至此,整个高可用方案已经搭建完成。
 
[root@localhost tmp]# redis-cli -h 100.10.32.54 -p 6400 info Replication
# Replication
role:master
connected_slaves:1
slave0:ip=100.10.32.55,port=6400,state=online,offset=72669,lag=1
master_repl_offset:72669
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:72668[root@localhost tmp]# redis-cli -h 100.10.32.54 -p 26400 info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
master0:name=master6400,status=ok,address=100.10.32.54:6400,slaves=1,sentinels=3[root@localhost tmp]# ip a |grep eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
inet 100.10.32.54/24 brd 100.10.32.255 scope global eth0
inet 100.10.32.250/24 scope global secondary eth0
四、测试
1、把主库停掉
redis-cli -h 100.10.32.54 -p 6400 shutdown2、看从库是否提升为主库
[root@localhost tmp]# redis-cli -h 100.10.32.55 -p 6400 info Replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0看VIP是否漂移到100.10.32.55上
[root@localhost tmp]# ip a |grep eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
inet 100.10.32.55/24 brd 100.10.32.255 scope global eth0
inet 100.10.32.250/24 scope global secondary eth04、看Sentinel的监控状态
[root@localhost tmp]# redis-cli -p 26400 info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
master0:name=master6400,status=ok,address=100.10.32.55:6400,slaves=1,sentinels=3原文链接:http://navyaijm.blog.51cto.com/4647068/1745569  
参考学习:http://www.cnblogs.com/LiZhiW/p/4851631.html  查看全部
一、背景​  
公司的业务在大量的使用redis,访问量大的业务我们有在使用codis集群,redis 3.0集群,说到redis 3.0集群,我们线上已经跑了半年多了,集群本身没有出现过任务问题,但是由于我们这个业务是海外的,集群建在aws的ec2上,由于ec2的网络抖动或者ec2本身的原因,导致主从切换,目前aws的技术正在跟进,这个集群目前的QPS 50w+,集群本身已经做到了高可用和横向扩展,但是,实际情况一些小的业务没必要上集群,单个实例就可以满足业务需求,那么我们就要想办法如何保证单个实例的高可用,最近也在看相关的文档,做一些测试,大家有在使用redis主从+lvs 漂VIP的方案,也有使用redis主从+哨兵 漂VIP的方案,甚至有在代码逻辑做故障切换等等,各种各样的方案都有,下面我介绍一下redis主从+ 哨兵 漂VIP的方案,后面我们打算线上大规模的使用这个方案。
 
二、环境
#redis
100.10.32.54:6400 主库
100.10.32.55:6400 从库
100.10.32.250 VIP

#sentinel
100.10.32.54:26400 sentinel 本地节点
100.10.32.55:26400 sentinel 本地节点
100.10.32.57:26400 sentinel 仲裁节点

三、部署
1、安装
yum -y install redis
2、撰写redis配置文件(100.10.32.54 和100.10.32.55)
vim /etc/redis_6400.conf

daemonize yes
pidfile "/var/run/redis_6400.pid"
port 6400
tcp-backlog 65535
bind 0.0.0.0
timeout 0
tcp-keepalive 0
loglevel notice
logfile "/var/log/redis/redis_6400.log"
maxmemory 8gb
maxmemory-policy allkeys-lru
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
dir "/data/redis/6400"
slave-serve-stale-data yes
slave-read-only yes
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
3、撰写sentinel配置文件(100.10.32.54 、100.10.32.55 和100.10.32.57)
vim /etc/redis-sentinel6400.conf

daemonize yes
port 26400
dir "/data/redis/redis_sentinels"
pidfile "/var/run/redis/sentinel6400.pid"
logfile "/data/redis/redis_sentinels/sentinel6400.log"
sentinel monitor master6400 100.10.32.54 6400 2
sentinel down-after-milliseconds master6400 6000
sentinel failover-timeout master6400 18000
sentinel client-reconfig-script master6400 /opt/notify_master6400.sh ##仲裁节点无需添加这行配置,client-reconfig-script参数是在sentinel做failover的过程中调用脚本漂vip到新的master上
PS:
关于sentinel 的一些工作原理和参数说明,请参阅:http://redisdoc.com/topic/sentinel.html  
 
4、撰写漂VIP的脚本(100.10.32.54 、100.10.32.55)
vim /opt/notify_master6400.sh

#!/bin/bash
MASTER_IP=$6
LOCAL_IP='100.10.32.54' #从库修改为100.10.32.55
VIP='100.10.32.250'
NETMASK='24'
INTERFACE='eth0'
if [ ${MASTER_IP} = ${LOCAL_IP} ]; then
/sbin/ip addr add ${VIP}/${NETMASK} dev ${INTERFACE}
/sbin/arping -q -c 3 -A ${VIP} -I ${INTERFACE}
exit 0
else
/sbin/ip addr del ${VIP}/${NETMASK} dev ${INTERFACE}
exit 0
fi
exit 1
chmod +x /opt/notify_master6400.sh   #赋予可执行权限
PS:
这里大概说一下这个脚本的工作原理,sentinel在做failover的 过程中会传出6个参数,分别是<master-name>、 <role>、 <state>、 <from-ip>、 <from-port>、 <to-ip> 、<to-port>,其中第6个参数from-ip也就是新的master的ip,对应脚本中的MASTER_IP,下面的if判断大家应该都很了然了,如果MASTER_IP=LOCAL_IP,那就绑定VIP,反之删除VIP。
 
5、启动redis服务(100.10.32.54、100.10.32.55)
redis-server /etc/redis_6400.conf
6、初始化主从(100.10.32.55)
redis-cli -p 6400 slaveof 10.10.32.54 6400
7、绑定VIP到主库(100.10.32.54)
/sbin/ip addr add 100.10.32.250/24 dev eth0
8、启动sentinel服务(100.10.32.54、100.10.32.55、100.10.32.57)
redis-server /etc/redis-sentinel6400.conf --sentinel
至此,整个高可用方案已经搭建完成。
 
[root@localhost tmp]# redis-cli -h 100.10.32.54  -p 6400 info  Replication
# Replication
role:master
connected_slaves:1
slave0:ip=100.10.32.55,port=6400,state=online,offset=72669,lag=1
master_repl_offset:72669
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:72668
[root@localhost tmp]# redis-cli -h 100.10.32.54  -p 26400 info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
master0:name=master6400,status=ok,address=100.10.32.54:6400,slaves=1,sentinels=3
[root@localhost tmp]# ip a |grep eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
inet 100.10.32.54/24 brd 100.10.32.255 scope global eth0
inet 100.10.32.250/24 scope global secondary eth0

四、测试
1、把主库停掉
redis-cli -h 100.10.32.54  -p 6400 shutdown
2、看从库是否提升为主库
[root@localhost tmp]# redis-cli -h 100.10.32.55 -p 6400 info Replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
看VIP是否漂移到100.10.32.55上
[root@localhost tmp]# ip a |grep eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
inet 100.10.32.55/24 brd 100.10.32.255 scope global eth0
inet 100.10.32.250/24 scope global secondary eth0
4、看Sentinel的监控状态
[root@localhost tmp]# redis-cli -p 26400 info  Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
master0:name=master6400,status=ok,address=100.10.32.55:6400,slaves=1,sentinels=3
原文链接:http://navyaijm.blog.51cto.com/4647068/1745569  
参考学习:http://www.cnblogs.com/LiZhiW/p/4851631.html 

发送邮件常见错误总结

koyo 发表了文章 • 0 个评论 • 223 次浏览 • 2017-03-24 22:41 • 来自相关话题

情况1:550 Mail content denied这种是内容的问题,用户加服务器IP白名单就可以了。
 
情况2:550 Connection denied出错原因:该服务器IP的发信频率大幅度超过QQ邮箱限制。

情况3:550 Connection frequency limited出错原因:该服务器IP的发信频率超过腾讯邮箱限制。

情况4:550 5.5.0 Invalid EHLO/HELO domain原因:邮箱不存在
 
情况5:status=deferred用户把我们发送邮件当作垃圾邮件过滤掉了
 
情况6:host xxx.mail.eo.outlook.com[xxx.xxx.163.247] said: 550
5.7.1 Service unavailable; Client host [xxx.xxx.xxx..16] blocked using FBLW15;
To request removal from this list please forward this message to
delist@messaging.microsoft.com (in reply to RCPT TO command)客户的邮件系统是Exchange,不知微软的过滤规则为何挡了邮件,为了让微软把我们移出黑名单,只能给他们发邮件申诉了,delist@messaging.microsoft.com,申诉邮件内容:Please Help me out to solve the belowisuue.
My Below IP Address are showing Blacklisted on below dns address IP Address:IP xxx.xxx.xxx.xxx . Please Help me and removemy ip from black list Thank you!
xxxxx十分钟以后,会收到微软回复的邮件:Hello ,
Thank you for your delisting request SRX1251909371ID. Your ticket was received on (Jun 25 2014 07:59 AM UTC) and will be responded to within 24 hours.
Our team will investigate the address that you have requested to be removed from our blocklist. If for any reason we are not able to remove your address, one of our technical support representatives will respond to you with additional information.
Regards,
Technical Support耐心等待微软恢复你的邮件白名单。

情况7:status=bounced (host mx54.dns.com.cn[220.181.130.176]said: 550 Does not like recipient,your
mail is rejected! (in reply to end of DATA command)); sender non-delivery notification: F20F2DD80FC;removed出错原因:对方某一台收件服务器当时正处在繁忙之中或者我们的服务器和对方链接并不是很顺畅
解决方法:有可能是暂时的情况,用别的地址测试一下,看看是否被退信,或者过一段时间再发送一下
 
情况8:1)status=bounced(hostmx3.qq.com[183.60.2.53]said:550Mailboxnotfound.http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=20022&&no=1000728 (in reply to RCPT TO command)); sender non-delivery notification: 9CC7FDD8084; removed
2)status=bounced (host 163mx01.mxmail.netease.com[220.181.12.62] said: 550 User not found: cjld@163.com (in reply to RCPT TO command)); sender non-delivery notification: 8FD7CA00013A; removed出错原因:收件人地址不存在或者收件人地址写错
解决方法:核对地址后重新发送
 
情况9:status=deferred(hostmxzwg4.mxhichina.com[58.68.254.104]said:450MI:IPBhttp://www.net.cn/service/faq/youx/mailsy/200905/3781.html (in reply to MAIL FROM command))出错原因:450MI:IPB发信IP被暂时禁止,请检查是否有用户发送病毒或者垃圾邮件。
解决方法:联系您的企业邮箱运营商
 
情况10:status=deferred(connecttoapllo-zm.com[60.191.124.236]:25:Connectiontimedout);from=<jinxiuren@hanshitx.com>, size=24500463, nrcpt=2 (queue active);解决方法:用nslookup查询对方邮箱服务器的ip地址,通过 telnet 对方服务器的25端口等方式确认是网络连接不正常还是由于对方服务器的25端口没有响应。一般说来,无论是网络故障还是对方系统故障,都能被对方系统管理员很快被发现和恢复,所以可以选择再次发送进行尝试。对于部分国外的邮件服务商,出现这种情况持续的时间会比较长,如果尝试超过1天都不能成功,建议先使用其他方式与收件人联系。
 
情况11:1)status=bounced (host sohumx1.sohu.com[220.181.26.202] said: 553 5.7.3 CONTENT REJECT:10.10.71.82.2011062016.XXD6ywq8:dspam check:5:http://mail.sohu.com/info/policy/12 (in reply to end of DATA command));
2)Recipient address rejected: User unknown in local recipient table出错原因:1)内容被拒绝,可能是收件人对所接收的邮件进行了设置,内容中含有特定词汇等会被拒绝
                   2)收件人地址被拒绝
        
解决方法:核实对方是否对内容及账户进行了设置之后重新发送

情况12:.Clienthostrejected: Access denied; from=<cici@ybxchina.com> to=<terancetan@lovelylace.com> proto=SMTP helo=<hjy1>出错原因:客户端主机被拒绝
解决方法:看一下客户端接收邮件服务器设置是否正确,“我的服务器需要身份验证”是否打钩,测试一下发信25口是否已连接
 
情况13: status=bounced (host mx1.mail.cnb.yahoo.com[203.209.228.250] said: 554 delivery error: dd Sorry your message to weixing201314@yahoo.com.cn cannot be delivered. This account has been disabled or discontinued [#102]. - mta1004.mail.cnb.yahoo.com (in reply to end of DATA command)); sender non-delivery notification: 1C580DD80B4; removed出错原因:对方账号被停用或者不可用
解决方法:正常退信,换账号发送
 
情况14:9status=bounced (message size 24864357 exceeds size limit 10240000 of server cluster4.us.messagelabs.com[98.126.139.202]); sender non-delivery notification: C6A3BDD8078; removed出错原因:邮件过大,超出对方单封邮件接收范围
解决方法:对方换账号,重新发送 查看全部
mail.png

情况1:
550 Mail content denied
这种是内容的问题,用户加服务器IP白名单就可以了。
 
情况2:
550 Connection denied
出错原因:该服务器IP的发信频率大幅度超过QQ邮箱限制。

情况3:
550 Connection frequency limited
出错原因:该服务器IP的发信频率超过腾讯邮箱限制。

情况4:
550 5.5.0 Invalid EHLO/HELO domain
原因:邮箱不存在
 
情况5:
status=deferred
用户把我们发送邮件当作垃圾邮件过滤掉了
 
情况6:
host xxx.mail.eo.outlook.com[xxx.xxx.163.247] said: 550
5.7.1 Service unavailable; Client host [xxx.xxx.xxx..16] blocked using FBLW15;
To request removal from this list please forward this message to
delist@messaging.microsoft.com (in reply to RCPT TO command)
客户的邮件系统是Exchange,不知微软的过滤规则为何挡了邮件,为了让微软把我们移出黑名单,只能给他们发邮件申诉了,delist@messaging.microsoft.com,申诉邮件内容:
Please Help me out to solve the belowisuue.
My Below IP Address are showing Blacklisted on below dns address IP Address:IP xxx.xxx.xxx.xxx . Please Help me and removemy ip from black list Thank you!
xxxxx
十分钟以后,会收到微软回复的邮件:
Hello ,
Thank you for your delisting request SRX1251909371ID. Your ticket was received on (Jun 25 2014 07:59 AM UTC) and will be responded to within 24 hours.
Our team will investigate the address that you have requested to be removed from our blocklist. If for any reason we are not able to remove your address, one of our technical support representatives will respond to you with additional information.
Regards,
Technical Support
耐心等待微软恢复你的邮件白名单。

情况7:
status=bounced (host mx54.dns.com.cn[220.181.130.176]said: 550 Does not like recipient,your
mail is rejected! (in reply to end of DATA command)); sender non-delivery notification: F20F2DD80FC;removed
出错原因:对方某一台收件服务器当时正处在繁忙之中或者我们的服务器和对方链接并不是很顺畅
解决方法:有可能是暂时的情况,用别的地址测试一下,看看是否被退信,或者过一段时间再发送一下
 
情况8:
1)status=bounced(hostmx3.qq.com[183.60.2.53]said:550Mailboxnotfound.http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=20022&&no=1000728 (in reply to RCPT TO command)); sender non-delivery notification: 9CC7FDD8084; removed
2)status=bounced (host 163mx01.mxmail.netease.com[220.181.12.62] said: 550 User not found: cjld@163.com (in reply to RCPT TO command)); sender non-delivery notification: 8FD7CA00013A; removed
出错原因:收件人地址不存在或者收件人地址写错
解决方法:核对地址后重新发送
 
情况9:
status=deferred(hostmxzwg4.mxhichina.com[58.68.254.104]said:450MI:IPBhttp://www.net.cn/service/faq/youx/mailsy/200905/3781.html (in reply to MAIL FROM command))
出错原因:450MI:IPB发信IP被暂时禁止,请检查是否有用户发送病毒或者垃圾邮件。
解决方法:联系您的企业邮箱运营商
 
情况10:
status=deferred(connecttoapllo-zm.com[60.191.124.236]:25:Connectiontimedout);from=<jinxiuren@hanshitx.com>, size=24500463, nrcpt=2 (queue active);
解决方法:用nslookup查询对方邮箱服务器的ip地址,通过 telnet 对方服务器的25端口等方式确认是网络连接不正常还是由于对方服务器的25端口没有响应。一般说来,无论是网络故障还是对方系统故障,都能被对方系统管理员很快被发现和恢复,所以可以选择再次发送进行尝试。对于部分国外的邮件服务商,出现这种情况持续的时间会比较长,如果尝试超过1天都不能成功,建议先使用其他方式与收件人联系。
 
情况11:
1)status=bounced (host sohumx1.sohu.com[220.181.26.202] said: 553 5.7.3 CONTENT REJECT:10.10.71.82.2011062016.XXD6ywq8:dspam check:5:http://mail.sohu.com/info/policy/12 (in reply to end of DATA command));
2)Recipient address rejected: User unknown in local recipient table
出错原因:1)内容被拒绝,可能是收件人对所接收的邮件进行了设置,内容中含有特定词汇等会被拒绝
                   2)收件人地址被拒绝
        
解决方法:核实对方是否对内容及账户进行了设置之后重新发送

情况12:
.Clienthostrejected: Access denied; from=<cici@ybxchina.com> to=<terancetan@lovelylace.com> proto=SMTP helo=<hjy1>
出错原因:客户端主机被拒绝
解决方法:看一下客户端接收邮件服务器设置是否正确,“我的服务器需要身份验证”是否打钩,测试一下发信25口是否已连接
 
情况13:
 status=bounced (host mx1.mail.cnb.yahoo.com[203.209.228.250] said: 554 delivery error: dd Sorry your message to weixing201314@yahoo.com.cn cannot be delivered. This account has been disabled or discontinued [#102]. - mta1004.mail.cnb.yahoo.com (in reply to end of DATA command)); sender non-delivery notification: 1C580DD80B4; removed
出错原因:对方账号被停用或者不可用
解决方法:正常退信,换账号发送
 
情况14:
9status=bounced (message size 24864357 exceeds size limit 10240000 of server cluster4.us.messagelabs.com[98.126.139.202]); sender non-delivery notification: C6A3BDD8078; removed
出错原因:邮件过大,超出对方单封邮件接收范围
解决方法:对方换账号,重新发送

代理到底有几种功能模式?

Ansible 发表了文章 • 0 个评论 • 388 次浏览 • 2017-03-21 22:39 • 来自相关话题

通常我们都知道Nginx性能很高,尤其是作为一个代理服务器,因为它用的是epoll模型,就比如Python Django Web的性能不行,我们可能就会在前端加一个nginx代理,从而提高总体的处理性能问题,但是我们常说的代理,值的是什么类型的代理呢,你知道吗?
 
代理服务技术是在互联网早期就出现被使用的。一般实现代理技术的方式就是在服务器上安装代理服务软件,让其成为一个代理服务器,从而实现代理技术。常用的代理技术分为正向代理、反向代理和透明代理。本文就是针对这三种代理来讲解一些基本原理和具体的适用范围和nginx的配置案例,便于大家更深入理解代理服务技术。
 

一、正向代理(Forward Proxy)

一般情况下,如果没有特别说明,代理技术默认说的是正向代理技术。
 
正向代理(forward)是一个位于客户端 【用户A】和原始服务器(origin server)【服务器B】之间的服务器【代理服务器Z】,为了从原始服务器取得内容,用户A向代理服务器Z发送一个请求并指定目标(服务器B),然后代理服务器Z向服务器B转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理,如下图所示:




从上面的概念中,我们看出,文中所谓的正向代理就是代理服务器【Z】替代访问方【用户A】去访问目标服务器【服务器B】。
 
这就是正向代理的意义所在。而为什么要用代理服务器【Z】去代替访问方【用户A】去访问服务器【B】呢?为什么不直接访问呢,这就要从场景和代理服务器使用的意义说起。
 
使用正向代理的意义和场景有如下几种:
 
1、用户访问本来无法访问的服务器B的资源




假设最初用户A要访问服务器B需要经过R1和R2路由器这样一个路由节点,如果路由器R1或者路由器R2发生故障,那么就无法访问服务器B了。但是如果用户A让代理服务器Z去代替自己访问服务器B,由于代理服务器Z没有在路由器R1或R2节点中,而是通过其它的路由节点访问服务器B,那么用户A就可以得到服务器B的数据了。

现实中的例子就是“翻墙”。不过自从VPN技术被广泛应用外,“翻墙”不但使用了传统的正向代理技术,有的还使用了VPN技术。
 
2、加速访问服务器B资源
这种说法目前不像以前那么流行了,主要是带宽流量的飞速发展。早期的正向代理中,很多人使用正向代理就是提速。
 
还是如图2假设用户A到服务器B,经过R1路由器和R2路由器,而R1到R2路由器的链路是一个低带宽链路。而用户A到代理服务器Z,从代理服务器Z到服务器B都是高带宽链路。那么很显然就可以加速访问服务器B了。
 
3、Cache作用




Cache(缓存)技术和代理服务技术是紧密联系的(不光是正向代理,反向代理也使用了Cache(缓存)技术。如上图所示,如果在用户A访问服务器B某数据F之前,已经有人通过代理服务器Z访问过服务器B上得数据F,那么代理服务器Z会把数据F保存一段时间,如果有人正好取该数据F,那么代理服务器Z不再访问服务器B,而把缓存的数据F直接发给用户A。这一技术在Cache中术语就叫Cache命中。如果有更多的像用户A的用户来访问代理服务器Z,那么这些用户都可以直接从代理服务器Z中取得数据F,而不用千里迢迢的去服务器B下载数据了。
 
4、客户端访问授权
这方面的内容现今使用的还是比较多的,例如一些公司采用ISA Server做为正向代理服务器来授权用户是否有权限访问互联网,如下图所示:




如上图防火墙作为网关,用来过滤外网对其的访问。假设用户A和用户B都设置了代理服务器,用户A允许访问互联网,而用户B不允许访问互联网(这个在代理服务器Z上做限制)这样用户A因为授权,可以通过代理服务器访问到服务器B,而用户B因为没有被代理服务器Z授权,所以访问服务器B时,数据包会被直接丢弃。
 
5、隐藏访问者的行踪
如下图所示,我们可以看出服务器B并不知道访问自己的实际是用户A,因为代理服务器Z代替用户A去直接与服务器B进行交互。如果代理服务器Z被用户A完全控制(或不完全控制),会惯以“肉鸡”术语称呼。




 
总结正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须设置正向代理服务器,当然前提是要知道正向代理服务器的IP地址,还有代理程序的端口。
 
Nginx正向代理配置示例如下:
server{
resolver 8.8.8.8;
resolver_timeout 30s;
listen 82;
location / {
proxy_pass http://$http_host$request_uri;
proxy_set_header Host $http_host;
proxy_buffers 256 4k;
proxy_max_temp_file_size 0;
proxy_connect_timeout 30;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 301 1h;
proxy_cache_valid any 1m;
}
}1、不能有hostname。 
2、必须有resolver, 即dns,即上面的8.8.8.8,超时时间(30秒)可选。 
3、配置正向代理参数,均是由 Nginx 变量组成。
proxy_pass $scheme://$host$request_uri;
proxy_set_header Host $http_host; 4、配置缓存大小,关闭磁盘缓存读写减少I/O,以及代理连接超时时间。
proxy_buffers 256 4k;
proxy_max_temp_file_size 0;
proxy_connect_timeout 30; 5、配置代理服务器 Http 状态缓存时间。  
proxy_cache_valid 200 302 10m;
proxy_cache_valid 301 1h;
proxy_cache_valid any 1m; 配置好后,重启nginx,以浏览器为例,要使用这个代理服务器,则只需将浏览器代理设置为http://+服务器ip地址+:+82(82是刚刚设置的端口号)即可使用了。


二、反向代理(reverse proxy)

反向代理正好与正向代理相反,对于客户端而言代理服务器就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端。
 
使用反向代理服务器的作用如下:
 
1、保护和隐藏原始资源服务器




用户A始终认为它访问的是原始服务器B而不是代理服务器Z,但实用际上反向代理服务器接受用户A的应答,从原始资源服务器B中取得用户A的需求资源,然后发送给用户A。由于防火墙的作用,只允许代理服务器Z访问原始资源服务器B。尽管在这个虚拟的环境下,防火墙和反向代理的共同作用保护了原始资源服务器B,但用户A并不知情。
 
2、负载均衡




当反向代理服务器不止一个的时候,我们甚至可以把它们做成集群,当更多的用户访问资源服务器B的时候,让不同的代理服务器Z(x)去应答不同的用户,然后发送不同用户需要的资源。

当然反向代理服务器像正向代理服务器一样拥有Cache的作用,它可以缓存原始资源服务器B的资源,而不是每次都要向原始资源服务器组请求数据,特别是一些静态的数据,比如图片和文件,如果这些反向代理服务器能够做到和用户X来自同一个网络,那么用户X访问反向代理服务器X,就会得到很高质量的速度。这正是CDN技术的核心。如下图所示:




我们并不是讲解CDN,所以去掉了CDN最关键的核心技术智能DNS。只是展示CDN技术实际上利用的正是反向代理原理这块。

反向代理结论与正向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。

基本上,网上做正反向代理的程序很多,能做正向代理的软件大部分也可以做反向代理。开源软件中最流行的就是squid,既可以做正向代理,也有很多人用来做反向代理的前端服务器。另外MS ISA也可以用来在Windows平台下做正向代理。反向代理中最主要的实践就是WEB服务,近些年来最火的就是Nginx了。网上有人说Nginx不能做正向代理,其实是不对的。Nginx也可以做正向代理,不过用的人比较少了。
 
Nginx反向代理示例:
http {
# 省略了前面一般的配置,直接从负载均衡这里开始
# 设置地址池,后端3台服务器
upstream http_server_pool {
server 192.168.1.2:8080 weight=2 max_fails=2 fail_timeout=30s;
server 192.168.1.3:8080 weight=3 max_fails=2 fail_timeout=30s;
server 192.168.1.4:8080 weight=4 max_fails=2 fail_timeout=30s;
}
# 一个虚拟主机,用来反向代理http_server_pool这组服务器
server {
listen 80;
# 外网访问的域名
server_name www.test.com;
location / {
# 后端服务器返回500 503 404错误,自动请求转发到upstream池中另一台服务器
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
proxy_pass http://http_server_pool;
proxy_set_header Host www.test.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
access_log logs/www.test.com.access.log combined;
}
}最简单的反向代理演示(在一台服务器上做代理服务器,将http请求转发到另一台IIS服务器上,通过二级域名形式访问。)编辑vim nginx.conf
server {
listen 80;
server_name test.zhoumengkang.com;
location / {
proxy_pass http://121.199.**.*:80;
}
}参考:http://www.blogjava.net/xiaomage234/archive/2011/09/08/358247.html 
 

三、透明代理

如果把正向代理、反向代理和透明代理按照人类血缘关系来划分的话。那么正向代理和透明代理是很明显堂亲关系,而正向代理和反向代理就是表亲关系了 。

透明代理的意思是客户端根本不需要知道有代理服务器的存在,它改编你的request fields(报文),并会传送真实IP。注意,加密的透明代理则是属于匿名代理,意思是不用设置使用代理了。

透明代理实践的例子就是时下很多公司使用的行为管理软件。如下图所示:




用户A和用户B并不知道行为管理设备充当透明代理行为,当用户A或用户B向服务器A或服务器B提交请求的时候,透明代理设备根据自身策略拦截并修改用户A或B的报文,并作为实际的请求方,向服务器A或B发送请求,当接收信息回传,透明代理再根据自身的设置把允许的报文发回至用户A或B,如上图,如果透明代理设置不允许访问服务器B,那么用户A或者用户B就不会得到服务器B的数据。
 
Nginx透明代理配置示例:
# cat /etc/nginx/sites-enabled/proxy
server {
resolver 8.8.8.8;
access_log off;
listen [::]:8080;
location / {
proxy_pass $scheme://$host$request_uri;
proxy_set_header Host $http_host;
proxy_buffers 256 4k;
proxy_max_temp_file_size 0k;
}
}

iptables -t nat -A PREROUTING -s 10.8.0.0/24 -p tcp --dport 80 -j DNAT --to 192.168.0.253:8080RAW Paste Data# cat /etc/nginx/sites-enabled/proxy
server {
resolver 8.8.8.8;
access_log off;
listen [::]:8080;
location / {
proxy_pass $scheme://$host$request_uri;
proxy_set_header Host $http_host;
proxy_buffers 256 4k;
proxy_max_temp_file_size 0k;
}
}

iptables -t nat -A PREROUTING -s 10.8.0.0/24 -p tcp --dport 80 -j DNAT --to 192.168.0.253:8080参考:
http://z00w00.blog.51cto.com/515114/1031287  
https://mengkang.net/78.html   查看全部
通常我们都知道Nginx性能很高,尤其是作为一个代理服务器,因为它用的是epoll模型,就比如Python Django Web的性能不行,我们可能就会在前端加一个nginx代理,从而提高总体的处理性能问题,但是我们常说的代理,值的是什么类型的代理呢,你知道吗?
 
代理服务技术是在互联网早期就出现被使用的。一般实现代理技术的方式就是在服务器上安装代理服务软件,让其成为一个代理服务器,从而实现代理技术。常用的代理技术分为正向代理、反向代理和透明代理。本文就是针对这三种代理来讲解一些基本原理和具体的适用范围和nginx的配置案例,便于大家更深入理解代理服务技术。
 


一、正向代理(Forward Proxy)


一般情况下,如果没有特别说明,代理技术默认说的是正向代理技术。
 
正向代理(forward)是一个位于客户端 【用户A】和原始服务器(origin server)【服务器B】之间的服务器【代理服务器Z】,为了从原始服务器取得内容,用户A向代理服务器Z发送一个请求并指定目标(服务器B),然后代理服务器Z向服务器B转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理,如下图所示:
ForwardAgent.png

从上面的概念中,我们看出,文中所谓的正向代理就是代理服务器【Z】替代访问方【用户A】去访问目标服务器【服务器B】。
 
这就是正向代理的意义所在。而为什么要用代理服务器【Z】去代替访问方【用户A】去访问服务器【B】呢?为什么不直接访问呢,这就要从场景和代理服务器使用的意义说起。
 
使用正向代理的意义和场景有如下几种:
 
1、用户访问本来无法访问的服务器B的资源
SpeedAccess.png

假设最初用户A要访问服务器B需要经过R1和R2路由器这样一个路由节点,如果路由器R1或者路由器R2发生故障,那么就无法访问服务器B了。但是如果用户A让代理服务器Z去代替自己访问服务器B,由于代理服务器Z没有在路由器R1或R2节点中,而是通过其它的路由节点访问服务器B,那么用户A就可以得到服务器B的数据了。

现实中的例子就是“翻墙”。不过自从VPN技术被广泛应用外,“翻墙”不但使用了传统的正向代理技术,有的还使用了VPN技术。
 
2、加速访问服务器B资源
这种说法目前不像以前那么流行了,主要是带宽流量的飞速发展。早期的正向代理中,很多人使用正向代理就是提速。
 
还是如图2假设用户A到服务器B,经过R1路由器和R2路由器,而R1到R2路由器的链路是一个低带宽链路。而用户A到代理服务器Z,从代理服务器Z到服务器B都是高带宽链路。那么很显然就可以加速访问服务器B了。
 
3、Cache作用
CacheFile.png

Cache(缓存)技术和代理服务技术是紧密联系的(不光是正向代理,反向代理也使用了Cache(缓存)技术。如上图所示,如果在用户A访问服务器B某数据F之前,已经有人通过代理服务器Z访问过服务器B上得数据F,那么代理服务器Z会把数据F保存一段时间,如果有人正好取该数据F,那么代理服务器Z不再访问服务器B,而把缓存的数据F直接发给用户A。这一技术在Cache中术语就叫Cache命中。如果有更多的像用户A的用户来访问代理服务器Z,那么这些用户都可以直接从代理服务器Z中取得数据F,而不用千里迢迢的去服务器B下载数据了。
 
4、客户端访问授权
这方面的内容现今使用的还是比较多的,例如一些公司采用ISA Server做为正向代理服务器来授权用户是否有权限访问互联网,如下图所示:
AccessAuth.png

如上图防火墙作为网关,用来过滤外网对其的访问。假设用户A和用户B都设置了代理服务器,用户A允许访问互联网,而用户B不允许访问互联网(这个在代理服务器Z上做限制)这样用户A因为授权,可以通过代理服务器访问到服务器B,而用户B因为没有被代理服务器Z授权,所以访问服务器B时,数据包会被直接丢弃。
 
5、隐藏访问者的行踪
如下图所示,我们可以看出服务器B并不知道访问自己的实际是用户A,因为代理服务器Z代替用户A去直接与服务器B进行交互。如果代理服务器Z被用户A完全控制(或不完全控制),会惯以“肉鸡”术语称呼。
Hidden.png

 
总结正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须设置正向代理服务器,当然前提是要知道正向代理服务器的IP地址,还有代理程序的端口。
 
Nginx正向代理配置示例如下:
server{
resolver 8.8.8.8;
resolver_timeout 30s;
listen 82;
location / {
proxy_pass http://$http_host$request_uri;
proxy_set_header Host $http_host;
proxy_buffers 256 4k;
proxy_max_temp_file_size 0;
proxy_connect_timeout 30;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 301 1h;
proxy_cache_valid any 1m;
}
}
1、不能有hostname。 
2、必须有resolver, 即dns,即上面的8.8.8.8,超时时间(30秒)可选。 
3、配置正向代理参数,均是由 Nginx 变量组成。
proxy_pass $scheme://$host$request_uri;  
proxy_set_header Host $http_host;
4、配置缓存大小,关闭磁盘缓存读写减少I/O,以及代理连接超时时间。
proxy_buffers 256 4k;  
proxy_max_temp_file_size 0;
proxy_connect_timeout 30;
5、配置代理服务器 Http 状态缓存时间。  
proxy_cache_valid 200 302 10m;  
proxy_cache_valid 301 1h;
proxy_cache_valid any 1m;
配置好后,重启nginx,以浏览器为例,要使用这个代理服务器,则只需将浏览器代理设置为http://+服务器ip地址+:+82(82是刚刚设置的端口号)即可使用了。


二、反向代理(reverse proxy)


反向代理正好与正向代理相反,对于客户端而言代理服务器就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端。
 
使用反向代理服务器的作用如下:
 
1、保护和隐藏原始资源服务器
RevProxy.png

用户A始终认为它访问的是原始服务器B而不是代理服务器Z,但实用际上反向代理服务器接受用户A的应答,从原始资源服务器B中取得用户A的需求资源,然后发送给用户A。由于防火墙的作用,只允许代理服务器Z访问原始资源服务器B。尽管在这个虚拟的环境下,防火墙和反向代理的共同作用保护了原始资源服务器B,但用户A并不知情。
 
2、负载均衡
LoadBlance.png

当反向代理服务器不止一个的时候,我们甚至可以把它们做成集群,当更多的用户访问资源服务器B的时候,让不同的代理服务器Z(x)去应答不同的用户,然后发送不同用户需要的资源。

当然反向代理服务器像正向代理服务器一样拥有Cache的作用,它可以缓存原始资源服务器B的资源,而不是每次都要向原始资源服务器组请求数据,特别是一些静态的数据,比如图片和文件,如果这些反向代理服务器能够做到和用户X来自同一个网络,那么用户X访问反向代理服务器X,就会得到很高质量的速度。这正是CDN技术的核心。如下图所示:
CdnProxy.png

我们并不是讲解CDN,所以去掉了CDN最关键的核心技术智能DNS。只是展示CDN技术实际上利用的正是反向代理原理这块。

反向代理结论与正向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。

基本上,网上做正反向代理的程序很多,能做正向代理的软件大部分也可以做反向代理。开源软件中最流行的就是squid,既可以做正向代理,也有很多人用来做反向代理的前端服务器。另外MS ISA也可以用来在Windows平台下做正向代理。反向代理中最主要的实践就是WEB服务,近些年来最火的就是Nginx了。网上有人说Nginx不能做正向代理,其实是不对的。Nginx也可以做正向代理,不过用的人比较少了。
 
Nginx反向代理示例:
http {
# 省略了前面一般的配置,直接从负载均衡这里开始
# 设置地址池,后端3台服务器
upstream http_server_pool {
server 192.168.1.2:8080 weight=2 max_fails=2 fail_timeout=30s;
server 192.168.1.3:8080 weight=3 max_fails=2 fail_timeout=30s;
server 192.168.1.4:8080 weight=4 max_fails=2 fail_timeout=30s;
}
# 一个虚拟主机,用来反向代理http_server_pool这组服务器
server {
listen 80;
# 外网访问的域名
server_name www.test.com;
location / {
# 后端服务器返回500 503 404错误,自动请求转发到upstream池中另一台服务器
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
proxy_pass http://http_server_pool;
proxy_set_header Host www.test.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
access_log logs/www.test.com.access.log combined;
}
}
最简单的反向代理演示(在一台服务器上做代理服务器,将http请求转发到另一台IIS服务器上,通过二级域名形式访问。)编辑vim nginx.conf
server {
listen 80;
server_name test.zhoumengkang.com;
location / {
proxy_pass http://121.199.**.*:80;
}
}
参考:http://www.blogjava.net/xiaomage234/archive/2011/09/08/358247.html 
 


三、透明代理


如果把正向代理、反向代理和透明代理按照人类血缘关系来划分的话。那么正向代理和透明代理是很明显堂亲关系,而正向代理和反向代理就是表亲关系了 。

透明代理的意思是客户端根本不需要知道有代理服务器的存在,它改编你的request fields(报文),并会传送真实IP。注意,加密的透明代理则是属于匿名代理,意思是不用设置使用代理了。

透明代理实践的例子就是时下很多公司使用的行为管理软件。如下图所示:
tmproxy.png

用户A和用户B并不知道行为管理设备充当透明代理行为,当用户A或用户B向服务器A或服务器B提交请求的时候,透明代理设备根据自身策略拦截并修改用户A或B的报文,并作为实际的请求方,向服务器A或B发送请求,当接收信息回传,透明代理再根据自身的设置把允许的报文发回至用户A或B,如上图,如果透明代理设置不允许访问服务器B,那么用户A或者用户B就不会得到服务器B的数据。
 
Nginx透明代理配置示例:
# cat /etc/nginx/sites-enabled/proxy
server {
resolver 8.8.8.8;
access_log off;
listen [::]:8080;
location / {
proxy_pass $scheme://$host$request_uri;
proxy_set_header Host $http_host;
proxy_buffers 256 4k;
proxy_max_temp_file_size 0k;
}
}

iptables -t nat -A PREROUTING -s 10.8.0.0/24 -p tcp --dport 80 -j DNAT --to 192.168.0.253:8080
RAW Paste Data
# cat /etc/nginx/sites-enabled/proxy
server {
resolver 8.8.8.8;
access_log off;
listen [::]:8080;
location / {
proxy_pass $scheme://$host$request_uri;
proxy_set_header Host $http_host;
proxy_buffers 256 4k;
proxy_max_temp_file_size 0k;
}
}

iptables -t nat -A PREROUTING -s 10.8.0.0/24 -p tcp --dport 80 -j DNAT --to 192.168.0.253:8080
参考:
http://z00w00.blog.51cto.com/515114/1031287  
https://mengkang.net/78.html  

Nginx缓存静态页面

mark 发表了文章 • 0 个评论 • 307 次浏览 • 2017-03-16 15:01 • 来自相关话题

首先介绍一下弄这个的初衷。
其实初衷很简单公司需要这个,然后你就去实现没有什么更高大上的理由,原理什么的我也不打算介绍了, 个人不太喜欢这些咬文爵字的东西。
 
其次做这个需要用到ngx_cache_purge 缓存模块。
不清楚自己的nginx有没有添加这个模块的童鞋可以使用nginx -V查看具体如下:[root@localhost sbin]# ./nginx -V
nginx version: nginx/1.10.3
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-ipv6 --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gzip_static_module --add-module=/root/ngx_cache_purge-2.3 --with-http_perl_module --with-ld-opt=-Wl,-E

如果看到了ngx_cache_purge则已经添加了这个模块。你可以直接跳到最下面看看是不是你想要的, 好了,废话不多说。

一、编译安装Nginx

首先下载nginx和ngx_cache_purge 缓存模块
附:
nginx下载地址:http://nginx.org/download/nginx-1.10.3.tar.gz
ngx_cache_purge下载地址:http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
 
开始编译安装cd /usr/local/
wget http://nginx.org/download/nginx-1.10.3.tar.gz
tar zxvf nginx-1.10.3.tar.gz
wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
tar -xvf ngx_cache_purge-2.3.tar.gz
./configure --prefix=/usr/local/nginx --add-module=../ngx_cache_purge-2.3 --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-ipv6 --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gzip_static_module --with-http_perl_module --with-ld-opt="-Wl,-E"


 附Nginx编译安装时可能遇到的问题:/configure: error: the HTTP rewrite module requires the PCRE library.
解决方法:安装pcre
# yum -y install pcre pcre-devel

缺少ssl错误,错误信息如下:
./configure: error: the HTTP cache module requires md5 functions
from OpenSSL library. You can either disable the module by using
--without-http-cache option, or install the OpenSSL library into the system,
or build the OpenSSL library statically from the source with nginx by using
--with-http_ssl_module --with-openssl=<path> options.
解决方法:安装openssl
# yum -y install openssl openssl-devel

缺少编译器,错误信息如下:
./configure: error: C compiler cc is not found
解决方法:安装gcc-c++
# yum -y install gcc-c++ autoconf automake
autoconf是自动配置,automake是自动编译

缺少zlib包,错误信息如下:
./configure: error: the HTTP gzip module requires the zlib library.
You can either disable the module by using –without-http_gzip_module
option, or install the zlib library into the system, or build the zlib
library
statically from the source with nginx by using –with-zlib=<path> option.
解决方法:安装zlib
# yum install -y zlib-devel

缺少libxml2,错误信息如下:
./configure: error: the HTTP XSLT module requires the libxml2/libxslt
libraries. You can either do not enable the module or install the libraries.
解决方法:
# yum -y install libxml2 libxml2-dev
# yum -y install libxslt-devel

http_image_filter_module是nginx提供的集成图片处理模块,需要gd-devel的支持,错误信息如下:
./configure: error: the HTTP image filter module requires the GD library.
You can either do not enable the module or install the libraries.
解决方法:
# yum -y install gd-devel

缺少ExtUtils,错误信息如下:
./configure: error: perl module ExtUtils::Embed is required
解决方法:
# yum -y install perl-devel perl-ExtUtils-Embed

缺少GeoIP,错误信息如下:
./configure: error: the GeoIP module requires the GeoIP library.
You can either do not enable the module or install the library.
解决方法:
# yum -y install GeoIP GeoIP-devel GeoIP-data

 

二、配置nginx.conf

安装完成后编辑nginx的配置文件位于/usr/local/nginx/conf/nginx.conf# cd /usr/local/nginx/conf/
# cp nginx.conf nginx.conf.bak #先将nginx的配置文件进行备份
可以利用nginx -V查看是否添加了ngx_cache_purge 缓存模块(如何查看文章头部)
配置的一些详细的参数我在我的nginx配置文件中有详细的注释。
所以这里就不多讲,可以根据我的进行修改
最后附上自己的配置文件[root@localhost sbin]# cat ../conf/nginx.conf
user nobody;
worker_processes 1;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;


events {
#epoll是多路复用IO(I/O Multiplexing)中的一种方式,
#仅用于linux2.6以上内核,可以大大提高nginx的性能
use epoll;
worker_connections 1024; #单个后台worker process进程的最大并发链接数
# 并发总数是 worker_processes 和 worker_connections 的乘积
# 即 max_clients = worker_processes * worker_connections
# 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4 为什么
# 为什么上面反向代理要除以4,应该说是一个经验值
# 根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:4 * 8000 = 32000
# worker_connections 值的设置跟物理内存大小有关
# 因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数
# 而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右
# 我们来看看360M内存的VPS可以打开的文件句柄数是多少:
# $ cat /proc/sys/fs/file-max
# 输出 34336
# 32000 < 34336,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内
# 所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置
# 使得并发总数小于操作系统可以打开的最大文件数目
# 其实质也就是根据主机的物理CPU和内存进行配置
# 当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。
# ulimit -SHn 65535
}
http {
#设定mime类型,类型由mime.type文件定义
include mime.types;
default_type application/octet-stream;
#设定日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on; #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
#对于普通应用,必须设为 on,
#如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
#以平衡磁盘与网络I/O处理速度,降低系统的uptime.
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65; #连接超时时间
tcp_nodelay on;
gzip on; #开启gzip压缩
gzip_disable "MSIE [1-6].";
client_header_buffer_size 128k; #设定请求缓冲
large_client_header_buffers 4 128k;
proxy_buffering on; #开启代理缓存
proxy_connect_timeout 5; #连接超时时间,超时时间设置不要超过75秒,至于为什么i don't konw
proxy_read_timeout 60; #设置与代理服务器两次读取的间隔时间
proxy_send_timeout 5; #设置后端服务器数据回传时间就是在规定时间之内后端服务器必须传完所有的数据,如果超时nginx会关闭连接
proxy_buffer_size 16k; #设置nginx保存用户头部信息的缓存区大小
proxy_buffers 4 64k; #缓存区大小
proxy_busy_buffers_size 128k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 128k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
proxy_temp_path /tmp/temp_cache1; #临时缓存目录
proxy_cache_path /tmp/cache1 levels=1:2 keys_zone=cache_one:200m inactive=30d max_size=5g;
#注:proxy_temp_path和proxy_cache_path指定的路径必须在同一分区
#设置Web缓存区名称为cache_one,内存缓存空间大小为200MB,30天没有被访问的内容自动清除,硬盘缓存空间大小为5GB。

#定义反向代理
upstream backend_server {
server 192.168.58.139:80 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.58.140:80 weight=1 max_fails=2 fail_timeout=30s;
}

server {
listen 80;
server_name localhost;

# #charset koi8-r;
# #access_log logs/host.access.log main;

#缓存html页面,可以缓存伪静态
location ~ .*\.html$ {
proxy_pass http://backend_server;
proxy_redirect off;
proxy_set_header Host $host;
proxy_cache cache_one;
proxy_next_upstream http_502 http_504 error timeout invalid_header; #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
proxy_cache_valid 200 302 1d; #状态为200、302的缓存1天
proxy_cache_valid 301 2d; #状态为301的缓存2天
proxy_cache_valid any 1m; #有效缓存大小
expires 1d; #浏览器过期时间设置1天
proxy_cache_key $host$uri$is_args$args; #以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内
proxy_ignore_headers "Cache-Control" "Expires" "Set-Cookie"; #忽略头部禁止缓存申明,类似与CDN的强制缓存功能
add_header Nginx-Cache "$upstream_cache_status"; #在header中插入缓存状态,命中缓存为HIT,没命中则为MISS
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

#禁止访问 .htxxx 文件
location ~ /\.ht {
deny all;
}

#用于清除缓存,假设一个URL为http://192.168.8.42/test.txt,通过访问http://192.168.8.42/purge/test.txt就可以清除该URL的缓存。
location ~ /purge(/.*) {
#设置只允许指定的IP或IP段才可以清除URL缓存。
allow 127.0.0.1;
allow 192.168.58.0/24;
deny all;
proxy_cache_purge cache_one $host$1$is_args$args;
}

#动态页面直接放过不缓存
location ~ .*\.(php|jsp|cgi)(.*){
proxy_pass http://backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

#设置缓存黑名单,不缓存指定页面,比如wp后台或其他需要登录态的页面,用分隔符隔开
#location ~ ^/(wp-admin|system)(.*)$ {
# proxy_pass http://backend_server;
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#}

#location / {
# proxy_cache cache_one;
# proxy_next_upstream http_502 http_504 error timeout invalid_header; #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
# proxy_cache_valid 200 304 12h; #对不同的HTTP状态码设置不同的缓存时间
# proxy_cache_key $host$uri$is_args$args; #以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内
# proxy_set_header Host $host;
# proxy_set_header X-Forwarded-For $remote_addr;
# proxy_pass http://backend_server;
# expires 1d;
#}

}

}

打完收工.................... 查看全部
首先介绍一下弄这个的初衷。
其实初衷很简单公司需要这个,然后你就去实现没有什么更高大上的理由,原理什么的我也不打算介绍了, 个人不太喜欢这些咬文爵字的东西。
 
其次做这个需要用到ngx_cache_purge 缓存模块。
不清楚自己的nginx有没有添加这个模块的童鞋可以使用nginx -V查看具体如下:
[root@localhost sbin]# ./nginx -V
nginx version: nginx/1.10.3
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-ipv6 --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gzip_static_module --add-module=/root/ngx_cache_purge-2.3 --with-http_perl_module --with-ld-opt=-Wl,-E

如果看到了ngx_cache_purge则已经添加了这个模块。你可以直接跳到最下面看看是不是你想要的, 好了,废话不多说。


一、编译安装Nginx


首先下载nginx和ngx_cache_purge 缓存模块
附:
nginx下载地址:http://nginx.org/download/nginx-1.10.3.tar.gz
ngx_cache_purge下载地址:http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
 
开始编译安装
cd /usr/local/
wget http://nginx.org/download/nginx-1.10.3.tar.gz
tar zxvf nginx-1.10.3.tar.gz
wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
tar -xvf ngx_cache_purge-2.3.tar.gz
./configure --prefix=/usr/local/nginx --add-module=../ngx_cache_purge-2.3 --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-ipv6 --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gzip_static_module --with-http_perl_module --with-ld-opt="-Wl,-E"


 附Nginx编译安装时可能遇到的问题:
/configure: error: the HTTP rewrite module requires the PCRE library.
解决方法:安装pcre
# yum -y install pcre pcre-devel

缺少ssl错误,错误信息如下:
./configure: error: the HTTP cache module requires md5 functions
from OpenSSL library. You can either disable the module by using
--without-http-cache option, or install the OpenSSL library into the system,
or build the OpenSSL library statically from the source with nginx by using
--with-http_ssl_module --with-openssl=<path> options.
解决方法:安装openssl
# yum -y install openssl openssl-devel

缺少编译器,错误信息如下:
./configure: error: C compiler cc is not found
解决方法:安装gcc-c++
# yum -y install gcc-c++ autoconf automake
autoconf是自动配置,automake是自动编译

缺少zlib包,错误信息如下:
./configure: error: the HTTP gzip module requires the zlib library.
You can either disable the module by using –without-http_gzip_module
option, or install the zlib library into the system, or build the zlib
library
statically from the source with nginx by using –with-zlib=<path> option.
解决方法:安装zlib
# yum install -y zlib-devel

缺少libxml2,错误信息如下:
./configure: error: the HTTP XSLT module requires the libxml2/libxslt
libraries. You can either do not enable the module or install the libraries.
解决方法:
# yum -y install libxml2 libxml2-dev
# yum -y install libxslt-devel

http_image_filter_module是nginx提供的集成图片处理模块,需要gd-devel的支持,错误信息如下:
./configure: error: the HTTP image filter module requires the GD library.
You can either do not enable the module or install the libraries.
解决方法:
# yum -y install gd-devel

缺少ExtUtils,错误信息如下:
./configure: error: perl module ExtUtils::Embed is required
解决方法:
# yum -y install perl-devel perl-ExtUtils-Embed

缺少GeoIP,错误信息如下:
./configure: error: the GeoIP module requires the GeoIP library.
You can either do not enable the module or install the library.
解决方法:
# yum -y install GeoIP GeoIP-devel GeoIP-data

 


二、配置nginx.conf


安装完成后编辑nginx的配置文件位于/usr/local/nginx/conf/nginx.conf
# cd /usr/local/nginx/conf/
# cp nginx.conf nginx.conf.bak #先将nginx的配置文件进行备份

可以利用nginx -V查看是否添加了ngx_cache_purge 缓存模块(如何查看文章头部)
配置的一些详细的参数我在我的nginx配置文件中有详细的注释。
所以这里就不多讲,可以根据我的进行修改
最后附上自己的配置文件
[root@localhost sbin]# cat ../conf/nginx.conf
user nobody;
worker_processes 1;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;


events {
#epoll是多路复用IO(I/O Multiplexing)中的一种方式,
#仅用于linux2.6以上内核,可以大大提高nginx的性能
use epoll;
worker_connections 1024; #单个后台worker process进程的最大并发链接数
# 并发总数是 worker_processes 和 worker_connections 的乘积
# 即 max_clients = worker_processes * worker_connections
# 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4 为什么
# 为什么上面反向代理要除以4,应该说是一个经验值
# 根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:4 * 8000 = 32000
# worker_connections 值的设置跟物理内存大小有关
# 因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数
# 而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右
# 我们来看看360M内存的VPS可以打开的文件句柄数是多少:
# $ cat /proc/sys/fs/file-max
# 输出 34336
# 32000 < 34336,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内
# 所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置
# 使得并发总数小于操作系统可以打开的最大文件数目
# 其实质也就是根据主机的物理CPU和内存进行配置
# 当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。
# ulimit -SHn 65535
}
http {
#设定mime类型,类型由mime.type文件定义
include mime.types;
default_type application/octet-stream;
#设定日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on; #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
#对于普通应用,必须设为 on,
#如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
#以平衡磁盘与网络I/O处理速度,降低系统的uptime.
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65; #连接超时时间
tcp_nodelay on;
gzip on; #开启gzip压缩
gzip_disable "MSIE [1-6].";
client_header_buffer_size 128k; #设定请求缓冲
large_client_header_buffers 4 128k;
proxy_buffering on; #开启代理缓存
proxy_connect_timeout 5; #连接超时时间,超时时间设置不要超过75秒,至于为什么i don't konw
proxy_read_timeout 60; #设置与代理服务器两次读取的间隔时间
proxy_send_timeout 5; #设置后端服务器数据回传时间就是在规定时间之内后端服务器必须传完所有的数据,如果超时nginx会关闭连接
proxy_buffer_size 16k; #设置nginx保存用户头部信息的缓存区大小
proxy_buffers 4 64k; #缓存区大小
proxy_busy_buffers_size 128k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 128k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
proxy_temp_path /tmp/temp_cache1; #临时缓存目录
proxy_cache_path /tmp/cache1 levels=1:2 keys_zone=cache_one:200m inactive=30d max_size=5g;
#注:proxy_temp_path和proxy_cache_path指定的路径必须在同一分区
#设置Web缓存区名称为cache_one,内存缓存空间大小为200MB,30天没有被访问的内容自动清除,硬盘缓存空间大小为5GB。

#定义反向代理
upstream backend_server {
server 192.168.58.139:80 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.58.140:80 weight=1 max_fails=2 fail_timeout=30s;
}

server {
listen 80;
server_name localhost;

# #charset koi8-r;
# #access_log logs/host.access.log main;

#缓存html页面,可以缓存伪静态
location ~ .*\.html$ {
proxy_pass http://backend_server;
proxy_redirect off;
proxy_set_header Host $host;
proxy_cache cache_one;
proxy_next_upstream http_502 http_504 error timeout invalid_header; #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
proxy_cache_valid 200 302 1d; #状态为200、302的缓存1天
proxy_cache_valid 301 2d; #状态为301的缓存2天
proxy_cache_valid any 1m; #有效缓存大小
expires 1d; #浏览器过期时间设置1天
proxy_cache_key $host$uri$is_args$args; #以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内
proxy_ignore_headers "Cache-Control" "Expires" "Set-Cookie"; #忽略头部禁止缓存申明,类似与CDN的强制缓存功能
add_header Nginx-Cache "$upstream_cache_status"; #在header中插入缓存状态,命中缓存为HIT,没命中则为MISS
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

#禁止访问 .htxxx 文件
location ~ /\.ht {
deny all;
}

#用于清除缓存,假设一个URL为http://192.168.8.42/test.txt,通过访问http://192.168.8.42/purge/test.txt就可以清除该URL的缓存。
location ~ /purge(/.*) {
#设置只允许指定的IP或IP段才可以清除URL缓存。
allow 127.0.0.1;
allow 192.168.58.0/24;
deny all;
proxy_cache_purge cache_one $host$1$is_args$args;
}

#动态页面直接放过不缓存
location ~ .*\.(php|jsp|cgi)(.*){
proxy_pass http://backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

#设置缓存黑名单,不缓存指定页面,比如wp后台或其他需要登录态的页面,用分隔符隔开
#location ~ ^/(wp-admin|system)(.*)$ {
# proxy_pass http://backend_server;
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#}

#location / {
# proxy_cache cache_one;
# proxy_next_upstream http_502 http_504 error timeout invalid_header; #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
# proxy_cache_valid 200 304 12h; #对不同的HTTP状态码设置不同的缓存时间
# proxy_cache_key $host$uri$is_args$args; #以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内
# proxy_set_header Host $host;
# proxy_set_header X-Forwarded-For $remote_addr;
# proxy_pass http://backend_server;
# expires 1d;
#}

}

}

打完收工....................

Nginx如何设置首页跳转到后端服务

采菊篱下 回复了问题 • 2 人关注 • 2 个回复 • 347 次浏览 • 2017-03-14 12:19 • 来自相关话题

Nginx location配置及rewrite规则写法总结

Geek小A 发表了文章 • 1 个评论 • 301 次浏览 • 2017-03-13 23:49 • 来自相关话题

location正则写法

简单示例如下:
location = / {
# 精确匹配 /,主机名后面不能带任何字符串
[ configuration A ]
}

location / {
# 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 ,比如我们代理的一个站点根
# 但是正则和最长字符串会优先匹配
[ configuration B ]
}

location /documents/ {
# 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
[ configuration C ]
}

location ~ /documents/Abc {
# 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
[ configuration CC ]
}

location ^~ /images/ {
# 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。
[ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
# 匹配所有以 gif,jpg或jpeg 结尾的请求
# 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则
[ configuration E ]
}

location /images/ {
# 字符匹配到 /images/,继续往下,会发现 ^~ 存在
[ configuration F ]
}

location /images/abc {
# 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在
# F与G的放置顺序是没有关系的
[ configuration G ]
}

location ~ /images/abc/ {
# 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用
[ configuration H ]
}

location ~* /js/.*/\.js
=开头表示精确匹配 如A中只匹配根目录结尾的请求,后面不能带任何字符串。^~ 开头表示uri以某个常规字符串开头,不是正则匹配~ 开头表示区分大小写的正则匹配;~* 开头表示不区分大小写的正则匹配/ 通用匹配, 如果没有其它匹配,任何请求都会匹配到
 
匹配优先级:

(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (/)

按照上面的location顺序,以下的匹配示例成立:
/ -> config A  # 精确完全匹配,即使/index.html也匹配不了/downloads/download.html -> config B   # 匹配B以后,往下没有任何匹配,采用B/images/1.gif -> configuration D   # 匹配到F,往下匹配到D,停止往下/images/abc/def -> config D   # 最长匹配到G,往下匹配D,停止往下,你可以看到 任何以/images/开头的都会匹配到D并停止,FG写在这里是没有任何意义的,H是永远轮不到的,这里只是为了说明匹配顺序/documents/document.html -> config C    # 匹配到C,往下没有任何匹配,采用C/documents/1.jpg -> configuration E   # 匹配到C,往下正则匹配到E/documents/Abc.jpg -> config CC   # 最长匹配到C,往下正则顺序匹配到CC,不会往下到E
 

实际使用建议

 
所以实际使用中,个人觉得至少有三个匹配规则定义,如下:
#直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。
#这里是直接转发给后端应用服务器了,也可以是一个静态首页
# 第一个必选规则
location = / {
proxy_pass http://tomcat:8080/index
}
# 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
# 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {
root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}
#第三个规则就是通用规则,用来转发动态请求到后端应用服务器
#非静态文件请求就默认是动态请求,自己根据实际把握
#毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了
location / {
proxy_pass http://tomcat:8080/
}参考:
http://tengine.taobao.org/book/chapter_02.html  
http://nginx.org/en/docs/http/ngx_http_rewrite_module.html  
 

Rewrite规则

ewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。rewrite只能放在server{},location{},if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用,例如 http://seanlook.com/a/we/index.php?id=1&u=str 只对/a/we/index.php重写。语法rewrite regex replacement [flag];
 
如果相对域名或参数字符串起作用,可以使用全局变量匹配,也可以使用proxy_pass反向代理。

表明看rewrite和location功能有点像,都能实现跳转,主要区别在于rewrite是在同一域名内更改获取资源的路径,而location是对一类路径做控制访问或反向代理,可以proxy_pass到其他机器。很多情况下rewrite也会写在location里,它们的执行顺序是:
执行server块的rewrite指令执行location匹配执行选定的location中的rewrite指令
如果其中某步URI被重写,则重新循环执行1-3,直到找到真实存在的文件;循环超过10次,则返回500 Internal Server Error错误。
 
 
flag标志位
last : 相当于Apache的[L]标记,表示完成rewritebreak : 停止执行当前虚拟主机的后续rewrite指令集redirect : 返回302临时重定向,地址栏会显示跳转后的地址permanent : 返回301永久重定向,地址栏会显示跳转后的地址
 
 
因为301和302不能简单的只返回状态码,还必须有重定向的URL,这就是return指令无法返回301,302的原因了。这里 last 和 break 区别有点难以理解:
last一般写在server和if中,而break一般使用在location中last不终止重写后的url匹配,即新的url会再从server走一遍匹配流程,而break终止重写后的匹配break和last都能组织继续执行后面的rewrite指令
 
 
if指令与全局变量
if判断指令
语法为if(condition){...},对给定的条件condition进行判断。如果为真,大括号内的rewrite指令将被执行,if条件(conditon)可以是如下任何内容:
当表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做false直接比较变量和内容时,使用=或!=~正则表达式匹配,~*不区分大小写的匹配,!~区分大小写的不匹配
-f和!-f用来判断是否存在文件
-d和!-d用来判断是否存在目录
-e和!-e用来判断是否存在文件或目录
-x和!-x用来判断文件是否可执行
 
示例:
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
} //如果UA包含"MSIE",rewrite请求到/msid/目录下

if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
set $id $1;
} //如果cookie匹配正则,设置变量$id等于正则引用部分

if ($request_method = POST) {
return 405;
} //如果提交方法为POST,则返回状态405(Method not allowed)。return不能返回301,302

if ($slow) {
limit_rate 10k;
} //限速,$slow可以通过 set 指令设置

if (!-f $request_filename){
break;
proxy_pass http://127.0.0.1;
} //如果请求的文件名不存在,则反向代理到localhost 。这里的break也是停止rewrite检查

if ($args ~ post=140){
rewrite ^ http://example.com/ permanent;
} //如果query string中包含"post=140",永久重定向到example.com

location ~* \.(gif|jpg|png|swf|flv)$ {
valid_referers none blocked www.jefflei.com www.leizhenfang.com;
if ($invalid_referer) {
return 404;
} //防盗链
}
 全局变量
下面是可以用作if判断的全局变量:
$args : #这个变量等于请求行中的参数,同$query_string$content_length : 请求头中的Content-length字段。$content_type : 请求头中的Content-Type字段。$document_root : 当前请求在root指令中指定的值。$host : 请求主机头字段,否则为服务器名称。$http_user_agent : 客户端agent信息$http_cookie : 客户端cookie信息$limit_rate : 这个变量可以限制连接速率。$request_method : 客户端请求的动作,通常为GET或POST。$remote_addr : 客户端的IP地址。$remote_port : 客户端的端口。$remote_user : 已经经过Auth Basic Module验证的用户名。$request_filename : 当前请求的文件路径,由root或alias指令与URI请求生成。$scheme : HTTP方法(如http,https)。$server_protocol : 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。$server_addr : 服务器地址,在完成一次系统调用后可以确定这个值。$server_name : 服务器名称。$server_port : 请求到达服务器的端口号。$request_uri : 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.phparg=baz”。$uri : 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。$document_uri : 与$uri相同。
 
示例:http://localhost:88/test1/test2/test.php$host:localhost
$server_port:88
$request_uri:http://localhost:88/test1/test2/test.php
$document_uri:/test1/test2/test.php
$document_root:/var/www/html
$request_filename:/var/www/html/test1/test2/test.php
常用正则
. : 匹配除换行符以外的任意字符 : 重复0次或1次+ : 重复1次或更多次* : 重复0次或更多次\d :匹配数字^ : 匹配字符串的开始$ : 匹配字符串的介绍{n} : 重复n次{n,} : 重复n次或更多次[c] : 匹配单个字符c[a-z] : 匹配a-z小写字母的任意一个
小括号()之间匹配的内容,可以在后面通过$1来引用,$2表示的是前面第二个()里的内容。正则里面容易让人困惑的是\转义特殊字符。
 
 
rewrite实例
示例1:
http {
# 定义image日志格式
log_format imagelog '[$time_local] ' $image_file ' ' $image_type ' ' $body_bytes_sent ' ' $status;
# 开启重写日志
rewrite_log on;

server {
root /home/www;

location / {
# 重写规则信息
error_log logs/rewrite.log notice;
# 注意这里要用‘’单引号引起来,避免{}
rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4;
# 注意不能在上面这条规则后面加上“last”参数,否则下面的set指令不会执行
set $image_file $3;
set $image_type $4;
}

location /data {
# 指定针对图片的日志格式,来分析图片类型和大小
access_log logs/images.log mian;
root /data/images;
# 应用前面定义的变量。判断首先文件在不在,不在再判断目录在不在,如果还不在就跳转到最后一个url里
try_files /$arg_file /image404.html;
}
location = /image404.html {
# 图片不存在返回特定的信息
return 404 "image not found\n";
}
}对形如/images/ef/uh7b3/test.png的请求,重写到/data?file=test.png,于是匹配到location /data,先看/data/images/test.png文件存不存在,如果存在则正常响应,如果不存在则重写tryfiles到新的image404 location,直接返回404状态码。
 
示例2:
rewrite ^/images/(.*)_(\d+)x(\d+)\.(png|jpg|gif)$ /resizer/$1.$4?width=$2&height=$3? last;对形如/images/bla_500x400.jpg的文件请求,重写到/resizer/bla.jpg?width=500&height=400地址,并会继续尝试匹配location。 查看全部
nginxre.png


location正则写法


简单示例如下
location = / {
# 精确匹配 /,主机名后面不能带任何字符串
[ configuration A ]
}

location / {
# 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 ,比如我们代理的一个站点根
# 但是正则和最长字符串会优先匹配
[ configuration B ]
}

location /documents/ {
# 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
[ configuration C ]
}

location ~ /documents/Abc {
# 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
[ configuration CC ]
}

location ^~ /images/ {
# 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。
[ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
# 匹配所有以 gif,jpg或jpeg 结尾的请求
# 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则
[ configuration E ]
}

location /images/ {
# 字符匹配到 /images/,继续往下,会发现 ^~ 存在
[ configuration F ]
}

location /images/abc {
# 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在
# F与G的放置顺序是没有关系的
[ configuration G ]
}

location ~ /images/abc/ {
# 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用
[ configuration H ]
}

location ~* /js/.*/\.js

  • =开头表示精确匹配 如A中只匹配根目录结尾的请求,后面不能带任何字符串。
  • ^~ 开头表示uri以某个常规字符串开头,不是正则匹配
  • ~ 开头表示区分大小写的正则匹配;
  • ~* 开头表示不区分大小写的正则匹配
  • / 通用匹配, 如果没有其它匹配,任何请求都会匹配到

 
匹配优先级:


(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (/)


按照上面的location顺序,以下的匹配示例成立:
  • / -> config A  # 精确完全匹配,即使/index.html也匹配不了
  • /downloads/download.html -> config B   # 匹配B以后,往下没有任何匹配,采用B
  • /images/1.gif -> configuration D   # 匹配到F,往下匹配到D,停止往下
  • /images/abc/def -> config D   # 最长匹配到G,往下匹配D,停止往下,你可以看到 任何以/images/开头的都会匹配到D并停止,FG写在这里是没有任何意义的,H是永远轮不到的,这里只是为了说明匹配顺序
  • /documents/document.html -> config C    # 匹配到C,往下没有任何匹配,采用C
  • /documents/1.jpg -> configuration E   # 匹配到C,往下正则匹配到E
  • /documents/Abc.jpg -> config CC   # 最长匹配到C,往下正则顺序匹配到CC,不会往下到E

 


实际使用建议


 
所以实际使用中,个人觉得至少有三个匹配规则定义,如下:
#直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。
#这里是直接转发给后端应用服务器了,也可以是一个静态首页
# 第一个必选规则
location = / {
proxy_pass http://tomcat:8080/index
}
# 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
# 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {
root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}
#第三个规则就是通用规则,用来转发动态请求到后端应用服务器
#非静态文件请求就默认是动态请求,自己根据实际把握
#毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了
location / {
proxy_pass http://tomcat:8080/
}
参考:
http://tengine.taobao.org/book/chapter_02.html  
http://nginx.org/en/docs/http/ngx_http_rewrite_module.html  
 


Rewrite规则


ewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。rewrite只能放在server{},location{},if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用,例如 http://seanlook.com/a/we/index.php?id=1&u=str 只对/a/we/index.php重写。语法rewrite regex replacement [flag];
 
如果相对域名或参数字符串起作用,可以使用全局变量匹配,也可以使用proxy_pass反向代理。

表明看rewrite和location功能有点像,都能实现跳转,主要区别在于rewrite是在同一域名内更改获取资源的路径,而location是对一类路径做控制访问或反向代理,可以proxy_pass到其他机器。很多情况下rewrite也会写在location里,它们的执行顺序是:
  1. 执行server块的rewrite指令
  2. 执行location匹配
  3. 执行选定的location中的rewrite指令

如果其中某步URI被重写,则重新循环执行1-3,直到找到真实存在的文件;循环超过10次,则返回500 Internal Server Error错误。
 
 
flag标志位
  • last : 相当于Apache的[L]标记,表示完成rewrite
  • break : 停止执行当前虚拟主机的后续rewrite指令集
  • redirect : 返回302临时重定向,地址栏会显示跳转后的地址
  • permanent : 返回301永久重定向,地址栏会显示跳转后的地址

 
 
因为301和302不能简单的只返回状态码,还必须有重定向的URL,这就是return指令无法返回301,302的原因了。这里 last 和 break 区别有点难以理解:
  1. last一般写在server和if中,而break一般使用在location中
  2. last不终止重写后的url匹配,即新的url会再从server走一遍匹配流程,而break终止重写后的匹配
  3. break和last都能组织继续执行后面的rewrite指令

 
 
if指令与全局变量
if判断指令
语法为if(condition){...},对给定的条件condition进行判断。如果为真,大括号内的rewrite指令将被执行,if条件(conditon)可以是如下任何内容:
  • 当表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做false
  • 直接比较变量和内容时,使用=或!=
  • ~正则表达式匹配,~*不区分大小写的匹配,!~区分大小写的不匹配

-f和!-f用来判断是否存在文件
-d和!-d用来判断是否存在目录
-e和!-e用来判断是否存在文件或目录
-x和!-x用来判断文件是否可执行
 
示例:
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
} //如果UA包含"MSIE",rewrite请求到/msid/目录下

if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
set $id $1;
} //如果cookie匹配正则,设置变量$id等于正则引用部分

if ($request_method = POST) {
return 405;
} //如果提交方法为POST,则返回状态405(Method not allowed)。return不能返回301,302

if ($slow) {
limit_rate 10k;
} //限速,$slow可以通过 set 指令设置

if (!-f $request_filename){
break;
proxy_pass http://127.0.0.1;
} //如果请求的文件名不存在,则反向代理到localhost 。这里的break也是停止rewrite检查

if ($args ~ post=140){
rewrite ^ http://example.com/ permanent;
} //如果query string中包含"post=140",永久重定向到example.com

location ~* \.(gif|jpg|png|swf|flv)$ {
valid_referers none blocked www.jefflei.com www.leizhenfang.com;
if ($invalid_referer) {
return 404;
} //防盗链
}

 全局变量
下面是可以用作if判断的全局变量:
  • $args : #这个变量等于请求行中的参数,同$query_string
  • $content_length : 请求头中的Content-length字段。
  • $content_type : 请求头中的Content-Type字段。
  • $document_root : 当前请求在root指令中指定的值。
  • $host : 请求主机头字段,否则为服务器名称。
  • $http_user_agent : 客户端agent信息
  • $http_cookie : 客户端cookie信息
  • $limit_rate : 这个变量可以限制连接速率。
  • $request_method : 客户端请求的动作,通常为GET或POST。
  • $remote_addr : 客户端的IP地址。
  • $remote_port : 客户端的端口。
  • $remote_user : 已经经过Auth Basic Module验证的用户名。
  • $request_filename : 当前请求的文件路径,由root或alias指令与URI请求生成。
  • $scheme : HTTP方法(如http,https)。
  • $server_protocol : 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
  • $server_addr : 服务器地址,在完成一次系统调用后可以确定这个值。
  • $server_name : 服务器名称。
  • $server_port : 请求到达服务器的端口号。
  • $request_uri : 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.phparg=baz”。
  • $uri : 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
  • $document_uri : 与$uri相同。

 
示例:http://localhost:88/test1/test2/test.php
$host:localhost
$server_port:88
$request_uri:http://localhost:88/test1/test2/test.php
$document_uri:/test1/test2/test.php
$document_root:/var/www/html
$request_filename:/var/www/html/test1/test2/test.php

常用正则
  • . : 匹配除换行符以外的任意字符
  • : 重复0次或1次
  • + : 重复1次或更多次
  • * : 重复0次或更多次
  • \d :匹配数字
  • ^ : 匹配字符串的开始
  • $ : 匹配字符串的介绍
  • {n} : 重复n次
  • {n,} : 重复n次或更多次
  • [c] : 匹配单个字符c
  • [a-z] : 匹配a-z小写字母的任意一个

小括号()之间匹配的内容,可以在后面通过$1来引用,$2表示的是前面第二个()里的内容。正则里面容易让人困惑的是\转义特殊字符。
 
 
rewrite实例
示例1:
http {
# 定义image日志格式
log_format imagelog '[$time_local] ' $image_file ' ' $image_type ' ' $body_bytes_sent ' ' $status;
# 开启重写日志
rewrite_log on;

server {
root /home/www;

location / {
# 重写规则信息
error_log logs/rewrite.log notice;
# 注意这里要用‘’单引号引起来,避免{}
rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4;
# 注意不能在上面这条规则后面加上“last”参数,否则下面的set指令不会执行
set $image_file $3;
set $image_type $4;
}

location /data {
# 指定针对图片的日志格式,来分析图片类型和大小
access_log logs/images.log mian;
root /data/images;
# 应用前面定义的变量。判断首先文件在不在,不在再判断目录在不在,如果还不在就跳转到最后一个url里
try_files /$arg_file /image404.html;
}
location = /image404.html {
# 图片不存在返回特定的信息
return 404 "image not found\n";
}
}
对形如/images/ef/uh7b3/test.png的请求,重写到/data?file=test.png,于是匹配到location /data,先看/data/images/test.png文件存不存在,如果存在则正常响应,如果不存在则重写tryfiles到新的image404 location,直接返回404状态码。
 
示例2:
rewrite ^/images/(.*)_(\d+)x(\d+)\.(png|jpg|gif)$ /resizer/$1.$4?width=$2&height=$3? last;
对形如/images/bla_500x400.jpg的文件请求,重写到/resizer/bla.jpg?width=500&height=400地址,并会继续尝试匹配location。

Mac下最简单翻墙的方法

采菊篱下 发表了文章 • 0 个评论 • 344 次浏览 • 2017-03-13 15:32 • 来自相关话题

自动代理配置url: https://raw.githubusercontent.com/bannedbook/fanqiang/master/ios/ios.pac 
 
图示:




 
完美解决: 查看全部
googleproxy.png

自动代理配置url: https://raw.githubusercontent.com/bannedbook/fanqiang/master/ios/ios.pac 
 
图示:
urlsetting.png

 
完美解决:
pian.png