第一篇 架构规划篇
第1章 网站架构简介
在目前这样一个高速的信息时代,我们更希望在最短的时间内以最简单的方式获取自己需要的内容。因此,我们需要一个高性能、高可用性的网站架构来支撑网站大量的访问。所以,网站的架构在网站运营当中所占的分量是相当之重的,那么如何构建稳定而又可平滑扩展的网站结构呢?我们先来了解什么是网站架构。
网站架构通过对用户需求进行分析、了解并定位网站的目标用户,从而对网站整体架构进行规划、设计,以最大限度地进行高效资源分配与管理的设计。网站架构粗略分为硬架构和软架构。
1.1 网站的硬架构
1.1.1 机房的选择
在选择机房的时候,根据用户的地域分布,可以选择双线或多线机房,但更多时候,可能多线机房才是最合适的。越大的城市,机房价格越贵,从成本的角度看可以在一些中小城市托管服务器,比如说北京的公司可以考虑把服务器托管在天津、廊坊等地,不是特别远,但是价格会便宜很多。
1.1.2 带宽的大小
通常我们在架构网站的时候,会设定一些目标,比如网站每天要能承受千万PV的访问量,这时我们要估算一下大概需要多大的带宽。计算带宽大小主要有两个指标(峰值流量和页面大小),我们先做出必要的假设:
1.峰值流量是平均流量的3倍;
2.每次访问平均的页面大小是100kB左右。
如果1000万PV的访问量在一天内平均分布,每秒大约120次访问,如果按平均每次访问页面的大小是100kB字节计算,120次访问总计大约就是12000kB。字节的单位是Byte,而带宽的单位是bit,它们之间的关系是1Byte = 8bit,所以12000k Byte大致就相当于96000k bit,也就是90Mbps的样子。实际上,我们的网站必须能在峰值流量时保持正常运行状态,所以按照假设的峰值流量计算,真实带宽的需求应该在270Mbps左右。
当然,这个结论是根据前面提到的两点假设得出的,具体值则需要根据公司实际情况来计算。
1.1.3 服务器的划分
一般情况下网站需要的服务器包括图片服务器、页面服务器、数据库服务器、应用服务器、日志服务器等。
对于访问量大的网站,图片服务器和页面服务器的分离是相当必要的。我们可以在图片服务器上运行Lighttpd,在页面服务器上运行Ngnix,当然也可以选择别的。我们也可以扩展成多台图片服务器和多台页面服务器同时运行,并设置相关域名,如imgs.domain.com和www.domain.com,页面里的图片路径都使用绝对路径,如<imgsrc="http://imgs.domain.com/xxx.gif"/>,然后配置DNS轮循,达到最初级的负载均衡。服务器多了就不可避免地涉及同步的问题,这时可以使用Rsync软件来完成。
数据库服务器是重中之重,因为网站的瓶颈问题大多出在数据库身上。现在一般的中小网站多使用MySQL数据库。一般而言,使用MySQL数据库的时候,我们应该配置为一个主从(一主多从)结构,主数据库服务器使用InnoDB 表结构,从数据服务器使用MyiSAM表结构。这样充分发挥它们各自的优势,而且这样的主从结构分离了读写操作,降低了读操作的压力。我们还可以设定一个专门的从服务器作为备份服务器,有时候还需要借助Memcached之类的第三方软件,以便适应更大访问量的要求。MySQL在后面的章节有具体介绍。
如果有条件,可以应用独立的日志服务器。一般网站的做法是把页面服务器和日志服务器合二为一,在凌晨访问量不大的时候计划任务运行前一天的日志计算。不过对于百万级访问量而言,即使按天归档,也会消耗很多时间和服务器资源来计算。所以分离单独的日志服务器还是有好处的,这样不会影响正式服务器的工作状态。
1.2 网站的软架构
1.2.1 框架的选择
现在的框架有很多选择,比如PHP 的Symfony、Zend Framework等,至于应该使用哪种并没有唯一的答案,这要根据业务以及团队成员对各个框架的了解程度而定。很多时候,即使没有使用框架,仍然可以写出好的程序来,据说Flickr就是用Pear和Smarty这样的类库写出来的。所以,是否使用框架,使用什么样的框架,这都不是最重要的,重要的是我们的编程思想里要有框架的意识。
1.2.2 逻辑的分层
网站达到一定的规模之后,前期代码逻辑设计里的不足便会给维护和扩展带来巨大的障碍,但我们的解决方式其实很简单,那就是重构,将逻辑进行分层。通常,自上而下可以分为表现层、应用层、领域层和持久层。
表现层
表现层的表现形式不应该仅仅是模板,它的范围还可以更广一些,所有和表现有关的逻辑都应该纳入表现层的范畴。比如说某处的字体要显示为蓝色、某处的开头要有空格,这些都属于表现层应解决的问题。通常,我们容易犯的错误就是把本属于表现层的逻辑放到了其他层去完成。举一个比较常见的例子:通常在列表页显示文章标题的时候,都会设定标题允许的最多字数,一旦标题长度超过了这个限制,就会被截断,并在后面显示“...”,这就是最典型的表现层逻辑。但实际上,有很多程序员都是在非表现层代码中完成数据的获取和截断,然后赋值给表现层模板。这样的代码最明显的缺点就是,同一段数据,在一个页面可能要显示前5个字,在另一个页面可能要显示前10个字,而一旦在程序中固化了这个数值,这就丧失了灵活性。正确的做法是用视图程序来专门处理此类逻辑。
应用层
应用层的主要作用是定义用户可以做什么,并把操作结果返回给表现层。至于如何做,这就不属于其职责范围(而是领域层的职责范围),应用层会通过委派把工作实现的具体方法交给领域层处理。
领域层
最直接的解释就是包含领域逻辑的层,是一个软件的灵魂所在。首先,我们来看看什么叫领域逻辑。简单来说,具有明确的领域概念的逻辑就是领域逻辑,比如在ATM机上取钱,过程大致是这样的:插入银行卡——输入密码——输入取款金额——确定——拿钱——打印凭证——ATM吐出一张交易凭条。银行卡在ATM机中完成钱从账户划拨的过程就是一个领域逻辑,因为取钱在银行中是一个明确的领域概念,而ATM机吐出一张交易凭条的过程则不是领域逻辑,而仅是一个应用逻辑,因为吐出交易凭条并不是银行中一个明确的领域概念,只是一种技术手段。对应的,我们取钱后不要求打印交易凭条,而只要求发送一条提醒短信也是可能的。如果要求取款后必须吐出交易凭条,则吐出交易凭条的过程已经和取款过程紧密结合,那么就可以把吐出交易凭条的过程看作是领域逻辑的一部分,一切都以问题的具体情况而定。
持久层
持久层用于把领域模型保存到数据库中。因为程序代码是面向对象风格的,而数据库一般是关系型的数据库,所以需要把领域模型碾平,才能保存到数据库中。可以使用的方法有行数据入口(Row Data Gateway)或者表数据入口(Table Data Gateway),或者把领域层和持久层合二为一变成活动记录(Active Record)的方式。
1.3 网站架构需要考虑的几个问题
1.3.1 HTML静态化
众所周知,效率最高、消耗最小的就是纯静态化的HTML页面,所以我们尽可能使网站架构上的页面采用静态页面来实现,最简单的方法往往也是最有效的。但是对于内容大量并且频繁更新的网站,我们无法全部手动去逐一实现,于是出现了常见的信息发布系统(CMS),像各个门户站点的新闻频道等,都是通过信息发布系统来管理和实现的。信息发布系统可以实现最简单的信息录入并自动生成静态页面,还具备频道管理、权限管理、自动抓取等功能。对于一个大型网站来说,一套高效、可管理的CMS是必不可少的。
除了门户和信息发布类型的网站,对于交互性要求很高的社区类型网站来说,尽可能地静态化也是提高性能的必要手段。将社区内的帖子、文章进行实时的静态化,有更新的时候再重新静态化都是大量使用的策略,像MOP的大杂烩、网易社区等就是如此。
同时,HTML 静态化也是某些缓存策略使用的手段,对于系统中频繁使用数据库查询但内容更新很小的应用,可以考虑使用HTML静态化来实现,比如论坛的公用设置信息。目前,主流论坛都可以对这些信息进行后台管理并将其存储在数据库中,这些信息其实大量被前台程序调用,但是更新频率很小。可以考虑将这部分内容在后台更新时进行静态化,这样就避免了大量的数据库访问请求。
1.3.2 图片服务器分离
对于Web服务器来说,不管是Apache、IIS还是其他Web服务器,图片是最消耗资源的,所以有必要将图片与页面进行分离,这是大型网站都会采用的策略,他们都有独立的一台或图片服务器。这样的架构可以降低提供页面访问请求的服务器系统的压力,并且可以保证系统不会因为图片问题而崩溃。在应用服务器和图片服务器上,可以进行不同的优化配置,比如Apache在配置ContentType的时候可以只支持必要的类型,配置LoadModule的时候只加载必要的模块,保证更高的系统消耗和执行效率。
1.3.3 数据库集群和库表散列
大型网站都有很多复杂的应用程序,这些应用程序必须使用数据库,那么在面对大量访问的时候,数据库的瓶颈很快就显现出来,这时一台数据库无法满足应用要求,所以需要使用数据库集群或者库表散列。在数据库集群方面,很多数据库都有自己的解决方案,Oracle、Sybase等都有很好的方案,常用的MySQL数据库提供的Master/Slave也是类似的方案,业务上使用了什么样的DB,就参考使用相应的解决方案。
由于数据库集群在架构、成本、扩张性方面都受到所采用DB类型的限制,于是需要从应用程序的角度来考虑改善系统架构。库表散列是常用并且最有效的解决方案。在应用程序中,安装业务和应用或者功能模块将数据库进行分离,不同的模块对应不同的数据库或者表,再按照一定的策略对某个页面或者功能进行更小的数据库散列,比如按照用户ID进行对用户表散列,这样不仅能够低成本地提升系统的性能而且使系统具有很好的扩展性。一些大型论坛就是采用了这样的架构,将论坛的用户、设置、帖子等信息进行数据库分离,然后对帖子、用户按照板块和ID进行数据库和表散列,最终只需在配置文件中进行简单的配置便能让系统随时增加一台低成本的数据库进来补充系统性能。
1.3.4 缓存
相信程序开发人员都了解,很多地方要用到缓存。网站架构和网站开发中的缓存也是非常重要。这里先讲述最基本的两种缓存,高级和分布式的缓存将在后面进行讲述。
架构方面的缓存:对Apache比较熟悉的人都知道,Apache拥有自己的缓存模块,也可以使用外加的Squid进行缓存,这两种方式均可以有效提高Apache对访问的响应能力。
网站程序开发方面的缓存:Linux上提供的MemoryCache是常用的缓存接口,可以在Web开发中使用,比如用Java开发的时候就可以调用MemoryCache对一些数据进行缓存和通信共享,一些大型社区便使用了这样的架构。另外,在进行WEB开发的时候,各种语言基本都有自己的缓存模块和方法,如PHP有Pear的Cache模块。
1.3.5 镜像
镜像是大型网站常采用的提高性能和数据安全性的方式。镜像技术可以解决不同网络接入商和地域带来的用户访问速度差异,比如ChinaNet和EduNet之间的差异促使很多网站在教育网内搭建镜像站点,数据进行定时更新或者实时更新。在镜像的细节技术方面,这里不阐述太深,有很多专业的、现成的解决架构和产品可供选择,也有廉价的通过软件实现的方案,比如Rsync等工具。
1.3.6 负载均衡
负载均衡是大型网站解决高负载和大量并发请求而采用的终极解决办法。
四层交换使用第三层和第四层信息包的报头信息,根据应用区间识别业务流,将整个区间段的业务流分配到合适的应用服务器进行处理。
四层交换功能就像是虚拟IP,指向物理服务器。其传输业务服从多种协议,有HTTP、FTP、NFS、Telnet或其他协议。这些业务在物理服务器基础上,需要复杂的载量平衡算法。在IP世界,业务类型由终端TCP或UDP端口地址来决定,在四层交换中的应用区间则由源端和终端IP地址、TCP和UDP端口共同决定。
使用负载均衡的一个典型策略是,在软件或者硬件四层交换的基础上搭建缓存集群。这种思路被很多大型网站(包括搜索引擎)所采用。这样的架构成本低、性能高还有很强的扩展性,可随时向架构中增减节点,操作非常容易。这样的架构技术我们后面再行讲解。
1.4 操作系统的选择及参数优化
1.4.1 用U盘自动安装操作系统
目前市面上有很多种类的Linux,下面来介绍几种常见的Linux操作系统。
·Ubuntu:最流行的Debian 的衍生版软件,非常简单而全面;
·Fedora:Redhat 的免费桌面版;
·Red Hat Enterprise Linux ASX:Redhat 服务器版;
·Mandriva:其前身为Mandrake,号称最易用的Linux;
·OpenSUSE:由Novell 发起的Linux,很不错;
·Gentoo:大牛们玩的编译安装Linux;
·CentOS(CommunityEnterpriseOperatingSystem):来自于RedHatEnterprise的Linux,依照开放源代码规定释出的源代码所编译而成。它也是企业中最常用的一种。由于出自同样的源代码,因此有些要求高度稳定性的服务器使用CentOS替代商业版的RedHatEnterpriseLinux。两者的不同,在于CentOS并不包含封闭源代码软件。
系统的光盘安装这里不再多说,可以去我的博客里下载相关的视频,这些视频是我以前教学用的课件。下面讲解U盘无人值守安装Linux操作系统的方法。公司新购置十几台机器放到办公区,总不能一台一台地用光盘安装系统,虽然说可以配置批量安装服务器来远程安装(放到IDC机房),但需要购买管理控制卡,为了节省成本,个人感觉还是U盘安装比较方便。一台标配的DELL R710一般12分钟就可以装好Linux 系统(视安装包多少决定),然后配置IP和主机等基本配置,其他配置可回公司操作。注意,U盘的数量决定总体安装的时间。
U盘无人值守安装需要一个4GB的U盘(根据操作系统ISO的大小来定),另外需要两台服务器:一台做服务器端用来创建分区、复制文件;一台做测试机用来测试U盘安装。还有一台Windows操作系统用来引导写入MBR。
U盘无人值守安装Linux操作系统操作步骤如下。
1.创建ISO挂载点
[root@utest srv]# mkdir -p /mnt/iso/
2.挂载操作系统的ISO
[root@utest srv]# mount -o loop RHEL4.8-x86_64-AS-DVD.iso /mnt/iso/
3.给U盘分区(本环境被识别为/dev/sdb)
[root@utest srv]# fdisk /dev/sdb
如果U盘被系统认做sdb,如图1-1所示。按【n】键来创建新的分区,如图1-2所示。
图1-1
图1-2
首先创建一个分区(格式化成DOS分区)用来存放启动文件,这里为其分配大于100MB的空间即可,如图1-3所示。
图1-3
然后剩下的空间全部分配给/dev/sdb2,用于存放ISO文件,如图1-4所示。
图1-4
按【p】键查看分区结果,如图1-5所示。
图1-5
按【w】键保存并退出,如图1-6所示。
图1-6
4.创建两个挂载U盘的挂载点
[root@utest srv]# mkdir -p mnt/usb1 [root@utest srv]# mkdir -p mnt/usb2
5.格式化第一个分区成DOS分区
[root@utest srv]# mkfs.msdos /dev/sdb1
6.格式化第二个分区为ext2分区(syslinux暂不支持ext3文件系统)
[root@utest srv]# mkfs.ext2 /dev/sdb2
7.分别挂载
[root@utest srv]# mount /dev/sdb1 /mnt/usb1 [root@utest srv]# mount /dev/sdb2 /mnt/usb2
8.查看本地分区情况,如图1-7所示
图1-7
[root@utest srv]# df –lh
9.移动isolinux目录到DOS分区并且重命名
[root@utest srv]# cp -a /mnt/iso/isolinux/ /mnt/usb1/syslinux
10.复制自动安装读取的文件到DOS分区
[root@utest srv]# cp -a /root/anaconda-ks.cfg /mnt/usb1
11.复制系统ISO文件
[root@utest srv]# cp -a RHEL4.8-x86_64-AS-DVD.iso /mnt/usb2
12.进入DOS分区重命名文件并且编辑
[root@utest srv]# cd /mnt/usb1/syslinux/ [root@utest syslinux]# mv isolinux.cfg syslinux.cfg [root@utest syslinux]# chmod +w syslinux.cfg(原本为只读文件) [root@utest syslinux]# vi syslinux.cfg
修改文件的配置,原配置如图1-8所示。修改为如图1-9所示。
图1-8
图1-9
13.修改自动启动的配置文件
[root@utest syslinux]# cd /mnt/usb1 [root@utest usb1]# vi anaconda-ks.cfg # Kickstart file automatically generated by anaconda. install harddrive --partition=sdb2 --dir= lang en_US.UTF-8 keyboard us text network --device eth0 --bootproto static --ip 192.168.14.11 --netmask255.255.255.0 --gateway 50.11.11.19 --nameserver 22.16.0.20 rootpw aaaaaa firewall --enabled --port=22:tcp authconfig --enableshadow --enablemd5 selinux --disabled timezone Asia/Shanghai bootloader --location=mbr --driveorder=sda --append="rhgb quiet" # The following is the partition information you requested # Note that any partitions you deleted are not expressed # here so unless you clear all partitions first, this is # not guaranteed to work clearpart --all --drives=sda part / --fstype ext3 --size=50000 --ondisk=sda part swap --size=4096 --ondisk=sda %packages @admin-tools @base @core @development-libs @development-tools @editors @graphical-internet @legacy-network-server @legacy-software-development @legacy-software-support @network-server @server-cfg @system-tools @base-x keyutils kexec-tools iscsi-initiator-utils trousers fipscheck device-mapper-multipath perl-Convert-ASN1 imake
以上软件包的数量如果认为比较少,还可以自行添加其他软件包。
syslinux.cfg完整内容 default ks prompt 1 timeout 10 display boot.msg F1 boot.msg F2 options.msg F3 general.msg F4 param.msg F5 rescue.msg label linux kernel vmlinuz append initrd=initrd.img label text kernel vmlinuz append initrd=initrd.img text label ks kernel vmlinuz append ks=hd:sdb1:/hdd.cfg initrd=initrd.img text label local localboot 1 label memtest86 kernel memtest append -
在Windows系统的操作如下。
1.从Linux服务器上把U盘拔出并插在Windows上,这里识别为I盘,如图1-10所示。
图1-10
2.复制syslinux.exe到系统目录,最后路径如图1-11所示。
图1-11
3.在DOS环境下执行命令,把系统引导写入U盘的MBR,如图1-12所示
图1-12
将测试机设置为从U盘启动,启动后如果没错误则系统自动安装,如果弹出红帽子的安装界面然后在boot后输入ks,然后按【Enter】键即可完成系统安装。
1.4.2 系统初始化
系统安装完成后,需要根据不同的应用配置不同的参数。下面首先对sysctl.conf文件进行配置。该文件可以实现对千万级PV负载的支持,当然根据环境的不同,参数也不同。
# Kernel sysctl configuration file for Red Hat Linux # # For binary values, 0 is disabled, 1 is enabled. See sysctl(8) and # sysctl.conf(5) for more details. # ControlsIPpacket forwarding net.ipv4.ip_forward = 1 # Controls source route verification net.ipv4.conf.default.rp_filter = 1 # Do not accept source routing net.ipv4.conf.default.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 # Controls the use of TCP syncookies net.ipv4.tcp_syncookies = 1 # Controls the maximum size of a message, in bytes kernel.msgmnb = 65536 # Controls the default maxmimum size of a mesage queue kernel.msgmax = 65536 # Controls the maximum shared segment size, in bytes kernel.shmmax = 68719476736 # Controls the maximum number of shared memory segments, in pages kernel.shmall = 4294967296 # Reboot a minute after an Oops kernel.panic = 60 # Syncookies make SYN flood attacks ineffective net.ipv4.tcp_syncookies = 1 # Ignore bad ICMP net.ipv4.icmp_echo_ignore_broadcasts = 1 net.ipv4.icmp_ignore_bogus_error_responses = 1 # Disable ICMP Redirect Acceptance net.ipv4.conf.all.accept_redirects = 0 # EnableIPspoofing protection, turn on source route verification net.ipv4.conf.all.rp_filter = 1 # Log Spoofed Packets, Source Routed Packets, Redirect Packets net.ipv4.conf.all.log_martians = 1 # Reply to ARPs only from correct interface (required for DSR load-balancers) net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 fs.file-max = 1024000 net.ipv4.tcp_max_syn_backlog = 65536 net.core.netdev_max_backlog = 32768 net.core.somaxconn = 32768 net.core.wmem_default = 8388608 net.core.rmem_default = 8388608 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.tcp_timestamps = 0 net.ipv4.tcp_synack_retries = 2 net.ipv4.tcp_syn_retries = 2 net.ipv4.tcp_tw_recycle = 1 #net.ipv4.tcp_tw_len = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_mem = 94500000 915000000 927000000 net.ipv4.tcp_max_orphans = 3276800 #net.ipv4.tcp_fin_timeout = 30 #net.ipv4.tcp_keepalive_time = 120 net.ipv4.ip_local_port_range = 1024 65535 # Increase max conntrack table net.ipv4.ip_conntrack_max = 1310720000 # Reduce time_wait period to 10s (60s default) net.ipv4.tcp_fin_timeout = 1 net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 0 # Re-use Time_Wait socket when safe -- help reduce the amount of TW socket vm.swappiness = 2 net.ipv4.tcp_tw_reuse = 1 # Controls source route verification net.ipv4.conf.default.rp_filter = 0 # EnableIPspoofing protection, turn on source route verification net.ipv4.conf.all.rp_filter = 0 net.ipv4.ip_nonlocal_bind = 1 # 优化硬盘 cp /etc/fstab /etc/fstab.'date +"%Y-%m-%d_%H-%M-%S"' # 关闭系统,写入文件最后读取时间 sed -i 's/ext3 defaults/ext3 defaults,noatime/' /etc/fstab # 关闭系统,按时间间隔决定下次重启时运行fsck grep ext3 /etc/fstab | grep -v boot | awk '{print $1}' | xargs -i tune2fs -i0 {} # 关闭系统,按mount次数决定下次重启时运行fsck # grep ext3 /etc/fstab | grep -v boot | awk '{print $1}'|xargs -i tune2fs -c-1 {} # 安装工具软件sysstat, ntp, net-snmpd, sudo yum install sysstat ntp net-snmp sudo screen –y # Linux大多远程维护pts连接,可以关闭多余的tty,保留一个用于物理登录 cp /etc/inittab /etc/inittab.'date +"%Y-%m-%d_%H-%M-%S"' sed -i '/tty[2-6]/s/^/#/' /etc/inittab # 关闭不必要的服务 SERVICE='which service' CHKCONFIG='which chkconfig' SERVICES="acpid atd auditd avahi-daemon bluetooth cpuspeed cups firstboot hidd ip6tables isdn mcstrans messagebus pcscd rawdevices sendmail yum-updatesd" for service in $SERVICES do ${CHKCONFIG} $service off ${SERVICE} $service stop Done #Iptables的默认配置,需要根据实际情况添加 *filter :LOGDROP_ILLEGAL_PACKET - [0:0] -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j LOGDROP_ILLEGAL_PACKET -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST, PSH,ACK,URG -j LOGDROP_ILLEGAL_PACKET -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j LOGDROP ILLEGAL_PACKET -A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j LOGDROP_ILLEGAL_PACKET -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j LOGDROP_ILLEGAL_PACKET -A INPUT -p tcp -m tcp --tcp-flags FIN,ACK FIN -j LOGDROP_ILLEGAL_PACKET -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,ACK, URG -j LOGDROP_ILLEGAL_PACKET -A LOGDROP_ILLEGAL_PACKET -m limit --limit 2/sec -j LOG --log-prefix "IPTFW-bad-flag " --log-level 7 #-A INPUT -s 192.168.0.0/255.255.0.0 -i eth0 -j LOGDROP_ILLEGAL_PACKET -A INPUT -s 172.16.0.0/255.240.0.0 -i eth0 -j LOGDROP_ILLEGAL_PACKET -A INPUT -s 172.16.0.0/255.240.0.0 -i eth1 -j LOGDROP_ILLEGAL_PACKET -A INPUT -s 10.0.0.0/255.0.0.0 -i eth1 -j LOGDROP_ILLEGAL_PACKET -A INPUT -s 169.254.0.0/255.255.0.0 -j LOGDROP_ILLEGAL_PACKET -A LOGDROP_ILLEGAL_PACKET -j DROP :FORWARD ACCEPT [0:0] :INPUT DROP [0:0] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p vrrp -j ACCEPT -A INPUT -p udp -m state --state NEW -m udp --dport 53 -j ACCEPT -A INPUT -i eth0 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A INPUT -i eth0 -p tcp -m state --state NEW -m tcp --dport 110 -j ACCEPT -A INPUT -i eth0 -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT -A INPUT -i eth0 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type 8 -m limit --limit 5/sec -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type 0 -m limit --limit 5/sec -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type 11 -m limit --limit 5/sec -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type 3 -m limit --limit 5/sec -j ACCEPT -A INPUT -p icmp -j DROP -A INPUT -i eth0 -j REJECT --reject-with icmp-host-prohibited :OUTPUT DROP [0:0] -A OUTPUT -p vrrp -j ACCEPT -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A OUTPUT -o lo -j ACCEPT -A OUTPUT -p udp -m state --state NEW -m udp --dport 53 -j ACCEPT -A OUTPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A OUTPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT -A OUTPUT -p tcp -m state --state NEW -m tcp --dport 110 -j ACCEPT -A OUTPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT -A OUTPUT -p icmp -m icmp --icmp-type 8 -m limit --limit 5/sec -j ACCEPT -A OUTPUT -p icmp -m icmp --icmp-type 0 -m limit --limit 5/sec -j ACCEPT -A OUTPUT -p icmp -m icmp --icmp-type 11 -m limit --limit 5/sec -j ACCEPT -A OUTPUT -p icmp -m icmp --icmp-type 3 -m limit --limit 5/sec -j ACCEPT -A OUTPUT -p icmp -j DROP COMMIT
以上是笔者在工作中的一些经验和心得,与大家分享,希望能给大家一定的帮助。一套成熟的方案、一个安全稳定的网站或者系统,是长时间的积累和实践得出来的,因此,读者还需要不断地实践和总结。
1.5 小结
本章简单介绍了网站的架构和选择依据,并且对系统包的定制、U盘安装、系统初始化做了全方位的介绍,这是对系统底层的强有力的建设,希望大家掌握本章内容。尤其是系统部署部分的内容,这些对于以后的工作有很大的帮助。理解了本章的内容,我们的工作会更得心应手。