如今,在大访问量的网站中,squid反向代理已经成为一种常用的缓存技术。但是,众所周知,squid本身不支持SMP,因此其原本是不支持在单台服务器同一端口(例如要反向代理web必须指定80端口)下开多个进程的。

而今多核多内存服务器已成趋势,如果单台服务器只运行一个squid反向代理跑web则显得太浪费,而根据官方意见要想运行多个squid实例,要么就指定不同的IP不同端口来实现。

而nginx是一个高性能的 HTTP 和反向代理服务器软件,运用nginx的负载均衡功能,我们就能很好的实现在同一台服务器中跑多个squid的目的,充分发挥多核大内存的作用。

具体步骤如下:
1.将N个squid安装到不同目录,并指定好多个用户以及不同的监听端口,这样便于监控时查看,例如:
squid1:/opt/squid1 监听在127.0.0.1:8081
squid2:/opt/squid2 监听在127.0.0.1:8082
squid3:/opt/squid3 监听在127.0.0.1:8083

2.编译并安装,配置nginx
./configure
nginx配置文件nginx.conf

user  www www;
worker_processes  10;


worker_rlimit_nofile 51200;


events {
        use epoll;
        worker_connections  51200;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    tcp_nopush     on;
   tcp_nodelay  on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    upstream jianglb {
     server 127.0.0.1:8081;
     server 127.0.0.1:8082;
     server 127.0.0.1:8083;

    }

    #gzip  on;

    server {
        listen       192.168.1.3:80;
        server_name  www.jianglb.com jianglb.com ;
        access_log  logs/host.access.log  main;


        location / {
                proxy_pass        http://jianglb;
                proxy_redirect          off;
                proxy_set_header   Host             $host:80;
                proxy_set_header   X-Real-IP        $remote_addr;
                proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

        }
    }
}

这里有几个配置的注意点:
1.如果需要同时代理加速多个域名,而这些域名是同时做负载均衡的话,不需要分开来指定,upstream只需要一个即可,proxy_pass那里的名称能对应起来即可;
2.proxy_set_header Host $host:80;这里最好加上端口80,因为我一开始没加80,发现nginx转发的时候squid会收到www.jianglb.com:8081这样的头信息,这明显是不对的,一次加上80会比较好。

前几日,给校内网开发了个应用,不说其开发说明简陋粗糙,审核效率低下(在开发说明里自称每天审核,结果过了2天才给审核),单是其给我的答复的审核短信就够莫名其妙了:

很抱歉,经查看您的应用”IT资讯”目前尚有些问题,不能通过审核,请修改并测试后提交。
可能存在的问题:
应用有太多链接在应用外部打开

这个模糊的答复,什么叫“太多”,怎么个标准都没有,纯凭审查员瞟一眼就定了?

既然我开发的程序外链太多,那么看看目前已经通过审核的应用吧,那总该是符合标准了吧。

不看不知道,一看才知道,审核者实在是眼神有问题。看了几个通过审核的应用,有跟本应用同类型,也有不同类型的,多数是用iframe形式嵌套,外链之多自不必说了,而且还有滚动条,用户体验极不舒服,与他们相比,本人的程序堪称典范。

理由如下:

1.采用校内推荐的XNML代码,与校内网站的界面完美整合。

2.外链全为必要链接:内容提要直接显示,详细内容则为外链。

3.无广告,无杂质的纯净版本。

我又去看了校内祖师爷:facebook,发现校内果然是抄FB抄的最像的,连API的代码语法都抄的相似极了:人家是FBML,校内的就改成了XNML,在校内的应用只要做些许修改就可以直接在facebook上运行

看来校内是不缺应用了,本想下一步开发给这个新的应用加上个性化定制新闻的功能,现在人家校内不稀罕咱的东西,只能转投facebook。

Freebsd 6.2 的服务器, 跑Squid服务,经常在启动不久之后,就会出现
xcalloc: Unable to allocate 1 blocks of 4108 bytes!
错误信息,大致是指Squid申请内存错误。

在 Squid FAQ 中找到
Messages like "FATAL: xcalloc: Unable to allocate 4096 blocks of 1 bytes!" appear when Squid can't allocate more memory, and on most operating systems (inclusive BSD) there are only two possible reasons:

* The machine is out of swap
* The process' maximum data segment size has been reached

The first case is detected using the normal swap monitoring tools available on the platform (pstat on SunOS, perhaps pstat is used on BSD as well).

To tell if it is the second case, first rule out the first case and then monitor the size of the Squid process. If it dies at a certain size with plenty of swap left then the max data segment size is reached without no doubts.

The data segment size can be limited by two factors:

* Kernel imposed maximum, which no user can go above
* The size set with ulimit, which the user can control.

When squid starts it sets data and file ulimit's to the hard level. If you manually tune ulimit before starting Squid make sure that you set the hard limit and not only the soft limit (the default operation of ulimit is to only change the soft limit). root is allowed to raise the soft limit above the hard limit.

文中指出,导致 Squid在 Freebsd下跑起来内存溢出有两种情况:

1、系统的交换分区 Swap分区不够用。

2、进程申请的最大内存受到限制。

该服务器有4G内存,开启了高达8G Swap,明显第一个原因是不对。

然后用top 观察Squid运行状态,发现Squid在跑超过512M内存的时候,就自动退出了,而Squid设置的是1280M的内存参数。

用 limits 查看系统参数,发现单进程的内存占用数被限制在了512M

datasize 524288

通过 ulimt -d 2097152 和 ulimit -Hd 进行强制设置并不成功,因为freebsd默认是csh,不支持ulimit。

继续翻阅Google上的资料,在一个台湾网友那里找到了设置的方法。

kern.maxdsiz=”2G”

添加到

/boot/loader.conf

(中间尝试添加到 /etc/sysctl.conf 重启后不成功)

Script.Aculo.Us是基于Prototype框架的一个非常优秀的开源JS框架,详细的介绍和使用方法参见:
Script.aculo.us开发系列全集

这里记录下最新版1.8.1的一个bug:
该bug在InPlaceCollectionEditor控件中,该控件的作用是编辑状态下显示一个Select标签。但是在最新的1.8.1中调用该控件使会发生JS错误,无法成功,就连官方自带的demo文档下,该控件也无效。而老的1.6却不会出错。

经检测,错误发生在controls.js的838行: this._controls.editor.update(”);
这行代码在FIFEFOX下不会有问题,但是在IE下却会出错了,去掉该行即可,我估计写这个框架的老外用的是FF,所以这个BUG居然没发现,^_^。

外键的作用:

保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值!
例如:
a b 两个表
a表中存有 客户号,客户名称
b表中存有 每个客户的订单
有了外键后
你只能在确信b 表中没有客户x的订单后,才可以在a表中删除客户x

建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表主键)。

指定主键关键字: foreign key(列名)

引用外键关键字: references <外键表名>(外键列名)

事件触发限制: on delete和on update , 可设参数cascade(跟随外键改动), restrict(限制外表中的外键改动),set Null(设空值),set Default(设默认值),[默认]no action

例如:

outTable表 主键 id 类型 int

创建含有外键的表:
create table temp(
id int,
name char(20),
foreign key(id) references outTable(id) on delete cascade on update cascade);

说明:把id列 设为外键 参照外表outTable的id列 当外键的值删除 本表中对应的列筛除 当外键的值改变 本表中对应的列值改变。

08月 3rd, 2007PHP编码规范

注:这是从PHPCMS开发文档里看到编码规范,虽名为PHPCMS的开发规范,但我觉得所有的PHP编程都该如此。写了那么多PHP,很多编码对照这规范都感觉欠缺很多,今后一定要对照纠正。

Phpcms 编码规范
1. 引言…. 2
2. 适用范围…. 2
3. 标准化的重要性和好处…. 3
4. PHP编码规范与原则…. 3
4.1. 代码标记… 3
4.2. 注释… 3
4.3. 书写规则… 4
4.3.1. 缩进… 4
4.3.2. 大括号{}、if和switch. 4
4.3.3. 运算符、小括号、空格、关键词和函数… 5
4.3.4. 函数定义… 6
4.3.5. 引号… 6
4.3.6. 多语言问题… 7
4.4. 命名原则… 8
4.4.1. 变量、对象、函数名… 8
4.4.2. 常量… 8
4.5. 变量的初始化与逻辑检查… 8
4.6. 安全性… 9
4.7. 兼容性… 9
4.8. 代码重用… 10
4.9. 其他细节问题… 10
4.9.1. 包含调用… 10
4.9.2. 错误报告级别… 11
5. 数据库设计…. 11
5.1. 字段… 11
5.1.1. 表和字段命名… 11
5.1.2. 字段结构… 11
5.2. SQL语句… 12
5.3. 性能与效率… 13
5.3.1. 定长与变长表… 13
5.3.2. 运算与检索… 13
5.3.3. 结构优化与索引优化… 14
5.3.4. 查询优化… 14
5.3.5. 兼容性问题… 16
6. 模板设计…. 16
6.1. 代码标记… 16
6.2. 书写规则… 16
6.2.1. HTML. 16
6.2.2. 变量… 16
6.2.3. 语言元素… 17
6.2.4. 缩进… 17
7. 文件与目录…. 17
7.1. 文件命名… 17
7.2. 目录命名… 18
7.3. 空目录索引… 18
Read the rest of this entry »


© 2007-2011 Jianglb之家 |浙ICP备05036290号-2 | Powered by Wordpress