/ 中存储网

Nginx服务器中实现负载均衡和反向代理

2014-04-08 17:54:01 来源:kejihao
所谓代理。比如我不能上网,而局域网中其它一个IP能上网,我可以通过他来连接外网,他就充当了代理的角色。这种通过别人来连接外网的方式叫正向代理。

当我们为外网提供服务时,外网用户要访问我们服务器内部的资源。而有些资源是在局域网中的,而这些资源无法直接在外网访问。这时候就需要在局域网中有一个类似上面代理的角色,请外部的请求转到内部的资源上。这种方式叫反向代理。

Upstream 模块是 Nginx 负载均衡的主要模块,它提供了简单的办法来实现在轮询和客户端IP之间的后端服务器负载均衡,并可以对服务器进行健康检查。它的配置方式是:

在 nginx.conf 中加入:

upstream somename{

server domain1.abc.com weight=5;

server domain2.abc.com:8080

}

这样就声明了一个负载均衡的服务器集合.而我们的服务都是在 server 模块中定义的,所以可以想象,如果我们要对服务进行负载均衡,肯定要在 server 模块中进行和 upstream 的关联。如:

server{

listen 80;

server_name www.domain1.com

location /message/

{

proxy_pass http://somename/

proxy_set_header Host $host;

}

}

上面这段配置的意思就是,当访问 www.domain1.com/message/时,会反向代理到前面 upstream 定义的 somename 这一个服务器集合中。默认的负载均衡方式是轮询.Upstream 中的 server 指令用于指定服务器的名称和参数,服务器的名称可以是一个域名,一个IP地址,或 unix socket.

server 模块中可以通过如上所示的 proxy_pass 或 fastcgi_pass 进和向代理 upstream 服务器集群.

proxy_set_header 用于在向反向代理的web服务器发起请求时添加指定的 Header 头信息。比如服务器A上有多个虚拟主机,我们通过反向代理将请求转向服务器A,如何能确定是要转向哪个虚拟主机呢,就是通过 proxy_set_header 来进行的。

使用反向代理后,后端WEB服务器(以PHP为例),就不能直接通过$_SERVER['REMOTE_ADDR']来获得用户的真实IP了,它获得的是Nginx 负载均衡服务器的IP。这时候要通过在Nginx反向代理时添加Header头信息X-Forwarded-For让服务器通过$_SERVER['HTTP_X_FORWARDED_FOR']来获得真实的IP.

下面贴上一些完整的配置文件:

user  www www;

worker_processes 4;

error_log  /home/wwwlogs/nginx_error.log  crit; pid        /usr/local/nginx/logs/nginx.pid;

#Specifies the value for maximum file descriptors that can be opened by this process.

worker_rlimit_nofile 51200;

events

{

use epoll;

worker_connections 51200;

}

http

{

include       mime.types;

default_type  application/octet-stream;

server_names_hash_bucket_size 128;

client_header_buffer_size 32k;

large_client_header_buffers 4 32k;

client_max_body_size 50m;

sendfile on;

tcp_nopush     on;

keepalive_timeout 60;

tcp_nodelay on;

fastcgi_connect_timeout 300;

fastcgi_send_timeout 300;

fastcgi_read_timeout 300;

fastcgi_buffer_size 64k;

fastcgi_buffers 4 64k;

fastcgi_busy_buffers_size 128k;

fastcgi_temp_file_write_size 256k;

gzip on;

gzip_min_length  1k;

gzip_buffers     4 16k;

gzip_http_version 1.0;

gzip_comp_level 2;

gzip_types       text/plain application/x-javascript text/css application/xml;

gzip_vary on;

#limit_zone  crawler  $binary_remote_addr  10m;

# 定义两组服务器

upstream php_server_pool{

server 127.0.0.1:8081 weight=4 max_fails=2 fail_timeout=30s;

}

upstream bbs_server_pool{

server 127.0.0.1:8082 weight=1 max_fails=2 fail_timeout=30s;

}

# 第一个虚拟主机,反向代理 php_server_pool 这组服务器

server

{

listen       80;

server_name test1.mydomain.cn;

index index.html index.htm index.php;

root  /home/wwwroot/test1;

location /

{

# 如果后端服务器返回 502,504,超时等.将自动把请求转发到 upstream 池中的另一台服务器中实现故障转移

proxy_next_upstream http_502 http_504 error timeout invalid_header;

proxy_pass http://php_server_pool;

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $remote_addr;

}

log_format  access  ‘$remote_addr – $remote_user [$time_local] “$request” ‘

‘$status $body_bytes_sent “$http_referer” ‘

‘”$http_user_agent” $http_x_forwarded_for’;

access_log  /home/wwwlogs/test1.log  access;

}

server

{

listen       80;

server_name test2.mydomain.cn;

index index.html index.htm index.php;

root  /home/wwwroot/test2;

location /

{

proxy_pass http://bbs_server_pool;

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $remote_addr;

}

access_log  /home/wwwlogs/test2.log   access;

}

server

{

listen       8081;

server_name test1.mydomain.cn;

index index.html index.htm index.php;

root  /home/wwwroot/test1;

location /

{

fastcgi_pass  unix:/tmp/php-cgi.sock;

fastcgi_index index.php;

include fcgi.conf;

}

access_log  /home/wwwlogs/test1.log   access;

}

server

{

listen       8082;

server_name test2.mydomain.cn;

index index.html index.htm index.php;

root  /home/wwwroot/test2;

location /

{

fastcgi_pass  unix:/tmp/php-cgi.sock;

fastcgi_index index.php;

include fcgi.conf;

}

access_log  /home/wwwlogs/test2.log   access;

}

include vhost/*.conf;

}

上面配置的解释:

在同一台服务器上,两个虚拟主机监听 80 端口。但当它们接收到各自的请求后,将请求转向 8081 和 8082 端口。同时,nginx 还监听着 8081 和 8082 端口。

这里是在同一台机器上监听着这么多个端口。在实际应用中,会将请求转向同一局域网中的其它 ip 的机器。而 80 端口只是负责转发,这样以实现负载均衡。