nginx直接有条件地反向代理或服务器

时间:2013-09-02 06:53:16

标签: wordpress nginx proxy raspberry-pi

问题是要求让nginx 有条件地将请求重定向到其他服务器(通过反向代理)或自行处理请求。

以下是详细信息。

我有一个Raspberry Pi(RPi)在家里运行nginx + wordpress 24 * 7。我也有一台笔记本电脑每晚运行Ubuntu大约5个小时。

RPi上的wordpress工作得很好,但速度很慢(尤其是当它处理php时)。所以我想让笔记本电脑帮忙:

  • 如果笔记本电脑开启,RPi的nginx会通过反向代理将所有请求重定向到Ubuntu;
  • 如果笔记本电脑关闭,RPi的nginx会像往常一样处理请求。

我想知道是否有可能实现这一目标?如果是,如何配置RPi和Ubuntu?

1 个答案:

答案 0 :(得分:2)

基本的解决方案是,将nginx作为带有fail_timout的反向代理,当它收到请求时,它会调度到Ubuntu具有更高优先级的上游,如果Ubuntu处于脱机状态,RPi将自行处理该请求。 / p>

这需要:

  1. mysql可以由具有不同ip的两个客户端访问,已经支持;
  2. 对于RPi和Ubuntu,
  3. wordpress应该是相同的,这可以通过nfs share来完成;
  4. nginx应该正确配置。
  5. 以下是配置的详细信息。

    注意,在我的配置中:

    • RPi的IP为192.168.1.100,Ubuntu的IP为192.168.1.101;
    • wordpress仅允许https,所有http请求都会重定向到https;
    • 服务器侦听端口80和443,上游侦听端口8000;

    <强> Mysql的

    bind-address = 192.168.1.100中设置/etc/mysql/my.cnf,并确保未定义skip-networking;

    在mysql的控制台中为RPi和Ubuntu授予权限:

    grant all on minewpdb.* to 'mineblog'@'192.168.1.100' identified by 'xxx';
    grant all on minewpdb.* to 'mineblog'@'192.168.1.100' identified by 'xxx';
    

    <强> WordPress的

    正确设置DB_HOST:

    define('DB_NAME', 'minewpdb');
    define('DB_USER', 'mineblog');
    define('DB_PASSWORD', 'xxx');
    define('DB_HOST', '192.168.1.100');
    

    <强> NFS

    在RPi上,安装nfs-kernel-server,然后按/etc/exports

    导出
    /path/to/wordpress 192.168.1.101(rw,no_root_squash,insecure,sync,no_subtree_check)
    

    要在RPi上启用nfs服务器,还需要rpcbind:

    sudo service rpcbind start
    sudo update-rc.d rpcbind enable
    sudo service nfs-kernel-server start
    

    在Ubuntu上,挂载nfs(它也应该在/ etc / fstab中设置以使其自动挂载)

    sudo mount -t nfs 192.168.1.100:/path/to/wordpress /path/to/wordpress
    

    <强> Nginx的

    在RPi上,使用以下参数创建一个新的配置文件/etc/nginx/sites-available/wordpress-load-balance

    upstream php {
      server unix:/var/run/php5-fpm.sock;
    }
    
    upstream mineservers {
      # upstreams, Ubuntu has much higher priority
      server 192.168.1.101:8000   weight=999 fail_timeout=5s max_fails=1;
      server 192.168.1.100:8000;
    }
    
    server {
      listen 80;
      server_name mine260309.me;
      rewrite     ^ https://$server_name$request_uri? permanent;
    }
    
    server {
      listen          443 ssl;
      server_name     mine260309.me;
    
      ssl_certificate     /path/to/cert/cert_file;
      ssl_certificate_key /path/to/cert/cert_key_file;
      ssl_protocols       SSLv3 TLSv1 TLSv1.1 TLSv1.2;
      ssl_ciphers         HIGH:!aNULL:!MD5;
      access_log         /path/to/wordpress/logs/proxy.log;
      error_log            /path/to/wordpress/logs/proxy_error.log;
    
    location / {
      # reverse-proxy to upstreams
      proxy_pass  http://mineservers;
    
      ### force timeouts if one of backend is died ##
      proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
    
      ### Set headers ####
      proxy_set_header        Accept-Encoding   "";
      proxy_set_header        Host            $host;
      proxy_set_header        X-Real-IP       $remote_addr;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    
      ### Most PHP, Python, Rails, Java App can use this header ###
      #proxy_set_header X-Forwarded-Proto https;##
      #This is better##
      proxy_set_header        X-Forwarded-Proto $scheme;
      add_header              Front-End-Https   on;
    
      ### By default we don't want to redirect it ####
      proxy_redirect     off;
      }
    }
    
    server {
      root /path/to/wordpress;
      listen          8000;
      server_name     mine260309.me;
      ... # normal wordpress configurations
    }
    

    在Ubuntu上,它可以使用相同的配置文件。

    现在RPi的nginx服务器在端口443上收到任何请求,它被分派到Ubuntu或RPi的端口8000,其中Ubuntu具有更高的优先级。如果Ubuntu处于脱机状态,RPi本身也可以处理请求。

    欢迎任何评论!