电商以及门户网站首要的要求就是稳定,并且能够自动实现后端服务器的健康监测,在后端服务器出现故障时,能够自动切换到健康的服务器上来。作为前端代理的杰出产品,nginx以其高稳定和高可用性赢得了众多运维人员的青睐,纷纷采用这个来使用来做自己的前端代理,先说明一下 nginx 的代理配置:
安装pcre插件,pcre是一个perl库,nginx 需要安装它,以便更好地支持配置中的正则表达式
wget http://sourceforge.net/projects/pcre/files/pcre/8.32/pcre-8.32.tar.gz/download
tar zxvfpcre-8.32.tar.gz && cd pcre-8.32
./configure && make && make install
下载 nginx 版本 , 当前稳定版本中最新的是 1.2.6 . Wget http://nginx.org/download/nginx-1.2.6.tar.gz
解压缩,编译,安装:
tar zxvf nginx-1.2.6.tar.gz
cd nginx-1.2.6
./configure --user=www --group=www --prefix=/opt/soft/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=../pcre-8.32 --with-pcre-jit
nginx 编译时注意,nginx 1.2.1 版以上都不支持 pcre-8.30 以下的版本,故编译时候要指定 pcre 的位置:否则会报此类错误:ngx_regex.c:307: undefined reference to `pcre_free_study'
编译完成之后,make && make install 进行安装
nginx.conf 文件配置如下:
user www www;worker_processes 8;
error_log logs/error.log crit;
pid logs/nginx.pid;
worker_rlimit_nofile 51200;
events
{
use epoll;
worker_connections 51200;
}
http
{
include mime.types;
default_type application/octet-stream;
gzip on;
gzip_proxied any;
gzip_min_length 1024;
gzip_buffers 4 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/x-javascript application/javascript application/xml;
keepalive_timeout 120;
server_tokens off;
tcp_nodelay on;
client_header_buffer_size 4k;
open_file_cache max=51200 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 1;
upstream web_test {
server 192.168.10.2:80;
server 192.168.10.3:80;
}
log_format main '$remote_addr - $remote_user [$time_local] $request '
'"$status" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$request_time" "$upstream_addr" ';
access_log /var/log/nginx/master.log main;
server
{
listen 80;
server_name test.com;
location / {
proxy_next_upstream error timeout invalid_header http_404 http_502 http_503 http_504 http_500;
proxy_pass http://web_test;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 200s;
proxy_read_timeout 200s;
proxy_send_timeout 200s;
}
这样在后端某 server 发生故障时,如报404 500 502 503 等错误时,即可实现自动容错,切换到第二台server进行响应。
这是通常情况下的负载均衡容错,他是建立在后端的server不能再响应用户请求的情况下才进行切换的,我们在日常工作中碰到了这么一种情况:
平时需要从第三方的一台server上接收数据,将接受过来的数据已链接的形式反馈给用户使用,碰到的问题是,当第三方的接收有问题时,数据无法接收,但是我们自己 server 并没有异常,照常响应用户请求,由于没有接受过来数据,所以用户看到的反馈结果为空,这样严重影响了用户体验,故采用下面一种方法,首先 check 一个 url ,用于判断与第三方的通信情况,如果正常,则第二个反馈给用户的数据链接正常调用;如果异常,则将所有的用户请求都转发到下一台server中,我尝试利用 nginx 来实现,无奈的是没有操作成功,故这里采用 haproxy 来实现
wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.8.tar.gz
tar zxvf haproxy-1.4.8.tar.gz && cd haproxy-1.4.8
make TARGET=linux26 PREFIX=/opt/soft/haproxy
make install PREFIX=/opt/soft/haproxy
创建haproxy账户及账户组,以专门用于启动haproxy进程
groupadd haproxy
useradd -g haproxy haproxy
haproxy配置如下:
globallog 127.0.0.1 local1 notice
maxconn 4096
chroot /opt/soft/haproxy
uid 504
gid 504
daemon
quiet
nbproc 2
pidfile /opt/soft/haproxy/haproxy.pid
defaults
log 127.0.0.1 local0 err
mode http
option redispatch
option dontlognull
option httplog
timeout connect 10000ms
timeout client 30000ms
timeout server 300ms
retries 1
maxconn 20000
listen test.com.cn 0.0.0.0:8020
mode http
option forwardfor
balance source
cookie SERVERID
option httpchk HEAD /quotedata/cachealert.aspx
server server_A 192.168.10.2:80 check inter 1500 weight 10 cookie A
server server_B 192.168.10.3:80 check inter 1500 weight 10 cookie B
这样,当server_A目录下的 cachealert.aspx 这个链接出现问题时,表示已无法接收第三方的数据,因此将所有的访问链接都转到server_B上