如何部署servlet 到lighttpd
部署概述:
1、 测试环境:
操作系统为REHL4,部署目标目录为/home/lighttpd;
2、 使用版本:
使用lighttpd1419版;
3、 优化说明:
对etag头配置进行修改,,根据文件更新频繁程度,对不同的文件目录采用不同的expire策略;对于静态html/js/css文件均启用http压缩支持。主进程仅包含运行必须的模块,其他模块均排除,减少进程资源。
修改etag头是为了在集群环境中能够对相同的文件不用进行重复的请求,Lighttpd中可以通过设置etaguse-inode="disable",只设置mtime和size来解决这个问题,不过研发那边既然要求去掉Etag,那么就把Etag disable掉吧。(原来以为是可以将etag的输出disable掉的,但是如果同时启用了compress模块,会有问题,compress仍然会输出etag头,看了网上的一些文档,似乎可以通过hack手段修改源码来解决这个问题,但是没有时间去测试这个方法的稳定性,只得作罢。但是需要注意集群环境中文件的时间和大小需要一致)
4、 测试说明:
对大日志(超过2G的日志)、系统性能、Etag和expire头均进行过基本的测试;
关于压缩功能的测试,需要说明一点,lighttpd的compress模块只对超过一定大小的文件才启用压缩,这个具体的文件大小也没有找到相关的说明。
5、 部署拓扑:
使用四层交换机对客户的静态文件请求进行负载均衡调度,服务器之间用rsync来进行文件同步。
一、编译:
1、下载安装包:
安装mod cache需要打补丁,使用的lighttpd版本为lighttpd-1419,对应的patch版本为lighttpd-1419modcachev144patch (mod cache是一个类似于squid,可以通过lighttpd来实现squid的功能,考虑到将来的扩展和部署,可以在安装是将mod cache一并安装) 。
安装 mod cache需要gamin和pcre,也一并下载安装。按照下面的安装方式,所有的功能模块都是安装在同一个目录下面,这样便于整个备份和删除。
安装 mod cache 需要打补丁,需要一并下载。
通常老板花钱请我们架构网站的时候,会给我们提出一些目标,诸如网站每天要能承受100万PV的访问量等等。这时我们要预算一下大概需要多大的带宽,计算带宽大小主要涉及两个指标(峰值流量和页面大小),我们不妨在计算前先做出必要的假设:
第一:假设峰值流量是平均流量的5倍。
第二:假设每次访问平均的页面大小是100K字节左右。
如果100万PV的访问量在一天内平均分布的话,折合到每秒大约12次访问,如果按平均每次访问页面的大小是100K字节左右计算的话,这12次访问总计大约就是1200K字节,字节的单位是Byte,而带宽的单位是bit,它们之间的关系是1Byte = 8bit,所以1200K Byte大致就相当于9600K bit,也就是9Mbps的样子,实际情况中,我们的网站必须能在峰值流量时保持正常访问,所以按照假设的峰值流量算,真实带宽的需求应该在45Mbps 左右。
当然,这个结论是建立在前面提到的两点假设的基础上,如果你的实际情况和这两点假设有出入,那么结果也会有差别。 先看我们都需要哪些服务器:服务器,页面服务器,数据库服务器,应用服务器,日志服务器等等。
对于访问量大点的网站而言,分离单独的服务器和页面服务器相当必要,我们可以用lighttpd来跑服务器,用apache来跑页面服务器,当然也可以选择别的,甚至,我们可以扩展成很多台服务器和很多台页面服务器,并设置相关域名,如imgdomain和 wwwdomain,页面里的路径都使用绝对路径,如<img src=http://imgdomain/abcgif />,然后设置DNS轮循,达到最初级的负载均衡。当然,服务器多了就不可避免的涉及一个同步的问题,这个可以使用rsync软件来搞定。
数据库服务器是重中之重,因为网站的瓶颈问题十有八九是出在数据库身上。现在一般的中小网站多使用MySQL数据库,不过它的集群功能似乎还没有达到stable的阶段,所以这里不做评价。一般而言,使用MySQL数据库的时候,我们应该搞一个主从(一主多从)结构,主数据库服务器使用innodb表结构,从数据服务器使用myisam表结构,充分发挥它们各自的优势,而且这样的主从结构分离了读写操作,降低了读操作的压力,甚至我们还可以设定一个专门的从服务器做备份服务器,方便备份。不然如果你只有一台主服务器,在大数据量的情况下,mysqldump基本就没戏了,直接拷贝数据文件的话,还得先停止数据库服务再拷贝,否则备份文件会出错。但对于很多网站而言,即使数据库服务仅停止了一秒也是不可接受的。如果你有了一台从数据库服务器,在备份数据的时候,可以先停止服务(slave stop)再备份,再启动服务(slave start)后从服务器会自动从主服务器同步数据,一切都没有影响。但是主从结构也是有致命缺点的,那就是主从结构只是降低了读操作的压力,却不能降低写操作的压力。
为了适应更大的规模,可能只剩下最后这招了:横向/纵向分割数据库。所谓横向分割数据库,就是把不同的表保存到不同的数据库服务器上,比如说 用户表保存在A数据库服务器上,文章表保存在B数据库服务器上,当然这样的分割是有代价的,最基本的就是你没法进行LEFT JOIN之类的操作了。所谓纵向分割数据库,一般是指按照用户标识(user_id)等来划分数据存储的服务器,比如说:我们有5台数据库服务器,那么 “user_id % 5 + 1”等于1的就保存到1号服务器,等于2的就保存到2号服务器,以此类推,纵向分隔的原则有很多种,可以视情况选择。不过和横向分割数据库一样,纵向分割数据库也是有代价的,最基本的就是我们在进行如COUNT, SUM等汇总操作的时候会麻烦很多。综上所述,数据库服务器的解决方案一般视情况往往是一个混合的方案,以其发挥各种方案的优势,有时候还需要借助memcached之类的第三方软件,以便适应更大访问量的要求。
如果有专门的应用服务器来跑PHP脚本是最合适不过的了,那样我们的页面服务器只保存静态页面就可以了,可以给应用服务器设置一些诸如appdomain之类的域名来和页面服务器加以区别。对于应用服务器,我还是更倾向于使用prefork模式的apache,配上必要的xcache之类的PHP缓存软件,加载模块要越少越好,除了mod_rewrite等必要的模块,不必要的东西统统舍弃,尽量减少httpd进程的内存消耗,而那些服务器,页面服务器等静态内容就可以使用lighttpd或者tux来搞,充分发挥各种服务器的特点。
如果条件允许,独立的日志服务器也是必要的,一般小网站的做法都是把页面服务器和日志服务器合二为一了,在凌晨访问量不大的时候cron运行前一天的日志计算,不过如果你使用awstats之类的日志分析软件,对于百万级访问量而言,即使按天归档,也会消耗很多时间和服务器资源去计算,所以分离单独的日志服务器还是有好处的,这样不会影响正式服务器的工作状态。
一、安装Lighttpd
Lighttpd 是一个德国人领导的开源Web服务器软件,其根本的目的是提供一个专门针对高性能网站,安全、快速、兼容性好并且灵活的web server环境。具有非常低的内存开销、cpu占用率低、效能好以及丰富的模块等特点。
1使用如下命令安装LightHttpd。
opkg update opkg install lighttpd lighttpd-mod-cgi
2安装完成后,编辑/etc/lighttpd/lighttpdconf文件。
按下图画红线的地方修改servermodules、serverport以及serverdocument-root即可。
注,如果在启动lighttpd时,报如下的错误 Cannot load plugin mod_cgi more than once, please fix your config (we may not accept such configs in future releases,则不需要添加上述内容,因为该配置文件中引用的配置文件已经在servermodules中包含了"mod_cgi"。在我的lighttpd版本中,lighttpdconf配置文件引入了/etc/lighttpd/confd/10-cgiconf配置文件,而后者已经包含了"servermodule"。
3 通过以下命令创建/srv/www目录
mkdir -p /srv/www
4使用如下的命令启动lighttpd和设置lighttpd服务随开机启动。
/etc/initd/lighttpd start /etc/initd/lighttpd enable
二、安装PHP
1使用如下命令安装PHP。
opkg update opkg install php5 php5-cgi
2编辑/etc/phpini,设置doc_root = "/srv/www"。
3按下图的方式编辑/etc/lighttpd/lighttpdconf,已用红线画出。
注意:当lighthttp启动失败时,如果是因为配置文件错误的话通常会报这样的错误:(configfilec957) source: /etc/lighttpd/lighttpdconf line,可通过如下的命令来查看出错的原因,这里我是因为多添加了一个index-filenames造成的错误。
lighttpd -f /etc/lighttpd/lighttpdconf
如果报如下的错误,则是因为多配置了cgiassign,就需要将刚才配置的cgiassign注释掉,因为配置文件中引入了/etc/lighttpd/confd/conf文件。
Duplicate config variable in conditional 0 global: cgiassign 2014-12-21 13:41:18: (configfilec957) source: cat /etc/lighttpd/confd/conf line: 34 pos: 1 parser failed somehow near here: (EOL) 2014-12-21 13:41:18: (configfilec957) source: /etc/lighttpd/lighttpdconf line: 41 pos: 1 parser failed somehow near here: (EOL)
然后编辑/etc/lighttpd/confd/10-cgiconf文件,在文件中添加如下图红线标记的内容。
4使用如下的命令重启Lighttpd。
/etc/initd/lighttpd restart
5下面在srv/www目录下,写一个php文件,来测试一下安装是否成功。可使用如下的命令简单地添加一个文件。
echo "<php phpinfo(); >" > /srv/www/indexphp
6然后,在浏览器中输入网址,查看php和http服务器是否安装成功。我这里是如下图所示,表示安装成功了。
三、安装Mysql
1使用如下命令,安装mysql及相关组件
opkg install libpthread libncurses libreadline mysql-server
2 依次执行如下命令,对Mysql做初始化工作
sed -i 's,^datadir,datadir = "/srv/mysql",g' /etc/mycnf sed -i 's,^tmpdir,tmpdir = "/tmp",g' /etc/mycnf mkdir -p /srv/mysql mysql_install_db --force /etc/initd/mysqld start /etc/initd/mysqld enable mysqladmin -u root password '123456'
注:123456是mysql的root账户密码
3安装如下组件,使PHP可以使用Mysql
opkg install php5-mod-mysql
4将mysqlso配置到/etc/phpini中
sed -i 's,;extension=mysqlso,extension=mysqlso,g' /etc/phpini
5将mysqliso配置到/etc/phpini中
sed -i 's,;extension=mysqliso,extension=mysqliso,g' /etc/phpini
6到/etc/myconf下查看你的数据库套接字文件地址,如下图所示。
7如下图所示,配置/etc/phpini文件,修改[mysql]下的内容,并把[mysql]的内容复制一份,并修改成mysqli,如下图所示
到此,Mysql就配置完了。
0条评论