乐趣区

LNMP+HAProxy+Keepalived负载均衡(三)- 配置文件汇总

Nginx 的操作命令
vim /usr/local/nginx/conf/nginx.conf
# 将端口由 80 修改为 10001,修改内容如下:
listen 10001 default_server;
# 具体配置可参考下面的 nginx 配置文件

# 重启 Nginx,并查看其状态;
service nginx restart & service nginx status

Nginx 的配置文件(Web 服务器需要修改的配置,仅用参考)
user www www;
worker_processes auto;
error_log /home/wwwlogs/nginx_error.log crit;
pid /usr/local/nginx/logs/nginx.pid;

#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 51200;
events
{
use epoll;
worker_connections 51200;
multi_accept on;
}
http
{
include mime.types;
default_type application/octet-stream;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 50m;

sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;

fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 256k;

gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth;
gzip_disable “MSIE [1-6]\.”;
#limit_conn_zone $binary_remote_addr zone=perip:10m;
##If enable limit_conn_zone,add “limit_conn perip 10;” to server section.

server_tokens off;
access_log off;

server
{
# 端口根据自己的情况修改
listen 10001 default_server;
server_name _;
index index.html index.htm index.php default.html default.htm default.php;
# 站点根目录
root /home/wwwroot/publishPath;

include rewrite/laravel.conf;
#error_page 404 /404.html;

# Deny access to PHP files in specific directory
#location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ {deny all;}

include enable-php.conf;

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 12h;
}
location ~ /.well-known {
allow all;
}
location ~ /\.
{
deny all;
}
access_log off;
}
    # 可以加载自己的配置文件,这里我把配置文件中的内容直接替换了原本的 server 节点配置;
# include vhost/*.conf;
}

MySQL 的操作命令
vim /etc/my.cnf
service mysql restart & service mysql status
lnmp restart

MySQL 的配置文件(DB 服务器需要修改的配置,仅用参考)
[client]
port = 10002
socket = /tmp/mysql.sock

[mysqld]
port = 10002
socket = /tmp/mysql.sock
# 数据库文件存放位置
datadir = /home/lnmp/mysql/data
skip-external-locking
key_buffer_size = 128M
max_allowed_packet = 1M
table_open_cache = 512
sort_buffer_size = 2M
net_buffer_length = 8K
read_buffer_size = 2M
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 32M
thread_cache_size = 64
query_cache_size = 64M
tmp_table_size = 64M
performance_schema_max_table_instances = 4000

explicit_defaults_for_timestamp = true
#skip-networking
max_connections = 500
max_connect_errors = 100
open_files_limit = 65535

log-bin=mysql-bin
binlog_format=mixed
server-id = 51
lower_case_table_names = 1
expire_logs_days = 10
replicate_wild_do_table=lgd_system.%
# relay_log=mysqld-relay-bin
log-slave-updates=YES

default_storage_engine = InnoDB
innodb_file_per_table = 1
innodb_data_home_dir = /home/lnmp/mysql/data
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = /home/lnmp/mysql/data
innodb_buffer_pool_size = 512M
innodb_log_file_size = 128M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50

[mysqldump]
# 数据库备份账户,自行创建并分配相应的权限
user=bakuser
password=ZXdfty^&
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash

[myisamchk]
key_buffer_size = 128M
sort_buffer_size = 2M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout

HAProxy 的操作命令
# 负载状态监测:
# Web 服务器 HAProxy – http://192.168.6.111:8080/web
# DB 服务器 HAProxy – http://192.168.6.211:8080/db
# 如果需要通过外网访问,需要把 8080 端口映射到外网端口即可。
# 常用命令:
vim /etc/haproxy/haproxy.cfg
service haproxy restart & service haproxy status

HAProxy 的配置文件(Web 服务器)
#———————————————————————
# Global settings
#———————————————————————
global
# 全局的日志配置,使用 log 关键字,指定使用 127.0.0.1 上的 syslog 服务中的 local0 日志设备,记录日志等级为 info 的日志
log 127.0.0.1 local3
# 软件工作目录
chroot /var/lib/haproxy
# haproxy 的 pid 存放路径, 启动进程的用户必须有权限访问此文件
pidfile /usr/local/haproxy/haproxy.pid
# 最大连接数,默认 4000
maxconn 30000
# 所属用户
user haproxy
# 所属组
group haproxy
# 以守护进程方式运行 haproxy
daemon
# turn on stats unix socket
# stats socket /var/lib/haproxy/stats    # socket 路径

#———————————————————————
# common defaults that all the ‘listen’ and ‘backend’ sections will
# use if not designated in their block
#———————————————————————
defaults
mode http    # 默认的模式 mode {tcp|http|health},tcp 是 4 层,http 是 7 层,health 只会返回 OK
log global    # 采用全局定义的日志
option httplog    # 启用日志记录 HTTP 请求,默认 haproxy 日志记录是不记录 HTTP 请求日志
option dontlognull    # 不记录健康检查的日志信息
option http-server-close # 每次请求完毕后主动关闭 http 通道

# 如果后端服务器需要获得客户端真实 ip 需要配置的参数,可以从 Http Header 中获得客户端 ip
option forwardfor except 127.0.0.0/8
option redispatch    # serverId 对应的服务器挂掉后, 强制定向到其他健康的服务器
retries 3 # 3 次连接失败就认为服务不可用,也可以通过后面设置
timeout http-request 10s      # http 请求超时时间
timeout queue 1m       # 一个请求在队列里的超时时间
timeout connect 10s      # 连接超时
timeout client 1m       # 客户端连接超时
timeout server 1m       # 服务器连接超时
timeout http-keep-alive 10s      # 设置 http-keep-alive 的超时时间
timeout check 10s      # 检测超时
maxconn 3000    # 最大连接数

#———————————————————————
# main frontend which proxys to the backends
#———————————————————————
# 前端配置
frontend main *:80
acl url_static path_beg -i /static /images /javascript /stylesheets
acl url_static path_end -i .jpg .gif .png .css .js

use_backend static if url_static
default_backend servers

#———————————————————————
# static backend for serving up images, stylesheets and such
#———————————————————————
# 后台静态文件服务配置
backend static
balance roundrobin
server    static1 192.168.6.100:10001 check inter 2000 fall 3 weight 50
server    static2 192.168.6.110:10001 check inter 2000 fall 3 weight 50

#———————————————————————
# round robin balancing between the various backends
#———————————————————————
# 后台服务配置
backend servers
balance roundrobin
# 添加 cookie 配置,将某客户端引导到之前为其服务过的后端服务器上,即和后端某服务器保持联系,防止登录验证失效
cookie app_cook insert nocache
server    app1 192.168.6.100:10001 check inter 2000 fall 3 weight 50 cookie server1
server    app2 192.168.6.110:10001 check inter 2000 fall 3 weight 50 cookie server2

# HAProxy 状态监控服务配置
listen stats
# 绑定端口
bind *:8080
mode http
# stats enable
# 访问地址:192.168.6.100:8080/web 和 192.168.6.110:8080/web
stats uri /web
stats realm Global\ statistics
# 管理员账户
stats auth hapadmin:1qazse$#2

HAProxy 的配置文件(DB 服务器)
#———————————————————————
# Global settings
#———————————————————————
global
pidfile /var/run/haproxy.pid
maxconn 30000
user haproxy
group haproxy
daemon
nbproc    1

#———————————————————————
# common defaults that all the ‘listen’ and ‘backend’ sections will
# use if not designated in their block
#———————————————————————
defaults
mode tcp
option redispatch
retries 3
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout check 10s
maxconn 4096
option abortonclose

frontend main
bind *:3306
  default_backend servers

backend servers
server    mysql1 192.168.6.200:10002 check inter 3000 fall 3 weight 50
server    mysql2 192.168.6.210:10002 check inter 3000 fall 3 weight 50

# 监控访问地址:192.168.6.210:8080/db 和 192.168.6.200:8080/db
listen stats
mode http
bind 0.0.0.0:8080
stats enable
stats uri /db
stats realm Global\ statistics
stats auth dbadmin:1qazse$#2

Keeplived 的操作命令
# 查看已安装的 Keepalived 的版本:
keepalived -v
# 查看配置:
cat /etc/keepalived/keepalived.conf
# 编辑配置文件:
vim /etc/keepalived/keepalived.conf
# 测试高可用的远程访问:
mysql -h 远程数据库 ip 地址 -P 端口 -u 用户名 -p
mysql -h 192.168.6.200 -P 3306 -u dbuser -p

# 开通服务器间的 vrrp 协议通信,用于 Keepalived 通信:
firewall-cmd –direct –permanent –add-rule ipv4 filter INPUT 0 –in-interface 网卡名称 –destination 224.0.0.18 –protocol vrrp -j ACCEPT;
firewall-cmd –reload;
# 服务器的网卡名称请根据自己的情况修改,
# INPUT 代表接收 224.0.0.18 的报文。
# 在 VIP 服务器上测试 VIP 漂移:
ip addr | grep 网卡名称
# 停止 VIP 所在服务器的 keepalived 服务,并查看 VIP 是否移除,并查看备用服务器是否获取到 VIP:
service keepalived stop && service keepalived status
ip addr | grep 网卡名称
# 在之前停止 keepalived 服务的服务器上开启 keepalived 服务,查看 VIP 是否已取回:
service keepalived start && service keepalived status
ip addr | grep 网卡名称

Keeplived 的配置(Web 服务器)

Web 主服务器的配置:
# Master 的配置内容:
! Configuration File for keepalived
global_defs {
notification_email {
example@domain.com    # 收邮件人,可以定义多个
}
notification_email_from HaproxyMaster@web.haproxy    # 发件人,可伪装
smtp_server 127.0.0.1    # 发送邮件的服务器地址
smtp_connect_timeout 30    # 连接超时时间
no_email_faults
router_id WebMaster
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_haproxy {# HAProxy 服务监测脚本
script ‘/etc/keepalived/check_haproxy.sh’
interval 2
weight 2
}
vrrp_instance VI_1 {# 每一个 vrrp_instance 就是定义一个虚拟路由器
state MASTER # 由初始状态状态转换为 master 状态
interface 网卡名称 # 网卡名称,如 eth0,根据自己的情况修改
virtual_router_id 100    # 虚拟路由的 id 号,一般不能大于 255 的
priority 100 # 优先级,数字越大,优先级越高,主比次大
advert_int 1 # 初始化通告
authentication {# 认证机制
auth_type PASS
auth_pass 666 # 密码,自行更改,主备一致即可
}
track_script {
chk_haproxy
}
virtual_ipaddress {# Web 服务的虚拟 ip 地址:vip,前面提到的备用的虚拟 IP。
#<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPT> label <LABEL>
#192.168.200.18/24 dev eth2 label eth2:1
192.168.6.111
}
    notify_master ‘/etc/keepalived/clean_arp.sh 192.168.6.111’
}

Web 备服务器的配置:
# Backup 的配置内容:
! Configuration File for keepalived
global_defs {
notification_email {
example@domain.com    # 收邮件人,可以定义多个
}
notification_email_from HaproxyBackup@web.haproxy    # 发件人,可伪装
smtp_server 127.0.0.1    # 发送邮件的服务器地址
smtp_connect_timeout 30    # 连接超时时间
no_email_faults
router_id WebBackup
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_haproxy {# HAProxy 服务监测脚本
script ‘/etc/keepalived/check_haproxy.sh’
interval 2
weight 2
}
vrrp_instance VI_1 {# 每一个 vrrp_instance 就是定义一个虚拟路由器
state BACKUP # 由初始状态状态转换为 backup 状态
interface 网卡名称 # 网卡名称,如 eth0,根据自己的情况修改
virtual_router_id 100    # 虚拟路由的 id 号,一般不能大于 255 的
priority 90 # 优先级,数字越大,优先级越高,主比次大
advert_int 1 # 初始化通告
authentication {# 认证机制
auth_type PASS
auth_pass 666 # 密码,自行更改,主备一致即可
}
track_script {
chk_haproxy
}
virtual_ipaddress {# Web 服务的虚拟 ip 地址:vip,前面提到的备用的虚拟 IP。
#<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPT> label <LABEL>
#192.168.200.18/24 dev eth2 label eth2:1
192.168.6.111
}
    notify_master ‘/etc/keepalived/clean_arp.sh 192.168.6.111’
}

Keeplived 的配置(DB 服务器)

DB 主服务器的配置:
# Master 的配置内容:
! Configuration File for keepalived
global_defs {
notification_email {
example@domain.com    # 收邮件人,可以定义多个
}
notification_email_from HaproxyMaster@db.haproxy    # 发件人,可伪装
smtp_server 127.0.0.1    # 发送邮件的服务器地址
smtp_connect_timeout 30    # 连接超时时间
no_email_faults
router_id DBMaster
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_haproxy {# HAProxy 服务监测脚本
script ‘/etc/keepalived/check_haproxy.sh’
interval 2
weight 2
}
vrrp_instance VI_1 {# 每一个 vrrp_instance 就是定义一个虚拟路由器
state MASTER # 由初始状态状态转换为 master 状态
interface 网卡名称 # 网卡名称,如 eth0,根据自己的情况修改
virtual_router_id 99    # 虚拟路由的 id 号,一般不能大于 255 的
priority 100 # 优先级,数字越大,优先级越高,主比次大
advert_int 1 # 初始化通告
authentication {# 认证机制
auth_type PASS
auth_pass 666 # 密码,自行更改,主备一致即可
}
track_script {
chk_haproxy
}    
virtual_ipaddress {# DB 服务的虚拟 ip 地址:vip,前面提到的备用的虚拟 IP。
#<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPT> label <LABEL>
#192.168.200.18/24 dev eth2 label eth2:1
192.168.6.211
}
notify_master ‘/etc/keepalived/clean_arp.sh 192.168.6.211’
}

DB 备服务器的配置:
# Backup 的配置内容:
! Configuration File for keepalived
global_defs {
notification_email {
example@domain.com    # 收邮件人,可以定义多个
}
notification_email_from HaproxyBackup@db.haproxy    # 发件人,可伪装
smtp_server 127.0.0.1     # 发送邮件的服务器地址
smtp_connect_timeout 30    # 连接超时时间
no_email_faults
router_id DBBackup
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_haproxy {# HAProxy 服务监测脚本
script ‘/etc/keepalived/check_haproxy.sh’
interval 2
weight 2
}
vrrp_instance VI_1 {# 每一个 vrrp_instance 就是定义一个虚拟路由器
state BACKUP     # 由初始状态状态转换为 master 状态
interface 网卡名称 # 网卡名称,如 eth0,根据自己的情况修改
virtual_router_id 99    # 虚拟路由的 id 号,一般不能大于 255 的
priority 90 # 优先级,数字越大,优先级越高,主比次大
advert_int 1 # 初始化通告
authentication {# 认证机制
auth_type PASS
auth_pass 666 # 密码,自行更改,主备一致即可
}
track_script {
chk_haproxy
}    
virtual_ipaddress {# DB 服务的虚拟 ip 地址:vip,前面提到的备用的虚拟 IP。
#<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPT> label <LABEL>
#192.168.200.18/24 dev eth2 label eth2:1
192.168.6.211
}
notify_master ‘/etc/keepalived/clean_arp.sh 192.168.6.211’
}

创建 Keepalived 调用的脚本

操作命令
mkdir /etc/keepalived/
echo ” > /etc/keepalived/check_haproxy.sh
echo ” > /etc/keepalived/clean_arp.sh
chmod +x /etc/keepalived/*.sh
# 然后编辑两个脚本的内容,如下

/etc/keepalived/check_haproxy.sh
#!/bin/bash
# 判断 haproxy 是否已经启动
if [$(ps -C haproxy –no-header | wc -l) -eq 0 ]; then
# 如果没有启动,则启动 haproxy 程序
haproxy -f /etc/haproxy/haproxy.cfg
fi
# 睡眠两秒钟,等待 haproxy 完全启动
sleep 2
# 判断 haproxy 是否已经启动
if [$(ps -C haproxy –no-header | wc -l) -eq 0 ]; then
# 如果 haproxy 没有启动起来,则将 keepalived 停掉,则 VIP 自动漂移到另外一台 haproxy 机器, 实现了对 haproxy 的高可用
service keepalived stop

/etc/keepalived/clean_arp.sh
#!/bin/sh
VIP=$1
GATEWAY=192.168.6.255 # 本机的网卡网关地址
/sbin/arping -I ens160 -c 5 -s $VIP $GATEWAY &>/dev/null

发布文件的配置
# 站点根目录赋权
chmod -R 777 /home/wwwroot/publishPath
# PHP 环境配置
vim /home/wwwroot/publishPath/.env

# 编辑配置内容:
APP_DEBUG=false
# Web 的内网 VIP,如需外网访问,则需要将 192.168.6.111 映射到外网,然后将该处的 IP 改成外网 IP
APP_URL=http://192.168.6.111
DB_CONNECTION=mysql
# DB 的内网 VIP
DB_HOST=192.168.6.211
# DB 的内网端口
DB_PORT=3306
# 数据库名称
DB_DATABASE=dbName
# 数据库用户名
DB_USERNAME=dbuser
# 数据库密码
DB_PASSWORD=dbpwd
# 其他配置选项使用默认设置,这里省略。

# 配置保存退出后重启 php 服务:
service php-fpm restart

关于 IP 的说明 以上说到的 IP 都是内网 IP,所有的配置都使用内网 IP 即可。如需外网访问,只需要把两个虚拟 IP 和端口映射到外网即可(注意修改 php 配置的 APP_URL)。

退出移动版