存档

文章标签 ‘nginx’

解决https在火狐浏览器报sec_error_unknown_issuer问题

2016年3月21日 3 条评论

有使用facebook的 canvas业务,相当于把自己的网站iframe嵌入到他们画板中,要求里面的域名全部是https的,我们申请了个*.domain.com 的证书,子域名全部可以用,在其他浏览器都浏览正常,然而在火狐上报证书不安全,错误代码:sec_error_unknown_issuer

但是想想我这是正规网站买的证书啊,怎么会认不到,google了吧,说是要加上ca bundle,购买证书的时候,证书厂商会给你个xx_bundle.crt的

阅读全文…

分类: linux 标签: ,

Centos6 下安装HHVM3.x+MariaDB5.x代替php+mysql

2014年9月18日 没有评论

Ubuntu平台安装请看 -> Ubuntu14.04上安装HHVM+MariaDB+WordPress

转载请注明出处,本文来自钿畑的博客

安装nginx

准备yum源

阅读全文…

分类: HHVM 标签: , ,

hhvm上运行wordpress3.9.2时报Fatal error: Argument 2 passed to hash_equals() must be an instance of string, null given in

2014年9月18日 没有评论

域名前几天备案好了,今天把博客迁移到国内某云主机上,然后用了Nginx+HHVM+MariaDB, 另外一个低版本的博客,迁移后没问题,wordpress3.9.2这个版本迁移后前台查看文章也没有异常,但是登录的时候报错

Status Code:500 hphp_invoke

阅读全文…

分类: WordPress 标签: , , ,

[转]Nginx Location 指令基础

2013年11月14日 没有评论

Nginx Location 指令基础

 

Nginx 中的 Location 指令 是NginxHttpCoreModule中重要指令。Location 指令比较简单,但却是配置 Nginx 过程中不得不去了解的。 

Location 指令,是用来为匹配的 URI 进行配置,URI 即语法中的”/uri/”,可以是字符串或正则表达式。但如果要使用正则表达式,则必须指定前缀。

一、基本语法

 

〖=〗 表示精确匹配,如果找到,立即停止搜索并立即处理此请求。
〖~ 〗 表示区分大小写匹配
〖~*〗 表示不区分大小写匹配
〖^~ 〗 表示只匹配字符串,不查询正则表达式。
〖@〗 指定一个命名的location,一般只用于内部重定向请求。

二、匹配过程

首先对字符串进行匹配查询,最确切的匹配将被使用。然后,正则表达式的匹配查询开始,匹配第一个结果后会停止搜索,如果没有找到正则表达式,将使用字符串的搜索结果,如果字符串和正则都匹配,那么正则优先级较高。

三、配置实例

 

四、全局变量

 附录1

$request_uri$uri区别

This variable is equal to the *original* request URI as received from the client including the args. It cannot be modified. Look at $uri for the post-rewrite/altered URI. Does not include host name. Example: “/foo/bar.php?arg=baz” 
这个变量等于从客户端发送来的原生请求URI,包括参数。它不可以进行修改。$uri变量反映的是重写后/改变的URI。不包括主机名。例如:”/foo/bar.php?arg=baz”
This variable is the current request URI, without any arguments (see $args for those). This variable will reflect any modifications done so far by internal redirects or the index module. Note this may be different from $request_uri, as $request_uri is what was originally sent by the browser before any such modifications. Does not include the protocol or host name. Example: /foo/bar.html 
这个变量指当前的请求URI,不包括任何参数(见$args)。这个变量反映任何内部重定向或index模块所做的修改。注意,这和$request_uri不同,因$request_uri是浏览器发起的不做任何修改的原生URI。不包括协议及主机名。例如:”/foo/bar.html”
$document_uri
The same as $uri. 
同$uri.

 附录2

#允许客户端请求的最大的单个文件字节数
client_max_body_size 10m; 

#缓冲区代理缓冲用户端请求的最大字节数 可以理解为先保存到本地再传给用户
client_body_buffer_size 128k;

#跟后端服务器连接的超时时间_发起握手等候响应超时时间
proxy_connect_timeout 600;

#连接成功后_等候后端服务器响应时间_其实已经进入后端的排队等候处理
proxy_read_timeout 600;

#后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
proxy_send_timeout 600;

#代理请求缓存区_这个缓存区间会保存用户的头信息以供Nginx进行规则处理_一般只要能保存下头信息即可
proxy_buffer_size 8k;

#同上 告诉Nginx保存单个用的几个Buffer 最大用多大空间
proxy_buffers 4 32k;

#如果系统很忙的时候可以申请更大的proxy_buffers 官方推荐*2
proxy_busy_buffers_size 64k;

#proxy缓存临时文件的大小
proxy_temp_file_write_size 64k;

 

 

 

分类: nginx 标签: ,

Nginx 日志配置

2012年12月2日 没有评论

Nginx升级到1.2.0版本后出现的报错nginx: [warn] the “log_format” directive may be used only on “http” level解决方法

1、配置文件

vim /usr/local/services/nginx/conf/nginx.conf


2、vhosts中配置

 

题外话:nginx、php-fpm默认配置与性能–TCP socket还是unix domain socket

http://www.cnxct.com/default-configuration-and-performance-of-nginx-phpfpm-and-tcp-socket-or-unix-domain-socket/

3、相关说明

 

4. nginx 每日自动分割日志

 

分类: nginx 标签: ,

nginx 反向代理https http

2012年2月8日 1 条评论

tomcat端口:8080 做好虚拟主机 参照我的另一篇文章
nginx端口:80 根据域名分派

在conf/nginx.conf中的http中增加:

其中192.168.0.2是你的https主机
如果后端https没有证书的话,可以如此简化:

server {
listen 80;
server_name svn.huozhe.com;location / {
proxy_pass https://192.168.0.2:443;
proxy_set_header Host $host:443;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Via “nginx”;
proxy_set_header X-Forwarded-Proto https; #注意看这里 多了一行
}
}

 

 

如果提示“SSL 接收到一个超出最大准许长度的记录。”  错误代码“ssl_error_rx_record_too_long”说明少了“ssl on;”这一行

后面的server.crt server.key是数字证书,具体可以参照openssl做证书

分类: linux 标签: , ,

Nginx 访问控制

2011年12月22日 1 条评论

1. Nginx 身份证验证

#cd /usr/local/nginx/conf

#mkdir htpasswd

/usr/local/apache2/bin/htpasswd -c /usr/local/nginx/conf/htpasswd/tongji linuxtone

#添加用户名为linuxtone

New password: (此处输入你的密码)

Re-type new password: (再次输入你的密码)

Adding password for user

http://count.linuxtone.org/tongji/data/index.html(目录存在/data/www/wwwroot/tongji/data/目录下)

将下段配置放到虚拟主机目录,当访问http://count.linuxtone/tongji/即提示要密验证:

location ~ ^/(tongji)/ {

root /data/www/wwwroot/count;

auth_basic “LT-COUNT-TongJi”;

auth_basic_user_file /usr/local/nginx/conf/htpasswd/tongji;

}

 

2. Nginx 禁止访问某类型的文件.

如,Nginx下禁止访问*.txt文件,配置方法如下.

location ~* .(txt|doc)$ {

if (-f $request_filename) {

root /data/www/wwwroot/linuxtone/test;

#rewrite …..可以重定向到某个URL

break;

}

}

 

方法2:

location ~* .(txt|doc)${

root /data/www/wwwroot/linuxtone/test;

deny all;

}

 

实例:

禁止访问某个目录

location ~ ^/(WEB-INF)/ {

deny all;

}

 

3. 使用ngx_http_access_module限制ip访问

location / {

deny 192.168.1.1;

allow 192.168.1.0/24;

allow 10.1.1.0/16;

deny all;

}

复制代码

详细参见wiki: http://wiki.codemongers.com/NginxHttpAccessModule#allow

4. Nginx 下载限制并发和速率

limit_zone linuxtone $binary_remote_addr 10m;

server

{

listen 80;

server_name down.linuxotne.org;

index index.html index.htm index.php;

root /data/www/wwwroot/down;

#Zone limit

location / {

limit_conn linuxtone 1;

limit_rate 20k;

}

……….

}

复制代码

只允许客房端一个线程,每个线程20k.

【注】limit_zone linuxtone $binary_remote_addr 10m; 这个可以定义在主的

5. Nginx 实现Apache一样目录列表

location / {

autoindex on;

}

复制代码

6. 上文件大小限制

主配置文件里加入如下,具体大小根据你自己的业务做调整。

client_max_body_size 10m;

通过Nginx 访问控制_小小运维的空间_百度空间.

分类: nginx 标签:

ngx_cache_purge介绍

2011年10月26日 没有评论

ngx_cache_purge

本模块由第三方提供,不包含在 Nginx 的源码发布版中。
说明

ngx_cache_purge is nginx module which adds ability to purge content from FastCGI, proxy, SCGI and uWSGI caches.
安装

下载模块源码:ngx_cache_purge-1.2(更新记录)
(SHA1: d9468cf42432e81ea3a110ec63aae2eb273f5516)
其他版本

解压,然后编译:

./configure
make && make install

配置指令

fastcgi_cache_purge zone_name key (context: location)

Sets area and key used for purging selected pages from FastCGI’s cache.

proxy_cache_purge zone_name key (context: location)

Sets area and key used for purging selected pages from proxy’s cache.

scgi_cache_purge zone_name key (context: location)

Sets area and key used for purging selected pages from SCGI’s cache.

uwsgi_cache_purge zone_name key (context: location)

Sets area and key used for purging selected pages from uWSGI’s cache.
示例配置

http {
proxy_cache_path  /tmp/cache  keys_zone=tmpcache:10m;

server {
location / {
proxy_pass         http://127.0.0.1:8000;
proxy_cache        tmpcache;
proxy_cache_key    $uri$is_args$args;
}

location ~ /purge(/.*) {
allow              127.0.0.1;
deny               all;
proxy_cache_purge  tmpcache $1$is_args$args;
}
}
}

分类: nginx 标签: ,

nginx搭建flv、mp4流媒体服务器

2011年7月15日 2 条评论

一、FLV视频发布方式简介

FLV视频有两总发布方式

1、  HTTP方式

这种方式要下载FLV视频文件到本地播放,一旦FLV视频文件下载完成,就不会消耗服务器的资源和带宽,但是拖动功能没有RTMP/RTMP流媒体方式强大,很多视频网站都是用HTTP方式实现的,如:YouTube,土豆,酷6等

2、  RTMP/RTMP流媒体方式

这种方式不用下载FLV视频文件到本地,可以实时的播放flv文件,可以任意拖拽播放进度条,但是比较消耗服务器的资源,

二、使用nginx来搭建flv流媒体服务器

1、使用nginx来搭建flv流媒体服务器简介

nginx中的Flv Stream模块能实现flv流媒体的功能,而且支持flv视频进度条拖拽,另外nignx还可以作为方向代理服务器代理后端基于Flash Media Server或者Red5的RTMP/RTMP流媒体服务器

2、  下面我们就来搭建一个完整的nginx流媒体服务器

1)、Nginx服务器的安装

#安装zlib

tar xzvf zlib-1.2.3.tar.gz

cd zlib-1.2.3

./configure

make && make install

#安装pcre

tar zxvf pcre-7.9.tar.gz

cd pcre-7.9

./configure –prefix=/usr/local/pcre

make && make install

#添加mp4支持模块

wget http://h264.code-shop.com/download/nginx_mod_h264_streaming-2.2.7.tar.gz

tar -zxvf nginx_mod_h264_streaming-2.2.7.tar.gz

#安装nginx

groupadd www

useradd -g www www

tar xzvf nginx-0.8.34.tar.gz

cd nginx-0.8.34

./configure –add-module=../nginx_mod_h264_streaming-2.2.7 –with-http_ssl_module –with-pcre=/root/zhang/nginx/pcre-7.9 –with-zlib=/root/zhang/nginx/zlib-1.2.3 –user=www –group=www –prefix=/usr/local/nginx –with-http_flv_module –with-http_stub_status_module

make && make install

2)、安装yamdi

yadmi的作用是为flv文件添加关键帧,才能实现拖动播放

#下载yadmi

wget http://sourceforge.net/projects/yamdi/files/yamdi/1.4/yamdi-1.4.tar.gz/download

#安装yadmi

tar xzvf yamdi-1.4.tar.gz

cd yamdi-1.4

make && make install

使用方法:yamdi -i input.flv -o out.flv

给input.flv文件 添加关键帧,输出为out.flv文件

3)、配置nginx

vi /usr/local/nginx/conf/nginx.conf 添加以下内容(根据自身情况修改):

user  www www;

worker_processes 30;

error_log  /usr/local/nginx/logs/error.log  crit;

pid        /usr/local/nginx/logs/nginx.pid;

events {

use epoll;

worker_connections      65535;

}

http {

include       mime.types;

default_type  application/octet-stream;

log_format main  ‘$remote_addr – $remote_user [$time_local] ‘

‘”$request” $status $bytes_sent ‘

‘”$http_referer” “$http_user_agent” ‘

‘”$gzip_ratio”‘;

keepalive_timeout  60;

server_names_hash_bucket_size  128;

client_header_buffer_size    32k;

large_client_header_buffers  4 32k;

access_log off;

gzip on;

gzip_min_length  1100;

gzip_buffers     4 8k;

gzip_types       text/plain;

output_buffers   1 32k;

postpone_output  1460;

client_header_timeout  3m;

client_body_timeout    3m;

send_timeout           3m;

sendfile                on;

tcp_nopush              on;

tcp_nodelay             on;

#####################################################################

server {

listen       80;

server_name  192.168.1.105;

root    /usr/local/nginx/html/flv_file/;

limit_rate_after 5m;    ####在flv视频文件下载了5M以后开始限速
limit_rate 512k;         ####速度限制为512K

index   index.html;

charset utf-8;

location ~ \.flv {

flv;

}

location ~ \.mp4$ {
mp4;
}

error_page   500 502 503 504  /50x.html;

location = /50x.html {

root   html;

}

}

}

4)、基本上已经设置完毕,但是此时我们测试的时候还需要一个支持拖拽播放的flash播放器,开源的JW Player就可以实现这样的功能,我将编译的播放器上传上来,供大家下载:

下载链接:http://blogimg.chinaunix.net/blog/upfile2/100607142612.rar

下载播放器后,上传到上面设置的/usr/local/nginx/html/flv_file/目录下,闭关把flv视频文件也放到该目录下!

5)、启动nginx后测试:

http://192.168.1.105/player.swf?type=http&file=test1.flv

说明: #我的ip是192.168.1.105

#player.swf是我的JW Player播放器

#http是表示居于http分发方式

#test1.flv是我的flv视频文件

 

分类: linux 标签: ,

Linux文件句柄数导致php-cgi假死的解决方案之一

2011年4月19日 1 条评论

转载:http://blog.fj18.com/post/55.html

最近,一台生产中的服务器(CentOS 5.2 64位 4G内存),老是出现网站打不开,登录到服务器上查看,发现Nginx和php-cgi都在运行,和平时不同的是此时php-cgi的 cpu占用为0,马上查看文件句柄数限制

  1. ulimit -n

得到的结果是:1024,这个值对生产中的服务显得偏小。
网上给出的解决方案,大部分是直接输入

  1. ulimit -SHn 51200 # 51200可自己根据应用调整

此法缺点很明显,一旦退出登陆,设置就失效了。
也有说直接把该命令写到/etc/rc.d/rc.local中的,今天找到一个正确的做法
打开/etc/security/limits.conf,里面有很详细的注释,找到如下设置(如果没有就插入)

  1. * soft nofile 51200
  2. * hard nofile 51200

退出后再次登陆,查看句柄数,已经正确设置为51200。
如果有碰到类似情况,可以检查一下看看是不是文件句柄数设置太小引起的。

分类: nginx 标签: ,

HAProxy 负载均衡

2011年4月4日 没有评论

链接:http://www.dbasky.net/archives/2009/07/haproxy.html
最近公司的某个业务发展速度之快,导致前端服务器的压力非常的大.为了能够尽快的解决此问题,向公司提交个采购服务器的要求,很快公司也批了,服务器也到 位了.现在的问题怎么合理的利用新采购服务器的资源呢(原来就一台前端服务器),第一就想到用nginx来做负载均衡,大家都知道nginx好是好,但是 session没办法同步,是否没有办法了?办法是有的,可以利用HAProxy 来祢补nginx的不足的地方.

haproxy-diagram.png

一:安装 HAProxy

[root@xutest src]cd /usr/local/
[root@xutest src]wget http://www.dbasky.net/tool/haproxy-1.3.15.7.tar.gz
[root@xutest src]tar -zxvf haproxy-1.3.15.7.tar.gz
[root@xutest src]cd haproxy-1.3.15.7
[root@xutest src]make TARGET=linux26 USE_STATIC_PCRE=1
[root@xutest src]make install PREFIX=/home

二:配置

1)新建haproxy 用户组和用户:

[root@xutest src]groupadd haproxy
[root@xutest src]useradd haproxy -g haproxy

2)查看用户ID:

[root@xutest src]vi /etc/passwd
haproxy:x:500:500::/home/haproxy:/bin/bash

3)新建HAProxy目录:

[root@xutest opt]#mkdir /opt/haproxy
[root@xutest opt]#touch /opt/haproxy/haproxy.cfg

4)配置haproxy.cfg

[root@xutest opt]#vi /opt/haproxy/haproxy.cfg
global
log 127.0.0.1   local0
maxconn 4096
chroot /opt/haproxy
uid 500
gid 500
daemon
nbproc 1
#pidfile /home/haproxy/logs/haproxy.pid
#debug
#quiet

defaults
log     127.0.0.1       local3
mode    http
option  httplog
option  httpclose
option  dontlognull
option  forwardfor
option  redispatch
retries 2
maxconn 2000
balance roundrobin
stats   uri     /haproxy-stats
contimeout      5000
clitimeout      50000
srvtimeout      50000

listen  web_proxy 0.0.0.0:8888
option  httpchk

server  web1 192.168.1.250:8080 weight 3 check
server  web2 192.168.1.238:8080 weight 3 check

三:启动HAProxy主进程:

[root@xutest haproxy]# /usr/local/sbin/haproxy -f /opt/haproxy/haproxy.cfg

停止HAProxy:

[root@xutest haproxy]# ps aux|grep haproxy
[root@xutest haproxy]# kill -9 + 进程ID

到此HAProxy配置完,我们可以通过浏览器查看:http://192.168.1.6:8888/haproxy-stats/

分类: nginx 标签: ,

nginx upstream 的几种分配方式

2011年4月4日 没有评论

链接:http://www.dbasky.net/archives/2009/12/nginx-upstream.html
1、轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

2、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
例如:

upstream bakend {
server 192.168.1.10 weight=10;
server 192.168.1.11 weight=10;
}

3、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
例如:

upstream resinserver{
ip_hash;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}

4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream resinserver{
server server1;
server server2;
fair;
}

5、url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

upstream resinserver{
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}

tips:

 

upstream resinserver{#定义负载均衡设备的Ip及设备状态
ip_hash;
server 127.0.0.1:8000 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6801;
server 127.0.0.1:6802 backup;
}

在需要使用负载均衡的server中增加

proxy_pass http://resinserver/;

每个设备的状态设置为:
1.down 表示单前的server暂时不参与负载
2.weight 默认为1.weight越大,负载的权重就越大。
3.max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误
4.fail_timeout:max_fails次失败后,暂停的时间。
5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

nginx支持同时设置多组的负载均衡,用来给不用的server来使用。

client_body_in_file_only 设置为On 可以讲client post过来的数据记录到文件中用来做debug
client_body_temp_path 设置记录文件的目录 可以设置最多3层目录
location 对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡

分类: nginx 标签: ,

Nginx+Tomcat 负载均衡集群方案

2011年3月10日 没有评论

Nginx+Tomcat 负载均衡集群方案
该方案是我之前做过的一个项目生产应用的,目前运行良好,如何您生产使用,请先做好测试。

转载:http://wiki.unixhot.com/doku.php?do=show&id=nginx_tomcat

系统架构图
nginx负载均衡

下载软件包

安装Nginx
安装Nginx依赖的包

安装Nginx

Nginx 配置文件

Nginx Upstream支持的分配方法
nginx的upstream目前支持5种方式的分配

*1.轮询(默认

  每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
*2.weight (带权重的)

  指定轮询权重,weight和访问比率成正比,用于后端服务器性能不均的情况。

  例如:

*3.ip_hash

  每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

  例如:

*4.fair(第三方)

  按后端服务器的响应时间来分配请求,响应时间短的优先分配。

*5.url_hash(第三方)

  按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

  例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

  
*设置说明:

  每个设备的状态设置为:

  1.down 表示单前的server暂时不参与负载

  2.weight 默认为1.weight越大,负载的权重就越大。

  3.max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误

  4.fail_timeout:max_fails次失败后,暂停的时间。

  5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

  nginx支持同时设置多组的负载均衡,用来给不用的server来使用。

  client_body_in_file_only 设置为On 可以讲client post过来的数据记录到文件中用来做debug

  client_body_temp_path 设置记录文件的目录 可以设置最多3层目录

  location 对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡

分类: nginx 标签:

nginx构建高性能web站点

2011年3月10日 没有评论

这个架构基于squid、nginx和lvs等技术,从架构上对bbs进行全面优化和保护,有如下特点:

1、高性能:所有的点击基本上全部由前端缓存负责,提供最快速的处理。

2、高保障度:不需考虑应用程序稳定与否、程序语言是何种、数据库是何种,都能从架构上保证稳定。

3、高可用性:对应用程序的修改达到最简化:在程序的某些地方加入清缓存的语句即可,当然还需要做页面静态化的工作和统计工作。

首先看图,这个图比较大:
nginx大型web网站架构1

这个架构的特点和一些流程的说明:

1、主域名和图片域名分离

域名分离可以使流量分离,缓存策略分离等等,好处诸多。bbs初期一定要做好规划,将图片用另外的域名独立服务,即使没有足够机器,域名也要先分开。另外,图片服务器可以使用有别于主域名的另一个域名,一个好处是可以减少读取cookie对图片服务器的压力,另一个是提高安全性,避免cookie泄露。

2、使用LVS作为前端、二级代理和数据库的访问入口

使用LVS作为入口,比其他任何一种方式都来得更优质。首先LVS的负载能力很强,因为它工作在网络协议的第4层,使用虚拟ip技术,所以它本身并不担负任何流量的处理,仅仅是一个封包转发的功能;第二,LVS的配置相对简单而且稳定,一般去调整的几率比较低,也减少了因人为等因素而出现故障;第三,LVS可以处理任何端口的负载均衡,所以它基本可以做所有服务的负载均衡和容错。在这个架构中,除了处理http的80端口之外,LVS也处理了数据库mysql的3306端口,在数据库这个应用中是采用的双机热备策略。

3、使用nginx+squid作为最前端的缓存组合

在这个架构中,是最能体现app_nginx_squid_nginx架构的优势的。在这个架构中的bbs运行在缓存上,用户每发布一张帖子,都需要使用purge指令清除该帖子的缓存,如果是squid在最前端,那么每次发布一张帖子,都需要在所有的squid中调用purge指令,这样在机器比较多的时候,purge将成为一个巨大的压力。

所以在这里将nginx放在最前端并使用手工url_hash的方式分流,将经常需要purge的帖子页面和列表页面按一个url对应一台squid的策略,分布到各台squid上,并提供了一台或一组backup的squid,个别squid出现异常时将自动使用backup的机器继续提供一段时间的服务直到其正常。在这样的架构下,purge就不再是关键问题,因为一个url只会对应到一台机器上,所以purge的时候,后端app_server找到对应的机器就可以了。

可以看到在前端中还有一台nginx(purge)的机器,这台机器是专用于purge的,只要发送purge指令和需要清除的url到这台机器,就可以找到相应的服务器并清除缓存了。另外,purge时还需要清理backup机器上的缓存,所以无论前端机器增加到多少,purge指令只会在2台机器上执行,如果backup机器使用到2-3台,purge指令就会在3-4台机器上执行,仍然在可接受范围之内。

nginx作为前端,另有的好处:

1/使用nginx的日志统计点击量非常方便
2/nginx也可作为缓存,一般可以直接负责favicon.ico和logo等固定的小图片

nginx大型web网站架构

4、基于nginx的中层代理

前端的lvs和squid,按照安装方法,把epoll打开,配置文件照搬,基本上问题不多。

这个架构和app_squid架构的区别,也是关键点就是:加入了一级中层代理,中层代理的好处实在太多了:
1、gzip压缩
压缩可以通过nginx做,这样,后台应用服务器不管是apache、resin、lighttpd甚至iis或其他古怪服务器,都不用考虑压缩的功能问题。

2、负载均衡和故障屏蔽
nginx可以作为负载均衡代理使用,并有故障屏蔽功能,这样,根据目录甚至一个正则表达式来制定负载均衡策略变成了小case。

3、方便的运维管理,在各种情况下可以灵活制订方案。
例如,如果有人用轻量级的ddos穿透squid进行攻击,可以在中层代理想办法处理掉;访问量和后台负载突变时,可以随时把一个域名或一个目录的请求扔入二级cache服务器;可以很容易地控制no-cache和expires等header。等等功能。。。

4、权限清晰
这台机器就是不写程序的维护人员负责,程序员一般不需要管理这台机器,这样假如出现故障,很容易能找到正确的人。
对于应用服务器和数据库服务器,最好是从维护人员的视线中消失,我的目标是,这些服务只要能跑得起来就可以了,其它的事情全部可以在外部处理掉。

在这个架构中,假如后端的app_server上把帖子页和列表页直接生成了静态页面,那么使用中层代理再做一次url_hash,将可以解决后端app_server的硬盘容量的压力,但是如果使用到url_hash的话,那做容错就相对麻烦了。所以建议不要采用生成静态页的方式,后端的压力一般不会非常的大,所以没有必要生成静态页。假如前端squid的命中率实在太低下,造成大量穿透,可以考虑使用二级代理暂顶。

5、基于LVS的数据库双机热备

在这个架构中,因为大量的并发和访问量都由前端的缓存处理掉了,所以后端的mysql主要压力来自于数据的写入,所以压力并不是非常大,并且负载比较稳定,一般不会随着访问量上升而提高过快,估计目前一台64位的机器,加满内存并使用高速的硬盘,前端负载数亿访问量时数据库都不会出现性能问题。在数据库这方面应主要考虑故障恢复,因为数据库崩溃的话,按照一般使用备份恢复的做法,耗时很长而且难免丢失数据,是很棘手的问题。使用双机热备的方案,出现故障时首先可由一台时刻同步着的备用数据库即刻充当主数据库,然后卸下的数据库可以有充分的时间对其进行维修,所以是个很安全有效的办法。

当然,数据库的优化还是要细心做的

细心地调一遍,性能会好很多。

6、图片服务器

图片服务器我在这个架构中没有特别详细的介绍,在大型的bbs系统下,图片常常会出现容灾现象——图片数量严重超过了单台前端服务器容纳能力,导致前端服务器命中率低下。处理容灾问题也是非常棘手的,往后会有更详细的介绍。

7、简单的点击量统计办法

1/使用js的script标签访问另一(台)组服务器的空文件,然后定期向数据库更新
2/在前端的nginx上直接开启日志功能,按需要统计点击量的链接规则进行记录,然后定期更新数据库

分类: nginx, webapp 标签:

nginx配置文件

2011年2月15日 没有评论

分类: linux 标签: