让nginx支持跨域woff自定义字体

这个问题困扰我很久很久了,之前一直懒得去解决,因为问题只有在firefox下才有。今天使用自己的cdn上的font-awesome时,头疼的问题又出现了,自定义字体生成的icon在firefox下始终出不来,蛋了个疼呀!心里有种特别想把这个问题搞定的冲动,因为对比了下其他网站和自己网站,我似乎发现了问题的关键,不说先,我们先看看问题的现象。正常的状态:正常解析的页面

有问题的Firefox的解析状态:

不正常的页面

自定义字体对应的内容根本出不来,或者说是乱码,看了下其他网站,同样的源码,他们好好的,为啥我的不行呢?看了源码我似乎知道了些什么,按照我的思路,尝试了下,把我的样式和字体文件放在了测试域名下来访问,问题瞬间解决了,笑脸出来啦。原来是跨域资源共享惹的祸!

按照思路,Google了一把,在serverFault找到了解决方案,原理就是允许跨站共享,贴出来啊贴出来~

  1. location ~* .(eot|ttf|woff)$ {
  2. add_header Access-Control-Allow-Origin *;
  3. }

 

在你存放字体的nginx服务器配置文件中的server段内加上上面的代码,问题就搞定了,Firefox也乖乖的显示自定义字体啦!撒花~~

顺便看了下发现某些字体文件也是支持gzip的(woff字体据说已经是压缩过的了,没去验证过…),下面是支持gzip的字体mime列表:

  1. image/svg+xml
  2. application/vnd.ms-fontobject
  3. application/x-font-ttf
  4. font/opentype

你要问我这段加在哪里,我不会告诉你的,哈哈~~好了,问题搞定了,心情也好了,舒坦~

php高负载架构

说明:
我在设计系统架构时,进行了大胆的尝试,只用6台Web服务器,达到了可承受4000万PV(页面访问量)的性能:

抛弃了 Apache,因为它能承受的并发连接相对较低;
抛弃了 Squid,因为它在内存利用、访问速度、并发连接、清除缓存等方面不如 Varnish;
抛弃了 PHP4,因为 PHP5 处理面向对象代码的速度要比 PHP4 快,另外,PHP4 已经不再继续开发;
抛弃了 F5 BIG-IP 负载均衡交换机,F5 虽然是个好东西,但由于价格不菲,多个部门多个产品都运行在其之上,流量大、负载高,从而导致性能大打折扣;

利用 Varnish cache 减少了90%的数据库查询,解决了MySQL数据库瓶颈;
利用 Varnish cache 的内存缓存命中加快了网页的访问速度;
利用 Nginx + PHP5(FastCGI) 的胜过Apache 10倍的高并发性能,以最少的服务器数量解决了PHP动态程序访问问题;
利用 Memcached 处理实时数据读写;
利用 HAProxy 做接口服务器健康检查;

经过压力测试,每台Web服务器能够处理3万并发连接数,承受4千万PV完全没问题。

保证4千万PV的并发连接数:(40000000PV / 86400秒 * 10个派生连接数 * 5秒内响应 * 5倍峰值) / 6台Web服务器 = 19290连接数

实验证明:

举个简单的例子,服务器192.168.0.2上运行Nginx+PHP,192.168.0.3上运行 Apache+PHP,你在192.168.0.4上安装压力测试工具webbench , 以30万并发连接分别请求Nginx和Apache服务器上的一 个PHP文件60秒钟。在这期间,你用你的浏览器访问Apache服务器上的PHP文件,会发现要么是“该页无法显示”、要么是等待好几秒钟才能打开,而 Nginx服务器的PHP文件,依然没有丝毫影响,访问速度仍然飞快。

webbench -c 300000 -t 60 http://192.168.0.2/index.php

webbench -c 300000 -t 60 http://192.168.0.3/index.php

 

一句简单命令重启nginx

最近我的多个VPS经常出现502错误,经常需要重启nginx,但网上的很多教程都需要繁琐的启动脚本,远不如apache的重启命令那么简单。
但研究了一下nginx帮助后发现,有-s参数可对nginx服务进行管理:
# /usr/local/nginx/sbin/nginx -h
nginx version: nginx/0.7.63
Usage: nginx [-?hvVt] [-s signal] [-c filename] [-p prefix] [-g directives]

Options:
-?,-h : this help
-v : show version and exit
-V : show version and configure options then exit
-t : test configuration and exit
-s signal : send signal to a master process: stop, quit, reopen, reload
-p prefix : set prefix path (default: /usr/local/nginx/)
-c filename : set configuration file (default: conf/nginx.conf)
-g directives : set global directives out of configuration file

于是我执行
# /usr/local/nginx/sbin/nginx -s reload
nginx已经重启成功

nginx的301重定向规则

今天对网站进行了301重定向,把www.it86.cc和it86.cc合并,并把之前的域名也一并合并. 有两种实现方法,
第一种方法是判断nginx核心变量host(老版本是http_host):

server {
	server_name www.it86.cc it86.cc ;
	if ($host != 'www.it86.cc' ) {
		rewrite ^/(.*)$ http://www.it86.cc/$1 permanent;
	}
	...
}

第二种方法:

server {
	server_name it86.cc;
	rewrite ^/(.*) http://www.it86.cc/$1 permanent;
}

我用的是第一种方法,这两种方法中, permanent是关键,详细说明见nginx重定向规则说明。

last – 基本上都用这个Flag。
break – 中止Rewirte,不在继续匹配
redirect – 返回临时重定向的HTTP状态302
permanent – 返回永久重定向的HTTP状态301

好了,现在可以检查结果,这里可以看返回的HTTP头信息:http://www.seoconsultants.com/tools/headers.asp