快过年了,服务器总会出些问题让大家忙活下。首先是 5.3.8 爆出大 BUG 来。然后是升级后出现一系列的问题。这几天服务器从 5.3.8 升级到新版本 5.3.9 共出现了:
socket() failed (55: No buffer space available) while connecting to upstream(通过切换 spawn-fcgi 为 PHP-FPM 问题好像就没再出现了) Can’t create TCP/IP socket (55) (估计和上面问题类似) 500 内部错误、502 BAD GAYEWAY(由于有台服务器没打开日志 - -! 也不知道是啥问题) Too Many Open Files 这里说下 Too Many Open Files 的问题,当流量达到一定数量的时候(并不一定非常大),程序执行时打开的文件也比较多(50+-,如果你用 ZEND 的话,打开这么多文件也很正常),就可能会出现打开系统文件句柄过多的问题。 如果出现这个问题,首先看看NGINX 和 PHP-FPM 的 rlimit_files 的设置。看下当前打开文件句柄是否已经接近这个值了,最后再看下系统的设置。 相关参数 PHP-FPM.INI
; Set open file descriptor rlimit.
; Default Value: system defined value
;rlimit_files = 1024
NGINX.CONF worker_rlimit_nofile FDLIMITS; [...]
我们都知道HTTP中有一个HEADER 头信息,通过 PHP 函数 HEADER 可以向客户端浏览器代理发送一个 HEADER 头。比如:
1
2
3
4
<?php
/* This will give an error. Note the output
* above, which is before the header() call */
header(’Location: http://www.example.com/’);
默认情况下 PHP 解释器会自动向客户端浏览器代理发送一个名为:X-Powered-By 的 HEADER ,如下图:
这样就暴露了服务器 PHP 的版本(当然 NGINX 也发送了他的版本)。如果是恶意的用户,发现服务器当前版本正好有漏洞并加以攻击的话,就会很麻烦。
以下是 NGINX [...]
哇,发布的好快啊。其他的不关注,我只关注了下 Supercolliding a PHP array (HASH 碰撞导致 PHP-CGI 崩溃) 的问题。
Security Enhancements and Fixes in PHP 5.3.9:
Added max_input_vars directive to prevent attacks based on hash collisions. (CVE-2011-4885)
Fixed bug #60150 (Integer overflow during the parsing of invalid exif header). (CVE-2011-4566)
…
All users are strongly encouraged to upgrade to PHP [...]
哈,今天在同事的帮助下,在自己的本子上弄了一个 ZABBIX。
但在启动 zabbix-server 的时候遇到了类似: Zabbix 1.8 FreeBSD “Can’t allocate shared memory” 的问题。
Same problem
Zabbix working in jail
Try these commands:
sysctl kern.ipc.shmall=409600
sysctl kern.ipc.shmmax=204800000
sysctl -a 发现只有 kern.sysv.shmall、kern.sysv.shmmax 悲剧啊。对这些不懂,直接先改了再说,竟然OK 了。对于这些我只能说很神奇 -。-
要配置一个稍微复杂点的内部测试环境。大概是这样的:站点 A 使用域名 a.com 站点 B 使用域名 b.com。 A 站点和 B 站点都提供了相同的 OAUTH 服务。因为业务的需求,需要将访问 A 站点的 OAUTH 请求转向到 B 站点。
本来问题很简单,直接在 A 站点的 NGINX 做一个代理即可:
1
2
proxy_pass http://b.com;
proxy_redirect default;
但由于 OAUTH 在签名的时候用到了 HOST,这样本来访问 A 站点用的是 a.com 的签名,自然和转向后用 B 站点的 b.com 签名后在认证时就会抛出 “Invalid signature” 异常。(当然这是我这边哟用的 OAUTH PHP 客户端的问题)
可以看下面代码的 $key
1
今天要在 Freebsd8.2下安装 MONGO 2.0 ,但 PORT 下的最新版本目前还是 1.8.3 。所以先手动安装下了。
安装参考:http://www.mongodb.org/display/DOCS/Building+for+FreeBSD
在执行 “scons .” 安装出现错误:
third_party/js-1.7/jsprf.c: In function ‘BuildArgArray’:
third_party/js-1.7/jsprf.c:644: error: incompatible types in assignment
third_party/js-1.7/jsprf.c: In function ‘dosprintf’:
third_party/js-1.7/jsprf.c:952: warning: pointer targets in passing
argument 1 of ‘js_OneUcs4ToUtf8Char’ differ in signedness
scons: *** [third_party/js-1.7/jsprf.o] Error [...]
今天在弄一个PHP程序的时候,发现默认使用这样的路径 /index.php/foo/xxx。我的WEB服务端是NGINX,所以出现了 404 。因为/index.php 这个目录根本不存在,事实上需要找的是 /index.php 文件。于是查了下 REWIRTE 的相关资料,得出2个解决办法。
办法一:使用 fastcgi_split_path_info 指令
该指令的参数是一个正则表达式分组一标识 $fastcgi_script_name、分组二标识 $fastcgi_path_info(等同于PHP $_SERVER 中的 PATH_INFO)。
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param PATH_INFO $path_info;
比如官方示例:
1
2
3
4
5
6
7
8
location ~ ^.+\.php {
…
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param SCRIPT_FILENAME /path/to/php$fastcgi_script_name;
fastcgi_param [...]
转载:http://willko.iteye.com/blog/670120
uuid用binary保存
建议uuid不要使用char来保存,而用binary(16)来保存。这里在长度上来讲用binary会节省一半。因为一个字符占用1个字节,而一个字节实际上可以表示0-256(2^8),用16进制的表示需要2个字节00-FF(0-256)。
优化前:SET uuid = UUID() (类型:char(36))
优化后:SET uuid = HEX(REPLACE(UUID(), ‘-’, ”)) (类型:binary(16))
用crc32替换长字符串的查找
如果索引列是个很长的字符串,例如url。那可以再建立一个列用来保存这个列的crc32结果,以提高索引的使用速度。
优化前:WHERE url = ‘http://willko.iteye.com/’ (索引:url,类型:var/char(?))
优化后:WHERE url_crc32 = CRC32(‘http://willko.iteye.com/’) AND url = ‘http://willko.iteye.com/’ (索引:url_crc32,类型:unsigned int)
前缀索引和后缀索引
前缀索引听得比较多,优点是减少索引的长度,缺点是排序不能使用前缀索引(影响distinct/order/group),也不会出现Covering Index(只读取索引就能满足查询)。
后缀索引还是首次听到,孤陋寡闻了。因为MySQL不支持反向索引,所有有时候查询会有问题,例如字段blog保存用户的博客地址(http://willko.iteye.com),那需要查询某个域名有多少个用户就不好查询,可以用一个额外的字段反转保存。blog_reverse:moc.eyeavaj.willko://ptth,这样就很容易查到iteye.com(moc.eyeavaj)有多少用户了,并可以使用索引,也就是解决了 LIKE ‘%?’的问题,因为查询反转成LIKE ‘?%’了。
散列数据
散列数据就是把原本只有一条记录的散列成多条,充分利用InnoDB行锁的特性,提高并发。
例如,之前是UPDATE hit_counter SET cnt = cnt + 1 [...]
看看问题
我在做这样一个测试:架设 Replica Set,有 3 个节点,运行于同台机器的3个不同端口。使用 PHP 往里面不停地以每次插入 10000 个文档,一共需要插入 1E 左右个文档。
在插入中,2 个 SECONDARY 全部状态为 Recovering,错误信息:”errmsg” : “error RS102 too stale to catch up”。并且在插入7000W左右文档时(并不表示在 7000W 数据后才发生),发现插入速度变的很不稳定:
>mongo insert in 2.1298868656158 Secs. memory 164.25 MB
>mongo insert in 61.71651506424 Secs. memory 164.25 MB
>mongo insert in 2.6970100402832 Secs. memory 164.25 MB
PHP:PHP 5.3.6 (cli) (built: Jun 15 2011 16:29:50)
MYSQL:5.1.51
如果我们有的一张表有几百万或几千万的记录,我们要使用 PHP 将所有的记录都获取过来(遍历数据表)进行处理。查询语句:
1
SELECT * FROM largetable;
PS:为了证明上面的做法是最佳的办法,我尝试使用 largetable 中的一个字段做 where ,以及 LIMIT,OFFSET 。上面那种 WHERE 获得结果很慢,虽然用了索引。后面这种 LIMIT 可以让你有一种想死的感觉(有兴趣可以了解下,《分页优化》)。
以 MYSQL 以及PDO_MYSQL 为例,尝试直接使用以下代码,必然会出现超内存的情况:
1
2
3
$result = mysql_query($sql);
while ($rowset = mysql_fetch_assoc($mysql)) {
… 1
2
3
4
$stmt = $dbh->prepare($sql);
[...]
實用技術博客,分享、討論實際工作中的一些問題和經驗
茉莉花~
有那麽一堆人,把道德和文化都丟棄了,還自稱5千年文明,可笑。
歡迎一起討論 OSX 下的程序開發、軟件應用等;WINDOWS 下的競技遊戲近期评论
- nroe 发表在《It’s Brain 后台管理UI》
- 桉叶 发表在《It’s Brain 后台管理UI》
- Paul 发表在《留言板》
- nroe 发表在《ZendStudio OSX 下啟用 JAVAHL》
- nroe 发表在《MAC 下使用 MACPORT 安裝 PHP-FPM》
标签
.SVN 80后 AJAX Android APACHE array aspersa AWE41AP BSD BUFFLAO character CHROME dns freebsd GOOGLE Javascript MAC MACPORT MAIL MMSEG4N MongoDB MySQL NAS NGINX NODEJS OSX OSX Password-Strength phing PHP Replica-SET REWRITE SESSION SHEEL SHELL TIMEMACHINE UPLOAD XDEBUG ZendFramework 中国特色 域名 存储过程 安全 搞笑 漫画日和链接表
- 01. Eric's linux and nginx 杨振亮一直从事linux 负载均衡,存储等工作
- 01. 叶茂盛 YeMaosheng’s Blog(软件开发、系统管理)
- 01. 威同学的博客 疯狂痴呆傻,美甘苦涩禅
- 01. 翡翠’s 板报 纪录自己的生活、工作和学习
- 01. 阿冬的 I-T 厨房的博客
- 01. 风雪之隅 PHP 的文章比较多,偶然看看[推荐下]
- 02. 新普IT教育(培训)
- 02. 若寒小记
- 10. Ayou 服务器系统架构分析日志 网易 Ayou,博客很简洁,内容精彩
- 10. Cats Who Code a website dedicated to those who create and maintain websites
- 10. David Walsh Blog MooTools Dev, JavaScript FanBoy, CSS Experimenter, and TPS Reporter
- 10. Web App Security
- 10. 大罗-PHP/Python博客
- 99. CodeColorer wordpress 代码加亮插件
- 99. stackoverflow.com 专业技术问答网站
文章归档
- 2012 年五月 (1)
- 2012 年三月 (1)
- 2012 年二月 (17)
- 2012 年一月 (6)
- 2011 年十二月 (9)
- 2011 年十一月 (7)
- 2011 年九月 (4)
- 2011 年八月 (11)
- 2011 年七月 (27)
- 2011 年六月 (20)
- 2011 年五月 (9)
- 2011 年四月 (10)
- 2011 年三月 (3)
- 2011 年二月 (3)
- 2011 年一月 (22)
- 2010 年十二月 (18)
- 2010 年十一月 (2)
- 2010 年十月 (6)
- 2010 年九月 (18)
- 2010 年八月 (6)
- 2010 年七月 (3)
- 2010 年六月 (2)
- 2010 年四月 (1)
- 2010 年三月 (7)
- 2010 年二月 (11)
- 2010 年一月 (8)
- 2009 年十二月 (4)
- 2009 年十一月 (4)
- 2009 年十月 (4)
- 2009 年八月 (5)
- 2009 年七月 (21)
