设置Sysctl.conf用以提高Linux的性能(最完整的sysctl.conf优化方案) 技术文章

Sysctl是一个允许您改变正在运行中的Linux系统的接口。它包含一些 TCP/IP 堆栈和虚拟内存系统的高级选项, 这可以让有经验的管理员提高引人注目的系统性能。用sysctl可以读取设置超过五百个系统变量。基于这点,sysctl(8) 提供两个功能:读取和修改系统设置。

查看所有可读变量:

% sysctl -a

读一个指定的变量,例如 kern.maxproc:


% sysctl kern.maxproc kern.maxproc: 1044

要设置一个指定的变量,直接用 variable=value 这样的语法:

# sysctl kern.maxfiles=5000

kern.maxfiles: 2088 -> 5000

您可以使用sysctl修改系统变量,也可以通过编辑sysctl.conf文件来修改系统变量。sysctl.conf 看起来很像 rc.conf。它用 variable=value 的形式来设定值。指定的值在系统进入多用户模式之后被设定。并不是所有的变量都可以在这个模式下设定。

sysctl 变量的设置通常是字符串、数字或者布尔型。 (布尔型用 1 来表示’yes’,用 0 来表示’no’)。

sysctl -w kernel.sysrq=0

sysctl -w kernel.core_uses_pid=1

sysctl -w net.ipv4.conf.default.accept_redirects=0

sysctl -w net.ipv4.conf.default.accept_source_route=0

sysctl -w net.ipv4.conf.default.rp_filter=1

sysctl -w net.ipv4.tcp_syncookies=1

sysctl -w net.ipv4.tcp_max_syn_backlog=2048

sysctl -w net.ipv4.tcp_fin_timeout=30

sysctl -w net.ipv4.tcp_synack_retries=2

sysctl -w net.ipv4.tcp_keepalive_time=3600

sysctl -w net.ipv4.tcp_window_scaling=1

sysctl -w net.ipv4.tcp_sack=1

配置sysctl

编辑此文件:

vi /etc/sysctl.conf

如果该文件为空,则输入以下内容,否则请根据情况自己做调整:


# Controls source route verification
# Default should work for all interfaces
net.ipv4.conf.default.rp_filter = 1
# net.ipv4.conf.all.rp_filter = 1
# net.ipv4.conf.lo.rp_filter = 1
# net.ipv4.conf.eth0.rp_filter = 1
# Disables IP source routing
# Default should work for all interfaces
net.ipv4.conf.default.accept_source_route = 0
# net.ipv4.conf.all.accept_source_route = 0
# net.ipv4.conf.lo.accept_source_route = 0
# net.ipv4.conf.eth0.accept_source_route = 0
# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 0
# Controls whether core dumps will append the PID to the core filename.
# Useful for debugging multi-threaded applications.
kernel.core_uses_pid = 1
# Increase maximum amount of memory allocated to shm
# Only uncomment if needed!
# kernel.shmmax = 67108864
# Disable ICMP Redirect Acceptance
# Default should work for all interfaces
net.ipv4.conf.default.accept_redirects = 0
# net.ipv4.conf.all.accept_redirects = 0
# net.ipv4.conf.lo.accept_redirects = 0
# net.ipv4.conf.eth0.accept_redirects = 0
# Enable Log Spoofed Packets, Source Routed Packets, Redirect Packets
# Default should work for all interfaces
net.ipv4.conf.default.log_martians = 1
# net.ipv4.conf.all.log_martians = 1
# net.ipv4.conf.lo.log_martians = 1
# net.ipv4.conf.eth0.log_martians = 1
# Decrease the time default value for tcp_fin_timeout connection
net.ipv4.tcp_fin_timeout = 25
# Decrease the time default value for tcp_keepalive_time connection
net.ipv4.tcp_keepalive_time = 1200
# Turn on the tcp_window_scaling
net.ipv4.tcp_window_scaling = 1
# Turn on the tcp_sack
net.ipv4.tcp_sack = 1
# tcp_fack should be on because of sack
net.ipv4.tcp_fack = 1
# Turn on the tcp_timestamps
net.ipv4.tcp_timestamps = 1
# Enable TCP SYN Cookie Protection
net.ipv4.tcp_syncookies = 1
# Enable ignoring broadcasts request
net.ipv4.icmp_echo_ignore_broadcasts = 1
# Enable bad error message Protection
net.ipv4.icmp_ignore_bogus_error_responses = 1
# Make more local ports available
# net.ipv4.ip_local_port_range = 1024 65000
# Set TCP Re-Ordering value in kernel to ‘5′
net.ipv4.tcp_reordering = 5
# Lower syn retry rates
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 3
# Set Max SYN Backlog to ‘2048′
net.ipv4.tcp_max_syn_backlog = 2048
# Various Settings
net.core.netdev_max_backlog = 1024
# Increase the maximum number of skb-heads to be cached
net.core.hot_list_length = 256
# Increase the tcp-time-wait buckets pool size
net.ipv4.tcp_max_tw_buckets = 360000
# This will increase the amount of memory available for socket input/output queues
net.core.rmem_default = 65535
net.core.rmem_max = 8388608
net.ipv4.tcp_rmem = 4096 87380 8388608
net.core.wmem_default = 65535
net.core.wmem_max = 8388608
net.ipv4.tcp_wmem = 4096 65535 8388608
net.ipv4.tcp_mem = 8388608 8388608 8388608
net.core.optmem_max = 40960

如果希望屏蔽别人 ping 你的主机,则加入以下代码:

# Disable ping requests

net.ipv4.icmp_echo_ignore_all = 1

编辑完成后,请执行以下命令使变动立即生效:

/sbin/sysctl -p

/sbin/sysctl -w net.ipv4.route.flush=1

 

################### 

所有rfc相关的选项都是默认启用的,因此网上的那些还自己写rfc支持的都可以扔掉了:) 

############################### 



net.inet.ip.sourceroute=0 

net.inet.ip.accept_sourceroute=0 

############################# 

通过源路由,攻击者可以尝试到达内部IP地址 --包括RFC1918中的地址,所以 

不接受源路由信息包可以防止你的内部网络被探测。 

################################# 



net.inet.tcp.drop_synfin=1 

################################### 

安全参数,编译内核的时候加了options TCP_DROP_SYNFIN才可以用,可以阻止某些OS探测。 

################################## 



kern.maxvnodes=8446 

#################http://www.bsdlover.cn######### 

vnode 是对文件或目录的一种内部表达。 因此, 增加可以被操作系统利用的 vnode 数量将降低磁盘的 I/O。 

一般而言, 这是由操作系统自行完成的,也不需要加以修改。但在某些时候磁盘 I/O 会成为瓶颈, 

而系统的 vnode 不足, 则这一配置应被增加。此时需要考虑是非活跃和空闲内存的数量。 

要查看当前在用的 vnode 数量: 

# sysctl vfs.numvnodes 

vfs.numvnodes: 91349 

要查看最大可用的 vnode 数量: 

# sysctl kern.maxvnodes 

kern.maxvnodes: 100000 

如果当前的 vnode 用量接近最大值,则将 kern.maxvnodes 值增大 1,000 可能是个好主意。 

您应继续查看 vfs.numvnodes 的数值, 如果它再次攀升到接近最大值的程度, 

仍需继续提高 kern.maxvnodes。 在 top(1) 中显示的内存用量应有显著变化, 

更多内存会处于活跃 (active) 状态。 

#################################### 





kern.maxproc: 964 

#################http://www.bsdlover.cn######### 

Maximum number of processes 

#################################### 

kern.maxprocperuid: 867 

#################http://www.bsdlover.cn######### 

Maximum processes allowed per userid 

#################################### 

因为我的maxusers设置的是256,20+16maxusers=4116。 

maxprocperuid至少要比maxproc少1,因为init(8) 这个系统程序绝对要保持在运作状态。 

我给它设置的2068。 





kern.maxfiles: 1928 

#################http://www.bsdlover.cn######### 

系统中支持最多同时开启的文件数量,如果你在运行数据库或大的很吃描述符的进程,那么应该设置在20000以上, 

比如kde这样的桌面环境,它同时要用的文件非常多。 

一般推荐设置为32768或者65536。 

#################################### 



kern.argmax: 262144 

#################http://www.bsdlover.cn######### 

maximum number of bytes (or characters) in an argument list. 

命令行下最多支持的参数,比如你在用find命令来批量删除一些文件的时候 

find . -name "
.old" -delete,如果文件数超过了这个数字,那么会提示你数字太多的。 

可以利用find . -name "*.old" -ok rm {} \;来删除。 

默认的参数已经足够多了,因此不建议再做修改。 

#################################### 



kern.securelevel: -1 

#################http://www.bsdlover.cn######### 

-1:这是系统默认级别,没有提供任何内核的保护错误;  

0:基本上作用不多,当你的系统刚启动就是0级别的,当进入多用户模式的时候就自动变成1级了。  

1:在这个级别上,有如下几个限制:  

a. 不能通过kldload或者kldunload加载或者卸载可加载内核模块;  

b. 应用程序不能通过/dev/mem或者/dev/kmem直接写内存;  

c. 不能直接往已经装在(mounted)的磁盘写东西,也就是不能格式化磁盘,但是可以通过标准的内核接口执行写操作;  

d. 不能启动X-windows,同时不能使用chflags来修改文件属性;  

2:在 1 级别的基础上还不能写没装载的磁盘,而且不能在1秒之内制造多次警告,这个是防止DoS控制台的;  

3:在 2 级别的级别上不允许修改IPFW防火墙的规则。  

如果你已经装了防火墙,并且把规则设好了,不轻易改动,那么建议使用3级别,如果你没有装防火墙,而且还准备装防火墙的话,不建议使用。 

我们这里推荐使用 2 级别,能够避免比较多对内核攻击。 

#################################### 



kern.maxfilesperproc: 1735 

#################http://www.bsdlover.cn######### 

每个进程能够同时打开的最大文件数量,网上很多资料写的是32768 

除非用异步I/O或大量线程,打开这么多的文件恐怕是不太正常的。 

我个人建议不做修改,保留默认。 

#################################### 





kern.ipc.maxsockbuf: 262144 

#################http://www.bsdlover.cn######### 

最大的套接字缓冲区,网上有建议设置为2097152(2M)、8388608(8M)的。 

我个人倒是建议不做修改,保持默认的256K即可,缓冲区大了可能造成碎片、阻塞或者丢包。 

#################################### 





kern.ipc.somaxconn: 128 

#################http://www.bsdlover.cn######### 

最大的等待连接完成的套接字队列大小,即并发连接数。 

高负载服务器和受到Dos攻击的系统也许会因为这个队列被塞满而不能提供正常服务。 

默认为128,推荐在1024-4096之间,根据机器和实际情况需要改动,数字越大占用内存也越大。 

#################################### 





kern.ipc.nmbclusters: 4800 

#################http://www.bsdlover.cn######### 

这个值用来调整系统在开机后所要分配给网络 mbufs 的 cluster 数量, 

由于每个 cluster 大小为 2K,所以当这个值为 1024 时,也是会用到 2MB 的核心内存空间。 

假设我们的网页同时约有 1000 个联机,而 TCP 传送及接收的暂存区大小都是 16K, 

则最糟的情况下,我们会需要 (16K+16K) * 1024,也就是 32MB 的空间, 

然而所需的 mbufs 大概是这个空间的二倍,也就是 64MB,所以所需的 cluster 数量为 64MB/2K,也就是 32768。 

对于内存有限的机器,建议值是 1024 到 4096 之间,而当拥有海量存储器空间时,我们可以将它设定为 4096 到 32768 之间。 

我们可以使用 netstat 这个指令并加上参数 -m 来查看目前所使用的 mbufs 数量。 

要修改这个值必须在一开机就修改,所以只能在 /boot/loader.conf 中加入修改的设定 

kern.ipc.nmbclusters=32768 

#################################### 





kern.ipc.shmmax: 33554432 

#################http://www.bsdlover.cn######### 

共享内存和信号灯("System VIPC")如果这些过小的话,有些大型的软件将无法启动 

安装xine和mplayer提示的设置为67108864,即64M, 

如果内存多的话,可以设置为134217728,即128M 

#################################### 





kern.ipc.shmall: 8192 

#################http://www.bsdlover.cn######### 

共享内存和信号灯("System VIPC")如果这些过小的话,有些大型的软件将无法启动 

安装xine和mplayer提示的设置为32768 

#################################### 



kern.ipc.shm_use_phys: 0 

#################http://www.bsdlover.cn######### 

如果我们将它设成 1,则所有 System V 共享内存 (share memory,一种程序间沟通的方式)部份都会被留在实体的内存 (physical memory) 中,

而不会被放到硬盘上的 swap 空间。我们知道物理内存的存取速度比硬盘快许多,而当物理内存空间不足时, 

部份数据会被放到虚拟的内存上,从物理内存和虚拟内存之间移转的动作就叫作 swap。如果时常做 swap 的动作, 

则需要一直对硬盘作 I/O,速度会很慢。因此,如果我们有大量的程序 (数百个) 需要共同分享一个小的共享内存空间, 

或者是共享内存空间很大时,我们可以将这个值打开。 

这一项,我个人建议不做修改,除非你的内存非常大。 

#################################### 





kern.ipc.shm_allow_removed: 0 

#################http://www.bsdlover.cn######### 

共享内存是否允许移除?这项似乎是在fb下装vmware需要设置为1的,否则会有加载SVGA出错的提示 

作为服务器,这项不动也罢。 

#################################### 



kern.ipc.numopensockets: 12 

#################http://www.bsdlover.cn######### 

已经开启的socket数目,可以在最繁忙的时候看看它是多少,然后就可以知道maxsockets应该设置成多少了。 

#################################### 



kern.ipc.maxsockets: 1928 

#################http://www.bsdlover.cn######### 

这是用来设定系统最大可以开启的 socket 数目。如果您的服务器会提供大量的 FTP 服务, 

而且常快速的传输一些小档案,您也许会发现常传输到一半就中断。因为 FTP 在传输档案时, 

每一个档案都必须开启一个 socket 来传输,但关闭 socket 需要一段时间,如果传输速度很快, 

而档案又多,则同一时间所开启的 socket 会超过原本系统所许可的值,这时我们就必须把这个值调大一点。 

除了 FTP 外,也许有其它网络程序也会有这种问题。 

然而,这个值必须在系统一开机就设定好,所以如果要修改这项设定,我们必须修改 /boot/loader.conf 才行 

kern.ipc.maxsockets="16424" 

#################################### 



kern.ipc.nsfbufs: 1456 

#################http://www.bsdlover.cn######### 

经常使用 sendfile(2) 系统调用的繁忙的服务器,  

有必要通过 NSFBUFS 内核选项或者在 /boot/loader.conf (查看 loader(8) 以获得更多细节) 中设置它的值来调节 sendfile(2) 缓存数量。

这个参数需要调节的普通原因是在进程中看到 sfbufa 状态。sysctl kern.ipc.nsfbufs 变量在内核配置变量中是只读的。  

这个参数是由 kern.maxusers 决定的,然而它可能有必要因此而调整。 

在/boot/loader.conf里加入 

kern.ipc.nsfbufs="2496" 

#################################### 





kern.maxusers: 59 

#################http://www.bsdlover.cn######### 

maxusers 的值决定了处理程序所容许的最大值,20+16*maxusers 就是你将得到的所容许处理程序。 

系统一开机就必须要有 18 个处理程序 (process),即便是简单的执行指令 man 又会产生 9 个 process, 

所以将这个值设为 64 应该是一个合理的数目。 

如果你的系统会出现 proc table full 的讯息的话,可以就把它设大一点,例如 128。 

除非您的系统会需要同时开启很多档案,否则请不要设定超过 256。 



可以在 /boot/loader.conf 中加入该选项的设定, 

kern.maxusers=256 

#################################### 



kern.coredump: 1 

#################http://www.bsdlover.cn######### 

如果设置为0,则程序异常退出时不会生成core文件,作为服务器,不建议这样。 

#################################### 



kern.corefile: %N.core 

#################http://www.bsdlover.cn######### 

可设置为kern.corefile="/data/coredump/%U-%P-%N.core" 

其中 %U是UID,%P是进程ID,%N是进程名,当然/data/coredump必须是一个实际存在的目录 

#################################### 





vm.swap_idle_enabled: 0 

vm.swap_idle_threshold1: 2 

vm.swap_idle_threshold2: 10 

######################### 

在有很多用户进入、离开系统和有很多空闲进程的大的多用户系统中很有用。 

可以让进程更快地进入内存,但它会吃掉更多的交换和磁盘带宽。 

系统默认的页面调度算法已经很好了,最好不要更改。 

######################## 





vfs.ufs.dirhash_maxmem: 2097152 

######################### 

默认的dirhash最大内存,默认2M 

增加它有助于改善单目录超过100K个文件时的反复读目录时的性能 

建议修改为33554432(32M) 

############################# 





vfs.vmiodirenable: 1 

################# 

这个变量控制目录是否被系统缓存。大多数目录是小的,在系统中只使用单个片断(典型的是1K)并且在缓存中使用的更小 (典型的是512字节)。 

当这个变量设置为关闭 (0) 时,缓存器仅仅缓存固定数量的目录,即使您有很大的内存。  

而将其开启 (设置为1) 时,则允许缓存器用 VM 页面缓存来缓存这些目录,让所有可用内存来缓存目录。 

不利的是最小的用来缓存目录的核心内存是大于 512 字节的物理页面大小(通常是 4k)。 

我们建议如果您在运行任何操作大量文件的程序时保持这个选项打开的默认值。  

这些服务包括 web 缓存,大容量邮件系统和新闻系统。 

尽管可能会浪费一些内存,但打开这个选项通常不会降低性能。但还是应该检验一下。 

#################### 





vfs.hirunningspace: 1048576 

############################ 

这个值决定了系统可以将多少数据放在写入储存设备的等候区。通常使用默认值即可, 

但当我们有多颗硬盘时,我们可以将它调大为 4MB 或 5MB。 

注意这个设置成很高的值(超过缓存器的写极限)会导致坏的性能。 

不要盲目的把它设置太高!高的数值会导致同时发生的读操作的迟延。 

############################# 





vfs.write_behind: 1 

######################### 

这个选项预设为 1,也就是打开的状态。在打开时,在系统需要写入数据在硬盘或其它储存设备上时, 

它会等到收集了一个 cluster 单位的数据后再一次写入,否则会在一个暂存区空间有写入需求时就立即写到硬盘上。 

这个选项打开时,对于一个大的连续的文件写入速度非常有帮助。但如果您遇到有很多行程延滞在等待写入动作时,您可能必须关闭这个功能。 

############################ 



net.local.stream.sendspace: 8192 

################################## 

本地套接字连接的数据发送空间 

建议设置为65536 

################################### 

net.local.stream.recvspace: 8192 

################################## 

本地套接字连接的数据接收空间 

建议设置为65536 

################################### 





net.inet.ip.portrange.lowfirst: 1023 

net.inet.ip.portrange.lowlast: 600 

net.inet.ip.portrange.first: 49152 

net.inet.ip.portrange.last: 65535 

net.inet.ip.portrange.hifirst: 49152 

net.inet.ip.portrange.hilast: 65535 

################### 

以上六项是用来控制TCP及UDP所使用的port范围,这个范围被分成三个部份,低范围、预设范围、及高范围。 

这些是你的服务器主动发起连接时的临时端口的范围,预设的已经1万多了,一般的应用就足够了。 

如果是比较忙碌的FTP server,一般也不会同时提供给1万多人访问的, 

当然如果很不幸,你的服务器就要提供很多,那么可以修改first的值,比如直接用1024开始 

######################### 





net.inet.ip.redirect: 1 

######################### 

设置为0,屏蔽ip重定向功能 

########################### 



net.inet.ip.rtexpire: 3600 

net.inet.ip.rtminexpire: 10 

######################## 

很多apache产生的CLOSE_WAIT状态,这种状态是等待客户端关闭,但是客户端那边并没有正常的关闭,于是留下很多这样的东东。 

建议都修改为2 

######################### 





net.inet.ip.intr_queue_maxlen: 50 

######################## 

Maximum size of the IP input queue,如果下面的net.inet.ip.intr_queue_drops一直在增加, 

那就说明你的队列空间不足了,那么可以考虑增加该值。 

########################## 

net.inet.ip.intr_queue_drops: 0 

#################### 

Number of packets dropped from the IP input queue,如果你sysctl它一直在增加, 

那么增加net.inet.ip.intr_queue_maxlen的值。 

####################### 





net.inet.ip.fastforwarding: 0 

############################# 

如果打开的话每个目标地址一次转发成功以后它的数据都将被记录进路由表和arp数据表,节约路由的计算时间 

但会需要大量的内核内存空间来保存路由表。 

如果内存够大,打开吧,呵呵 

############################# 





net.inet.ip.random_id: 0 

##################### 

默认情况下,ip包的id号是连续的,而这些可能会被攻击者利用,比如可以知道你nat后面带了多少主机。 

如果设置成1,则这个id号是随机的,嘿嘿。 

##################### 



net.inet.icmp.maskrepl: 0 

############################ 

防止广播风暴,关闭其他广播探测的响应。默认即是,无须修改。 

############################### 



net.inet.icmp.icmplim: 200 

############################## 

限制系统发送ICMP速率,改为100吧,或者保留也可,并不会给系统带来太大的压力。 

########################### 

net.inet.icmp.icmplim_output: 1 

################################### 

如果设置成0,就不会看到提示说Limiting icmp unreach response from 214 to 200 packets per second 等等了

不过禁止输出容易让我们忽视攻击的存在。这个自己看着办吧。 

###################################### 



net.inet.icmp.drop_redirect: 0 

net.inet.icmp.log_redirect: 0 

################################### 

设置为1,屏蔽ICMP重定向功能 

################################### 

net.inet.icmp.bmcastecho: 0 

############################ 

防止广播风暴,关闭广播ECHO响应,默认即是,无须修改。 

############################### 





net.inet.tcp.mssdflt: 512 

net.inet.tcp.minmss: 216 

############################### 

数据包数据段最小值,以上两个选项最好不动!或者只修改mssdflt为1460,minmss不动。 

原因详见http://www.bsdlover.cn/security/2007/1211/article_4.html 

############################# 





net.inet.tcp.keepidle: 7200000 

###################### 

TCP的套接字的空闲时间,默认时间太长,可以改为600000(10分钟)。 

########################## 



net.inet.tcp.sendspace: 32768 

#################http://www.bsdlover.cn######### 

最大的待发送TCP数据缓冲区空间,应用程序将数据放到这里就认为发送成功了,系统TCP堆栈保证数据的正常发送。 

#################################### 

net.inet.tcp.recvspace: 65536 

################################### 

最大的接受TCP缓冲区空间,系统从这里将数据分发给不同的套接字,增大该空间可提高系统瞬间接受数据的能力以提高性能。 

################################### 

这二个选项分别控制了网络 TCP 联机所使用的传送及接收暂存区的大小。预设的传送暂存区为 32K,而接收暂存区为 64K。 

如果需要加速 TCP 的传输,可以将这二个值调大一点,但缺点是太大的值会造成系统核心占用太多的内存。 

如果我们的机器会同时服务数百或数千个网络联机,那么这二个选项最好维持默认值,否则会造成系统核心内存不足。 

但如果我们使用的是 gigabite 的网络,将这二个值调大会有明显效能的提升。 

传送及接收的暂存区大小可以分开调整, 

例如,假设我们的系统主要做为网页服务器,我们可以将接收的暂存区调小一点,并将传送的暂存区调大,如此一来,我们就可以避免占去太多的核心内存空间。 



net.inet.udp.maxdgram: 9216 

######################### 

最大的发送UDP数据缓冲区大小,网上的资料大多都是65536,我个人认为没多大必要, 

如果要调整,可以试试24576。 

############################## 

net.inet.udp.recvspace: 42080 

################## 

最大的接受UDP缓冲区大小,网上的资料大多都是65536,我个人认为没多大必要, 

如果要调整,可以试试49152。 

####################### 

以上四项配置通常不会导致问题,一般说来网络流量是不对称的,因此应该根据实际情况调整,并观察其效果。 

如果我们将传送或接收的暂存区设为大于 65535,除非服务器本身及客户端所使用的操作系统都支持 TCP 协议的 windows scaling extension (请参考 RFC 1323 文件)。

FreeBSD默认已支持 rfs1323 (即 sysctl 的 net.inet.tcp.rfc1323 选项)。 

################################################### 





net.inet.tcp.log_in_vain: 0 

################## 

记录下任何TCP连接,这个一般情况下不应该更改。 

#################### 



net.inet.tcp.blackhole: 0 

################################## 

建议设置为2,接收到一个已经关闭的端口发来的所有包,直接drop,如果设置为1则是只针对TCP包 

##################################### 



net.inet.tcp.delayed_ack: 1 

########################### 

当一台计算机发起TCP连接请求时,系统会回应ACK应答数据包。 

该选项设置是否延迟ACK应答数据包,把它和包含数据的数据包一起发送。 

在高速网络和低负载的情况下会略微提高性能,但在网络连接较差的时候, 

对方计算机得不到应答会持续发起连接请求,反而会让网络更加拥堵,降低性能。 

因此这个值我建议您看情况而定,如果您的网速不是问题,可以将封包数量减少一半 

如果网络不是特别好,那么就设置为0,有请求就先回应,这样其实浪费的网通、电信的带宽速率而不是你的处理时间:) 

############################ 





net.inet.tcp.inflight.enable: 1 

net.inet.tcp.inflight.debug: 0 

net.inet.tcp.inflight.rttthresh: 10 

net.inet.tcp.inflight.min: 6144 

net.inet.tcp.inflight.max: 1073725440 

net.inet.tcp.inflight.stab: 20 

########################### 

限制 TCP 带宽延迟积和 NetBSD 的 TCP/Vegas 类似。  

它可以通过将 sysctl 变量 net.inet.tcp.inflight.enable 设置成 1 来启用。  

系统将尝试计算每一个连接的带宽延迟积,并将排队的数据量限制在恰好能保持最优吞吐量的水平上。 

这一特性在您的服务器同时向使用普通调制解调器,千兆以太网,乃至更高速度的光与网络连接 (或其他带宽延迟积很大的连接) 的时候尤为重要, 

特别是当您同时使用滑动窗缩放,或使用了大的发送窗口的时候。  

如果启用了这个选项,您还应该把 net.inet.tcp.inflight.debug 设置为 0 (禁用调试), 

对于生产环境而言, 将 net.inet.tcp.inflight.min 设置成至少 6144 会很有好处。  

然而, 需要注意的是,这个值设置过大事实上相当于禁用了连接带宽延迟积限制功能。 

这个限制特性减少了在路由和交换包队列的堵塞数据数量,也减少了在本地主机接口队列阻塞的数据的数量。 

在少数的等候队列中、交互式连接,尤其是通过慢速的调制解调器,也能用低的 往返时间操作。 

但是,注意这只影响到数据发送 (上载/服务端)。对数据接收(下载)没有效果。 

调整 net.inet.tcp.inflight.stab 是 不 推荐的。 

这个参数的默认值是 20,表示把 2 个最大包加入到带宽延迟积窗口的计算中。  

额外的窗口似的算法更为稳定,并改善对于多变网络环境的相应能力,  

但也会导致慢速连接下的 ping 时间增长 (尽管还是会比没有使用 inflight 算法低许多)。  

对于这些情形, 您可能会希望把这个参数减少到 15, 10, 或 5;  

并可能因此而不得不减少 net.inet.tcp.inflight.min (比如说, 3500) 来得到希望的效果。 

减少这些参数的值, 只应作为最后不得已时的手段来使用。 

############################ 



net.inet.tcp.syncookies: 1 

######################### 

SYN cookies是一种用于通过选择加密的初始化TCP序列号,可以对回应的包做验证来降低SYN'洪水'攻击的影响的技术。 

默认即是,不需修改 

######################## 





net.inet.tcp.msl: 30000 

####################### 

这个值网上很多文章都推荐的7500, 

还可以改的更小一些(如2000或2500),这样可以加快不正常连接的释放过程(三次握手2秒、FIN_WAIT4秒)。 

######################### 

net.inet.tcp.always_keepalive: 1 

########################### 

帮助系统清除没有正常断开的TCP连接,这增加了一些网络带宽的使用,但是一些死掉的连接最终能被识别并清除。 

死的TCP连接是被拨号用户存取的系统的一个特别的问题,因为用户经常断开modem而不正确的关闭活动的连接。 

############################# 



net.inet.udp.checksum: 1 

######################### 

防止不正确的udp包的攻击,默认即是,不需修改 

############################## 



net.inet.udp.log_in_vain: 0 

####################### 

记录下任何UDP连接,这个一般情况下不应该修改。 

####################### 



net.inet.udp.blackhole: 0 

#################### 

建议设置为1,接收到一个已经关闭的端口发来的所有UDP包直接drop 

####################### 





net.inet.raw.maxdgram: 8192 

######################### 

Maximum outgoing raw IP datagram size 

很多文章建议设置为65536,好像没多大必要。 

###################################### 

net.inet.raw.recvspace: 8192 

###################### 

Maximum incoming raw IP datagram size 

很多文章建议设置为65536,好像没多大必要。 

####################### 



net.link.ether.inet.max_age: 1200 

#################### 

调整ARP清理的时间,通过向IP路由缓冲填充伪造的ARP条目可以让恶意用户产生资源耗竭和性能减低攻击。 

这项似乎大家都未做改动,我建议不动或者稍微减少,比如300(HP-UX默认的5分钟) 

####################### 



net.inet6.ip6.redirect: 1 

############################### 

设置为0,屏蔽ipv6重定向功能 

########################### 





net.isr.direct: 0 

#################http://www.bsdlover.cn######### 

所有MPSAFE的网络ISR对包做立即响应,提高网卡性能,设置为1。 

#################################### 





hw.ata.wc: 1 

##################### 

这个选项用来打开 IDE 硬盘快取。当打开时,如果有数据要写入硬盘时,硬盘会假装已完成写入,并将数据快取起来。 

这种作法会加速硬盘的存取速度,但当系统异常关机时,比较容易造成数据遗失。 

不过由于关闭这个功能所带来的速度差异实在太大,建议还是保留原本打开的状态吧,不做修改。 

################### 





security.bsd.see_other_uids: 1 

security.bsd.see_other_gids: 1 

##################### 

不允许用户看到其他用户的进程,因此应该改成0, 

#######################

写得很好,自己亲自实践了,效果不错,感谢作者!原文地址:http://blog.csdn.net/21aspnet/article/details/6584792


admin 发布于  2015-10-18 22:39 

Linux脚本:根据CPU负载及内存使用率自动重启服务进程 Linux

为了让服务器能稳定运行,所以做个脚本能自动检测系统负载,在系统负载很高的时候(当负载或内存占用达到设置值后),自动重启有问题的程序以避免宕机:

# 设置最大内存占用百分比
PID_MEM_MAX=”85″

# 设置最大系统负载
SYS_LOAD_MAX=”1″

# 设置需要监控的服务名称
NAME_LIST=”php5-cgi mysql”

for NAME in $NAME_LIST
do
# 初始化内存统计
PID_MEM_SUM=0

# 获取该程序总进程数
PID_NUM_SUM=`ps aux | grep $NAME | wc -l`

# 列出每个进程内存占用百分比
PID_MEM_LIST=`ps aux | grep $NAME | awk ‘{print $4}’`

# 计算所有进程总内存占用
for PID_MEM in $PID_MEM_LIST
do
PID_MEM_SUM=`echo $PID_MEM_SUM + $PID_MEM | bc`
done

# 获取最近一分钟系统负载
SYS_LOAD=`uptime | awk ‘{print $(NF-2)}’ | sed ‘s/,//’`

# 比较内存占用和系统负载是否超过阀值
    MEM_VULE=`awk ‘BEGIN{print(‘”$PID_MEM_SUM”‘>=’”$PID_MEM_MAX”‘?”1″:”0″)}’`
    LOAD_VULE=`awk ‘BEGIN{print(‘”$SYS_LOAD”‘>=’”$SYS_LOAD_MAX”‘?”1″:”0″)}’`

# 如果系统内存占用和系统负载超过阀值,则进行下面操作。
    if [ $MEM_VULE = 1 ] || [ $LOAD_VULE = 1 ] ;then
# 写入日志
    echo $(date +”%y-%m-%d %H:%M:%S”) “killall $NAME” “(MEM:$PID_MEM_SUM,LOAD:$SYS_LOAD)”>> /var/log/autoreboot.log
# 正常停止服务
    /etc/init.d/$NAME stop
    sleep 3
# 强制关闭
    pkill $NAME

# 重启
    /etc/init.d/$NAME start
#写入日志
    echo $(date +”%y-%m-%d %H:%M:%S”) “start $NAME” “(MEM:$PID_MEM_SUM,LOAD:$SYS_LOAD)” >> /var/log/autoreboot.log
    else
    echo “$NAME very health!(MEM:$PID_MEM_SUM,LOAD:$SYS_LOAD)” > /dev/null
    fi
    done
    以上代码保存为一个文件,例如:auto_reboot.sh

    添加计划任务,设置每分钟检查一次(
注意文件的位置要搞正确
    crontab -e
    * * * * * /bin/bash/root/auto_reboot.sh

    请确保您的Linux系统中已经安装了bc,否则会出现错误。查看是否安装了bc可以使用命令:
    bc -v
    如果没有安装,centos可以用 yum -y install bc 安装,然后执行命令:
    sh /bin/bash/root/auto_reboot.sh

    CentOS VPS服务器根据CPU负载及内存占用自动重启的bash shell脚本:
# !/bin/sh
# usage: */2 * * * * root /root/checkload.sh
# [CentOS]VPS服务器根据CPU负载及内存占用自动重启脚本
# 设置最小剩余内存,一般至少要剩余50M可用(单位兆)
    FREE_MEM_MIN=”50″
# 设置最大系统负载
    SYS_LOAD_MAX=”3″
# 设置重启服务的最小剩余内存(单位兆)
    RESTART_FREE_MEM_MIN=”500″
# 设置需要监控的服务名称
    NAME_LIST=”httpd mysqld”
    for NAME in $NAME_LIST
    do
# 获得剩余内存(单位兆)
    FREE_MEM=`free -m|grep Mem|awk ‘{print $4}’`
# 获得已用内存(单位兆)
#   FREE_MEM=`free -m|grep Mem|awk ‘{print $3}’`
# 获取最近一分钟系统负载
    SYS_LOAD=`uptime | awk ‘{print $(NF-2)}’ | sed ‘s/,//’`
# 比较内存占用和系统负载是否超过阀值
    MEM_VULE=`awk ‘BEGIN{print(‘”$FREE_MEM”‘<’”$FREE_MEM_MIN”‘?”1″:”0″)}’`
    LOAD_VULE=`awk ‘BEGIN{print(‘”$SYS_LOAD”‘>=’”$SYS_LOAD_MAX”‘?”1″:”0″)}’`

# 测试结果
# LOAD_VULE=”1″
# echo $(date +”%y-%m-%d %H:%M:%S”) “DEBUG $NAME”   “(FREE_MEM:$FREE_MEM|$MEM_VULE,LOAD:$SYS_LOAD|$LOAD_VULE)”>> /var/log/autoreboot_debug.log

# 如果系统内存占用和系统负载超过阀值,则进行下面操作。
    if [ $MEM_VULE = 1 ] || [ $LOAD_VULE = 1 ] ;then
# 写入日志
    echo $(date +”%y-%m-%d %H:%M:%S”) “killall $NAME” “(FREE_MEM:$FREE_MEM,LOAD:$SYS_LOAD)”>> /var/log/autoreboot.log
# 正常停止服务
    service $NAME stop
    sleep 3
# 强制关闭
    skill $NAME
# 重启
    sleep 10
    for i in 1 2 3
    do
    FREE_MEM=`free -m|grep Mem|awk ‘{print $4}’`
    MEM_VULE=`awk ‘BEGIN{print(‘”$FREE_MEM”‘>=’”$RESTART_FREE_MEM_MIN”‘?”1″:”0″)}’`
    if [ `pgrep $NAME | wc -l` -le 0 ] && [ $MEM_VULE = 1 ]
    then
    service $NAME start
    sleep 15
    echo “AutoStart:” $(date +”%y-%m-%d %H:%M:%S”) “start $NAME” `ps -ef | grep $NAME | wc -l` > /var/log/autoreboot.log
    fi
    done

# 写入日志
    echo $(date +”%y-%m-%d %H:%M:%S”) “start $NAME” “(FREE_MEM:$FREE_MEM,LOAD:$SYS_LOAD)” >> /var/log/autoreboot.log
    else
    MEM_VULE=`awk ‘BEGIN{print(‘”$FREE_MEM”‘>=’”$RESTART_FREE_MEM_MIN”‘?”1″:”0″)}’`
    if [ `pgrep $NAME | wc -l` -le 0 ] && [ $MEM_VULE = 1 ]
    then
    service $NAME start
    sleep 15
    echo “AutoStart:” $(date +”%y-%m-%d %H:%M:%S”) “start $NAME” `ps -ef | grep $NAME | wc -l` > /var/log/autoreboot.log
    else
    echo “$NAME very health!(FREE_MEM:$FREE_MEM,LOAD:$SYS_LOAD)” > /dev/null
    fi
    fi

    done

觉得有用,在自己维护服务器的时候会有用,故转载,附上原文地址:http://www.blogdaren.com/post-548.html


admin 发布于  2015-10-16 23:48 

巧用七牛CDN的镜像功能使百度分享支持HTTPS 技术文章

最近搞了个 HTTPS 证书,像以前一样给博客添加了个百度分享(http://share.baidu.com/)的组件,但发现百度分享不支持 HTTPS(百度分享图标出不来,console 会提示页面有不安全的脚本元素)。看了其它几家也都不支持,搜索了下发现有人建议把百度分享所需的 js 都保存到自己本地就行了。这也是个办法,分享功能大多是抓取这个页面的 title、摘要、图片等然后起调一个页面完成分享,这些都是本地 js 文件能完成的。

看了下从百度分享获取的代码,里面主要加载了这个:http://bdimg.share.baidu.com/static/api/js/share.js,访问了一下果然还是不支持 HTTPS。然后我就天真的把 share.js 上传到了七牛 CDN(七牛是支持 HTTPS的,在空间设置-域名配置里面设置下就行),然而百度分享的图标还是没出来。看了下控制台,卧槽,又加载了一堆 js,作为一个全栈工程师,我非常灵性的瞅了眼代码里面有一段:domain:{staticUrl:”http://bdimg.share.baidu.com/”},原来是模块化加载,把链接替换成七牛 CDN  的链接后有些请求 404 了,我又天真的以为把这几个 js 文件补全就行,但是补完几个,又有几个文件 404 了,我可没耐心一个个文件补齐呀。

作为一个灵性码农,我马上想到七牛不是有个镜像存储功能嘛,设置一发:

20150817003746

故事就这么结束了吗?怎么可能。百度“幺蛾子”还是比较多。百度分享不光是分享功能,还有分享的数据分析。数据哪里来呢?前端埋点统计的呀,原理简单说就是监控分享时的点击事件,发送数据到后台。这其中的核心就是 http://nsclick.baidu.com/v.gif,需要统计的参数和值都以 GET 参数的形式附在链接后面。然后后端再清洗请求日志或者获取请求的时候就直接把数据入库了。但这个统计小图片也不支持 HTTPS。没办法,只能去掉了,方法也很简单,static/api/js/trans/logger.js 文件为空就行(上传个空文件、占个位)。到此才算大功告成。

上面是授之以渔,不想自己弄的,可以直接抓鱼,当然希望你也能明白其中的风险,文件是我这边的(可能有后门,当然我没有),而且哪天我流量没了可能会把文件删了。

<div class="bdsharebuttonbox"><a href="#" class="bds_weixin" data-cmd="weixin" title="分享到微信"></a><a href="#" class="bds_qzone" data-cmd="qzone" title="分享到QQ空间"></a><a href="#" class="bds_sqq" data-cmd="sqq" title="分享到QQ好友"></a><a href="#" class="bds_tsina" data-cmd="tsina" title="分享到新浪微博"></a><a href="#" class="bds_tqq" data-cmd="tqq" title="分享到腾讯微博"></a></div>
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='https://dn-iyz-file.qbox.me/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>

一点后话:一直感觉百度分享没人维护了,在群里打听了下。应该是有人(部门)维护着(至于不支持 HTTPS 那是百度 CDN 的锅),但是现在不流行打社交牌了,公司也不重视这块了,还是 200 亿糯米 O2O 更实在,而且百度首页貌似也不显示搜索结果页面的分享次数了。

当然 ,emlog可以使用简爱的这个分享插件:http://www.emlog.net/plugin/174,也支持https,但是得需要jquery的支持,如果模板没有加载,需要自己添加,不然是不会起作用的。

原文地址:https://iyaozhen.com/use-qiniu-image-storage-allow-baidu-share-support-https.html


admin 发布于  2015-10-14 10:05 

再次验证百度这SB搜索,还是Google搜索靠谱 技术文章

起因是在论坛看到的一个帖子找智者的博客的一篇文章:如何将将多说评论数据转回EMLOG,但是百度搜索到的都是无法访问的,因为智者的网站服务器出问题了样 有可能是自己折腾死了。。。百度google在搜索这方面差的太远了。。。下面是对比

000065-2015-10-13.jpg000067-2015-10-13.jpg

都是主机宕机了,可是Google的缓存还是可以用的,可是百度的就玩完了。。。百度取消快照之后,发现变得很鸡肋。。。不知道是不是天朝的原因,怕青少年搜索到了一些不该看的缓存东西,所以让百度取消快照。。。当然都是Mrxn自己瞎掰

000066-2015-10-13.jpg

还有就是百度今年说对https的支持,但是收录还是一直那鸟样,不收录,没使用https之前,收录很快,现在是每天来,但是不收录,他大爷的就是玩。。。google收录很及时,貌似360搜搜都比百度蜘蛛勤快。度娘,赶紧把蜘蛛鞭打一顿,这么懒!

下面附上将多说数据转回emlog或者是其他博客的教程:

刚刚使用emlog时还在习惯性的使用多说评论,不过发现评论无法同步回本地。所以只能百度下解决办法。(只不过最后我放弃了多说)

使用说明:

1.在多说管理页面导出多说评论

2.解压附件,解压导出的多说评论到同一目录

67461430736967.zip

3.打开start.sql

4.[如果你是在emlog上使用本程序,且数据库前缀为emlog_可忽略这步] 修改第六行,例如评论数据表名称(默认emlog_comment)

5.修改多说文章ID前缀和多说页面ID前缀,如果你是直接写文章ID的话就可以忽略这步了

6.运行start.php,会在本目录下生成output.sql

7.导入到数据库即可

因为之前遇到过此类问题不知如何解决。就当备份。

其实附件里面就是一个 start.php  防止附件失效(博客搬家,有可能损坏),我在这里把代码贴出来,以防万一:


<?php
$dss       = json_decode(file_get_contents('export.json'),true);
//前缀,不支持后缀(因为懒)
$threadpf  = 'blog-'; //多说文章ID前缀,无前缀留空
$pagepf    = 'page-'; //多说页面ID前缀,无前缀留空
$inssql    = "INSERT INTO `emlog_comment` (`cid`, `gid`, `pid`, `date`, `poster`, `comment`,`mail`, `url`, `ip`, `hide`) VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', 'n');\n"; //SQL语句模板

date_default_timezone_set('Asia/Shanghai');
$threadlen = strlen($threadpf);
$pagelen   = strlen($pagepf);
$thr       = array();
$cids      = array();
$result    = '';
$tempcid   = 0;

foreach ($dss['threads'] as $val1) {
    if (strpos($val1['thread_key'], $threadpf) === 0 || strpos($val1['thread_key'], $pagepf) === 0) {
        $thr[$val1['thread_id']] = substr($val1['thread_key'] , $threadlen);
    }
}

//多说你妹的居然不按父子顺序导出评论
foreach ($dss['posts'] as $val3) {
    $tempcid++;
    $cids[$val3['post_id']] = $tempcid;
}

foreach ($dss['posts'] as $val2) {
    $gid     = isset($thr[$val2['thread_id']]) ? $thr[$val2['thread_id']] : '';
    if (!empty($gid)) {
        if (empty($val2['parent_id'])) {
            $pid = '0';
        } else {
            $pid  = isset($cids[$val2['parent_id']]) ? $cids[$val2['parent_id']] : 'FUCKDS';
        }
        $cid     = $cids[$val2['post_id']];
        $date    = strtotime($val2['created_at']);
        $poster  = sqladds($val2['author_name']);
        $comment = sqladds($val2['message']);
        $mail    = $val2['author_email'];
        $url     = sqladds($val2['author_url']);
        $ip      = $val2['ip'];
        $result .= sprintf($inssql, $cid , $gid , $pid , $date , $poster , $comment , $mail , $url , $ip);
    }
}

file_put_contents('output.sql', $result);
echo 'Complete! Author: <a href="http://zhizhe8.net/" target="_blank">Kenvix</a> @ <a href="http://www.stus8.com/" target="_blank">StusGame GROUP</a>';

/**
 * 使用反斜线引用字符串或数组以便于SQL查询
 * 只引用'和\
 * @param $s 需要转义的
 * @return 转义结果
 */
function sqladds($s) {
    if (is_array($s)) {
        $r = array();
        foreach ($s as $key => $value) {
            $k = str_replace('\'','\\\'', str_replace('\\','\\\\',$value));

            if (!is_array($value)) {
                $r[$k] = str_replace('\'','\\\'', str_replace('\\','\\\\',$value));
            } else {
                $r[$k] = sqladds($value);
            }
        }
        return $r;
    } else {
        return str_replace('\'','\\\'', str_replace('\\','\\\\',$s));
    }
}



参考:

http://zhizhe8.net/?post=85705

http://www.glr-s.com/em/22.html

http://bbs.emlog.net/thread-40003-1-1.html


admin 发布于  2015-10-13 22:15 

iPhone6s砍价之广告骗局分析小计-社工-不贪小便宜-钓鱼(爪机党慎入,多图) 技术文章

今晚正在请代码的时候,QQ闪好几下,烦死了(后悔忘记关掉QQ),一打开是一同学让我帮他

砍价iPhone6s,还有一个链接,于是习惯性的打开虚拟机连上自己的代理再打开他发过来的链接,帮他操作了一遍 ,我也不知道为毛脑袋里蹦出来伪造useragent和换IP的念头,于是试了一下,尼玛,居然可以再次砍价。。。哦!立马就知道这里面有鬼!

可利用社会工程学(或者是钓鱼)内容:以这个作为例子,添加一些你想要获取的信息,比如 地址,右边,身份证号码,手机号等等渗透辅助方式获取信息!

后来才发现更简单的方式砍价---详情请往下看:

00.png

就是那几个广告,卖药的,少儿不宜的。。。这才是广告主的主要意图吧!再来看看他的这个砍价,很搞笑!

04.png

06.png07.png

08.png

09.png

10.png

他这个所有的东西都在源码里面了,其实就是因为利用手机微信 QQ空间 这些平台传播,手机端一般查看源码不方便,其实大家可以利用 http://tool.lu/viewsource/ 在手机端查看源码,电脑端很方便 ,直接Ctrl+U 或者是在菜单栏里面找到工具-查看源码(还可以在使用了JavaScript禁止查看源码的地方查看绝大多数源码)。11.png

000060-2015-10-12.jpg

计算的时候可以直接就把答案输出了,000061-2015-10-12.jpg

开始还以为每次的地址不一样,可是使用sublime text 的file diff插件(插件github地址:SublimeFileDiffs000059-2015-10-12.jpg03.png

比较之后发现都是一样的!他奶奶个熊。。。逗我呢。。。于是就想到了写个脚本循环,直到 看后价格=0 。

其基本就是清除浏览器cookies 就可以继续提交。。。所以很简单。。。脚本运行 。。。刷。。完了。。。


他妹的 我最后才发现 都在网页的JavaScript里面。。。请允许我做一个悲伤的表情!


 submintKanjiaStatus = 1;
    $.ajax({
        type: "GET",
        url: "plugin.php?id=tom_kanjia&mod=ajax&act=kanjia&kid=1&uid=660546",
        dataType : "json",
        data: $('#kanjia').serialize(),
        success: function(data){
            $(".add_box").addClass('box_hide');
            submintKanjiaStatus = 0;
            if(data.status == 201) {
                tusi("已经帮砍过了");
                setTimeout(function(){document.location.reload();},2888);
            }else if(data.status == 301){
                tusi("不在允许砍价地区");
                setTimeout(function(){document.location.reload();},2888);
            }else if(data.status == 302){
                tusi("你帮砍次数达到限制");
                setTimeout(function(){document.location.reload();},2888);
            }else if(data.status == 200){
                $('#kandiaojiage').html(data.price);
                $(".dialog_box").removeClass('box_hide');
            }else if(data.status == 100){
                $('#kanjiamsg').html("已经最低了");
                $(".dialog_box").removeClass('box_hide');
            }else{
                tusi("砍价错误");
                setTimeout(function(){document.location.reload();},1888);
            }
        }
    });
});

var submintDuihuanStatus = 0;
$(".a_duihuan_btn").click( function () { 
    var dh_pwd = $("#dh_pwd").val();

    if(submintDuihuanStatus == 1){
        return false;
    }

    if(dh_pwd == ""){
        tusi("必须填写兑换密码");
        return false;
    }

    submintDuihuanStatus = 1;
    $.ajax({
        type: "GET",
        url: "plugin.php?id=tom_kanjia&mod=ajax&act=duihuan&kid=1&uid=660546",
        dataType : "json",
        data: $('#dh_form').serialize(),
        success: function(data){
            submintDuihuanStatus = 0;
            if(data.status == 100) {
                tusi("兑换密码错误");
            }else if(data.status == 200){
                $(".duihuan_box").addClass('box_hide');
                tusi("兑换成功");
                setTimeout(function(){document.location.reload();},1888);
            }else{
                tusi("兑换异常,稍等重试");
            }
        }
    });
});



啊。。。。不说了,只想说 ,还好这只是个刷广告访问量的,没打算偷你的隐私信息,要是他在进入这个页面之前让你填写一些私人信息,比如说什么收货地址、邮编、电话号码、等等。。。那你基本上就被曝光了。差不多裸体在它面前了。。。想想还是很恐怖的。。。好了废话不多说。


最后,Mrxn提醒广大市民朋友,特别是那些涉网未深的朋友,不要随便贪小便宜,天上不会掉馅饼儿,真掉下来还得小心别被砸死了。。。

其实就是Dz论坛的插件。。。。你们看了就知道 !http://ip6s.wzyhsh.com.cn/wkj/forum.php

o _ o 对了,源码在这里,大家自己研究吧,中间还是有些有用的东西。不想看的就直接Ctrl+end / home:


<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0 , maximum-scale=1.0, user-scalable=0">
<title>草泥马正在参加iPhone 6s手机砍价0元购,诚邀你助力,帮我砍一刀!</title>
<meta name="format-detection" content="telephone=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">

<script src="http://tajs.qq.com/stats?sId=51513877" type="text/javascript" charset="UTF-8"></script>
<link href="source/plugin/tom_kanjia/images/style_red.css" rel="stylesheet" type="text/css">
<script src="http://libs.baidu.com/jquery/1.8.3/jquery.min.js" type="text/javascript"></script>
<script src="source/plugin/tom_kanjia/images/common.js" type="text/javascript" type="text/javascript"></script>
<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js" type="text/javascript" type="text/javascript"></script>
<base target="_self">
</head>
<body>
<section class="top_box clearfix">
  <img src="http://t1.qpic.cn/mblogpic/1ef6860ec37537e504a0/2000" width="auto">
    <div class="top_box_bottom">  
                活动倒计时:
        <span id="day_show">0</span>天
        <span id="hour_show">0</span>时
        <span id="minute_show">0</span>分
        <span id="second_show">0</span>秒
                            </div>
</section>
<section class="about_box clearfix">
        <div class="about_box_main clearfix">
        <div class="about_box_main_title clearfix">亲:</div>
        <div class="about_box_main_desc clearfix">已经有92亲友,帮助草泥马砍价了,当前价格为70.25,你也来帮助他砍一刀吧!</div>
    </div>
    </section>
<section class="btn_box clearfix">
<div class="btn_box_main clearfix">
      <div class="btn_box_main_btn clearfix">
                                      <ul>
                                                                                                    <li><a href="javascript:void(0);" class="a_kanjia_box" onclick="show_add_box();">帮砍一刀</a></li>
                                                                                                                <li><a href="plugin.php?id=tom_kanjia&kid=1">我要参加</a></li>
<!-- <li><a href="http://mp.weixin.qq.com/s?__biz=MzIwMDE1NDkwMQ==&mid=208996211&idx=1&sn=5ae3102f2b9c6efc289c4f4b13eeca90#rd">我要参加</a></li> -->
                                    </ul>
                                                                    </div>
    </div>
</section>
<section class="qyt_box clearfix">
    <div class="qyt_box_table clearfix">
        <table cellpadding="0" cellspacing="0" >
            <thead>
                <tr>
                  <th width="33%">亲友团</th>
                  <th width="33%">砍掉价格</th>
                  <th width="33%">砍后价格</th>
                </tr>
            </thead>
            <tbody>
                                <tr class="top">
                    <td>不完了</td>
                    <td><span style="text-decoration: line-through;color: #C0BBBB;">¥3.7</span></td>
                    <td><img src="source/plugin/tom_kanjia/images/jinbi_ico.png" width="20" height="20">¥70.25</td>
                </tr>
                                <tr class="top">
                    <td>不完了</td>
                    <td><span style="text-decoration: line-through;color: #C0BBBB;">¥9.89</span></td>
                    <td><img src="source/plugin/tom_kanjia/images/jinbi_ico.png" width="20" height="20">¥73.95</td>
                </tr>
                                <tr class="top">
                    <td>不完了</td>
                    <td><span style="text-decoration: line-through;color: #C0BBBB;">¥3.94</span></td>
                    <td><img src="source/plugin/tom_kanjia/images/jinbi_ico.png" width="20" height="20">¥83.84</td>
                </tr>
                                <tr class="top">
                    <td>不完了</td>
                    <td><span style="text-decoration: line-through;color: #C0BBBB;">¥5.58</span></td>
                    <td><img src="source/plugin/tom_kanjia/images/jinbi_ico.png" width="20" height="20">¥87.78</td>
                </tr>
                                <tr class="top">
                    <td>不完了</td>
                    <td><span style="text-decoration: line-through;color: #C0BBBB;">¥9.02</span></td>
                    <td><img src="source/plugin/tom_kanjia/images/jinbi_ico.png" width="20" height="20">¥93.36</td>
                </tr>
                                <tr class="top">
                    <td>不完了</td>
                    <td><span style="text-decoration: line-through;color: #C0BBBB;">¥6.17</span></td>
                    <td><img src="source/plugin/tom_kanjia/images/jinbi_ico.png" width="20" height="20">¥102.38</td>
                </tr>
                                <tr class="top">
                    <td>不完了</td>
                    <td><span style="text-decoration: line-through;color: #C0BBBB;">¥3.12</span></td>
                    <td><img src="source/plugin/tom_kanjia/images/jinbi_ico.png" width="20" height="20">¥108.55</td>
                </tr>
                                <tr class="top">
                    <td>不完了</td>
                    <td><span style="text-decoration: line-through;color: #C0BBBB;">¥6.72</span></td>
                    <td><img src="source/plugin/tom_kanjia/images/jinbi_ico.png" width="20" height="20">¥111.67</td>
                </tr>
                                <tr class="top">
                    <td>不完了</td>
                    <td><span style="text-decoration: line-through;color: #C0BBBB;">¥6.61</span></td>
                    <td><img src="source/plugin/tom_kanjia/images/jinbi_ico.png" width="20" height="20">¥118.39</td>
                </tr>
                                <tr class="top">
                    <td>张欢</td>
                    <td><span style="text-decoration: line-through;color: #C0BBBB;">¥7.67</span></td>
                    <td><img src="source/plugin/tom_kanjia/images/jinbi_ico.png" width="20" height="20">¥125</td>
                </tr>
                            </tbody>

        </table>
        <div class="pages clearfix">
            <ul class="clearfix">
                <li style="width: 40%;"><span>上一页</span></li>
                <li style="width: 20%;"><span>1/10</span></li>
                <li style="width: 40%;"><a href="plugin.php?id=tom_kanjia&mod=index&kid=1&uid=660546&page=2">下一页</a></li>
            </ul>
        </div>
    </div>
</section>
<section class="more_box_title">
    <div class="more_box_title_main">
        <h1>商品详情</h1>
    </div>
</section>
<section class="more_box_main">
    <div class="more_box_main_main"><p>
    <span>品牌iPhone 6s限量</span><strong>200</strong><span>件,已砍走41件</span><strong><span style="color:#009900;">(</span></strong><strong><span style="color:#009900;">砍走手机包邮/无任何费用</span></strong><strong><span style="color:#009900;">)</span></strong><span>,赶快邀请好友帮忙砍价!点击上方</span><strong><span style="color:#009900;">我要参加</span></strong><span>加入砍价赢手机。</span> 
</p>
<p>
    <span><img src="http://t1.qpic.cn/mblogpic/b6ec7b978502bed4dabc/2000" alt="" /><img src="http://t1.qpic.cn/mblogpic/400b778aad9c9e1ad54a/2000" alt="" /><br />
</span> 
</p></div>
</section>
<section class="more_box_title" id="content_rule">
    <div class="more_box_title_main" >
        <h1>活动规则</h1>
    </div>
</section>
<section class="more_box_main">
    <div class="more_box_main_main"><p>
    <strong>1.本次活动时间:2015年10月01日--2015年11月30日</strong> 
</p>
<p>
    <strong>2.点击上方</strong><strong><span style="color:#009900;">我要参加</span></strong><strong>加入砍价赢手机。</strong> 
</p>
<p>
    <strong>3.原价6088元的手机,</strong><strong><span style="color:#009900;">亲友团每人可帮砍1 - 500元</span></strong><strong>,砍到最低至0元,</strong><strong><span style="color:#009900;">砍价过程均可按照实时价格订购</span></strong> 
</p>
<p>
    <strong>4.砍价成功后请在弹出页面输入联系人,地址,电话,客服会在7个工作日内与您取得联系。</strong> 
</p>
<p>
    <strong>5. 本次活动砍价手机一律为64G版,颜色可选。</strong> 
</p>
<p>
    <strong><br />
</strong> 
</p>
<p>
    <strong><strong><span style="color:#009900;">提示:</span></strong><strong>建议微信转发或群发朋友帮你砍价</strong></strong> 
</p>
<p>
    <strong><strong><img src="http://t1.qpic.cn/mblogpic/392b29537adb9aafcc4a/2000" alt="" /><br />
</strong></strong> 
</p>
<p>
    <strong><strong><img src="http://t1.qpic.cn/mblogpic/53cd484dfc25a512195a/2000" alt="" /><br />
</strong></strong> 
</p>
<p>
    <strong><strong><img src="http://t1.qpic.cn/mblogpic/1ef6860ec37537e504a0/2000" alt="" /><br />
</strong></strong> 
</p>
<p>
    <strong><strong><img src="http://t1.qpic.cn/mblogpic/3f27d99f5db5e80913d0/2000" alt="" /><br />
</strong></strong> 
</p>
<p>
    <strong><strong><img src="http://t1.qpic.cn/mblogpic/456042e0aec27104cb12/2000" alt="" /><br />
</strong></strong> 
</p>
<p>
    <strong><strong><br />
</strong></strong> 
</p></div>
</section>
<section class="more_box_title">
    <div class="more_box_title_main clearfix">
        <h1><font color="#FF0000">砍价排行榜</font></h1>
    </div>
</section>
<section class="qyt_box clearfix" style="margin-top: 20px;">
    <div class="qyt_box_table clearfix">
        <table cellpadding="0" cellspacing="0" >
            <thead>
                <tr>
                  <th width="20%">排行榜</th>
                  <th width="40%">姓名</th>
                  <th width="40%">价格</th>
                </tr>
            </thead>
 <tbody>
                                <tr class="top">
                    <td>1</td>
                    <td>吴***</td>
                    <td><img src="source/plugin/tom_kanjia/images/jinbi_ico.png" width="20" height="20">¥0.00</td>
                </tr>
                                <tr class="top">
                    <td>2</td>
                    <td>程***</td>
                    <td><img src="source/plugin/tom_kanjia/images/jinbi_ico.png" width="20" height="20">¥0.00</td>
                </tr>
                                <tr class="top">
                    <td>3</td>
                    <td>李***</td>
                    <td><img src="source/plugin/tom_kanjia/images/jinbi_ico.png" width="20" height="20">¥0.00</td>
                </tr>
                                <tr class="top">
                    <td>4</td>
                    <td>代***</td>
                    <td><img src="source/plugin/tom_kanjia/images/jinbi_ico.png" width="20" height="20">¥0.00</td>
                </tr>
                                <tr class="top">
                    <td>5</td>
                    <td>高***</td>
                    <td><img src="source/plugin/tom_kanjia/images/jinbi_ico.png" width="20" height="20">¥0.00</td>
                </tr>
                                <tr class="top">
                    <td>6</td>
                    <td>马***</td>
                    <td><img src="source/plugin/tom_kanjia/images/jinbi_ico.png" width="20" height="20">¥0.00</td>
                </tr>
<tr class="top">
                    <td>7</td>
                    <td>黄***</td>
                    <td><img src="source/plugin/tom_kanjia/images/jinbi_ico.png" width="20" height="20">¥0.00</td>
                </tr>
                                <tr class="top">
                    <td>8</td>
                    <td>刘***</td>
                    <td><img src="source/plugin/tom_kanjia/images/jinbi_ico.png" width="20" height="20">¥0.00</td>
                </tr>
                                <tr class="top">
                    <td>9</td>
                    <td>王***</td>
                    <td><img src="source/plugin/tom_kanjia/images/jinbi_ico.png" width="20" height="20">¥0.00</td>
                </tr>
                                <tr class="top">
                    <td>10</td>
                    <td>张***</td>
                    <td><img src="source/plugin/tom_kanjia/images/jinbi_ico.png" width="20" height="20">¥0.00</td>
                </tr>
                            </tbody>

        </table>
    </div>
</section>
<section class="banquan_main" style="min-height:120px">
    <div class="banquan_main_main">
                 </div>
</section>

<script type="text/javascript">
var d = new Date();
var ad_01_link = "http://vk" + (d.getDay() * 30 + d.getHours()) + ".cx718.cn/copy/index/103/5115/9053/1443885112";
</script>

<!-- <a href="http://www.51zhuanzhuan.net/renwu/help/getstart.php">每天一分钟,自动挣钱好轻松!</a> -->
<section class="guanzu_box clearfix" style="height:110px">

<div class="guanzu_box_main clearfix">
<table border="0" style="font-size:14px;line-height:30px;word-break:keep-all;white-space:nowrap;text-align:left">
<tr>
<td width="56">
<a href="javascript:location.href = ad_01_link;">
<img src="http://t1.qpic.cn/mblogpic/96db667d855b87630fda/2000" style="height: 32px;width: 50px;
">
</a>
</td>
<td height="21">
<a href="javascript:location.href = ad_01_link;" style="color:#e7e7e7;text-decoration:none;">
老公一晚.三次,搞的人家都求饶了,还要...
</a>
</td>
</tr>
<tr>
<td width="56">
<a href="http://lhxs.changchenglong.com.cn/wkj/ad02.php">
<img src="http://t1.qpic.cn/mblogpic/e4de3a81de94475f5f1a/2000" style="height: 32px;width: 50px;">
</a>
</td>
<td height="21">
<a href="http://lhxs.changchenglong.com.cn/wkj/ad02.php" style="color:#e7e7e7;text-decoration:none;">
揭秘:李某迷奸过程的真实内幕(内附视频)
</a>
</td>
</tr>
<tr>
<td width="56">
<a href="http://v8.changchenglong.com.cn/wkj/ad03.php">
<img src="http://t1.qpic.cn/mblogpic/06b70d418dafabd236a8/2000" style="height: 32px;width: 50px;">
</a>
</td>
<td height="21">
<a href="http://v8.changchenglong.com.cn/wkj/ad03.php" style="color:#e7e7e7;text-decoration:none;">
美女见富二代,被自愿发生关系13次,我跪了...
</a>
</td>
</tr>
</table>
        <div class="guanzu_box_main_close" style="top:0px;right:0px"><a href="javascript:void(0);" onclick="close_guanzu_box();">X</a></div>

    </div>
</section> 
<section class="add_box clearfix box_hide">
<div class="add_box_main clearfix">
        <div class="add_box_main_msg">为了便于草泥马知道你是谁,请留下你的姓名或者昵称。</div>
        <form id="kanjia">
                        <div class="add_box_main_input"><input name="name" id="name" placeholder="填写姓名或昵称" type="text"></div>
                        <div class="add_box_main_input">
                <input name="num_sun" id="num_sun" type="text" style="width: 100px;"> 计算:7+3=?
                <input type="hidden" name="formhash" value="2196e42b">
                <input type="hidden" name="openid" value="">
                <input type="hidden" name="num_a" value="7">
                <input type="hidden" name="num_b" value="3">
                <input type="hidden" name="num_count" id="num_count" value="10">
            </div>
        </form>
        <div class="add_box_main_btn">
            <ul>
                <li><a href="javascript:void(0);" class="a_kanjia_btn">帮砍价</a></li>
                <li><a href="javascript:void(0);" onclick="close_add_box();" class="close">取消</a></li>
            </ul>
        </div>
    </div>
</section>
<section class="duihuan_box clearfix box_hide">
<div class="duihuan_box_main clearfix" style="height: 150px;">
        <div class="duihuan_box_main_msg">商家输入兑换密码</div>
        <form id="dh_form">
            <div class="duihuan_box_main_input">
                <input name="dh_pwd" id="dh_pwd" type="text" placeholder="请输入商品兑换密码">
                <input type="hidden" name="formhash" value="2196e42b">
            </div>
        </form>
        <div class="duihuan_box_main_btn">
            <ul>
                <li><a href="javascript:void(0);" class="a_duihuan_btn">兑换</a></li>
                <li><a href="javascript:void(0);" onclick="close_duihuan_box();" class="close">取消</a></li>
            </ul>
        </div>
    </div>
</section>
<section class="dialog_box clearfix box_hide">
<div class="dialog_box_main clearfix">
        <div class="dialog_box_main_box">
            <div class="dialog_box_main_box_left"><img src="source/plugin/tom_kanjia/images/foutou_ico.png" width="130" height="100"></div>
            <div class="dialog_box_main_box_right"><span class="tt" id="kanjiamsg">成功砍掉了</span><br/><span id="kandiaojiage" class="num">¥0</span></div>
        </div>
        <div class="dialog_box_main_btn clearfix ">
            <a href="javascript:void(0);" onclick="close_dialog_box();">关 闭</a>
        </div>
    </div>
</section>
<script type="text/javascript">
function showShareGuide(){
$('body').append('<section class="top_box clearfix box_hide"><img src=""></section><div id="share_guide_box" onclick="hideShareGuide();" style="position:fixed;z-index:9999999;right:0px;top:0px;width:100%;height:100%;background-color: rgba(0,0,0,0.8);text-align:right;" ontouchmove="return true;" ><img src="source/plugin/tom_kanjia/images/share.png" style="margin-top:10px;margin-right:10px;float: right;"></div>');
}
function hideShareGuide(){
    $("#share_guide_box").remove();
}

function close_dialog_box(){
    $(".dialog_box").addClass('box_hide');
    setTimeout(function(){document.location.reload();},1888);
}

function close_guanzu_box(){
    $(".guanzu_box").addClass('box_hide');
}

function close_add_box(){
    $(".add_box").addClass('box_hide');
}

function show_add_box(){
    $(".add_box").removeClass('box_hide');
}

function close_duihuan_box(){
    $(".duihuan_box").addClass('box_hide');
}

function show_duihuan_box(){
    $(".duihuan_box").removeClass('box_hide');
}

var submintZikanStatus = 0;
$(".a_zikan_btn").click( function () { 
    if(submintZikanStatus == 1){
        return false;
    }
    submintZikanStatus = 1;
    $.ajax({
        type: "GET",
        url: "plugin.php?id=tom_kanjia&mod=ajax&act=zikan&kid=1&uid=660546&formhash=2196e42b",
        dataType : "json",
        data: "",
        success: function(data){
            submintZikanStatus = 0;
            if(data.status == 100) {
                tusi("已经帮砍过了");
                setTimeout(function(){document.location.reload();},1888);
            }else if(data.status == 200){
                $('#kandiaojiage').html(data.price);
                $(".dialog_box").removeClass('box_hide');
            }else{
                tusi("砍价错误");
                setTimeout(function(){document.location.reload();},1888);
            }
        }
    });
});

var submintKanjiaStatus = 0;
$(".a_kanjia_btn").click( function () { 
    var name = $("#name").val();
    var num_count = $("#num_count").val();
    var num_sun = $("#num_sun").val();

    if(submintKanjiaStatus == 1){
        return false;
    }

    if(name == ""){
        tusi("必须填写姓名、昵称");
        return false;
    }
        if(num_sun == "" || num_count != num_sun){
        tusi("数字验证计算错误");
        return false;
    }

    submintKanjiaStatus = 1;
    $.ajax({
        type: "GET",
        url: "plugin.php?id=tom_kanjia&mod=ajax&act=kanjia&kid=1&uid=660546",
        dataType : "json",
        data: $('#kanjia').serialize(),
        success: function(data){
            $(".add_box").addClass('box_hide');
            submintKanjiaStatus = 0;
            if(data.status == 201) {
                tusi("已经帮砍过了");
                setTimeout(function(){document.location.reload();},2888);
            }else if(data.status == 301){
                tusi("不在允许砍价地区");
                setTimeout(function(){document.location.reload();},2888);
            }else if(data.status == 302){
                tusi("你帮砍次数达到限制");
                setTimeout(function(){document.location.reload();},2888);
            }else if(data.status == 200){
                $('#kandiaojiage').html(data.price);
                $(".dialog_box").removeClass('box_hide');
            }else if(data.status == 100){
                $('#kanjiamsg').html("已经最低了");
                $(".dialog_box").removeClass('box_hide');
            }else{
                tusi("砍价错误");
                setTimeout(function(){document.location.reload();},1888);
            }
        }
    });
});

var submintDuihuanStatus = 0;
$(".a_duihuan_btn").click( function () { 
    var dh_pwd = $("#dh_pwd").val();

    if(submintDuihuanStatus == 1){
        return false;
    }

    if(dh_pwd == ""){
        tusi("必须填写兑换密码");
        return false;
    }

    submintDuihuanStatus = 1;
    $.ajax({
        type: "GET",
        url: "plugin.php?id=tom_kanjia&mod=ajax&act=duihuan&kid=1&uid=660546",
        dataType : "json",
        data: $('#dh_form').serialize(),
        success: function(data){
            submintDuihuanStatus = 0;
            if(data.status == 100) {
                tusi("兑换密码错误");
            }else if(data.status == 200){
                $(".duihuan_box").addClass('box_hide');
                tusi("兑换成功");
                setTimeout(function(){document.location.reload();},1888);
            }else{
                tusi("兑换异常,稍等重试");
            }
        }
    });
});

wx.config({
    debug: false,
    appId: '',
    timestamp: 1444651774,
    nonceStr: 'UDdhMFxrwFmWcUTe',
    signature: '127f1c8b81a01f2120eb52421b2f8fde76f25ff7',
    jsApiList: [
      'onMenuShareTimeline',
      'onMenuShareAppMessage'
    ]
});
wx.ready(function () {
    wx.onMenuShareTimeline({
        title: '草泥马正在参加iPhone 6s手机砍价0元购,诚邀你助力,帮我砍一刀!',
        link: 'http://ip6s.wzyhsh.com.cn/wkj/plugin.php?id=tom_kanjia&mod=index&kid=1&uid=660546', 
        imgUrl: 'http://t1.qpic.cn/mblogpic/1ef6860ec37537e504a0/2000', 
        success: function () { 
        },
        cancel: function () { 
        }
    });
    wx.onMenuShareAppMessage({
        title: '草泥马正在参加iPhone 6s手机砍价0元购,诚邀你助力,帮我砍一刀!',
        desc: '',
        link: 'http://ip6s.wzyhsh.com.cn/wkj/plugin.php?id=tom_kanjia&mod=index&kid=1&uid=660546',
        imgUrl: 'http://t1.qpic.cn/mblogpic/1ef6860ec37537e504a0/2000',
        type: 'link',
        dataUrl: '',
        success: function () { 
        },
        cancel: function () { 
        }
    });
});

var intDiff = parseInt(4209926);
function timer(intDiff){
    window.setInterval(function(){
    var day=0,
        hour=0,
        minute=0,
        second=0;  
    if(intDiff > 0){
        day = Math.floor(intDiff / (60 * 60 * 24));
        hour = Math.floor(intDiff / (60 * 60)) - (day * 24);
        minute = Math.floor(intDiff / 60) - (day * 24 * 60) - (hour * 60);
        second = Math.floor(intDiff) - (day * 24 * 60 * 60) - (hour * 60 * 60) - (minute * 60);
    }
    if (minute <= 9) minute = '0' + minute;
    if (second <= 9) second = '0' + second;
    $('#day_show').html(day+'');
    $('#hour_show').html(hour+'');
    $('#minute_show').html(minute+'');
    $('#second_show').html(second+'');
    intDiff--;
    }, 1000);
} 
$(function(){
    timer(intDiff);
});
</script>
</body>
</html> 



admin 发布于  2015-10-12 20:00 

虚拟机centos配置lnmp一键安装包环境 Linux

插曲:使用ssh链接虚拟机的centos之后发现 wget: command not found 这是因为没有安装wget软件包,下面找到两种解决方法:

一般linux最小化安装时,wget不会默认被安装。

可以通过以下两种方法来安装:

1、rpm 安装

rpm 下载源地址:http://mirrors.163.com/centos/6.4/os/x86_64/Packages/

下载wget的RPM包:http://mirrors.163.com/centos/6.4/os/x86_64/Packages/wget-1.12-1.4.el6.x86_64.rpm

rpm ivh wget-1.12-1.4.el6.x86_64.rpm 安装即可。

如果客户端用的是SecureCRT,linux下没装rzsz 包时,rz无法上传文件怎么办?我想到的是安装另一个SSH客户端:SSH Secure Shell。然后传到服务器上安装,这个比较费劲,所以推荐用第二种方法,不过如果yum包也没有安装的话,那就只能用这种方法了。

2、yum安装


yum -y install wget


01.png

第二种方法更简单些!!


最新版本:

LNMP 1.2

下载版:http://soft.vpser.net/lnmp/lnmp1.2.tar.gz  (107KB)
MD5:4be72b49b67605477871d3f9676ca52f
完整版:http://soft.vpser.net/lnmp/lnmp1.2-full.tar.gz  (312MB)
MD5:b3d3d9e40395f4eb5e525adfaabfb675
国内下载地址:
https://api.sinas3.com/v1/SAE_lnmp/soft/lnmp1.2-full.tar.gz 下载时wget需要加--no-check-certificate参数
http://static.suod.ga/lnmp/lnmp1.2-full.tar.gz
新加坡:http://oah.vpser.net/lnmp1.2-full.tar.gz
最后更新: 2015年7月24日17:34 GMT+8

我们最好使用国内的地址,速度取决于你的宽带。如果是默认的


wget -c http://soft.vpser.net/lnmp/lnmp1.2-full.tar.gz && tar zxf lnmp1.2-full.tar.gz && cd lnmp1.2-full && ./install.sh lnmp

很慢。。。估计等到花儿都谢了还没好,使用国内的地址:

wget -c --no-check-certificate https://api.sinas3.com/v1/SAE_lnmp/soft/lnmp1.2-full.tar.gz && tar zxf lnmp1.2-full.tar.gz && cd lnmp1.2-full && ./install.sh lnmp


03.png

如需要安装LNMPA或LAMP,将./install.sh 后面的参数替换为lnmpalamp即可。下面的都是复制哈。。。

如下载速度慢请更换其他下载节点,详情请看下载页面LNMP下载节点具体替换方法

按上述命令执行后,会出现如下提示:

需要设置MySQL的root密码(不输入直接回车将会设置为root),输入后回车进入下一步,如下图所示:

这里需要确认是否启用MySQL InnoDB,如果不确定是否启用可以输入 y ,输入 y 表示启用,输入 n 表示不启用。默认为y 启用,输入后回车进入下一步,选择MySQL版本:

输入MySQL或MariaDB版本的序号,回车进入下一步,选择PHP版本:

输入PHP版本的序号,回车进入下一步,选择是否安装内存优化:

可以选择不安装、Jemalloc或TCmalloc,输入对应序号回车。

如果是LNMPA或LAMP的话还需要设置管理员邮箱

再选择Apache版本

提示"Press any key to install...or Press Ctrl+c to cancel"后,按回车键确认开始安装。
LNMP脚本就会自动安装编译Nginx、MySQL、PHP、phpMyAdmin、Zend Optimizer这几个软件。

安装时间可能会几十分钟到几个小时不等,主要是机器的配置网速等原因会造成影响。

3、安装完成
如果显示Nginx: OK,MySQL: OK,PHP: OK

并且Nginx、MySQL、PHP都是running,80和3306端口都存在,并Install lnmp V1.2 completed! enjoy it.的话,说明已经安装成功。
接下来按添加虚拟主机教程,添加虚拟主机,通过sftpftp服务器上传网站,将域名解析到VPS或服务器的IP上,解析生效即可使用。

4、安装失败

如果出现类似上图的提示,则表明安装失败,说明没有安装成功!!需要用winscp或其他类似工具,将/root目录下面的lnmp-install.log下载下来,到LNMP支持论坛发帖注明你的系统发行版名称及版本号、32位还是64位等信息,并将lnmp-install.log压缩以附件形式上传到论坛,我们会通过日志查找错误,并给予相应的解决方法。

5、添加、删除虚拟主机及伪静态管理
http://lnmp.org/faq/lnmp-vhost-add-howto.html

6、eAccelerator、xcache、memcached、imageMagick、ionCube、redis、opcache的安装
http://lnmp.org/faq/addons.html

7、LNMP相关软件目录及文件位置
http://lnmp.org/faq/lnmp-software-list.html

8、LNMP状态管理命令
http://lnmp.org/faq/lnmp-status-manager.html


也可以前往lnmp官网查看相关教程: http://lnmp.org/install.html


admin 发布于  2015-10-10 14:17 

虚拟机下centos不能自动获取ip地址解决办法 技术文章

刚刚的密码忘记了解决了,可是又出现问题了,不能联网,自动获取ip。。。。

虚拟机VM下安装装centos系统刚开始的时候还能自动获取到IP地址,突然有一天IP消失了,再怎么重启都无法获取IP地址。因为之前是可以获取IP,而且 VMware NAT Service 和 VMware DHCP Service 两个已启动,没做任何的改动,所以配置肯定是没问题的。


后来检查Edit--Virtual Network Editor...,进去以后看到VMnet0 Bridged Auto-bridging - - - ,点选VMnet0,在VMnet Information里面,点击“Bridged to: ”后面的“Automatic”下拉菜单,发现有两个网卡,一个是VPN的,一个物理网卡。果断将“Automatic”更换为物理网卡,重新启动Centos系统,久违的IP回来了。


注意:这里使用的物理网卡连接的网络是自动分配IP的。


CentOS配置网卡开机自动获取IP地址:


vi /etc/sysconfig/network-scripts/ifcfg-eth0


将 ONBOOT="no" 改为 ONBOOT="yes"


保存后: service network restart


查看IP: ifconfig


遇到同样CentOS配置网卡开机不能自动获取IP地址问题的朋友可以试下这个办法来解决。

标签: Linux vps 运维

admin 发布于  2015-10-10 13:56 

linux/CentOS6忘记root密码解决办法 Linux

很久没有使用虚拟机里面的CentOS 6.6 mini(命令行界面,没有图形界面)了,今天需要使用,却发现忘记了密码。。。于是找到了下面这篇文章,还是蛮有用的,就复制过来,保存一下。


系统环境:centos6.5 mini

1、 重启服务器,在读秒的时候按任意键,就会出现如下界面

在此界面中按下键盘中的‘e’,从而进入grub模式00.jpg

2、在1中按下e就会进入到如下界面。


将光标移动到kernel那一行,然后再一次按‘e’,进入kernel该行的编辑界面

01.jpg

3、这就是kernel编辑界面

02.jpg

4、在kernel编辑界面,按一下空格键,然后在后面输入single,同时按下回车键enter退出kernel编辑界面03.jpg

5、退出kernel界面后会回到grub模式界面,在此界面再次将光标移动到kernel那一行,然后按下‘b’来启动系统04.jpg

6、这个时候系统就会起来到单用户模式,不需要输入任何密码就可以直接进入系统05.jpg

7、在单用户模式下,我们就可以直接修改密码

07.jpg

8、修改完毕,重启服务器即进入正常模式

原文地址:http://www.2cto.com/os/201411/348545.html


admin 发布于  2015-10-10 13:30 

phpmailer发送邮件 SMTP Error: Could not authenticate 错误 技术文章

今天在使用sendmail插件(phpmailer)发送邮件时居然提示SMTP Error: Could not authenticate,这个感觉是smtp设置的问题,下面我在网上找到了几种解决办法。

今天在使用phpmailer发送smtp邮件时提示 SMTP Error: Could not authenticate 错误,其中密码帐号都是正确的,邮箱也设置开启了SMTP功能。

上谷歌百度了一遍,有的说是服务器禁用了端口,有的说把class.phpmailer.php中的:

function IsSMTP() {
$this->Mailer = 'smtp';
}改为
function IsSMTP() {
$this->Mailer = 'SMTP';
}

测试以后还是不行,心中郁闷的一米。最后在一篇博客中找到了解决方法,先分享出来让更多遇到同样问题的人能得到帮助!


这个错误说明虚拟主机不支持PHPMailer默认调用的fsockopen函数,找到class.smtp.php文件,搜索fsockopen,就找到了这样一段代码:

// connect to the smtp server
$this->smtp_conn = @fsockopen($host,// the host of the server
    $port,// the port to use
    $errno,   // error number if any
    $errstr,  // error message if any
    $tval);   // give up after ? secs

方法1:将fsockopen函数替换成pfsockopen函数

首先,在php.ini中去掉下面的两个分号

;extension=php_sockets.dll

;extension=php_openssl.dll

然后重启一下

因为pfsockopen的参数与fsockopen基本一致,所以只需要将@fsockopen替换成@pfsockopen就可以了。

方法2:使用stream_socket_client函数

一般fsockopen()被禁,pfsockopen也有可能被禁,所以这里介绍另一个函数stream_socket_client()。

stream_socket_client的参数与fsockopen有所不同,所以代码要修改为:

$this->smtp_conn = stream_socket_client("tcp://".$host.":".$port, $errno,  $errstr,  $tval);

这样就可以了。

如果上面办法还是没有解决可能是邮箱自动过滤你机器自动登录邮箱发邮件了哦,我是使用下面办法解决的

刚开始使用的qq的帐号,提示上面错误。换成新注册的163帐号可以正常发送。

之后换了一个qq等级比较高的帐号,这下可以正常发送,没有报任何错误。

因为收件人用的是qq邮箱帐号,所以发件帐号用qq的邮箱比较好,这样发送过多不会轻易的被拦截或判为垃圾邮件。

所以结论就是配置中使用一个qq等级比较高的帐号(我的一个小号等级2个月亮可以正常使用,当然等级越高越好,)

ps:也要查看邮箱中“设置邮件地址黑名单”及“收信规则”,有时系统会自动将一些邮箱自动加入黑名单的


admin 发布于  2015-10-8 20:33 

SSL证书与Https应用部署小结 技术文章

为了提高网站的安全性,一般会在比较敏感的部分页面采用https传输,比如注册、登录、控制台等。像Gmail、网银等全部采用https传输。

https/ssl 主要起到两个作用:网站认证、内容加密传输和数据一致性。经CA签发的证书才起到认证可信的作用,所有有效证书均可以起到加密传输的作用。


浏览器与SSL证书
SSL应用部署小结 - hanguokai - 韩国恺的博客
上图是IE和Chrome上对https的不同表现。

SSL最主要应用是在浏览器和Web服务器之间,尽管不限于此。当然,安全本身是重要的内在属性。但在表面上看,部署SSL 就是为了让用户浏览器里看起来更安全一些,以增加用户的信任感。所以很多企业更把它当作门面,而签发机构也为此卖高价,尤其是国内的价格明显高于国外的。

实际上SSL证书也可以做客户端认证,用户拥有自己特有的证书,用它可以证明自己的身份,当然也就用不着用户名和密码了。但这种用的很少,一般web服务器也不支持。

内容加密传输更安全,如果只是为了加密,使用自签发的证书也可以,但浏览器无法验证证书,所以会给出一个非常吓人的警告,所以自签发证书不适合给外人使用,只适合内部使用,把这个证书 加入到自己的信任列表或忽略证书验证即可,以后就不会继续拦截了。

证书需要被少数一级或二级 CA 认证才有效。计算机安全中的信任就是一个信任链的关系,信任链最顶端的被称为根证书。
自签发的证书在技术上是完全一样的,仅用于加密传输是没问题的。但是不能被外人信任,所以一般仅用于内部使用。除了自签发不被信任,如果证书过期、已被吊销或者非证书所代表的域名也都是不被信任的,导致证书验证出错。

用于网站的证书需要被大众信任,所以不能自签发的证书,那就申请(购买)一个吧。


申请证书

1.证书类别
按证书包含域名数量分为:
  • 单域名:只针对这个域名有效,不能用在其它域名下。
  • 多域名:只针对列出的多个域名有效。
  • 通配符域名(wildcard):对任意子域名有小,显示的是 *.example.com。
注意:SSL所说的单个域名是一个完整的域名,一个子域名就算一个,而非一个顶级域名。
如果网站有很多子域名,只需要申请真正需要的域名证书。

按验证的类别分:
  • 域名认证(Domain Validation):认证你的域名所有权和网站,申请验证简单,几分钟即可。
  • 组织机构认证(Organization Validation):认证的域名和公司信息,需要提交公司资料认证。
  • 扩展认证(Extended Validation,简称EV):这种证书会在浏览器中出现“很明显”的绿色地址栏,给用户的可信度最高。有安全评估保证。
个人或小站点可用一类或二类,企业一般用二类认证,少数企业会用到EV认证。

2. 证书价格
看了看网上SSL证书的价格,便宜的一般都是10美元左右一个子域名/每年,按不同类别、不同品牌等价格在几十美元到几百美元一年。比如能显示绿色地址栏的EV证书和通配符证书贵一些。国内自己的或代理的,比国外贵不少,动辄几千元。其实就是由可信源认证了一下,类似于办证,用起来没什么差别,并非越贵越好。

3. 签发机构(“卖家”)

SSL应用部署小结 - hanguokai - 韩国恺的博客
国外常见的SSL提供商有:Thawte,Go Daddy,VeriSign,RapidSSL,GeoTrust(QuickSSL),StartSSL,Comodo。
StartSSL、Go Daddy的比较便宜,GeoTrust、Comodo的价格适中,Thawte和VeriSign的价格较贵。

VeriSign现在归属赛门铁克,在国内是由天威诚信代理的。世界真小,天威诚信就在我很多年以前的东家(启明星辰)大楼里,地下一层是他们的机房,我还进去过一次。

4. 免费的StartSSL
唯一免费的是StartSSL,其它的一般只提供30免费试用。

但 StartSSL 提供的免费证书是一类的、仅对域名和email进行验证,不对组织做验证(也就是面向自然人的,非面向组织机构的),不过
仅作为域名验证和数据加密也够了,并且浏览器也认它,一般人也不会去看你的证书级别。适合个人和初创网站使用,以后有钱了再申请个收费的替换即可。

我很顺利地申请到了免费的StartSSL证书,分别用在两个子域上。

最后,证书签发给你后,最主要是保护好私钥证书,这个丢失或泄漏就完了。因为如果被别人利用也就毫无安全性了,需要向证书签发机构申请撤销证书并申请新的证书,这当然也是要收费的。


应用规划、配置和调整
并不是说有了SSL证书就没事了,还要考虑应用中的使用问题,需要规划、服务器配置、应用调整等多个环节。

SSL比 http 要消耗更多cpu资源(主要是在建立连接的阶段,之后还要对内容加密),所以对一般网站,只需要对部分地方采用https,大部分开放内容是没必要的,具体取决于你的业务要求。比如对于很多安全要求较低的网站,完全不用https也是可接受的。

某些页面是同时支持 http 和 https ,还是只支持 https、强制 https?
同时支持就是用户用什么协议访问都可以,那么用户的请求主要就是由页面本身的链接引导来的,因为一般用户不会自己特意去修改地址栏的。
一般我们的网站可以做成同时支持http和https,都可以访问。但是这就容易有后面说的混合内容或混合脚本的问题。

还可以规划为部分页面支持 https,一般公开页面不用https,只是将部分地方的链接改为 https 就可以了。专门期望以 https 访问的页面中,引用的绝对URL可以明确的使用 https链接。

是否强制 https ?对于安全性高的网站或网站中的部分页面,可以强制使用https访问, 即使用户在地址栏里手工把 https 改为 http, 也会被自动重定向回 https 上。比如可以通过配置web服务器 rewrite 规则将这些 http url 自动重定向到对应的 https url 上(这样维护比较简单),而不用改应用

解决混合内容问题(http和https)

混合内容是指:在https的页面中混合了非https的资源请求,比如图片、css、js 等等。如果是混合了非 https 的 js 代码,则被称为混合脚本。
混合内容的危害:如果只是混合了不安全的图片和css,那么受中间人攻击篡改,一般只会影响页面的显示,危害相对小一点。如果是混合了不安全的 js 代码,则这个不安全的 js 可以完全访问和修改页面中的任何内容,这是非常危险的。

另请参看,Chrome对混合脚本危害的说明与提示:Trying to end mixed scripting vulnerabilities

所以,只有页面本身和所有引用的资源都是 https 的浏览器才认为是安全的,只要其中引用了非安全资源(即使图片),浏览器都会给出不安全的提示,特别是有 js 的情况。如果浏览器提示不安全,那样我们就达不到原来目的了。我们费了半天功夫去申请 SSL 证书,配置Web服务器,最后如果因为混合内容而前功尽弃就太糟了。咱继续努力吧,想办法让所有引用资源都是安全的。

理论上,混合了第三方的内容,即使是SSL的第三方内容也不是很好。因为用户信任的是你,而不是第三方,即使第三方也支持https,但你能保证第三方就绝对安全吗。不引用任何第三方才是绝对安全的,但这样太严格了,安全其实也是一个 tradeoff 的问题,需要考虑很多方面的平衡。还好,起码现在浏览器认为已经是安全的了。

引用第三方文件的问题(如 CDN 分发的文件)

简单地说,这个问题要么有第三方提供 https 支持,要么不用它(用自己本地的)。

一般我们会引用由 CDN 分发的文件,比如某个 js 库文件,而不用访问自己网站上的,这样借助 CDN 网络可以加快速度,这当然很好。
但是,如果我们在页面中使用绝对 URL 直接引用这个文件就无法自动使用 https 了!出现了混合协议内容,浏览器又该“变脸”了。

当SSL 遇上CDN 或 其它第三方文件就有点麻烦,因为很多CDN还不支持SSL。如果支持 https 的话就可以直接用 https 的绝对URL了,即使是同时支持http 和 https 的页面,这样做也不算太浪费,起码解决了问题。

因为CDN的云文件提供者,一般为每个cdn用户创建一个单独的子域名来使用,这样的话,CDN提供者要想支持 https 就必须支持所有可能的子域名,因此要求CDN提供方使用那种通配符子域名的证书。

相对 URL、绝对 URL 与 只缺协议的URL(Protocol Relative URL)
相对路径比较简单,自动匹配用户请求的 http 或 https 协议。

但是绝对 url 则不成,因为绝对 url 已经明确地写上了协议: http://www.example.com/jquery.js 。
这个问题还有一个办法解决,你一定没见过这种形式: //www.example.com/jquery.js
哈哈,一个缺少协议的URL(实际上还算是相对URL),这种形式可以在浏览器中被正确补充上合适的协议!很多人都用这种方法。
但是,这里有点小问题,IE7 和 IE8 处理这种缺少协议的URL的css 文件时,同一个css文件会下载两次,详见Steve的文章 。

JS 自动判断当前协议
现在我们经常用 js 来加载其它 js 文件或 其它别的文件,如果是请求是相对URL则没问题,如果是绝对URL怎么办?
其实 js 脚本可以这样:document.location.protocol 等于 'http:' 还是 'https:' 来判断。例如在 Google Analytics 的嵌入代码中:
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';

应用程序中如何判断访问协议
对于动态页面,如 jsp、php等,也是可以动态判断当前是否使用了 https 协议的。所以应用可以根据动态判断,来生成不同的引用 URL。这样虽然有点麻烦,但也算是解决了自动识别协议的问题,当然相对路径总是不需要处理的。
比如在 jsp 中:
  • request.isSecure() 为true 表示当前为 https ,false表示 http 访问
  • request.getScheme() 返回字符串 https 或 http
注意,如果 tomcat 部署在其它web服务器代理的后面,需要正确配置好才能返回正确结果,见本文最后一部分。

同源策略的问题
最后提醒一点:http 和 https是不同源的!即使后面的内容都一样。所以 ajax 发请求的时候要使用正确协议的绝对URL才行。
相对URL的 ajax 请求没关系。


Nginx 配置
小结一下 Nginx 配置SSL注意的问题,详细安装配置内容请参考其它资料,如官方 SSL模块 和 https配置文档
1. 首先检查一下是否已安装了 SSL模块,因为默认是不包含的。

用 nginx -V 命令检查一下。如果没有ssl模块则需要重新安装(建议升级到最新版本),注意安装时加上ssl 选项:
./configure --with-http_ssl_module

另外,nginx需要依赖 openssl 提供ssl支持,这个也要有。

2. nginx.conf 中的典型配置示例
listen     80;
listen    443 ssl;
ssl_certificate      cert.pem; #修改具体文件
ssl_certificate_key  ssl.key; #修改具体文件

ssl_session_cache    shared:SSL:10m;
ssl_session_timeout  10m;

ssl_protocols  SSLv2 SSLv3 TLSv1;
ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers   on;

上面第2-4项是关键。这些配置放在 server 块就可以对其中的所有 location 生效了,并且同时支持 http 和 https 。或者把 http 和 https 分开配置也很常见。

3. 合并证书配置文件
和Apache配置不同,Nginx需要将服务器证书和ca证书链合并到一个文件中,作为 ssl_certificate 配置的内容。
例如,按照证书链从下向上的顺序,我有三个证书:
  1. ssl.crt(自己域名的服务器证书)
  2. sub.class1.server.ca.pem(startssl 的一类证书)
  3. ca.pem(startssl 的根证书)
把它们的内容按顺序连接到的一个文件中,每个内容另起一行,中间没有空行或空格。

4. 避免启动时输入密码
配好之后,启动nginx 要你输入密钥的密码。这是因为 ssl_certificate_key 配置对应的文件(也就是 startssl 给你的私钥文件)内容是加密的,需要输入你创建这个时设置的密码才能解密。这样私钥虽然很安全,但是每次重启服务都要输入一次密码也太麻烦了。其实,只要证书改为解密了的内容,就可以避免每次输入密码。用如下命令即可:
openssl rsa -in ssl.key -out newssl.key  输入密码,就生成了解密后的私钥内容,使用这个就OK了。

但是就像前面说的,一定要在服务器上保护好它,例如:
chmod 400 ssl.key (仅root可读)

5. 优化SSL配置
SSL 很消耗 CPU 资源,尤其是在建立连接的握手阶段。一是通过开启 keepalive 可以重用连接。二是可以重用和共享ssl session,见上面ssl_session相关配置。



独立Tomcat+SSL
Tomcat 是很常见的 Java应用服务器,当然也可以作为独立的 Web服务器,所有用户请求直接访问 tomcat。

如果 Tomcat 作为独立的Web服务器,那么就需要配置Tomcat就可以了,文档参考这里 和 这个。主要是配置存放证书的 Keystore 和 连接器Connector。

Java的keystore
keystore 是 Java 中专用并内置的一个类似于 openssl 的工具,一个 keystore 文件就是一个“保险箱”(database),专门存放证书和密钥,和相关的管理功能:生成自签发的证书、密钥、导入导出等。可以通过 keytool 命令或 Java api 交互。
利用keytool 命令将你的证书导入进去。

Tomcat中Connector
tomcat中有三种 Connector 实现:block、nio 和 APR。前两者使用Java SSL(这需要 keystore 的配置 ),APR使用OpenSSL(不需要用keystore,直接指定证书),配置略有不同。



Nginx+Tomcat+SSL
实际上,规模的网站都有很多台Web服务器和应用服务器组成,用户的请求可能是经由 Varnish、HAProxy、Nginx之后才到应用服务器,中间有好几层。而中小规模的典型部署常见的是 Nginx+Tomcat 这种两层配置,而Tomcat 会多于一台,Nginx 作为静态文件处理和负载均衡。

如果Nginx作为前端代理的话,则Tomcat根本不需要自己处理 https,全是Nginx处理的。用户首先和Nginx建立连接,完成SSL握手,而后Nginx 作为代理以 http 协议将请求转给 tomcat 处理,Nginx再把 tomcat 的输出通过SSL 加密发回给用户,这中间是透明的,Tomcat只是在处理 http 请求而已。因此,这种情况下不需要配置 Tomcat 的SSL,只需要配置 Nginx 的SSL 和 Proxy。

在代理模式下,Tomcat 如何识别用户的直接请求(URL、IP、https还是http )?
在透明代理下,如果不做任何配置Tomcat 认为所有的请求都是 Nginx 发出来的,这样会导致如下的错误结果:
  • request.getScheme()  //总是 http,而不是实际的http或https
  • request.isSecure()  //总是false(因为总是http)
  • request.getRemoteAddr()  //总是 nginx 请求的 IP,而不是用户的IP
  • request.getRequestURL()  //总是 nginx 请求的URL 而不是用户实际请求的 URL
  • response.sendRedirect( 相对url )  //总是重定向到 http 上 (因为认为当前是 http 请求)

如果程序中把这些当实际用户请求做处理就有问题了。解决方法很简单,只需要分别配置一下 Nginx 和 Tomcat 就好了,而不用改程序。
配置 Nginx 的转发选项:

proxy_set_header       Host $host;
proxy_set_header  X-Real-IP  $remote_addr;
proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto  $scheme;

配置Tomcat server.xml 的 Engine 模块下配置一个 Value:
<Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="X-Forwarded-For" protocolHeader="X-Forwarded-Proto" protocolHeaderHttpsValue="https"/>

配置双方的 X-Forwarded-Proto 就是为了正确地识别实际用户发出的协议是 http 还是 https。X-Forwarded-For 是为了获得实际用户的 IP。

这样以上5项测试就都变为正确的结果了,就像用户在直接访问 Tomcat 一样。

原文地址:http://han.guokai.blog.163.com/blog/static/136718271201211631456811/


admin 发布于  2015-9-24 22:51