1

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

这是详细信息。

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

RPi 上的 wordpress 运行良好,但速度很慢(尤其是在使用 php 时)。所以我想让笔记本电脑帮忙:

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

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

4

1 回答 1

2

基本的解决方案是,通过fail_timout将nginx作为一个反向代理,当它收到请求时,它会分派到Ubuntu优先级较高的上游,如果Ubuntu离线,RPi会自己处理请求。

这需要:

  1. mysql可以被两个不同ip的客户端访问,已经支持;
  2. wordpress 对于 RPi 和 Ubuntu 应该是一样的,可以通过 nfs share 来完成;
  3. nginx 应该正确配置。

下面是配置的详细信息。

注意,在我的配置中:

  • 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 本身也可以处理请求。

欢迎任何意见!

于 2013-09-06T08:02:27.280 回答