基本的解决方案是,通过fail_timout将nginx作为一个反向代理,当它收到请求时,它会分派到Ubuntu优先级较高的上游,如果Ubuntu离线,RPi会自己处理请求。
这需要:
- mysql可以被两个不同ip的客户端访问,已经支持;
- wordpress 对于 RPi 和 Ubuntu 应该是一样的,可以通过 nfs share 来完成;
- 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 本身也可以处理请求。
欢迎任何意见!