php语言搭建nginx反向代理,负载均衡常遇到的问题

1、当配置好nginx配置,搭建好反向代理后,出现点击网站链接找不到路径404页面的情况

把标出的这行给注释上就行了,因为这行会重定向以.php结尾的文件,所以不会走下面的location反向代理

2、修改nginx配置,搭建负载均衡

其实很简单,只需配置这两项就可以了,注意upstream是和server同级的,不是在server内配置的

 3、还有一步重要的,实现session共享,我是以redis实现session共享的

首先在服务器里分别搭建redis服务器,原理是让每台网站服务器都redis远程链接让session存储在固定的一台redis服务器,来实现共享

修改redis配置

3.1、bind 127.0.0.1是只允许本机访问的,不允许redis远程访问,修改成0.0.0.0就可以访问了

redis3.2版本后新增protected-mode配置,默认是yes,即开启。设置外部网络连接redis服务,设置方式如下:

   1、关闭protected-mode模式,此时外部网络可以直接访问

   2、开启protected-mode保护模式,需配置bind ip或者设置访问密码

设置daemonize yes ,让redis在后台自启,不用每次手动启动

设置密码

以上是一些准备工作。

4、修改一下我们服务器session存储方式,可以在php.ini里改,也可以用ini_set在页面里临时改。在这建议用ini_set修改,不影响其他的网站

ini_set("session.save_handler", "redis");
    // ini_set("session.bind", '0.0.0.0');
ini_set("session.save_path", "tcp://192.168.0.127:6379");
    // ini_set('default_socket_timeout', -1);
    session_start();//存入session
    $_SESSION['hu'] = '123';//连接redis
    $redis = new redis();
    $redis->connect('192.168.0.127', 6379);
    // $redis->auth('qw12!@');
    //检查session_idecho 
    echo 'session_id:' . session_id() . '<br/>';
    //redis存入的session(redis用session_id作为key,以string的形式存储)
    echo 'redis_session:' . $redis->get('PHPREDIS_SESSION:' . session_id()) . '<br/>';

    echo $_SESSION['name'];
    //php获取session值echo 'php_session:' . json_encode($_SESSION['class']); 

注意session_start();不要放在ini_set的前面,不然会报错

PHP Warning:  ini_set(): A session is active. You cannot change the session module's ini settings at this time in path\to\file.php on line 79
如果要在脚本中使用ini_set()更改PHP的session配置参数,需要在调用session_start()开会会话以前完成ini参数的修改工作,会话已经启动的时候再去修改SESSION运行时配置参数,将会触发一个警告级别的错误,并且对配置参数的修改也不会生效。
PHP Warning并不会影响后续代码,可以在ini_set()前面添加一个 @ 符号来屏蔽错误信息。

还有$_SESSION也需要在ini_set后边才能调用

 

主备服务器设置

http {
    upstream myapp {
        # 主服务器
        server 192.168.1.100:80 max_fails=3 fail_timeout=30s;
        # 备用服务器,设置backup参数表示它是备份服务器
        server 192.168.1.101:80 backup;
        # 可以添加更多备用服务器
        # server 192.168.1.102:80 backup;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://myapp;
            # 其他代理设置...
        }
    }
}

 

关键点解释:

  1. upstream‌:定义了一个名为myapp的上游服务器组,其中包含了主服务器和备用服务器。

  2. server 指令‌:在upstream块内,每个server指令定义了一个上游服务器的地址和端口。

  3. max_failsfail_timeout‌:这些参数用于健康检查。max_fails设置了允许的连续失败次数,fail_timeout设置了在多少秒内发生max_fails次失败后,服务器将被标记为不可用。

  4. backup 参数‌:对于备用服务器,你需要在其server指令后添加backup参数。这告诉Nginx,在所有没有设置backup参数的服务器都不可用时,才使用这个服务器。

工作原理:

  • Nginx会优先将请求发送到没有设置backup参数的服务器(即主服务器)。
  • 如果主服务器在fail_timeout时间内发生了max_fails次失败,Nginx会将其标记为不可用,并开始将请求发送到备用服务器。
  • 一旦主服务器恢复正常(即在后续的健康检查中成功响应),Nginx会再次开始将请求发送到主服务器。

 

 

在使用Nginx作为负载均衡器时,如果你希望实现‌优先访问主服务器,当主服务器不可用时再访问备用服务器‌的功能,可以通过配置Nginx的upstream模块结合健康检查备份服务器(或称为热备服务器)的机制来实现。不过,标准的Nginx负载均衡配置并不直接支持“备份服务器”的概念,但你可以通过一些技巧来模拟这种行为。

 

以下是一个基本的Nginx配置示例,展示了如何设置一个主服务器和一个或多个备用服务器,并优先将请求发送到主服务器:

 

 

 

注意事项:

  • 确保你的Nginx版本支持backup参数。这个功能在较新版本的Nginx中可用。
  • 定期检查你的服务器健康状态,并根据需要调整max_failsfail_timeout的值。
  • 考虑使用更高级的健康检查机制,如Nginx Plus中的主动健康检查,或者结合外部监控工具来更精确地控制服务器的可用性和负载均衡行为。

通过这种配置,你可以实现优先访问主服务器,当主服务器不可用时再访问备用服务器的需求。

 

posted on 2019-07-25 11:49  泽一年  阅读(559)  评论(0)    收藏  举报

导航