Category Archives: Server

Sqaure 网站所使用的技术

从他们的网站的招聘信息,Quora问答社区获取到的信息,可以大致了解情况。

早期的3人团队:
Jack Dorsey写服务器端(Python on Google App Engine)
Tristan O’Tierney 写iPhone客户端
Jim McKelvey设计硬件。
经过一个月的努力,三个创始人做出了第一个原型。

目前跑的是:

数据库:Redis and MySQL

支付平台:Ruby on Rails, Sinatra, JRuby, MRI, and Java

web: 宣传页面使用 html5,他们使用大量的js开源框架。

服务器部署在 亚马逊 CloudFront 云服务。

目前纯开发人员有大约有50人,可以从他们的开源项目看到:https://github.com/square

他们的开源代码提供了ruby代码,iPhone、Android测试框架,Android SDK,js等。

他们开发推崇TDD, Pair programming。

他们的开发理念:Rethinking,Redefining。

A simple http web service

很久没更新blog了,主要是这段时间工作太忙,刚加入一家创业公司 iboxpay,做移动支付,就是做中国版的Square :)

重新温习 socket之类的内容,翻看以前写的一些代码,整理一下,一个简单的 web server,放在 github:https://github.com/lytsing/myhttpd
这个例子很简单,但涉及到的内容都具备了:

  • 基础socket使用
  • 多路复用
  • 信号处理
  • 配置文件读取

等周末再完善,加上ipv6支持,当做一个学习的教程吧。

安装日志分析工具awstats

之前用Google Analytics分析网站,觉得多一次请求,对用户不太好,于是自己分析统计apache log。大约花了一个小时安装测试awstats,比预期的要顺利。

服务器是fedora,用yum安装很快。
[root@athena~]# yum install awstats

用默认的安装方法,/etc/httpd/conf.d/ 目录下面已经有了awstats.conf,如果没有,复制一个过去
# cp /usr/share/awstats/tools/httpd_conf /etc/httpd/conf.d/awstats.conf

编辑 /etc/httpd/conf.d/awstats.conf文件,默认的是:

<Directory "/usr/share/awstats/wwwroot">
    Options None
    AllowOverride None
    Order allow,deny
    Allow from 127.0.0.1
</Directory>

如果是外面的服务器,将 127.0.0.1改为 all

[root@athena~]# cp /etc/awstats/awstats.module.conf /etc/awstats/awstats.broncho.cn.conf
编辑/etc/awstats/awstats.broncho.cn.conf, 修改下面三项即可:
SiteDomain="broncho.cn"
LogFile="/var/log/httpd/broncho.cn_access_log.%YYYY-0%MM-0%DD-0"
Lang="cn"

[root@athena~]# cd /usr/share/awstats/wwwroot/cgi-bin
[root@athena cgi-bin]# ./awstats.pl -update -config=broncho.cn

发现:

Create/Update database for config “/etc/awstats/awstats.broncho.cn.conf” by AWStats version 6.8 (build 1.910)
From data in log file “/var/log/httpd/broncho.cn_access_log.20100927″…
Phase 1 : First bypass old records, searching new record…
Searching new records from beginning of log file…
AWStats did not find any valid log lines that match your LogFormat parameter, in the 50th first non commented lines read of your log.
Your log file /var/log/httpd/broncho.cn_access_log.20100927 must have a bad format or LogFormat parameter setup does not match this format.
Your AWStats LogFormat parameter is:1
This means each line in your web server log file need to have “combined log format” like this:
111.22.33.44 – – [10/Jan/2001:02:14:14 +0200] “GET / HTTP/1.1” 200 1234 “http://www.fromserver.com/from.htm” “Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)”
And this is an example of records AWStats found in your log file (the record number 50 in your log):
113.227.9.179 – – [27/Sep/2010:10:34:49 +0800] “GET /forum/styles/prosilver_se/theme/images/border_right.gif HTTP/1.1” 200 124
Setup (‘/etc/awstats/awstats.broncho.cn.conf’ file, web server or permissions) may be wrong.
Check config file, permissions and AWStats documentation (in ‘docs’ directory).

原来的日志按天分割的:

CustomLog “|/usr/local/sbin/cronolog /var/log/httpd/broncho.cn_access_log.%Y%m%d” common

按错误提示,修改为:

CustomLog "|/usr/local/sbin/cronolog /var/log/httpd/broncho.cn_access_log.%Y%m%d" combined

浏览 http://192.168.1.222/awstats/awstats.pl?config=broncho.cn 就可以看到效果。

定时分析日志,在服务器负载比较低的时候,一般是凌晨3,4点。

[root@athena~]# vim /usr/share/awstats/wwwroot/cgi-bin/awstats.sh

#!/bin/bash

cd /usr/share/awstats/wwwroot/cgi-bin
perl awstats.pl -update -config=broncho.cn

[root@athena~]# chmod 755 /usr/share/awstats/wwwroot/cgi-bin/awstats.sh

[root@athena~]# crontab -e
0 3 * * * /usr/share/awstats/wwwroot/cgi-bin/awstats.sh

thttpd源代码阅读笔记

thttpd源代码阅读笔记

thttpd是一个非常小巧的轻量级web server,适合做嵌入式web服务器,它的官方网站是http://www.acme.com/software/thttpd/
thttpd的代码量很小,大约1万行代码,代码风格好像是GNU,阅读不太习惯,用indent格式化:indent -kr -i4 -l200 -bad -bap -ip8 *.c
由于我的vim将tab设置为4个空格,代码中空格与tab共用,需要把tab还原为8个空格,才不出现排版混乱。

在fedora 12下编译,有错误:
htpasswd.c:52: error: conflicting types for 'getline'
/usr/include/stdio.h:655: error: previous declaration of 'getline' was here
htpasswd.c:52: error: conflicting types for 'getline'
/usr/include/stdio.h:655: error: previous declaration of 'getline' was here
make[1]: *** [htpasswd.o] Error 1
make[1]: Leaving directory `/home/deli/work/thttpd-2.25b/extras'
make: *** [subdirs] Error 2

原因是getline 已加入 POSIX 2008,可以把extras/htpasswd.c 里面的getline重命名为get_line或别的。

代码根目录下,就这几个文件:
fdwatch.c match.c strerror.c thttpd.c
libhttpd.c mmc.c tdate_parse.c timers.c

extras子目录两个
htpasswd.c makeweb.c

main函数在 thttpd.c
先梳理一些基本知识,看代码就容易多了。

编写守护进程(daemon)遵循的一般步骤:
1. 在父进程中执行fork并执行exit退出。
2. 在子进程调用setsid。
3. 让根目录“/” 成为子进程的工作目录。
4. 把子进程的umask变为0。
5. 关闭不必要的文件描述符。

除了上面所提的步骤,thttpd.c 跟其他服务器软件一样,解析参数,信号的处理,读取配置文件等。

Apache采用多进程模型响应用户请求,thttpd对并发请求不使用 fork()来派生子进程处理,采用IO多路复用解决方案。代码在fdwatch.c/h,对select()/poll()/kqueue()进行了封装,也加上了超时处理机制,跟Android RIL串口多路服用的代码非常相似。

至于socket网络编程,对HTTP/1.1协议的支持,都在libhttpd.c里面处理。

注意到了两个文本文件 mime_encodings.txt mime_types.txt,在Makefile.in里做处理,用sed格式化,生成mime_types.h,mime_encodings.h,在libhttpd.c中 再#include 进来,这是很常见的程序设计方法,好处就是修改方便,不容易出错。

Pages: Prev 1 2