MENU

nginx反向代理负载均衡实例配置

2016 年 06 月 30 日 • 应用服务器

nginx负载均衡也就是使用nginx的upstream模块来实现,比起lvs我更喜欢用nginx,就是因为它比较强大吧,安装配置也很简单,总的来说也是比较稳定,所以现在越来越火了。我个人最常用的就是nginx,lvs工作以来就用过两次,haproxy用过一次,哈哈,下面说说实现方法吧,也是从安装开始,以yum方式安装,无论是怎么装的,nginx配置都是一样的,开撸。

安装nginx阶段

我是CentOS6.9-64位系统,我不想编译装了,所以还是用yum吧,怎么方便怎么来,既然决定yum装了,先添加epel源吧。

1.添加epel源
[root@10-10-79-128 ~]# cat >>/etc/yum.repos.d/nginx.repo<<OEF
> [nginx]
> name=nginx repo
> baseurl=http://nginx.org/packages/centos/6/x86_64/
> gpgcheck=0
> enabled=1
> OEF

这只是针对CentOS6系列的64位操作系统,如果你的是CentOS5,或是7,写法就又不一样了,详见官方文档

2.安装nginx,默认安装最新稳定版
[root@10-10-79-128 ~]# yum clean all
[root@10-10-79-128 ~]# yum -y install nginx

如果要编译安装,需要如下操作。
[root@nginx src]# groupadd www
[root@nginx src]# useradd -s /sbin/nologin -g www www -M
[root@nginx src]# yum -y install openssl openssl-devel pcre pcre-devel #安装依赖包
[root@nginx src]# tar zxf nginx-1.12.0.tar.gz
{root@nginx src]# cd nginx-1.12.0
[root@nginx nginx-1.12.0]# ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module  --with-http_ssl_module #负载均衡必须参数
[root@nginx src]# make
[root@nginx src]# make install

配置阶段

nginx.conf配置

把我线上用的一个配置文件贴出来吧,下面的配置文件仅供参考。

user  nginx;
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
worker_rlimit_nofile 65535;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    use epoll;
    accept_mutex on;
    multi_accept on;
    worker_connections  65535;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    server_tokens off;
    keepalive_timeout 60;

    log_format  main  '$remote_addr - [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" "$upstream_addr" "$upstream_status" "$upstream_response_time" "$request_time" "$request_body"';

    client_header_buffer_size 32k;
    client_body_buffer_size    128k;
    server_names_hash_bucket_size 512;
    large_client_header_buffers 4 32k;
    client_max_body_size 50m;
    types_hash_max_size 2048;

    proxy_headers_hash_max_size          51200;
    proxy_headers_hash_bucket_size       6400;
    proxy_connect_timeout                60s;
    proxy_read_timeout                   60s;
    proxy_send_timeout                   60s;
    proxy_buffer_size                    32k;
    proxy_buffers 4                      64k;
    proxy_busy_buffers_size              128k;
    proxy_temp_file_write_size           128k;
    proxy_ignore_client_abort            on;

    gzip on;
    gzip_min_length  1k;
    gzip_buffers     4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 2;
    gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml;
    gzip_vary on;
    gzip_proxied   expired no-cache no-store private auth;
    gzip_disable   "MSIE [1-6]\.";

    include /etc/nginx/conf.d/*.conf;
}
upstream核心配置
[root@10-10-79-128 ~]# vim /etc/nginx/conf.d/upstream.conf
    upstream www_server_plools{
    server 10.10.79.128:8080    max_fails=3 fail_timeout=30s ;
    server 10.10.79.129:8080    max_fails=3 fail_timeout=30s ;
    server 10.10.79.130:8080    max_fails=3 fail_timeout=30s ;
    server 10.10.79.131:8080    max_fails=3 fail_timeout=30s ;
    #max_fails=3 fail_timeout=30s 意思是如果这台服务器30秒内出现了三次错误,接下来的30s不会去访问这台服务器,按需修改
}
#定义地址池
    server {
        listen       80;
        server_name  youdomain;
        location / {
        proxy_send_timeout 60;
        proxy_read_timeout 60;
        proxy_connect_timeout 60;
        #超时时间,只对该vhost生效,如果频发出现502、504的情况需要将该参数调大一点,默认60
        proxy_set_header Host $host;
        #代理向后端发送http请求头中加入host字段 配有多个虚拟主机时。可识别代理的是哪个虚拟主机,多虚拟主机配置关键
        proxy_pass http://www_server_plools;
        #请求访问地址池 
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #反向代理时,节点服务器获取用户真实IP的必要功能
        proxy_next_upstream http_502 http_504 error timeout invalid_header;
        #如后端主机出现502,504,连接失败,超时,返回空的或无效的响应错误时,自动将请求转发到别的节点,慎用,有坑。
       }
        access_log logs/youdomain.log main;
}

一些算法和参数

默认使用轮训,也就是你一个我一个,他一个,如果后端节点宕掉,可以自动移除。

指定轮训机率,使用weight参数,weight越高,负载越大,服务器性能较弱的搞低一点,栗子。

    upstream www_server_plools{
    server 10.10.79.128:8080  max_fails=3 fail_timeout=30s weight=20;
    server 10.10.79.129:8080  max_fails=3 fail_timeout=30s weight=10;
}

ip_hash算法,按IP的hash的结果进行分流,可以解决session问题,但是ip_hash不建议使用,要求是nginx必须是最前端的服务器,它只是将某一个IP固定到某个服务器了,比如说这个IP进来1000条请求,也是走被绑定的那台服务器,而不是轮训,所以不建议使用,ip_hash算法不可以和backup参数同时使用,栗子。

    upstream www_server_plools{
    ip_hash;
    server 10.10.79.128:81    max_fails=3 fail_timeout=30s;
    server 10.10.79.129:80    max_fails=3 fail_timeout=30s;
}

down表示当前服务器不参与负载,nginx不会将请求转给该节点。backup参数表示如果其他的都宕了,nginx才会把请求交给backup节点,栗子。

    upstream www_server_plools{
        server 10.10.79.130:80    max_fails=3 fail_timeout=30s down ;
        server 10.10.79.131:80    max_fails=3 fail_timeout=30s backup;
}

只有一个后端服务器

有时候只需要nginx代理一个节点,所以写配置文件就可以很简单了,如下。

    server {
        listen       80;
        server_name  youdomain;
        location / {
        proxy_set_header Host $host;
        proxy_pass http://blog.rj-bai.com;  #访问哪里
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       }
        access_log logs/youdomain.log main;
}

没必要配置出现错误信息切换节点了,一个节点崩了就是崩了,没办法了。

高可用

也是配合keepalived来实现,在这里我就不写keepalived的配置了,有需要的请参考这篇文档,然后负载均衡就在上面,也是需要两台服务器,两台都装有keepalived及配置相同的nginx,我指的不是硬件配置相同,在这里直接写个守护进程盯着nginx就行了,如果nginx卒,我就干了keepalived,然后VIP飘走,就这么简单。脚本如下,一个死循环。

[root@10-10-79-128 ~]# cat check.sh
#!/bin/bash
while true
  do
    if [ `netstat -lntp | grep 80 | wc -l` -ne 1 ];
      then
        /etc/init.d/keepalived stop >> /dev/null
    fi
  sleep 5
done
最后编辑于: 2018 年 12 月 10 日
返回文章列表 文章二维码 打赏
本页链接的二维码
打赏二维码