squid 关于内存相关参数的说明

cache_mem  10240 MB  squid使用的其它内存上限,用于传输中的对象/热对象/非缓存对象(有点像linux的硬盘缓存,他们都存成4kb的块,这样可以提高传输速度),默认8MB,传输中的对象优先级最高。
注意:这个值要参考硬盘缓存所使用的内存和总内存量确定,设定大,则缓存的热内容多,但硬盘缓存的内容就少了。(估算一下最热内容占多大空间再决定)
maximum_object_size_in_memory  16  KB  对象的最大尺寸,超过不会被放入内存,默认8KB,根据网站网页一般的尺寸设置大小,最好是4kb的倍数
memory_replacement_policy  lru  内存替换策略,默认LRU,不用改
memory_pools  on  squid预先分配一定的内存用于cache,以提高效率,默认on;如果os内存管理很高效,可以off
memory_pools_limit  5  MB  squid在memory_pools中保存的预分配(未使用的)内存的上限,当pools开启时有效,0表示不限制大小,最好设一个的值,大些,以保证内存效率,实际不一定会用到这个值,默认5MB。这个值可以设置为64-128MB,squid会根据需求占用之。

如果在服务器只单纯用于squid服务时,可以关闭memory_pools 选项,让squid自动决定分配多少内存:
memory_pools off
memory_pools_limit none
如果不是专门的服务器,就要打开memory_pools 选项,适当的设置
memory_pools on
memory_pools_limit 1024M

【求助】用squid 2.7做透明代理iptables规则问题

系统环境:CentOS 5.5今天刚编译了新的内核是2.36.2  
                 squid 2.7做的透明代理服务器
          内网网段:192.168.10.0/24
                  squid服务器地址:192.168.10.11 (端口是3128)
          网  关:192.168.10.1(也是CentOS 5.5)
遇到的问题:
           squid设置完成后需要在网关(192.168.10.1)上边设置转发规则 将内网192.168.10.0/24所有访问80端口的数据包

重定向到squid服务器3128端口上,因为网关和squid不在同一台机器,我在用192.168.10.1上边添加

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3128

添加后就将内网80端口数据重定向到了本地的3128端口,请问如何将80数据转发到192.168.10.11:3128端口上呢
我试了下iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 192.168.10.11:3128这条规则是将80端口的数据转发到了本地192端口上
。。很郁闷所以在此求教。

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.10.11:3128

这两条规则效果一样吗,除了在网关上设置将内网所有80端口的数据重定向到代理服务器3128端口外,还需要设置其他规则吗,还需要在192.168.10.11这台代理服务器上设置哪些规则吗,谢谢.

ps:研究了一周左右了,CDN网络加速已经实验成功,透明代理这里防火墙规则设置不过去,郁闷的很,在网上查了很多资料,越看越晕,到最后自己都糊涂了。。。能给出具体规则最好 呵呵谢谢大家 QQ:861112650

squid-2.6 在CentOS上源码安装

下载并解压缩最新的squid-2.6  
wget  http://mylinux.5d6d.com/userdirs ... 2.6.STABLE20.tar.gz
ulimit -HSn 65535
编译参数
./configure --prefix=/usr/local/squid \
--disable-dependency-tracking \
--enable-dlmalloc \
--enable-gnuregex \
--disable-carp \
--enable-async-io=240 \
--with-pthreads \
--enable-storeio=ufs,aufs,diskd,null \
--disable-wccp \
--disable-wccpv2 \
--enable-kill-parent-hack \
--enable-cachemgr-hostname=localhost \
--enable-default-err-language=Simplify_Chinese \
--with-build-environment=POSIX_V6_ILP32_OFFBIG \
--with-maxfd=65535 \
--with-aio \
--disable-poll \
--enable-epoll \
--enable-linux-netfilter \
--enable-large-cache-files \
--disable-ident-lookups \
--enable-default-hostsfile=/etc/hosts \
--with-dl \
--with-large-files \
--enable-removal-policies=heap,lru \
--enable-delay-pools \
--enable-snmp \
--disable-internal-dns

make && make install

squid.conf 中的refresh_pattern详解

这个东西是用来设置对象缓存时间的。
首先理解 refresh_pattern 语法: refresh_pattern [-i] regexp min percent max [options]
例如:
refresh_pattern \.(jpg|png|gif|mp3|xml|css|js)$ 1440    50%     28800    ignore-reload

-i 其实就是是否区分大小写,加上这个参数就是不区分。 regexp代表正则表达式,上例中表示以jpg|png|gif|mp3|xml|css|js 结尾的这些文件,当然这里的| 表示 或 的意思。
几个概念:
resource age =对象进入cache的时间-对象的last_modified,简单点理解就是从对象被缓存到对象被修改之间的时间
response age  =当前时间-对象进入cache的时间,简单理解就是对象已经被缓存了多久

min和max为时间,单位是分钟,上例中 1440就是1天,28800就是20天。

百分比,这个东西用来衡量一个文件的存活时间。存活时间= resource age * 百分比。

[options]  
如果希望页面一进入cache就不删除,直到被主动purge掉为止,可以加上ignore-reload选项.  一般情况可以使用 reload-into-ims

最后说说,如何判断一个文件是否过期:
1.  首先计算出response age
2.  当response age <= max时,对象不过期,而>max时就过期了
3.  当response age介于两者之间时,就需要看 存活期了,当存活期 > response age 时则过期,否则不过期。

过期了的话,squid并不会删除对象,当有请求来访问该文件时,则squid会到前端的web上去读取新的文件,但是squid还是会把当前的文件和web上的文件做对比,如果改了则重新拉取过来缓存,否则不拉取,直接更改resource age 。

squid优化及配置参数

Squid 在高负载下,需要大量的内核资源。特别的,您需要给您的系统配置比正常情况更高的文档描述符和缓存。文档描述符的限制通常很恼人。您最好在开始编译squid 之前来增加这些限制的大小。 .

文档描述符是个简单的整数,用以标明每一个被进程所打开的文档和socket。第一个打开的文档是0,第二个是1,依此类推。Unix 操作系统通常给每个进程能打开的文档数量强加一个限制。更甚的是,unix 通常有一个系统级的限制。

因为squid 的工作方式,文档描述符的限制可能会极大的影响性能。当squid 用完任何的文档描述符后,他不能接收用户新的连接。也就是说,用完文档描述符导致拒绝服务。直到一部分当前请求完成,相应的文档和socket 被关闭,squid 不能接收新请求。当squid发现文档描述符短缺时,他会发布警告。

在运行./configure 之前,检查您的系统的文档描述符限制是否合适,能给您避免一些麻烦。大多数情况下,1024 个文档描述符足够了。很忙的cache可能需要4096或更多。在配置文档描述符限制时,我推荐配置系统级限制的数量为每个进程限制的2 倍。

通常在您的Unix shell 中能找到系统的文档描述符限制。任何的C shell 及其类似的shell有内建的limit 命令。更新的Bourne shell 及其类似的shell 有一条叫做ulimit 的命令。为了发现您的系统的文档描述符限制,试运行如下命令:
sh$ ulimit -n .

在Linux 上配置文档描述符有点复杂。在编译squid 之前,您必须编辑系统include 文档中的一个,然后执行一些shell 命令。请首先编辑/usr/include/bits/typesizes.h 文档,改变__FD_SETSIZE 的值:
#define _ _FD_SETSIZE 8192

下一步,使用这个命令增加内核文档描述符的限制:
# echo 8192 > /proc/sys/fs/file-max

最后,增加进程文档描述符的限制,在您即将编译squid 的同一个shell 里执行:
sh# ulimit -Hn 8192

该命令必须以root 运行,仅仅运行在bash shell。不必重启机器。

使用这个技术,您必须在每一次系统启动后执行上述echo 和ulimit 命令,或至少在squid 启动之前。假如您使用某个rc.d 脚本来启动squid,那是个放置这些命令的好地方。 .

临时端口是TCP/IP 栈分配给出去连接的本地端口。换句话说,当squid 发起一条连接到另一台服务器,内核给本地socket 分配一个端口号。这些本地端口号有特定的范围限制。

临时端口号的短缺对很忙的代理服务器(例如每秒数百个连接)来说,会较大的影响性能。这是因为一些TCP 连接在他们被关闭时进入TIME_WAIT 状态。当连接进入TIME_WATI 状态时,临时端口号不能被重用。

您能使用netstat 命令来显示有多少个连接进入这个状态:

% netstat -n | grep TIME_WAIT

在Linux 上,简单的写一对数字到下列指定文档:
# echo "1024 40000" > /proc/sys/net/ipv4/ip_local_port_range

不要忘记将这些命令加到您的系统启动脚本中,以使机器每一次重启后都生效。 ..

ls -l /usr/local/squid
total 5
drwxr-x--- 2 wessels wheel 512 Apr 28 20:42 bin
drwxr-x--- 2 wessels wheel 512 Apr 28 20:42 etc
drwxr-x--- 2 wessels wheel 512 Apr 28 20:42 libexec
drwxr-x--- 3 wessels wheel 512 Apr 28 20:43 man
drwxr-x--- 2 wessels wheel 512 Apr 28 20:42 sbin
drwxr-x--- 4 wessels wheel 512 Apr 28 20:42 share
drwxr-x--- 4 wessels wheel 512 Apr 28 20:43 var ..

.4.1 configure 选项

./configure 脚本有大量的不同选项,他们以-开始。当您敲入./configure --help 时,能看到选项的完整列表。一些选项对任何configure 脚本是通用的,更有一些是squid 专有的。下面是您可能用得到的标准选项:
--perfix =PREFIX

如前面描述的相同,这里配置安装目录。安装目录是任何可执行文档,日志,和配置文档的默认目录。在整本书中,$prefix 指您选择的安装目录。

--localstatedir =DIR
该选项允许您改变var 目录的安装位置。默认是$prefix/var,但也许您想改变他,以使squid 的磁盘缓存和日志文档被存储在别的地方。

--sysconfdir =DIR
该选项允许您改变etc 目录的位置。默认的是$prefix/etc。假如您想使用/usr 作为安装位置,您也许该配置--sysconfdir为/etc.

以下是squid 的专有./configure选项:

--enable-dlmalloc[=LIB]
在一些系统上,内建的内存分配机制(malloc)在使用squid 时表现不尽人意。使用--enable-dlmalloc 选项将squid 源代码包中的dlmalloc 包编译和链接进来。假如您的系统中已安装dlmalloc,您能使用=LIB 参数指定库的路径。请见http://g.oswego.edu/dl/html/malloc.html更多关于dlmalloc 的信息。 。

--enable-gnuregex
在访问控制列表和其他配置指令里,squid 使用正则表达式作为匹配机制。GNU 的正则表达式库包含在squid 的源代码包里;他能够在没有内建正则表达式的操作系统中使用。./configure脚本侦察您系统中的正则表达式库,假如必要,他能够激活使用GNU正则表达式。假如因为某些理由,您想强制使用GNU正则表达式,您能够将这个选项加到./configure命令后。

--enable-carp
Cache数组路由协议(CARP)用来转发丢失的cache到父cache的数组或cluster。在10.9章有更多关于CARP的细节。

--enable-async-io[=N_THREADS]
同步I/O 是squid 技术之一,用以提升存储性能。aufs 模块使用大量的线程来执行磁盘I/O 操作。该代码仅仅工作在linux 和solaris 系统中。=N_THREADS 参数改变squid 使用的线程数量。aufs 和同步I/O 在8.4 章中被讨论。

Squid 错误信息中显示时间问题

Squid的Error messages 默认的时间显示的GMT时间,而非本地时间,这个有时候看着很别扭。

  下面是修改方法,找到Squid的源文件src/errorpage.c 大概在60多行,

    {
ERR_SQUID_SIGNATURE,
     "\n<BR clear=\"all\">\n"
     "<HR noshade size=\"1px\">\n"
     "<ADDRESS>\n"
     "Generated %T by %h (%s)\n"
     "</ADDRESS>\n"
     "</BODY></HTML>\n"
    },

  把上面的“ "Generated %T by %h (%s)\n"” 修改为“ "Generated %t by %h (%s)\n"”即可。

即:把%T改为%t 。

php 中ming的编译

1、下载  ming-0.4.0.rc1.tar.bz2  
wget http://mylinux.5d6d.com/userdirs ... ng-0.4.0.rc1.tar.gz
2、 tar jxvf ming-0.4.0.rc1.tar.bz2
3、cd ming-0.4.0.rc1 ; ./configure --prefix=/usr/local/ming ; make && make install
4、cp -r php_ext/*  /usr/local/src/php-5.2.8/ext/ming
5、cd /usr/local/php-5.2.8/
6、./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-mysql=/usr/local/mysql --with-mysql-sock=/tmp --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-mcrypt=/usr/local/libmcrypt --enable-soap --enable-gd-native-ttf --enable-ftp --enable-mbstring --enable-exif --enable-zend-multibyte --disable-ipv6 --enable-fastcgi --enable-fpm  --with-ming=/usr/local/ming
7、make && make install

php 编译(针对Apache)

PHP需要MySQL客户端模块支持,需要下载MySQL软件。
# cd /usr/local/src
# tar zvxf mysql-5.0.67-linux-i686-icc-glibc23.tar.gz
# mv mysql-5.0.67-linux-i686-icc-glibc23 /usr/local/mysql
# tar zvxf php-5.2.8.tar.gz
# cd php-5.2.8
# ./configure --prefix=/usr/local/php \
--with-apxs2=/usr/local/apache2/bin/apxs \
--with-config-file-path=/usr/local/php/etc \
--with-mysql=/usr/local/mysql \
--with-libxml-dir \
--with-gd \
--with-jpeg-dir \
--with-png-dir \
--with-freetype-dir \
--with-iconv-dir \
--with-zlib-dir  \
--with-bz2 \
--with-openssl \
--with-mcrypt \
--enable-soap \
--enable-gd-native-ttf \
--enable-ftp \
--enable-mbstring \
--enable-sockets \
--enable-exif \
--disable-ipv6 \
--disable-cgi \
--disable-cli
# make
# make install
# mkdir /usr/local/php/etc
# cp php.ini-dist /usr/local/php/etc/php.ini

php 5.2.11 with php-5.2.11-fpm编译安装

安装libevent(版本不低于libevent-1.4.12)
wget http://syslab.comsenz.com/downlo ... .4.12-stable.tar.gz
tar zxvf libevent-1.4.12-stable.tar.gz
cd libevent-1.4.12-stable
./configure --prefix=/usr/local/libevent
make && make install


安装php-fpm 0.6
wget http://syslab.comsenz.com/downlo ... m-0.6-5.2.11.tar.gz
tar -zxvf php-fpm-0.6-5.2.11.tar.gz
./php-fpm-0.6-5.2.11/generate-fpm-patch     //生成fpm补丁在/usr/local/src下


下载php-5.2.11.tar.gz
wget http://syslab.comsenz.com/downloads/linux/php-5.2.11.tar.gz
tar xvfz php-5.2.11.tar.gz
cd php-5.2.11
patch -p1 < ../fpm.patch
./buildconf --force
mkdir fpm-build && cd fpm-build
../configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-fpm  --with-fpm-bin=/usr/local/php/bin/php-fpm --with-fpm-conf=/usr/local/php/etc/php-fpm.conf --with-fpm-log=/usr/local/php/var/php-fpm.log --with-fpm-pid=/usr/local/php/var/php-fpm.pid  --with-fpm-user=www --with-fpm-group=www --with-libevent=/usr/local/libevent/ --with-mysql=/usr/local/mysql --with-mysql-sock=/tmp --with-libxml-dir --with-mcrypt --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --enable-soap --enable-gd-native-ttf --enable-ftp --enable-mbstring --enable-exif --enable-zend-multibyte --disable-ipv6 --enable-fastcgi  
make && make install

启动php-fpm
/etc/init.d/php-fpm start

默认端口9000启动,需要套接字启动,需要修改/usr/local/php/etc/php-fpm.conf

Eaccelerator 安装及配置

# cd /usr/local/src
# tar jxvf eaccelerator-0.9.5.2.tar.bz2
# cd eaccelerator-0.9.5.2
# /usr/local/php/bin/phpize
# ./configure \
    --enable-eaccelerator=shared \
    --with-php-config=/usr/local/php/bin/php-config \
    --with-eaccelerator-shared-memory \
    --with-eaccelerator-sessions \
    --with-eaccelerator-content-caching
# make
# make install
# mkdir /usr/local/php/ext
# ln -s /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so  /usr/local/php/ext/eaccelerator.so

tidy 安装 php扩展模块

来源: http://hi.baidu.com/leechl

首先要安装libtidy, 否则安装过程会报"configure: error: Cannot find libtidy"的错误.
libtidy的项目地址是:http://tidy.sourceforge.net/ , 我是在这里下载的http://anduin.linuxfromscratch.org/files/BLFS/sources/tidy-cvs_20070326.tar.bz2 或者  mylinux.5d6d.com/userdirs/c/f/mylinux/attachments/month_1102/tidy-cvs_20070326.tar.bz2

安装libtity

#tar jxf tidy-cvs_20070326.tar.bz2
#cd tidy-cvs_20070326
#./configure --prefix=/usr && make && make install

安装tidy的php扩展

#cd /home/php-5.2.8
#./configure --with-php-config=/home/php/bin/php-config && make && make install
#strip /home/php/lib/php/extensions/no-debug-non-zts-20060613/tidy.so
#vi /home/php/lib/php.ini
加入extension=tidy.so
#/home/php/sbin/php-fpm reload

安装好之后发现tidy.so没有load进去, 查了老半天看php_error.log, 发现有下面一行

PHP Startup: Unable to load dynamic library '/home/php/lib/php/extensions/no-debug-non-zts-20060613/tidy.so' - libtidy-0.99.so.0: cannot open shared object file: No such file or directory in Unknown on line 0

原来是找不到库文件, 虽然安装了库文件, 但是要用 /sbin/ldconfig 命令来重新加载. 于是执行如下命令.

# /sbin/ldconfig -f /etc/ld.so.conf
#/home/php/sbin/php-fpm restart

php-fpm.conf参数说明

emergency_restart_threshold 默认值 10

emergency_restart_interval  默认值 1m = 60s
表示在emergency_restart_interval(60)秒内出现SIGSEGV或者SIGBUS错误的php-cgi进程数如果超过emergency_restart_threshold个,php-fpm就会优雅重启。

request_terminate_timeout
请求处理超时时间,类似PHP中的max_execution_time

request_slowlog_timeout
超过这个时间的定义为slow请求。这些请求会进入slowlog日志

rlimit_files
文件句柄的最大限制

max_requests
在重启之前每个进程最多处理多少个请求。

libxlst 下载

简单介绍libxslt
libxslt 包括 libxslt 库文件. 它扩展了libxml2库,以支持 XSLT 文件.

软件包信息

下载地址 http://ftp.acc.umu.se/pub/GNOME/sources/libxslt/1.1/

php.ini 中开启短标签

控制参数: short_open_tag = On
如果设置为Off,则不能正常解析类似于这样形式的php文件:
<?
phpinfo()
?>

而只能解析
<?php
phpinfo()
?>
这样形式的php文件
所以要想php支持短标签,需要我们把short_open_tag  设置为On.

PHP 5.3新版特性浅析

注:本文转自51cto.com

从php4到php5,从个人框架到开源框架的发展,见证着php从山寨走上正规大军的发展。php6还在酝酿中,相信php5会作为php6小试牛刀的场地。php5.3是php5的一个里程碑,加入了大量新特性。

我个人总感觉php功能是越来越多了,但是php的语法却越来越丑陋了,有时加入了新功能,而新功能带来了问题,为了修复问题,又要加入新的语法来修复,郁闷。估计php用语法修复问题是为了更好的解析。

一、mysql驱动mysqlnd

一直以来,php都是通过mysql客户端连接mysql,而现在mysql官方已经推出php版的mysql客户端,而这个mysqlnd有效降低内存的使用以及提高性能。具体可以看:

http://dev.mysql.com/downloads/connector/php-mysqlnd/

http://forge.mysql.com/wiki/PHP_MYSQLND



从图中可以看出,使用mysqlnd少了从mysql驱动中复制数据到php扩展这一步。mysqlnd使用copy-on-write,也就是写时复制,读引用。

mysqlnd已经内置在php5.3的源码中,编译的时候使用--with-mysql=mysqlnd、--with-mysqli=mysqlnd 和 --with-pdo-mysql=mysqlnd 安装mysqlnd驱动。

mysqlnd的优点

编译php更方便了,不需要libmysql,已经内置在源码中

编译php更方便了,不需要libmysql,已经内置在源码中
使用php许可,避免版权问题
使用php的内存管理,支持php内存限制(memory_limit)
所有数据在内存只有一份,之前的libmysql有两份,参考上图
提供性能统计功能,帮助分析瓶颈
mysqli支持长连接(persistent connections)
性能绝对比libmysql要快
在驱动层增加缓存机制
看了这么多特点,有点矛盾,作为数据库抽象层的PDO能把不同后端的特点发挥出来吗?如果使用mysql作为数据库的话mysqli是不是更好的选择?我总觉得mysqli只是个过度产品,PDO才是未来的。

二、性能提高

md5()大概提高了10%-15%的性能
Better stack implementation in the engine,没明白
常量保存在ROM里(Constants moved to read-only memory),这里没明白意思
改进异常处理,操作码(opcode)更简洁
解决了include(require)_once重复打开的问题,之前once我都是用静态变量实现的,终于解决这个问题了
用gcc4编译的二进制文件将更小
整体性能提高了5%-15%
很多人觉得web的瓶颈在db,所以app应用的性能毫不在乎,我认为主要是因为app扩展比db扩展要容易得多,所以才会产生db瓶颈,但这并不意味着可以不顾虑app的性能,毕竟最终还是要在app里解决各种问题的,作为一名程序员编写高质量的代码是最基本的要求。程序的内存使用量少点和执行速度快点,在高并发下是有很效果的,有些时候你改动下实现方法,能提高几十倍也很正常,当然如果付出要很多收获很少的时候就不要太执着了,我觉得一定要有编写高质量代码的意识。

三、?:操作符

其实就是js里的||,返回的结果不是逻辑类型,而是返回本来变量的值,例如 false ?: 123返回123,而不是true。语法就是有点怪怪!