haproxy+keepalived+nginx+php-fpm

简介:

      手头有三台机器,领导要求做成高可用的网站,一台做数据库肯定是没错的,剩下两台机器只能做web了。

 

       原本打算用nginx+keepalived,keepalived做高可用没问题,一主一从,但是从机完全standby,资源有些浪费。于是想到了负载均衡集群。考虑到nginx又做负载均衡,又做web,怕管理上麻烦,负载均衡就用了haproxy做,并且haproxy的健康检查非常到位。而nginx的健康检查实际上是假的,应该较故障转移,因为一旦timeout过期了,流量仍然会分过去,发现不通后再进行故障转移,这会导致网页间歇性加载缓慢。

   本文做法的好处是,从服务器平时也能分担主服务器的流量,任何一个机器宕机,web服务都可以正常访问。

 

环境:CentOS6.4 x86_64

VIP          192.168.122.10

web01     192.168.122.11

web02     192.168.122.12

 

1、安装软件

 
 
  1. yum install haproxy keepalived nginx php-fpm php-gd php-mysql php-xml php-cli -y   
  2. chkconfig keepalived on  
  3. chkconfig haproxy on  
  4. chkconfig nginx on  
  5. chkconfig php-fpm on  
  6. chkconfig iptables off #防火墙暂时不配置 

2、系统和内核设置

 
 
  1. sed -i ‘s/enforcing/disabled/g' /etc/sysconfig/selinux 
 
 
  1. sysctl -w "net.ipv4.ip_nonlocal_bind = 1
  2. echo "net.ipv4.ip_nonlocal_bind = 1>>/etc/sysctl.conf 

上面这个内核参数,可以允许服务器监听在一个不存在的地址上。

 

3、配置keepalived(主从配置略有不同)

配置主服务器web01

 

 
 
  1. global_defs {  
  2.    notification_email {  
  3.      root@localhost  
  4.    }  
  5.    notification_email_from keepalived@localhost  
  6.    smtp_server 127.0.0.1  
  7.    smtp_connect_timeout 30  
  8.    router_id web01  
  9. }  
  10.   
  11. vrrp_instance VI_1 {  
  12.     state MASTER  
  13.     interface eth0  
  14.     virtual_router_id 51  
  15.     priority 100  
  16.     advert_int 1  
  17.     preempt   
  18.     authentication {  
  19.         auth_type PASS  
  20.         auth_pass 1111  
  21.     }  
  22.     virtual_ipaddress {  
  23.         192.168.122.10 label eth0:1  
  24.     }  
  25. }  

 

配置从服务器

 
 
  1. global_defs {  
  2.    notification_email {  
  3.      root@localhost  
  4.    }  
  5.    notification_email_from keepalived02@localhost  
  6.    smtp_server 127.0.0.1  
  7.    smtp_connect_timeout 30  
  8.    router_id web02  
  9. }  
  10.   
  11. vrrp_instance VI_1 {  
  12.     state BACKUP  
  13.     interface eth0  
  14.     virtual_router_id 51  
  15.     priority 90  
  16.     advert_int 1  
  17.     #preempt   
  18.     authentication {  
  19.         auth_type PASS  
  20.         auth_pass 1111  
  21.     }  
  22.     virtual_ipaddress {  
  23.         192.168.122.10 label eth0:1  
  24.     }  
  25. }  

 

4、配置haproxy(主从服务器配置完全相同,监听地址192.168.122.10:80)

 

 
 
  1. global  
  2.     log         127.0.0.1 local2  
  3.     chroot      /var/lib/haproxy  
  4.     pidfile     /var/run/haproxy.pid  
  5.     maxconn     4000  
  6.     user        haproxy  
  7.     group       haproxy  
  8.     daemon  
  9.   
  10. defaults  
  11.     mode                    http  
  12.     log                     global  
  13.     option                  httplog  
  14.     option                  dontlognull  
  15.     option http-server-close  
  16.     option forwardfor       except 127.0.0.0/8  
  17.     option                  redispatch  
  18.     retries                 3  
  19.     timeout http-request    10s  
  20.     timeout queue           1m  
  21.     timeout connect         10s  
  22.     timeout client          1m  
  23.     timeout server          1m  
  24.     timeout http-keep-alive 10s  
  25.     timeout check           10s  
  26.     maxconn                 3000  
  27.  
  28. listen status 
  29.     bind *:10086 
  30.     stats uri /haproxy-status  
  31.     stats auth admin:123456 
  32.     stats hide-version 
  33.   
  34.   
  35. frontend  haproxy-nlb   
  36.     bind    192.168.122.10:80  
  37.     default_backend             nginx-web  
  38.   
  39.   
  40. backend nginx-web  
  41.     option  httpchk HEAD /check.txt HTTP/1.0  
  42.     balance roundrobin  
  43.     server  web01 192.168.122.11:80 weight 3 check inter 5s rise 2 fall 3  
  44.     server  web02 192.168.122.12:80 weight 3 check inter 5s rise 2 fall 3  

 

5、配置nginx(除了监听地址不同,其余全一样)

主服务器监听192.168.122.11:80

从服务器监听192.168.122.12:80

 
 
  1. user  nginx; 
  2. worker_processes  2; 
  3. worker_rlimit_nofile 65535; 
  4.  
  5.  
  6. error_log  /var/log/nginx/error.log warn; 
  7. pid        /var/run/nginx.pid; 
  8.  
  9. google_perftools_profiles /tmp/tcmalloc; 
  10.  
  11. events { 
  12.     use epoll; 
  13.     worker_connections  2048; 
  14.  
  15.  
  16. http { 
  17.     include       /etc/nginx/mime.types; 
  18.     include       /etc/nginx/naxsi_core.rules; 
  19.     default_type  application/octet-stream; 
  20.  
  21.     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ' 
  22.                       '$status $body_bytes_sent "$http_referer" ' 
  23.                       '"$http_user_agent" "$http_x_forwarded_for"'; 
  24.  
  25.     #access_log  /var/log/nginx/access.log  main; 
  26.  
  27.     sendfile        on; 
  28.     server_tokens   off; 
  29.  
  30.     #tcp_nopush     on; 
  31.  
  32.     keepalive_timeout  65; 
  33.  
  34.     gzip  on; 
  35.     gzip_static on; 
  36.     gzip_disable "msie6"; 
  37.     gzip_http_version 1.1; 
  38.     gzip_vary on; 
  39.     gzip_comp_level 6; 
  40.     gzip_proxied any; 
  41.     gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript text/x$ 
  42.     gzip_buffers 16 8k; 
  43.  
  44.     client_max_body_size 20m; 
  45.     client_body_buffer_size 128k; 
  46. server { 
  47.     listen       192.168.122.11:8080; 
  48.     server_name  localhost; 
  49.     root        /usr/share/nginx/html; 
  50.     index       index.html index.htm index.php; 
  51.  
  52.     #charset koi8-r; 
  53.     access_log  /var/log/nginx/host.access.log  main; 
  54.  
  55.     location / { 
  56.         include /etc/nginx/naxsi_conf ; 
  57.  
  58.         if (!-e $request_filename) { 
  59.             rewrite ^/(.*)$ /index.php?q=$1 last; 
  60.         } 
  61.     } 
  62.  
  63.     #error_page  404              /404.html; 
  64.  
  65.     # redirect server error pages to the static page /50x.html 
  66.     # 
  67.     error_page   500 502 503 504  /50x.html; 
  68.   
  69.     # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 
  70.     # 
  71.     location ~ \.php$ { 
  72.         #try_files $uri = 404
  73.         fastcgi_pass   127.0.0.1:9000; 
  74.         #fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock; 
  75.         fastcgi_index  index.php; 
  76.         fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name; 
  77.         fastcgi_buffer_size 128k; 
  78.         fastcgi_buffers 256 16k; 
  79.         fastcgi_busy_buffers_size 256k; 
  80.         fastcgi_temp_file_write_size 256k; 
  81.         fastcgi_read_timeout 240; 
  82.         include        fastcgi_params; 
  83.     } 
  84.  
  85.     if ($fastcgi_script_name ~ \..*\/.*php) { 
  86.         return 403; 
  87.     } 
  88.  
  89.     # deny access to hiden file . (filename begin with ".") 
  90.     location ~ /\. { 
  91.         access_log off; 
  92.         log_not_found off;  
  93.         deny all; 
  94.     } 
  95.  
  96.     # deny access to bakup file .(any filename end with "~" ) 
  97.     location ~ ~$ {  
  98.         access_log off;  
  99.         log_not_found off;  
  100.         deny all;  
  101.         } 
  102.  
  103.     # cache image file 
  104.     location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml|swf)$ { 
  105.         expires           1d; 
  106.     } 
  107.  
  108.     # don't log robots  and favion 
  109.     location = /robots.txt { access_log off; log_not_found off; }  
  110.     location = /favicon.ico { access_log off; log_not_found off; }  
  111.  
  112.     # deny access to .htaccess files, if Apache's document root 
  113.     # concurs with nginx's one 
  114.     # 
  115.     location ~ /\.ht { 
  116.         deny  all; 
  117.     } 
  118.  } 

6、配置php-fpm

 
 
  1. sed -i ‘s/apache/nginx/g’ /etc/php-fpm.d/www.conf 

 

7、其他

给web01加上检测页面

 
 
  1. echo web01 >/usr/share/nginx/html/check.txt 

给web02加上检测页面

 
 
  1. echo web02 >/usr/share/nginx/html/check.txt 

 

8、重启两台机器

9、验证

由于是轮询,我们很容易检测负载均衡(最好不要用浏览器,浏览器有缓存)

 
 
  1. $ for n in {1..10};do curl http://192.168.122.10/check.txt;done 
  2. web02 
  3. web01 
  4. web02 
  5. web01 
  6. web02 
  7. web01 
  8. web02 
  9. web01 
  10. web02 
  11. web01 

 

OK,大功告成!










本文转自 紫色葡萄 51CTO博客,原文链接:http://blog.51cto.com/purplegrape/1180326,如需转载请自行联系原作者
相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
22天前
|
运维 应用服务中间件 Linux
keepalived详解(三)——keepalived与Nginx配合实战
keepalived详解(三)——keepalived与Nginx配合实战
30 1
|
1天前
|
负载均衡 网络协议 应用服务中间件
【亮剑】在 Linux 中如何使用 HAProxy、Nginx 和 Keepalived 进行负载均衡?
【4月更文挑战第30天】本文介绍了在Linux中构建高可用性和高性能网络服务的负载均衡工具HAProxy、Nginx和Keepalived。HAProxy是一个高性能的开源TCP和HTTP负载均衡器,适合处理大量并发连接;Nginx是一个多功能Web服务器和反向代理,支持HTTP、HTTPS和TCP负载均衡,同时提供缓存和SSL功能;Keepalived用于监控和故障切换,通过VRRP实现IP热备份,保证服务连续性。文中详细阐述了如何配置这三个工具实现负载均衡,包括安装、配置文件修改和启动服务,为构建可靠的负载均衡系统提供了指导。
|
17天前
|
Kubernetes 搜索推荐 应用服务中间件
通过keepalived+nginx实现 k8s apiserver节点高可用
通过keepalived+nginx实现 k8s apiserver节点高可用
35 16
|
2月前
|
应用服务中间件 Linux PHP
Linux下安装php环境并且配置Nginx支持php-fpm模块
Linux下安装php环境并且配置Nginx支持php-fpm模块
31 0
|
4月前
|
缓存 负载均衡 应用服务中间件
百度搜索:蓝易云【LVS/Nginx/HAProxy原理及应用场景介绍】
总结:LVS、Nginx和HAProxy都是常见的负载均衡技术和工具。它们能够分担系统负载、提高可用性和性能,并在高负载环境下实现请求分发和流量管理。选择适合自己需求的负载均衡方案,可以根据具体应用场景和要求进行评估和决策。
41 4
|
5月前
|
NoSQL 关系型数据库 应用服务中间件
Linux安装 OpenResty、Nginx、PHP、Mysql、Redis、Lua、Node、Golang、MongoDB、Kafka等
Linux安装 OpenResty、Nginx、PHP、Mysql、Redis、Lua、Node、Golang、MongoDB、Kafka等
91 0
|
5月前
|
负载均衡 前端开发 应用服务中间件
NGINX高可用之keepalived+nginx主从模式+主主模式配置实践
NGINX高可用之keepalived+nginx主从模式+主主模式配置实践
147 1
|
5月前
|
应用服务中间件 Linux PHP
百度搜索:蓝易云【在centos中配置nginx+php的环境教程。】
请注意,上述步骤是基本的配置指南,实际操作中可能会有特定的需求和配置。建议参考Nginx和PHP官方文档或其他详细教程以获得更全面和准确的信息。
45 0
|
5月前
|
Ubuntu 网络协议 应用服务中间件
Ubuntu安装PHP和NGINX环境
PHP-FPM 是 PHP FastCGI Process Manager 的缩写,是 FastCGI 进程管理器。 PHP-FPM 是基于 master/worker 的多进程架构模式,与 nginx 的设计风格类似。master 进程主要负责 CGI、PHP 环境初始化,事件监听、子进程状态,worker 进程负责处理 PHP 请求。 FPM 的 master 通过共享内存获取 worker 进程的信息,包括 worker 进程当前状态、已处理请求数等,当 master 进程要杀掉一个 worker 进程时则通过发送信号的方式通知 worker 进程。
55 0
|
6月前
|
运维 应用服务中间件 nginx
运维(27)-部署流量代理(Nginx+haproxy)
运维(27)-部署流量代理(Nginx+haproxy)
64 0