使用Nginx已经有很长一段时间,但是最近才去实践利用Nginx做负载均衡和高可用性。
大致思路:根据keepalived的特性,通过一个虚拟ip来实现主从服务器的切换,如果一台服务器宕机,可以自动切换到另一台备份服务器,从而不影响用户的访问。
以下是我的安装配置步骤,请大家参考指正。
1:服务器准备
准备两台ubuntu虚拟主机服务器,对应的IP分别是 192.168.1.100 192.168.1.200
两台主机的ip一定要在相同的网段
2:虚拟IP准备
sudo ifconfig eth0:0 192.168.1.150 netmask 255.255.255.0
然后查看ifconfig,不难发现与之前的ifconfig 的不同。也可以通过ip a查看,对应的网卡eth0有两个ipaddress
两台虚拟主机要使用相同的虚拟IP: 192.168.1.150
3:安装nginx
sudo apt-get install nginx
安装完成之后,ps -ef|grep nginx 查看nginx的进程,如果没问题,可以查看http://192.168.1.100 如果显示正常,说明nginx服务正常启动。
nginx的配置如下:
- user www-data;
- worker_processes 4;
- pid /var/run/nginx.pid;
- events {
- worker_connections 1024;
- # multi_accept on;
- }
- http {
- ##
- # Basic Settings
- ##
- sendfile on;
- tcp_nopush on;
- tcp_nodelay on;
- keepalive_timeout 65;
- fastcgi_buffer_size 64k;
- fastcgi_buffers 16 64k;
- types_hash_max_size 2048;
- # server_tokens off;
- # server_names_hash_bucket_size 64;
- # server_name_in_redirect off;
- include /etc/nginx/mime.types;
- default_type application/octet-stream;
- ##
- # Logging Settings
- ##
- access_log /var/log/nginx/access.log;
- error_log /var/log/nginx/error.log;
- upstream server_lb {
- server 192.168.1.100:9000; //9000为php的端口
- server 192.168.1.200:9000;
- ip_hash;
- }
- server {
- listen 80;
- server_name _;
- #root /var/www/html/demo/public;
- #charset koi8-r;
- try_files $uri $uri/ $uri.php?$args /index.php;
- location ~ .php$ {
- fastcgi_pass server_lb;//通过fastcgi进行负载均衡
- include fastcgi_params;
- }
- error_page 500 502 503 504 /50x.html;
- location = /50x.html {
- root html;
- }
- }
- }
两台服务器的nginx配置一致
4:安装keepalived
sudo apt-get install keepalived
安装完成之后,查看进程发现并没有keepalived的进程,这是因为keepalived配置文件不存在,需要用户自己创建一个keepalived.conf文件存放到/etc/keepalived目录
- vrrp_script chk_nginx {
- script "/etc/keepalived/check_nginx.sh" //检测nginx进程的脚本
- interval 2
- weight 2
- }
- global_defs {
- notification_email {
- //可以添加邮件提醒
- }
- }
- vrrp_instance VI_1 {
- state MASTER //主服务器
- interface eth0
- virtual_router_id 51
- mcast_src_ip 192.168.1.100
- priority 250
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 123456
- }
- track_script {
- chk_nginx
- }
- virtual_ipaddress {
- 192.168.1.150
- }
- }
两台服务器的keepalived.conf文件除了优先级,state和mcast_src_ip不一样,其他的完全一致,但是需要注意的几点是:
- 主服务器的state为MASTER,从服务器的state为BACKUP
- 主服务器的priority一定要比从服务器的priority大
- mcast_src_ip就是对应服务器的局域网ip
- “{”前面一定要有个空格,不能跟前面的字符连起来,否则出现问题很难发现
- check_nginx.sh脚本文件的执行权限一定要正确。
- check_nginx.sh的代码如下:
- #more /etc/keepalived/check_http.sh
- #!/bin/bash
- #代码一定注意空格,逻辑就是:如果nginx进程不存在则启动nginx,如果nginx无法启动则kill掉keepalived所有进程
- A=`ps -C nginx --no-header |wc -l`
- if [ $A -eq 0 ];then
- /etc/init.d/nginx start
- sleep 3
- if [ `ps -C nginx --no-header |wc -l`-eq 0 ];then
- killall keepalived
- fi
- fi
配置文件完成之后,sudo /etc/init.d/keepalived start,然后再查看下keepalived的进程是否存在,如果存在,再检查keepalived的log(sudo tail /var/log/syslog),如果看到nginx Keepalived_vrrp: VRRP_Script(chk_nginx) succeeded,则说明配置成功。
两台服务器的keepalived配置和启动命令是一致的
5:测试
因为check_nginx的缘故,当启动keepalived是,nginx也会同时被启动,所以此时,查看nginx和keepalived的进程应该都是存在的,否则就是配置有问题。
现在访问http://192.168.1.150,如果访问正常,此时应该显示的是主服务器的页面,也就是192.168.1.100的页面,否则也是配置有问题。
然后在关闭主服务器的nginx访问,访问http://192.168.1.150页面应该正常,因为check_nginx的缘故。
再关闭主服务器的keepalived进程,则此时访问http://192.168.1.150应该显示的是从服务器的页面,也就是192.168.1.200的页面,否则也是配置不正确。
如果再关闭从服务器的nginx和keepalived则http://192.168.1.150无法访问。
以上就是我的配置步骤,很粗略,还希望大家多指点。
另外,以下是版本信息
ubuntu:Ubuntu 12.04.1 LTS (GNU/Linux 3.2.0-29-generic x86_64)
Keepalived: v1.2.2
nginx version: nginx/1.1.19