存档

‘nginx’ 分类的存档

[转]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 tcp proxy 连接保持设置

2013年10月28日 没有评论

转自:http://blog.csdn.net/csfreebird/article/details/11475289

根据前文Nginx tcp proxy module试用的设置,在测试环境中发现tcp连接经常掉线。在该项目站点上找到一个issue,也谈论这件事情,不过别人用在web socket协议上。

其实就是少了几个设置,README的配置不能用于生产环境。

我的配置如下,现在工作正常了:

 

分类: nginx 标签:

nginx反向代理socket或非http协议配置

2013年10月25日 没有评论

nginx反向代理socket配置,需添加第三方tcp反向代理模块,姚伟斌项目地址https://github.com/yaoweibin/nginx_tcp_proxy_module

模块名
nginx_tcp_proxy_module – support TCP proxy with Nginx

安装:
Download the latest stable version of the release tarball of this module
from github (<http://github.com/yaoweibin/nginx_tcp_proxy_module>)

将模块编译进入nginx

配置举例:注意tcp模块不能包含在http标签中,需单独在配置中加入tcp标签

tcp配置,可以在nginx.conf中include 下tcp配置文件,注意tcp模块内已不支持location,在server下应用proxy_pass即可。

官方说明文档

 

分类: nginx 标签:

nginx 身份验证

2013年7月5日 没有评论

有些场景可能需求屏蔽写匿名访问者,比如wiki,或者想多加一层访问控制的话,nginx也可以做一层访问验证。

Nginx身份验证

 
看看打开页面是否需要输入用户名和密码!

分类: nginx 标签:

nginx 开启目录浏览功能

2013年7月5日 没有评论

这几个参数老是忘记,转篇文章过来,原文:http://blog.licess.org/nginx-autoindex/

Nginx默认是不允许列出整个目录的。如需此功能,

打开nginx.conf文件,在location server 或 http段中加入
autoindex on;
另外两个参数最好也加上去:

autoindex_exact_size off;
默认为on,显示出文件的确切大小,单位是bytes。
改为off后,显示出文件的大概大小,单位是kB或者MB或者GB

autoindex_localtime on;
默认为off,显示的文件时间为GMT时间。
改为on后,显示的文件时间为文件的服务器时间

location /images {
root   /var/www/nginx-default/ibugaocn;
autoindex on;
}

分类: nginx 标签:

安装pcre报make[3]: *** [install-data-hook] Error 1

2012年12月3日 没有评论

安装pcre时报错

处理办法

 

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 标签: ,

[转] 使用gperftools优化Nginx和MySQL内存管理

2012年11月9日 没有评论

Google 开发的 gperftools 包含四个工具,分别是:TCMalloc、heap-checker、heap-profiler 和 cpu-profiler,TCMalloc是 gperftools 的其中一个工具,用于优化C++写的多线程应用,与标准的glibc库的malloc相比,TCMalloc在内存的分配效率和速度要高,可以在高并发的情况下很好的控制内存的使用,提高服务器的性能,降低

Google 开发的 gperftools 包含四个工具,分别是:TCMalloc、heap-checker、heap-profiler 和 cpu-profiler,TCMalloc是 gperftools 的其中一个工具,用于优化C++写的多线程应用,与标准的glibc库的malloc相比,TCMalloc在内存的分配效率和速度要高,可以在高并发的情况下很好的控制内存的使用,提高服务器的性能,降低负载。

使用 TCMalloc 优化 Nginx 和 MySQL 的内存管理,性能将会有一定程度的提升,特别是对MYSQL服务器高并发下情况下的性能。

安装 libunwind 库
如果系统是64位的需要先安装libunwind库,32位系统则不需要安装。

libunwind 库为基于64位CPU和操作系统的程序提供了基本的堆栈辗转开解功能,其中包括用于输出堆栈跟踪的API、用于以编程方式辗转开解堆栈的API以及支持C++异常处理机制的API。

wget http://download.savannah.gnu.org/releases/libunwind/libunwind-1.0.1.tar.gz
tar -zxvf libunwind-1.0.1.tar.gz
cd libunwind-1.0.1/
CFLAGS=-fPIC ./configure
make CFLAGS=-fPIC
make CFLAGS=-fPIC install
cd ../

gperftools 的安装
gperftools 项目网站 http://code.google.com/p/gperftools/

wget http://gperftools.googlecode.com/files/gperftools-2.0.tar.gz
tar -zxvf gperftools-2.0.tar.gz
cd gperftools-2.0
./configure --prefix=/usr/local --enable-frame-pointers
make
make install
cd ../

如果是32位系统,可以不添加 –enable-frame-pointers,如果是64位系统,并且之前没有安装libunwind,那么一定要添加 –enable-frame-pointers 参数。

echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
/sbin/ldconfig

为 gperftools 添加线程目录:

mkdir /tmp/tcmalloc
chmod 0777 /tmp/tcmalloc

使用gperftools优化Nginx:

为了使 Nginx 支持 gperftools,增加参数 –with-google_perftools_module 重新编译Nginx。

修改/usr/local/nginx/conf/nginx.conf
在pid这行的下面添加
google_perftools_profiles /tmp/tcmalloc;

重新启动nginx

使用gperftools优化MYSQL:
查找文件 /usr/local/mysql/bin/mysqld_safe

在# executing mysqld_safe 下面加上
export LD_PRELOAD=/usr/local/lib/libtcmalloc.so

重新启动MYSQL

验证 tcmalloc 是否运行:
lsof -n | grep tcmalloc

负载。 使用 TCMalloc 优化 Nginx 和 MySQL 的内存管理,性能将会有一定程度的提升,特别是对MYSQL服务器高并发下情况下的性能。 安装 libunwind 库 如果系统是64位的需要先安装libunwind库,32位系统则不需要安装。 libunwind 库为基于64位CPU和操作系统的程序提供了基本的堆栈辗转开解功能,其中包括用于输出堆栈跟踪的API、用于以编程方式辗转开解堆栈的API以及支持C++异常处理机制的API。 wget http://download.savannah.gnu.org/releases/libunwind/libunwind-1.0.1.tar.gz tar -zxvf libunwind-1.0.1.tar.gz cd libunwind-1.0.1/ CFLAGS=-fPIC ./configure make CFLAGS=-fPIC make CFLAGS=-fPIC install cd ../ gperftools 的安装 gperftools 项目网站 http://code.google.com/p/gperftools/ wget http://gperftools.googlecode.com/files/gperftools-2.0.tar.gz tar -zxvf gperftools-2.0.tar.gz cd gperftools-2.0 ./configure –prefix=/usr/local –enable-frame-pointers make make install cd ../ 如果是32位系统,可以不添加 –enable-frame-pointers,如果是64位系统,并且之前没有安装libunwind,那么一定要添加 –enable-frame-pointers 参数。 echo “/usr/local/lib” > /etc/ld.so.conf.d/usr_local_lib.conf /sbin/ldconfig 为 gperftools 添加线程目录: mkdir /tmp/tcmalloc chmod 0777 /tmp/tcmalloc 使用gperftools优化Nginx: 为了使 Nginx 支持 gperftools,增加参数 –with-google_perftools_module 重新编译Nginx。 修改/usr/local/nginx/conf/nginx.conf 在pid这行的下面添加 google_perftools_profiles /tmp/tcmalloc; 重新启动nginx 使用gperftools优化MYSQL: 查找文件 /usr/local/mysql/bin/mysqld_safe 在# executing mysqld_safe 下面加上 export LD_PRELOAD=/usr/local/lib/libtcmalloc.so 重新启动MYSQL 验证 tcmalloc 是否运行: lsof -n | grep tcmalloc

分类: nginx 标签:

configure: error: “Failed to compile with X11/Xlib.h include. You must fix your compiler paths”

2012年7月31日 没有评论

CentOS Linux上搭建 Nginx+Mono 运行 ASP.NET中安装libgdiplus时报错,报configure: error: “Failed to compile with X11/Xlib.h include. You must fix your compiler paths”
./configure libgdiplus的时候出错

checking for LIBEXIF… no
./configure: line 13371: test: too many arguments
configure: error: “Failed to compile with X11/Xlib.h include. You must fix your compiler paths”
[root@nginx libgdiplus-2.10.9]# make
make: *** 没有指明目标并且找不到 makefile。 停止。

字面意思是x11的开发库没装,yum吧

 

[root@nginx libgdiplus-2.10.9]# yum install libX11-devel
Installed:
libX11-devel.i386 0:1.0.3-11.el5_7.1

Dependency Installed:
libXau-devel.i386 0:1.0.1-3.1 libXdmcp-devel.i386 0:1.0.1-2.1
mesa-libGL-devel.i386 0:6.5.1-7.10.el5 xorg-x11-proto-devel.i386 0:7.1-13.el5

Dependency Updated:
mesa-libGL.i386 0:6.5.1-7.10.el5

Complete!

 

尝试./configure 再次报错

using CFLAGS:
-I$(top_srcdir)/../pixman/pixman -Wall -Wextra -Wsign-compare -Werror-implicit-function-declaration -Wpointer-arith -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -Wpacked -Wswitch-enum -Wmissing-format-attribute -Wstrict-aliasing=2 -Winit-self -Wunsafe-loop-optimizations -Wdeclaration-after-statement -Wold-style-definition -Wno-missing-field-initializers -Wno-unused-parameter -Wno-attributes -Wno-long-long -Winline -fno-strict-aliasing

configure: error: Cairo requires at least one font backend.
Please install freetype and fontconfig, then try again:
http://freetype.org/ http://fontconfig.org/

configure: error: ./configure failed for cairo

继续排错。字面意思是Please install freetype and fontconfig, then try again

执行

[root@nginx libgdiplus-2.10.9]# yum install fontconfig fontconfig-devel
[root@nginx libgdiplus-2.10.9]# yum install freetype freetype-devel

继续./confugure

Configuration summary

* Installation prefix = /opt/mono
* Cairo = 1.6.4 (internal)
* Text = cairo
* EXIF tags = No. Get it from http://libexif.sourceforge.net/
* Codecs supported:

– TIFF: no (Get it from http://www.libtiff.org/)
– JPEG: yes
– GIF: no (See http://sourceforge.net/projects/libgif)
– PNG: yes

NOTE: if any of the above say ‘no’ you may install the
corresponding development packages for them, rerun
autogen.sh to include them in the build.


成功了。但是有几个no。可以去安装库来提供支持

yum install libtiff libtiff-devel giflib giflib-devel libexif libexif-devel

再次./configure


Configuration summary

* Installation prefix = /opt/mono
* Cairo = 1.6.4 (internal)
* Text = cairo
* EXIF tags = yes
* Codecs supported:

– TIFF: yes
– JPEG: yes
– GIF: yes
– PNG: yes

NOTE: if any of the above say ‘no’ you may install the
corresponding development packages for them, rerun
autogen.sh to include them in the build.

分类: nginx 标签:

CentOS Linux上搭建 Nginx+Mono 运行 ASP.NET中安装XSP报错

2012年7月31日 2 条评论

CentOS Linux上搭建 Nginx+Mono 运行 ASP.NET中安装XSP报错
如同安装mono 一样的方法, 先./configure –prefix=/usr/local/services/mono 之后下make , 编译期间这里却发生了错误

make[2]: Entering directory /usr/local/src/xsp-2.2/test’
/usr/local/bin/mcs
-pkg:dotnet -r:System.Xml.dll -target:library -out:SiteMapReader_1.1.dll
SiteMapReader_1.1.cs
Package dotnet was not found in the pkg-config search
path.
Perhaps you should add the directory containing
dotnet.pc’
to the
PKG_CONFIG_PATH environment variable
No package ‘dotnet’ found
error
CS8027: Error running pkg-config. Check the above output.
make[2]: ***
[SiteMapReader_1.1.dll] Error 1
make[2]: Leaving directory
/usr/local/src/xsp-2.2/test’
make[1]: *** [all-recursive] Error
1
make[1]: Leaving directory
/usr/local/src/xsp-2.2/test’
make: ***
[all-recursive] Error 1

 

看样子, pkg-config 检查套件找不到, 因为预设的pkg-config 是会找/usr/lib/pkgconfig 或/usr/lib64/ pkgconfig 下的目录, 但因为刚刚安装mono 时是安装在/usr/local/services/mono 下, mono 则把pkg-config 需要lib库安装在/usr/local/services/mono/lib 下了, 因此要自己设定PKG_CONFIG_PATH 这个参数然后编译,

PKG_CONFIG_PATH=/usr/local/services/mono/lib/pkgconfig make

编译看来似乎没问题了, 然后下make install , 成功了。

分类: nginx 标签:

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 标签: ,

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 标签: