nginx负载均衡相关

下面内容是将单机项目改为多机负载均衡的一些注意事项及配置

  1. 配置多台应用机器的环境为一样的环境

  2. 在主服务器上安装redis服务端,memcache服务端,项目代码中的redis和memcache均使用主服务器中的

  3. 脚本及定时任务都只在主服务器上运行

  4. 图片上传采用图片服务器

  5. 日志可改为数据库日志,或者运行日志分析系统将多机中分布的日志文件汇总

  6. 多台机器建议只有入口负载均衡的机器开放外网,其他机器采用内网

  7. 每次代码上传只需要上传到主服务器中,上传完后,执行脚本将本服务器的代码同步到所有其他服务器中.

配置负载均衡服务器

    1.vi /etc/nginx/nginx.conf 在http段中加入

upstream xx.sigoi.com {
    server 1.1.1.1:80 weight=10;
    server 2.2.2.2:80 weight=5;
}

    server填应用服务器的内网Ip及端口

    weight为权重,权重越高分配到改机器的概率越大

   2.进入conf.d目录,vi all.conf server内容如下

server{
    listen 80;
    server_name xx.sigoi.com;
    location / {
        proxy_pass http://xx.sigoi.com;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

  3.ip解析指向到负载均衡机器即可,进入到该域名的server后,会走到proxy_pass也就是上面在nginx.conf中设置的upsteam中,然后会根据规则转至内网的应用机中

如果需要将某台机器即作为负载均衡机,也作为应用机,可以用端口区分开,下面举例

1.1.1.1为负载均衡机也为应用机,2.2.2.2为应用机,域名都为a.sigoi.com

    1.(1.1.1.1的服务器中)nginx.conf的httd段中加入

upstream a.sigoi.com {
    server 1.1.1.1:81 weight=10;
    server 2.2.2.2:80 weight=5;
}

    2.(1.1.1.1的服务器中)进入conf.d目录,vi sigoi.conf 内容如下

server{
    listen 80;
    server_name a.sigoi.com;
    location / {
        proxy_pass http://a.sigoi.com;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
server {
    listen       81;
    server_name  a.sigoi.com;
        root   /usr/share/nginx/test;
        index  index.html index.php;
        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass    127.0.0.1:9000;
                fastcgi_index   index.php;
                fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include         fastcgi_params;
        }
        location ^~/log{
                deny all;
        }
        location / {
                if (!-e $request_filename) {
                        rewrite ^(.*)$ /index.php?s=$1 last;
                        break;
                }
        }
}

   3.(2.2.2.2的服务器中)进入conf.d目录,vi sigoi.conf 内容如下

server {
    listen       80;
    server_name  a.sigoi.com;
        root   /usr/share/nginx/test;
        index  index.html index.php;
        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass    127.0.0.1:9000;
                fastcgi_index   index.php;
                fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include         fastcgi_params;
        }
        location ^~/log{
                deny all;
        }
        location / {
                if (!-e $request_filename) {
                        rewrite ^(.*)$ /index.php?s=$1 last;
                        break;
                }
        }
}

以上配置即可完成负载均衡的配置


redis服务端设置

redis和memcache都使用主应用服务器里面的服务,但是redis默认不支持非本机ip连接

  1. 编辑redis.conf,修改一下内容

    #bind 127.0.0.1
改为,取掉 #
    bind 127.0.0.1 
    
    保留protected-mode为yes
    protected-mode yes
    
    # requirepass foobared
   改为 , 取掉#,并设置你的密码,密码最好别有特殊字符,容易出错
    requirepass yourpassword

    2.重启redis

    3.php中的redis connect新增auth

$redis = new \Redis();
$res = $redis->connect('172.18.222.215');
$redis->auth('yourpassword');
var_dump('连接结果:' . $res);
$redis->set('a', 12);
var_dump($redis->get('a'));


从应用机器无法访问外网

修改/etc/hosts,将项目中用到的地址指向内网ip,(如果是内网模块的话)

如果有模块需要访问到外网,例如短信,推送之类的, 将此类服务做成单独的模块单独运行,然后内网指定

或者给应用机器绑定ip


多台机器之间的日志同步问题

Filebeat 日志收集器 安装和配置