nginx+keepalived 高可用兼负载均衡集群

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
网络型负载均衡 NLB,每月750个小时 15LCU
简介:

Nginx是一个高性能的web服务器,同时也是一个优秀的反向代理服务器,本文利用两台Dell R720 构建一个高可用兼负载均衡的Linux web集群。

 

原理

 

通过nginx分别搭建两个web服务器,监听在本地非80端口;

然后利用nginx构建一个包含两个节点的负载均衡池;

最后通过keepalived实现负载均衡池的高可用。两个节点同时运行时,备用节点可以承载一半的前端流量,一个节点宕机后,负载均衡器通过健康检查,将失效节点踢出集群。

 

环境CentOS 6.4 x86_64

 

软件

版本

nginx

1.2.7

keepalived

1.2.7

php-fpm

5.4.13

 

主机名

IP地址

web01

192.168.122.10

web02

192.168.122.20

VIP

192.168.122.30

 

 

安装nginxkeepalivedphp-fpm等(编译过程略)

 

yum install nginx keepalived php-fpm php-gd php-xml php-mysql php-pecl-memcached php-pecl-sphinx watchodg -y

chkconfig nginx on

chkconfig keepalived on

chkconfig php-fpm on

chkconfig watchdog on

 

 

配置nginx

 

nginx主配置文件 /etc/nginx/nginx.conf

user nginx;

worker_processes 2;

worker_rlimit_nofile 65535;

error_log /var/log/nginx/error.log warn;

pid /var/run/nginx.pid;

events {

use epoll;

worker_connections 2048;

}

http {

include /etc/nginx/mime.types;

default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '

'$status $body_bytes_sent "$http_referer" '

'"$http_user_agent" "$http_x_forwarded_for"';

#access_log /var/log/nginx/access.log main;

sendfile on;

server_tokens off;

#tcp_nopush on;

keepalive_timeout 65;

gzip on;

gzip_static on;

gzip_disable "msie6";

gzip_http_version 1.1;

gzip_vary on;

gzip_comp_level 6;

gzip_proxied any;

gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript text/x$

gzip_buffers 16 8k;

client_max_body_size 20m;

client_body_buffer_size 128k;

 

proxy_hide_header Vary;

proxy_connect_timeout 600;

proxy_read_timeout 600;

proxy_send_timeout 600;

proxy_buffer_size 16k;

proxy_buffers 4 64k;

proxy_busy_buffers_size 128k;

#proxy_temp_file_write_size 128k

 

proxy_temp_path /dev/shm/tmp;

proxy_cache_path /dev/shm/proxycache/ levels=1:2 keys_zone=shmcache:10m inactive=2h max_size=500m;

 

include /etc/nginx/conf.d/*.conf;

}

 

 

 

网站主配置文件/etc/nginx/conf.d/default.conf

upstream webservers {

ip_hash ;

server 192.168.122.10:88 max_fails=3 fail_timeout=3s weight=2 ;

server 192.168.122.20:88 max_fails=3 fail_timeout=3s weight=2 ;

}

server {

listen 80 ;

server_name localhost ;

access_log /var/log/nginx/web01.access.log main;

location / {

proxy_redirect off;

proxy_pass http://webservers ;

 

proxy_cache shmcache;

proxy_cache_valid 200 302 1d;

proxy_cache_valid 404 1h;

proxy_cache_valid any 10m;

proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;

 

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_next_upstream error timeout invalid_header http_500 http_502 http_504;

}

location /status {

stub_status on;

access_log off;

allow 192.168.122.0/24;

}

}

server {

listen 192.168.122.10:88;

server_name localhost;

root /usr/share/nginx/html;

index index.html index.htm index.php;

#charset koi8-r;

location / {

if (!-e $request_filename) {

rewrite ^/(.*)$ /index.php?q=$1 last;

}

}

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html

#

error_page 500 502 503 504 /50x.html;

# proxy the PHP scripts to Apache listening on 127.0.0.1:80

#

#location ~ \.php$ {

# proxy_pass http://127.0.0.1;

#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

#

location ~ \.php$ {

#try_files $uri = 404;

fastcgi_pass 127.0.0.1:9000;

#fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

fastcgi_buffer_size 128k;

fastcgi_buffers 256 16k;

fastcgi_busy_buffers_size 256k;

fastcgi_temp_file_write_size 256k;

fastcgi_read_timeout 240;

include fastcgi_params;

}

if ($fastcgi_script_name ~ \..*\/.*php) {

return 403;

}

# deny access to hiden file . (filename begin with ".")

location ~ /\. {

access_log off;

log_not_found off;

deny all;

}

# deny access to bakup file .(any filename end with "~" )

location ~ ~$ {

access_log off;

log_not_found off;

deny all;

}

# cache image file

location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml|swf)$ {

expires 1d;

}

# don't log robots and favion

location = /robots.txt { access_log off; log_not_found off; }

location = /favicon.ico { access_log off; log_not_found off; }

# deny access to .htaccess files, if Apache's document root

# concurs with nginx's one

#

location ~ /\.ht {

deny all;

}

}

 

配置php-fpm

php-fpm全称php fastcgi process manager,用于管理phpfastcgi进程,自从php5.3.3之后集成进了php源码中。默认的php-fpm用户是apache,我们需要修改成nginx,代码:

 

sed -i 's/apache/nginx/g' /etc/php-fpm.d/www.conf

 

 

配置keepalived

keepalived是一个高可用软件,通过vrrp心跳来检测对方是否存活。

 

keepalived主配置文件

global_defs {

notification_email {

root@localhost

}

notification_email_from keepalived01@web01.test.org

smtp_server 127.0.0.1

smtp_connect_timeout 30

}

vrrp_instance VI_1 {

state MASTER

interface eth0

virtual_router_id 51

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.122.30 label eth0:1

}

}

 

配置watchdog

 

watchdog是个健壮可靠的内核模块,即使在高负载的系统中仍然可以存活。它能够执行检测脚本,定时检查nginxkeepalived进程是否存在,如果不存在可以重新开启进程。

 

watchdog主配置文件/etc/watchdog.conf

min-memory = 1

repair-binary = /etc/watchdog.d/repair.sh

test-binary = /etc/watchdog.d/test.sh

test-timeout = 5

watchdog-device = /dev/watchdog

admin = root

interval = 10

logtick = 1

realtime = yes

priority = 1

pidfile = /var/run/syslogd.pid

pidfile = /var/run/nginx.pid

pidfile = /var/run/keepalived.pid

pidfile = /var/run/php-fpm/php-fpm.pid

 

 

 

测试脚本,权限751

#!/usr/bin/env bash

#author:purplegrape

#desc: shell script to check if keepalived/nginx/php-fpm down.

 

keepalived_proc=`pgrep keepalived |wc -l`

nginx_proc=`pgrep nginx|wc -l`

php_fpm_porc=`pgrep php-fpm|wc -l`

 

if [$keepalived_proc == 0 ];then

exit 1

fi

 

if [$nginx_proc == 0 ];then

exit 1

fi

 

if [$php_fpm_proc == 0 ];then

exit 1

fi

 

修复脚本,权限751

#!/usr/bin/env bash

#author:purplegrape

#desc: shell script to repair keepalived/nginx/php-fpm.

 

keepalived_proc=`pgrep keepalived |wc -l`

nginx_proc=`pgrep nginx|wc -l`

php_fpm_proc=`pgrep php-fpm|wc -l`

 

if [$keepalived_proc == 0 ];then

wall “keepalived is dead”

/etc/init.d/keepalived restart

sleep 30

/etc/init.d/nginx restart

fi

 

if [$nginx_proc == 0 ];then

if [$keepalived_proc != 0 ];then

wall “nginx is dead”

/etc/init.d/nginx restart

fi

fi

 

if [ $php_fpm_proc == 0 ]; then

wall “php-fpm is dead”

/etc/init.d/php-fpm restart

fi

 

测试

打开浏览器,访问地址http://192.168.122.30

 










本文转自 紫色葡萄 51CTO博客,原文链接:http://blog.51cto.com/purplegrape/1175748,如需转载请自行联系原作者
相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
18天前
|
负载均衡 算法 搜索推荐
Nginx 常用的负载均衡算法
【10月更文挑战第17天】在实际应用中,我们需要根据具体的情况来选择合适的负载均衡算法。同时,还可以结合其他的优化措施,如服务器健康检查、动态调整权重等,来进一步提高负载均衡的效果和系统的稳定性。
108 59
|
14天前
|
负载均衡 算法 应用服务中间件
Nginx 常用的负载均衡算法
【10月更文挑战第22天】不同的负载均衡算法各有特点和适用场景。在实际应用中,需要根据具体的业务需求、服务器性能和网络环境等因素来选择合适的算法。
20 3
|
18天前
|
负载均衡 监控 应用服务中间件
除了 Nginx,还有以下一些常见的负载均衡工具
【10月更文挑战第17天】这些负载均衡工具各有特点和优势,在不同的应用场景中发挥着重要作用。选择合适的负载均衡工具需要综合考虑性能、功能、稳定性、成本等因素。
|
27天前
|
负载均衡 应用服务中间件 nginx
Nginx的6大负载均衡策略及权重轮询手写配置
【10月更文挑战第9天】 Nginx是一款高性能的HTTP服务器和反向代理服务器,它在处理大量并发请求时表现出色。Nginx的负载均衡功能可以将请求分发到多个服务器,提高网站的吞吐量和可靠性。以下是Nginx支持的6大负载均衡策略:
115 7
|
25天前
|
负载均衡 算法 Java
腾讯面试:说说6大Nginx负载均衡?手写一下权重轮询策略?
尼恩,一位资深架构师,分享了关于负载均衡及其策略的深入解析,特别是基于权重的负载均衡策略。文章不仅介绍了Nginx的五大负载均衡策略,如轮询、加权轮询、IP哈希、最少连接数等,还提供了手写加权轮询算法的Java实现示例。通过这些内容,尼恩帮助读者系统化理解负载均衡技术,提升面试竞争力,实现技术上的“肌肉展示”。此外,他还提供了丰富的技术资料和面试指导,助力求职者在大厂面试中脱颖而出。
腾讯面试:说说6大Nginx负载均衡?手写一下权重轮询策略?
|
负载均衡 容灾 应用服务中间件
使用Docker-compose搭建nginx-keepalived双机热备来实现高可用nginx集群
最近同学出去面试经常会被问到一个问题。 面试官:你说你们公司使用nginx反向代理tornado,部署了多少多少台机器,好像很牛逼的样子,但是我问你,如果主机也就是部署了nginx那台机器并发过大导致宕机了怎么办? 答曰:不考虑带宽峰值的话,比较新的 CPU 跑 nginx 单核每秒能接近 2 万请求,而且nginx如果纯做 HTTP 转发的话,Nginx 的性能高到恐怖,会挂掉很不科学。。。。 面试官:好吧,算你会忽悠,那如果插头被扫地大妈踢掉了怎么办,因为没电导致服务器宕机 答曰:阿里云机房会断电。。。你特么在逗我吧。。
使用Docker-compose搭建nginx-keepalived双机热备来实现高可用nginx集群
|
3月前
|
Java 应用服务中间件 Shell
Nginx+Keepalived+Tomcat 实现Web高可用集群
Nginx+Keepalived+Tomcat 实现Web高可用集群
109 0
|
6月前
|
存储 运维 负载均衡
Heartbeat+Nginx实现高可用集群
通过Heartbeat与Nginx的结合,您可以建立一个高可用性的负载均衡集群,确保在服务器故障时仍能提供无中断的服务。这种配置需要仔细的计划和测试,以确保系统在故障情况下能够正确运行。
84 2
|
缓存 运维 负载均衡
Keepalived+LVS+nginx搭建nginx高可用集群
  nginx是一款非常优秀的反向代理工具,支持请求分发,负载均衡,以及缓存等等非常实用的功能。在请求处理上,nginx采用的是epoll模型,这是一种基于事件监听的模型,因而其具备非常高效的请求处理效率,单机并发能力能够达到上百万。nginx接收到的请求可以通过负载均衡策略分发到其下一级的应用服务器,这些服务器一般是以集群方式部署的,因而在性能不足的情况下,应用服务器可以通过加机器的方式扩展流量。此时,对于一些特大型的网站,性能的瓶颈就来自于nginx了,因为单机的nginx的并发能力是有上限的,而nginx本身是不支持集群模式的,因而此时对nginx的横向扩展就显得尤为重要。
754 1
|
负载均衡 NoSQL 关系型数据库
Nginx+keepalived实现高可用集群
大型企业架构一般是用户先访问到四层负载均衡,在由四层负载均衡转发至七层服务在均衡,七层负载均衡再转发至后端服务器,四层负载均衡只起到一个分流的作用,根据用户访问的端口,比如说80端口就会跳转至七层的对应的集群,两台四层负载均衡配置是一模一样的,形成高可用,七层的配置也是一模一样的,当有1500个请求需要响应时,四层负载均衡就会平均将1500个请求分给急群中的lb,每个lb响应500个请求,减轻单点的压力。
1700 0
Nginx+keepalived实现高可用集群
下一篇
无影云桌面