前言:本文记述了搭建一个小型web服务器集群的过程,由于篇幅所限,系统、软件的安装和基本配置我这里就省略了,只记叙关键配置和脚本内容。假如各位朋友想了解各软件详细配置建议查阅官方文档。

一 需求分析:

1.整体需求:搭建一个高可用的网站服务器集群,能承受高并发请求,能抵御一般的网络攻击,任何一台服务器的退服不影响整个集群的运作,并且能对各服务器的运行情况作出实时监控。

2.详细需求分析:

根据需求,计划根据以下拓扑搭建运行环境:

二 详细功能描述:

1.前端服务器采用nginx实现反向代理和负载均衡,用keepalive实现HA。此部分由centos1和centos4实现,centos1作为主服务器,centos4作为热备服务器。Nginx会根据不同的请求ip机会均等地把请求发送到后端两台服务器,并且以ip hash的方式保持各个ip的会话。

2.后端服务器构建在centos2与centos3上,采用apache作为web发布软件,mysql作为数据库,测试网页用Django来实现。两台服务器的数据库能够自动同步。

3.作为热备服务器,centos4在centos1没有故障时并没有业务流量,处于相对空闲的状态,因此在centos4上配置nfs使它成为文件共享服务器,网站文件放在这台服务器上。

4.centos5作为监控服务器,运行nagios监控各服务器状态。出现告警时通过告警通知管理员。另外centos5还作为saltstack的服务器,其他主机的软件安装、文件传输、命令运行等操作均通过saltstack批量实现。

三 总体部署描述:

1.各个服务器均安装centos6.4  64位版本,采用cobbler实现批量自动安装。

2.各个软件均安装最新的稳定版,centos自带的软件也要进行升级,例如python,Centos自带的版本比较久,会影响Django的运行。

四 详细部署描述:

1.nginx设置

Nginx在这里的作用主要是反向代理、作为用户以及服务器之间的缓存、以及以负载均衡的方式把请求发送到后端两台服务器。

采用编译安装的方式安装nginx,具体过程就不在此记述了,不过为了更好地抵挡入侵,建议编译前修改一下安装文件,使入侵者难以查出nginx的版本号,修改安装文件中的nginx.h,把相关字段修改如下:

#define NGINX_VERSION      "1.0"
#define NGINX_VER "webserver" NGINX_VERSION

Nginx的配置文件如下:

user  www www;
worker_processes 2; events {
worker_connections 12800;
use epoll;
} http {
include mime.types; #协助部分浏览器(如firefox)识别网页文件的类型
default_type application/octet-stream;
limit_conn_zone $binary_remote_addr zone=addr:10m; sendfile on;#指定nginx是否调用sendfile函数来输出文件,能提高性能。
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 20; #客户端连接保持活动的超时时间
send_timeout 20; #指定响应客户端的超时时间
client_body_buffer_size 1k; #指定客户端请求主体缓冲区大小
client_header_buffer_size 1k; #指定来自客户端请求头的headerbuffer大小
large_client_header_buffers 2 1k; #客户端请求中较大的消息头指定的缓存最大数量和大小
server_tokens off; #禁止在错误页面上显示nginx版本号
client_body_timeout 20; #设置客户端请求主体读取超时时间
client_header_timeout 20; #设置客户端请求头读取超时时间
gzip on;
upstream WebServers{ #指定负载均衡服务器
ip_hash; #以ip_hash的方式保持会话
server 10.0.0.3; #没有设定权重,因此两台后端服务器将机会均等地接受请求
server 10.0.0.2;
}
server {
listen 80;
server_name localhost; location / {
proxy_pass http://WebServers;
limit_conn addr 100; #指定每个ip最多只允许建立100个连接
limit_rate 500k; #每个ip最大带宽是500k
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404;
} error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}

因为后端测试网页是用Django写的,因此nginx就不用处理php等动态网页的请求了。

设置完毕后,把nginx设置为开机启动,可以用如下方式:

echo “/usr/local/nginx/sbin/nginx” >>/etc/rc.local

2.Keeplive设置

Keeplive的作用是在两台服务器(centos1、centos4)之间,以VRRP协议实现HA。通过虚拟出一个Virtul IP(本例子中是192.168.48.138)来对外发布业务。两台服务器中的任一台退服了,keeplive会自动把业务转到另一台上。在这里centos1是主服务器,centos4是备用服务器。平时的数据流量只会通过centos1,只有centos1退服了,数据流量才会割接到centos4上。

centos1上的keepalive配置:

! Configuration File for keepalived

global_defs {
notification_email {
test@test.com #指定告警邮箱,当发现对端服务器退服时发邮件警报
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
} vrrp_instance VI_1 {
state MASTER
interface eth0 #绑定网卡接口
virtual_router_id 51
mcast_src_ip 192.168.48.139 #设置本机通过哪个ip发送vrrp包
priority 100 #设置优先级
advert_int 1 #检查间隔,这里设置为1秒
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.48.138
}
}

对于从服务器centos4,只需要把以上配置文件的部分内容修改即可:

state BACKUP
mcast_src_ip 192.168.48.140
priority 90

同样,配置好配置文件后,把keepalive添加到开机启动中。

对于keepalive,由于是使用VRRP协议来检查对端是否在线的,只要对端能ping通,那么keeplive就会认为对端在线。但也有一种情况是对端服务器没有宕机,但nginx出错关闭了,这种情况下keepalive仍然会判断对端在线,不会把业务割接到备用服务器。因此我们需要在服务器上运行一个脚本,监控nginx进程的状态。假如nginx进程关闭了,先尝试重启nginx,无法重启时就关闭keepalive的进程,使业务割接到备用端。脚本如下:

#!/bin/bash
#nginxStatus.sh
while :
do
nginxStatus=`ps -C nginx --no-header |wc -l`
if ((nginxStatus==0));then
/usr/local/nginx/sbin/nginx
sleep 5
nginxStatus=`ps -C nginx --no-header |wc -l`
if ((nginxStatus==0));then
/etc/init.d/keepalived stop
fi
else #当判断到主服务器的nginx已经重新启动后,再启动keepalive,使业务倒置回主
#服务器
keepaliveStatus=`ps -C keepalived --no-header |wc -l`
if ((keepaliveStatus==0));then
/etc/init.d/keepalived start
fi
fi
sleep 5
done

把这个脚本放在centos1上,设置开机后于后台运行:

echo “nohup ~/nginxStatus.sh &”>>/etc/rc.local

由于脚本中的while会不断循环下去来检查进程运行情况,因此没必要添加进计划任务。不过谨慎起见,防止脚本意外停止,也可以在计划任务中设置每30分钟运行一次。

3.后端Web服务器设置

后端web服务器运行在centos2、centos3上,采用apache搭建,测试网页使用Django编写,网页文件存放在共享文件服务器centos4上,分别挂载在本机的/var/www/html目录。

用saltstack批量在两台服务器上安装apache、apache-devel、wsgi、Django、mysql以及升级python,过程省略。

部署好运行环境后,修改一下apache的配置文件(http.conf),把运行用户名和组名改为apache,根目录指向/var/www/html

接下来设置mysql,把两台服务器的mysql设置互为主从,使得其中一台服务器的数据库变更了,马上同步到另一台,保证两台服务器的数据一致。设置步骤如下:

首先设置centos2

打开centos2上mysql的配置文件my.cnf,作如下修改:

[mysqld]
log-bin=MySQL-bin #开启二进制日志,从服务器靠读取主服务器的二进制日志来执行同步
server-id=1 #设置为1表明这是主服务器。
binlog-ignore-db=mysql
binlog-ignore-db=information_schema # binlog-ignore-db用来指定忽略哪些数据库记录到二进制日志,这样在同步的时候就会忽略掉这些数据库。其中“mysql”数据库用于记录用户信息,“information_schema”用于记录整个数据库各个库和表的信息。

然后以root身份登陆mysql,执行下面命令:

grant replication slave on *.* to ‘test’@’10.0.0.3’  identified ‘test123’;

这命令的含义是,在10.0.0.3机器上建立一个test用户,用户密码为test123,这个用户拥有对centos2上所有数据库的所有表同步到centos3(10.0.0.3)的权限。

然后执行:

show master status;

可以看到以下信息:

记录好这个信息,然后以root身份登陆centos3的mysql,执行下面的命令(有一点需要注意,假如同步之前需要同步的数据库不是空的话,需要先在数据库上加上读锁,把主服务器的相关数据库导入到从数据库中):

change master to
master_host='10.0.0.2',
master_user='test',
master_password='test123',
master_log_file='MySQL-bin.000070',
master_log_pos=106;

上面的master_log_file和master_log_pos的信息就是之前centos2上执行show master status命令后所显示的信息。执行show slave status;命令,查看一下centos3是否已经成功成为从服务器:

可以看到centos3的mysql已经成为centos2(10.0.0.2)的从服务器了。至此centos3的mysql已经能主动同步centos2的数据了,我们只需要把以上操作在centos3上操作一次(先修改my.cnf,其中server-id要设为2,然后再执行创建用户以及授权命令),就能实现两个数据库互为主从,相互之间自动同步。

4.共享文件服务器nfs

本环节中,我们需要把centos4配置成共享文件的服务器端,后端两台web服务器的网页内容将放在共享文件服务器上,以此保证两台web服务器的网页文件内容一致。

nfs在centos6.2上默认已安装,我们首先在centos4的/etc目录下新建exports文件,加入以下内容:

/home/apache/html 10.0.0.2(rw,sync)  #sync是指数据同时写入缓存和硬盘中,执行较慢但保证数据精确
/home/apache/html 10.0.0.3(rw,sync)

然后在centos4上一步步执行下面的命令:

groupadd apache
useradd -g apache -s /sbin/nologin apache
passwd apache
mkdir -p /home/apache/html
#把网页文件复制到/home/apache/html,然后再执行下面命令:
chown -R apache:apache /home/apache/html
chmod -R 700 /home/apache/html
chkconfig --level 35 nfs on
service nfs start

关于共享目录的权限设置,由于后端两台web服务器的apache都是以apache:apache这个用户来执行的,文件的读写也是通过这个用户,因此为保证数据安全,共享目录只开放权限给这个用户即可,其他用户一律什么权限都不给予。另外还要把共享文件夹的所属者设为apache:apache这个用户。

接下来到centos2、centos3两台web服务器上作如下设置,使它们开机时自动加载共享目录:

echo "mount -t nfs 10.0.0.4:/home/apache/html /var/www/html -o hard,bg,nfsvers=3 ">>/etc/rc.local

上面选项中hard表示网络短暂中断时会继续尝试连接服务器,并且不会显示错误信息;

bg表示执行mount时如果无法顺利mount上时,系统会将mount的操作转移到后台并继续尝试mount,直到mount成功为止;

nfsvers=3表示采用第3版的nfs。

5.nagios设置

监控软件安装在centos5上,负责监控其他4台服务器的情况,出现异常时发出邮件给管理员进行警报。

安装过程:需要在centos5上安装nagios、nagios插件包、nrpe、apache(用于搭建监控网页)、pnp(用于生成监控数据的分析图表)。4台被监控的主机需要安装nagios插件包以及nrpe,详细安装过程这里省略。

以下项目是对于4台服务器都需要监控的:

1.Check Swap:监控交换分区的剩余空间

2.Check Zombie Procs:监控僵尸进程的数目

3.Total Processes:监控总进程的数目

4.check-no_alowed_user:监控是否有非允许的用户登陆

5.check-system-load:监控系统负载

对于nagios的工作原理,简单来说就是:在服务端的nagios目录下的services.cfg文件上定义需要监控各个客户端的哪个监控项目,对应的监控脚本被放在客户端执行,执行结果通过客户端上的nrpe守护进程反馈给nagios服务器端。

默认情况下监控脚本返回的值所代表的的含义如下:

OK—退出代码 0—表示服务正常地工作。

WARNING—退出代码 1—表示服务处于警告状态。

CRITICAL—退出代码 2—表示服务处于危险状态。

UNKNOWN—退出代码 3—表示服务处于未知状态。

因此,要实现上述5个监控项目,首先修改nagios服务器端(即centos5)上的services.cfg文件,添加上以下内容:

define service{
use local-service
host_name centos1
service_description check-no_alowed_user
check_command check_nrpe!check_no_allowed_user #对于脚本在客户端执行的命令,都要在命令前加上check_nrpe!
notifications_enabled 1 #开启告警功能
flap_detection_enabled 0 #关闭抖动检测(当数据出现较大抖动时nagios不会作出提示)
notification_options w,c,r #warning、critical、recover时发出告警
notification_interval 5 #假如服务的状态没有恢复正常的话,告警将每5分钟发一次
notification_period 24x7 #设定告警的时段,这里设置为24X7
} define service{
use local-service,services-pnp #对于添加上services-pnp的服务,nagios将调用pnp把服务返回的数据画成图表。
host_name centos1
service_description check-system-load
check_command check_nrpe!check_load
notifications_enabled 1
flap_detection_enabled 0
notification_options w,c,r
notification_interval 5
notification_period 24x7
} define service{
use local-service,services-pnp
host_name centos1
service_description Total Processes
check_command check_nrpe!check_total_procs
notifications_enabled 1
flap_detection_enabled 0
notification_options w,c,r
notification_interval 5
notification_period 24x7
} define service{
use local-service,services-pnp
host_name centos1
service_description Check Zombie Procs
check_command check_nrpe!check_zombie_procs
notifications_enabled 1
flap_detection_enabled 0
notification_options w,c,r
notification_interval 5
notification_period 24x7
} define service{
use local-service,services-pnp
host_name centos1
service_description Check Swap
check_command check_nrpe!check_swap
notifications_enabled 1
flap_detection_enabled 0
notification_options w,c,r
notification_interval 5
notification_period 24x7
}

以上写出了描述centos1监控服务的描述,其他3台服务器的描述都是一样的,只是host_name不一样,限于篇幅,这里就不把剩余部分列出了。

接下来修改客户端的设置,同样以centos1为例,修改nagios目录下的nrpe.cfg文件,添加以下内容(部分内容默认已经存在的,修改的时候需要注意有没有重复):

command[check_swap]=/usr/local/nagios/libexec/check_swap -w 20% -c 10% #-w后面的参数告诉脚本当交换空间小于20%时,返回warming状态(即返回1),-c后面的参数告诉脚本当交换空间小于10%时,返回critical状态(即返回2)
command[check_load]=/usr/local/nagios/libexec/check_load -w 1.8,1.5,1.2 -c 2.5,2,1.8
command[check_zombie_procs]=/usr/local/nagios/libexec/check_procs -w 5 -c 10 -s Z
command[check_total_procs]=/usr/local/nagios/libexec/check_procs -w 150 -c 200
command[check_no_allowed_user]=/usr/local/nagios/libexec/check_no_allowed_user.py –a cjyfff

上面这5个命令对应的脚本中,check_no_allowed_user.py是我编写的脚本,另外4个是nagios自带的。check_no_allowed_user.py的作用是检测是否有允许用户以外的用户登录系统。使用方法是脚本后面加上选项-a,然后添加允许登录的用户列表(格式是-a user1,user2...,root默认已添加到允许列表,因此无需添加root)。当允许用户列表以外的用户登录时,将会触发nagios的critial告警。这个脚本的内容如下:

#! /usr/bin/env python
#coding=utf-8
#check_no_allowed_user.py
import os, sys, getopt def Usage():
print "Usage:\n\tpython check_no_allowed_user.py [-h|--help][-a|--add allowedUser01,allowUser02...]\n"
print "\tTo creat the allowed user list,please use this format:-a user1,user2...."
print "\tAny user(s) not in allowed user list login this system will alter Nagios."
sys.exit(3) def CheckUser(args):
a = os.popen("who").read() #这里a被赋值成一个包含换行符的字符串
#下面需要以换行符分隔把a建成列表,然后提取列表元素的第一个字段,这才是
#我们所需要的当前用户名
b = list(a.split("\n"))
c = []
i = 0
while i<len(b)-1:
c.append(b[i].split(" ")[0])
i += 1
userList = set(c)
allowedList = list(args.split(",")) #创建允许用户的列表
allowedList.append("root") #允许用户的列表中默认添加上root
#print allowedList
rs = [user for user in userList if user not in allowedList] #查出在当前用户列表中但不在允许列表中的用户
#print rs if rs :
print "Detected NO ALLOWED user(s)%s"%rs
sys.exit(2)
else:
print "All user is ALLOWED."
sys.exit(0) try:
options, args = getopt.getopt(sys.argv[1:], "ha:", ["help", "add="])
except getopt.GetoptError:
Usage() for o,r in options:
if o in ("-h", "--help"):
Usage()
if o in ("-a", "--add"):
#print type(r)
CheckUser(r)

另外,对于centos1、centos4两台前端服务器,还需要添加2项监控服务:

80port:监控80端口的情况

CheckNginxState:监控nginx进程是否启动

同样,以centos1为例,修改centos5上的services.cfg,添加上以下内容:

define service{
use local-service,services-pnp
host_name centos1
service_description 80port
check_command check_tcp!80 #这个命令是通过服务器端的脚本来监控客户端的80端口的,因此无需加上check_nrpe!,客户端也不需要存在这个命令对应的脚本。
} define service{
use local-service
host_name centos1
service_description CheckNginxState
check_command check_nrpe!check_nginx
}

然后修改centos1上的nrpe.cfg,添加上以下内容:

command[check_nginx]=/usr/local/nagios/libexec/check_nginx.sh

这里的check_nginx.sh也是我自己编写的脚本,脚本内容如下:

#!/bin/bash
#check_nginx.sh
use_age="This script is for checking nginx status,if nginx is stop Nagios will alarm."
if (($#!=0));then
echo $use_age
exit 3
fi
a=`ps -C nginx --no-header |wc -l`
if ((a!=0));then
echo "nginx is running."
exit 0
else
echo "nginx is NOT running."
exit 2
fi

对于centos4这台共享文件服务器,还需要增加一个监控项目,监控硬盘的容量大小,这里可以用nagios自带的check_disk脚本,方法和上面一样的,这里就不在叙述了。

对于作为后端web服务器的centos2、centos3,也很有必要监控服务器上apache以及mysql是否正在运行。监控脚本很简单,只需要把上面check_nginx.sh中“a=`ps -C nginx --no-header |wc -l`”修改一下,把“nginx”替换为“httpd”和“mysqld”即可。

最后,客户端都设置好监控设置了,作为服务器端,也可以为centos5增加监控内容,服务器端的监控脚本同样放在服务器端的libexec/下,监控服务是在localhost.cfg中定义的。

谨记添加自己写的脚本后要把用户改为nagios:nagios,并且增加执行权限。

最终配置完毕后,打开nagios监控页面的效果图如下:

6、安全设置

为了减少ssh密码被暴力破解的风险,在各个服务器上把ssh端口从默认的22端口更改为其他端口(本例子中改为2002),并且在/etc/hosts.allow中指定允许sshd通信的ip,在/etc/hosts.deny中添加sshd:ALL

考虑到服务器都是在内网环境,已经能隔绝外网的很多攻击,并且开启防火墙的话会影响服务器之间数据转发速度,因此我在这4台服务器上都关闭iptables,仅在centos5上开启。在实际生产环境中,依靠在集群前面的防火墙对集群进行进一步保护。

centos5的iptables脚本如下:

!#/bin/bash
#centos5-iptables.sh
iptables -F
iptables -X
iptables -Z
iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT iptables -A INPUT -p icmp -j ACCEPT#允许icmp协议包通过
iptables -A INPUT -s 192.168.48.139 -j ACCEPT
iptables -A INPUT -s 192.168.48.140 -j ACCEPT
iptables -A INPUT -s 10.0.0.2 -j ACCEPT
iptables -A INPUT -s 10.0.0.3 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dport 22,80 -j ACCEPT
/etc/rc.d/init.d/iptables save

五 结语:

最后我用apache benchmark测试了一下网站。虽然是在虚拟机环境,测试数据没多大参考价值,但是通过测试也可以看看在高并发的环境下,那些服务器负荷最大。经测试,在100并发的环境下,虽然网页还能打开,但是nagios已经失去了后端两台web服务器的响应,提示request timeout了,其他两台服务器的负载还是很低,说明在高并发的环境下,后端的web服务器负荷最大,也是重点需要优化的对象。

这个实验环境存在一个不足,那就是共享文件只放在一台服务器上,容易造成单边,建议条件许可的情况下可使用分布式存储系统,例如MFS。

另外在搭建实验环境的过程中还有2点待日后跟进:

1、优化apache的性能,让后端服务器能应付更大并发。

2、Mysql的主从同步存在延迟问题,可能会导致主、从数据库不一致。这个查看网上资料可以通过插件来解决,下一步尝试接触这些插件的使用方法。

Web服务器集群搭建关键步骤纪要的更多相关文章

  1. 大数据之Linux服务器集群搭建

    之前写过一篇关于Linux服务器系统的安装与网关的配置,那么现在我们要进一步的搭建多台Linux服务器集群. 关于单台服务器的系统搭建配置就不在赘述了,详情见https://www.cnblogs.c ...

  2. Nginx网络架构实战学习笔记(六):服务器集群搭建、集群性能测试

    文章目录 服务器集群搭建 Nginx---->php-fpm之间的优化 302机器 202机器 压力测试 搭建memcached.mysql(数据准备) 今晚就动手-.- 集群性能测试 服务器集 ...

  3. nginx+apache+php+mysql服务器集群搭建

    由于需要搭建了一个基本的服务器集群.具体的配置方案先不说了,到有时间的时候再介绍.下面介绍下整 个方案的优点. 我总共准备了四台阿里云的主机,架设分别是A,B1,B2,C,A在集群的最前面,B1和B2 ...

  4. FastDFS教程IV-文件服务器集群搭建

    1.简介     本文主要介绍FastDFS文件服务器的集群搭建,在阅读本文之前,您需具备FastDFS文件服务器单节点安装,扩容,迁移等方面的知识.同时,您还需了解Keepalived,nginx方 ...

  5. 使用简单的 5 个步骤设置 Web 服务器集群

    通过在多个处理器之间分担工作负载并采用多种软件恢复技术,能够提供高度可用的环境并提高环境的总体 RAS(可靠性.可用性和可服务性).可以得到的好处包括:更快地从意外中断中恢复运行,以及将意外中断对终端 ...

  6. 采用软件nginx实现web服务器集群

    nginx:软件负载均衡器  是高并发量http/反向代理服务器.实现windows下IIS的负载均衡 条件:2台服务器 1.cpu:Inter(R) 酷睿 i5 cpu 2.26GHz 内存:2G ...

  7. web服务器集群(多台web服务器)后session如何同步和共享

    在访问量上去以后,很多人会采用web集群的方式在满足逐渐增长的用户量.这时候就不得不面对一个问题,那就是在多个服务器下,每次请求都会因为负载均衡而分配到不同的服务器上.用户在登录服务器后,下一次请求被 ...

  8. Nginx+Tomcat+Terracotta的Web服务器集群实做

    1.准备工作两个Linux服务器,可以用VMware装一个,然后配置好再克隆一个,修改IP即可.Host1:192.168.0.79Host2:192.168.0.80先配置好jdk1.6.0和tom ...

  9. web服务器集群session同步

    在做了web集群后,你肯定会首先考虑session同步问题,因为通过负载均衡后,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,一个登录用户,一会是登录状态,一会又不是 ...

随机推荐

  1. CAML query for Group by count and data

    CAML query for Group by count and data Company Category Product Name Microsoft Developer Visual Stud ...

  2. 《MFC游戏开发》笔记二 建立工程、调整窗口

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9300383 作者:七十一雾央 新浪微博:http:/ ...

  3. java笔记01-反射

    --2013年7月26日17:56:35 写文章之前,参考了这篇:http://www.cnblogs.com/Quincy/archive/2011/06/19/2084557.html 评价:这个 ...

  4. 关于使用vss版本管理工具中的sln,suo文件作用

    Visual Studio.NET采用两种文件类型(.sln和.suo)来存储特定于解决方案的设置,它们总称为解决方案文件.为解决方案资源管理器提供显示管理文件的图形接口所需的信息 从而在每次继续开发 ...

  5. hdu3584 树状数组

    思路:从一维扩展到三维.可以看看poj2155的解法. #include<iostream> #include<cstring> #include<algorithm&g ...

  6. poj 1469 二分图最大匹配

    就是最简单的最大匹配,没的说 #include<iostream> #include<cstdio> #include<cstring> #include<a ...

  7. C#/.NET使用HttpWebRequest、SqlBulkCopy从API获取数据批量插入DB

    小弟新手程序员一枚,代码技术和文章水平均不才.所写文章均为对自己所写所学代码的简单记录,可能对于老手程序员营养价值不高,望莫见怪. 我工作上有个需求:从某处API接口上获取数据(大约1W条而已)并插入 ...

  8. CSS/块级元素与内联元素的深入理解

    今天终于对html中的块级元素和行内元素有了一个较为理性的认识.首先w3c对于block和inline的解释为:

  9. DOM操作在jQuery中的实用------文字提示和图片提示

    关于文字提示想必是家喻户晓,操作呢说简单一点就是在超链接中加入title属性.但是在人机交互越来越倍受恩宠的年代,依靠浏览器自带的文字提示即title属性,提示效果的响应速度就(还是人艰不拆了吧~)s ...

  10. Linux 命令 - tail: 打印文件的结尾部分

    命令格式 tail [OPTION]... [FILE]... 命令参数 -c, --bytes=[-]K 显示每个文件的后 K 字节内容.-n +K 则表示从第 K 字节开始输出. -f, --fo ...