nginx+keepalived高可用解决方案

1. 环境需求和说明

1.1. Nginx版本管理

Nginx隶属于开源产品,各个版本的区别主要有以下几种形式:

u Mainline version:Mainline 是 Nginx 目前主力在做的版本,可以说是开发版。

u Stable version:最新稳定版,生产环境上建议使用的版本。

u Legacy versions:遗留的老版本的稳定版。

一般选取软件的稳定版本,最新的稳定版。截止到文档更新日,稳定版1.220已经发布,发布日期为2021-11-16。

1.2. 系统安装要求

操作系统最好为linux系统。

1.3. 系统环境和软件版本

操作系统Linux
适用nginx版本nginx1.20.0+

1.4. 文件系统(基础要求)

裸设备文件系统大小说明
/lvnginx/nginx10Gl 最少5G
/lvnginxlogs/nginx/logs20G根据业务需要l 裸设备可以根据需要定义l 文件系统可以挂载在其他位置。l 文件系统名称可以根据需要进行修改

在特殊系统中,日志文件可能不能挂载在/nginx/logs下,我们可以通过softlink保持目录结构的统一性。

1.5. 用户和组

Nginx服务程序默认以nobody身份运行,建议为其创建专门的用户账号(无登入权限),控制其访问权限,降低安全风险。创建一个名为nginx的用户和组。

组名组ID(可默认或自定义)描述
nginx1000nginx组

用户规划:

用户用户ID(可默认或自定义)主属组组集主目录备注
nginx1000nginxnginx运行用户

参考命令:

groupadd -g 1000 nginxuseradd nginx -u 1000 -g  nginx -s /sbin/nologin -M

1.6. 端口设置

软件端口说明
nginx80服务端侦听端口

注意:在linux系统中端口1~1024之间为root保留端口,其他用户无权使用,若要使用http和https默认端口80和443时只能以root用户身份启动nginx服务。

2. 安装

确保当前环境中存在gcc编译环境(gcc,gcc-c++)可通过查询当前系统中gcc的版本来确认是否完整安装

#gcc -#g++ -v

若显示有版本信息则说明编译环境完整,输出结果参考如下:

wps1.jpg

2.1. 安装依赖包

pcrePerl库,正则表达式库
zlib数据压缩函式库
SSL用于nginx配置SSl证书配置,若不使用https协议可以不进行安装

通过如下命令查看当前环境是否存在相应的rpm安装包:

rpm -qa|grep -E ‘ssl|pcre|zlib’

若当前系统已挂载ios镜像或在可以连接外网的情况下可以使用yum安装,安装命令如下:

#安装pcre库yum install -y pcre pcre-devel#安装zlib压缩库yum install -y zlib zlib-devel#安装SSL证书依赖库yum install -y openssl openssl-devel

*备选离线安装方案*

如当前服务器未挂载ISO镜像也没有外网的条件下,可使用离线安装的方式补充依赖包。请按下列顺序安装;(请在官网中下载最新安装包,或自主选着指定版本的源码包)

源码包获取地址:

pcre编译安装包在http://www.pcre.org/上可以获取当前最新的版本

openssl编译安装包在http://www.openssl.org/source/上可以获取当前最新的版本

zlib编译安装包,在http://www.zlib.net/上可以获取当前最新的版本

本文档使用安装包分别为openssl-1.1.0f.tar.gz、zlib-1.2.12.tar.gz、pcre-8.45.tar.gz

本文下载的安装包放在/usr/local/src,本文依赖包均采用默认位置安装,如有指定路径请根据需要重新指定。(./configure -prefix 指定的路径)

安装zlib库

进入/usr/local/src,执行解压命令:

tar -xzvf zlib-1.2.12.tar.gz

依次执行安装命令:

#进入解压文件夹cd zlib-1.2.12 #预编译,检查安装zlib的依赖库是否完整,指定安装位置./configure #编译过程make #编译安装make install

安装pcre库

进入/usr/local/src,执行解压命令:

tar -xzvf pcre-8.45.tar.gz

执行安装命令:

#进入解压文件夹cd pcre-8.45 #预编译,检查安装zlib的依赖库是否完整,指定安装位置./configure #编译过程make #编译安装make install

安装SSL(选装:若不适用https协议可以不进行安装,防止后续有使用SSL认证,建议安装)

进入/usr/local/srcc,执行解压命令:

tar -xzvf openssl-1.1.0f.tar.gz

执行安装命令:

#进入解压文件夹cd openssl-1.1 #预编译,检查安装zlib的依赖库是否完整,指定安装位置./configure #编译过程make #编译安装make install

2.2. 安装Nginx

由于nginx是编译安装,目录可以自定义。目录以及模块配置如下:

指定软件安装位置/usr/local/nginx
添加状态查询模块–with-http_stub_status_module
添加pcre模块–with-pcre
添加zlib模块–with-zlib

解压nginx安装包,进行编译安装,参考如下命令执行:

#nginx安装包存放位置
cd /usr/local/src
#解压安装包文件
tar -zxvf nginx-1.20.0.tar.gz
#进入解压文件夹cd nginx-1.20.0
#预编译,指定nginx安装位置,添加nginx要加载的模块
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module
#编译安装过程
make && make install

若要加载更全依赖模块请参考如下命令进行编译

解压nginx安装包后,进行编译安装,参考如下命令执行:

./configure --prefix=l/nginx --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module  

注:编译安装nginx时使用–with进行指定加载模块用“=”指定加载模块安装位置,指定的参数请参考上表。

3. Nginx配置

3.1. 基本参数配置

Nginx配置文件即为nginx.conf文件,对于Nginx参数的调整,都需要更改nginx.conf这个文件。

3.1.1. event配置

具体示例内容如下:

# 指定使用用户,设置完后只有指定的用户有权限启用

user nginx;

 

# 指定工作进程数,建议与当前系统CPU总核心数相同(或者整数倍),以达到最佳性能,CPU核数查询命令:cat /proc/cpuinfo| grep "processor"| wc -l

worker_processes 4;

 

# 启用epoll,linux系统默认使用方式

use epoll;


# 单个后台worker process进程的最大并发链接数也可根据要求调整,注意ulimit –n的值必须大于得于worker_connections的配置

worker_connections 1024;

3.1.2. http配置

具体示例内容如下:

# 设置日志格式(根据需要,可默认)

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

       '$status $body_bytes_sent "$http_referer" '

      '"$http_user_agent" $request_time "$http_x_forwarded_for" $request_time ';

access_log logs/main_access.log main;


# 设置keepalive超时

keepalive_timeout 65;

# 打开数据压缩(根据实际需求开启)

gzip on;

# 隐藏nginx版本号

server_tokens off;

server设置:

# 设置监听端口

listen 80;

# 设置域名名称

server_name localhost;
 
# 设置应用根目录(默认路径:/usr/local/nginx/html)

root htmlr;

location设置**:**

# 地址重写

location /base {

	rewrite ^ (.*) /$1 last;

}

3.2. 反向代理配置

具体示例内容如下:

server {

  listen 80;

  server_name server.net;

  location / {

    proxy_pass http://connect;  #反向代理地址

  }

}

3.3. 负载均衡

nginx的负载均衡是通过模块upstream实现的。在http{}中添加服务器的地址即可实现负载均衡。示例内容如下:

http{

upstream firstdemo{

   server 192.168.43.205;

   server 192.168.43.206;

   }

}

# 若是用户想第一次访问服务器后,下次访问时仍想访问同一台服务器,可使用ip_hash实现该情景。

http{

upstream firstdemo{

   ip_hash;

   server 192.168.43.205;

   server 192.168.43.206;

   }

}

3.4. http安全漏洞修复

针对安全部提出的以下漏洞:Web服务器配置为允许使用危险的HTTP方法,如PUT、MOVE、COPY、DELETE、PROPFIND、SEARCH、MKCOL、LOCK、UNLOCK、PROPPATCH,该配置可能允许未授权的用户对Web服务器进行敏感操作。

修复方案如下;

#在nginx.conf中的server部分添加:

   if ($request_method !~ ^(GET|POST)$ ) {

     return 403;

   }

3.5. Nginx语法检测命令

启动nginx之前,测试语法是否能够通过。

nginx -t -c /nginx/conf/nginx.conf

注意:nginx -t 命令在root权限下执行时,若nginx.conf文件中未配置users 会对nginx安装路径下的temp路径进行属组修改,将文件夹属组修改为noboay 使用时要慎重。

4. 日志切割

Nginx的日志切割主要是通过操作系统的crontab来实现的。具体操作如下:

4.1. 设置切割脚本(脚本已部署)

编写分割日志脚本,并赋权755。

# vi /nginx/sbin/splitLog.sh

DATE=`date +'%Y%m%d'`

mv /usr/local/nginx/logs/access.log /usr/local/nginx/logs/$DATE_access.log

touch access.log

# chmod 755 splitLog.sh

4.2. 设置crontab参考(未设置根据需要进行修改)

按照分时日月周的时间格式,调用脚本进行日志分割。

root用户执行(参考):

crontab -e

5 0 * * *  ‘/nginx/sbin/splitLog.sh’

对crontab配置位数的说明如下:

img

5. nginx验证

5.1. 启停nginx

Nginx启动命令nginx
Nginx停止命令nginx -s stop
Nginx重载命令nginx -s reload

5.2. 查看nginx状态

ps –ef |grep nginxnetstat -anp|grep nginx

5.3. 测试Nginx

启动nginx后,打开浏览器,输入该机器的ip地址,页面出现“Welcome to Nginx!”即表示Nginx成功搭建完成。

wps2.jpg

6. Keepalived安装

6.1. 环境准备

主机ip角色部署软件
10.87.200.51masterkeepalived、nginx
10.87.200.52salvekeepalived、nginx
10.87.200.53虚ip

6.2. Keepalived安装

使用yum源安装,安装命令如下:

#安装keepalived服务
yum -y install keepalived
#验证是否安装成功
rpm -ql keepalived
#显示结果(参考)
/etc/keepalived
/etc/keepalived/keepalived.conf # 主配置文件
/etc/sysconfig/keepalived
/usr/bin/genhash
/usr/lib/systemd/system/keepalived.service
/usr/libexec/keepalived
/usr/sbin/keepalived

6.3. 监听存活脚本

在 /etc/keepalived/路径下创建nginx端口监听脚本check_port.sh

[root@localhost ~]#vim /etc/keepalived/check_port.sh

#!/bin/bash
#keepalived 监控端口脚本#使用方法:
#在keepalived的配置文件中
#vrrp_script check_port {
#创建一个vrrp_script脚本,检查配置
#   script "/etc/keepalived/check_port.sh 80" 
#配置监听的端口
#   interval 2 #检查脚本的频率,单位(秒)
#}
CHK_PORT=$1
if [ -n "$CHK_PORT" ];then
	PORT_PROCESS=`ss -lnt|grep $CHK_PORT|wc -l`
    if [ $PORT_PROCESS -eq 0 ];then
    	echo "Port $CHK_PORT Is Not Used,End."
        exit 1
    fi
else
	echo "Check Port Cant Be Empty!"
fi

[root@localhost ~]# chmod  +x /etc/keepalived/check_port.sh

6.4. Keepalived最终配置文件

Master(10.87.200.51)

[root@localhost ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
   router_id 10.87.200.51   #本机回环地址
}
vrrp_script chk_nginx {
    script "/etc/keepalived/check_port.sh 80"  #nginx监听端口,若启动端口变更需要修改该端口
    interval 2
    weight -20
}
vrrp_instance VI_1 {
    state MASTER
    interface ens192   #keepalived服务绑定的网卡命令
    virtual_router_id 251
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 11111111
    }
    track_script {
         chk_nginx   #调用nginx端口监控脚本
    }
    virtual_ipaddress {
        10.87.200.53  #keepalived的虚拟VIP地址
    }
}

Slave配置(10.87.200.52)

! Configuration File for keepalived
global_defs {
        router_id 10.87.200.52
}
vrrp_script chk_nginx {
        script "/etc/keepalived/check_port.sh 80"
        interval 2
        weight -20
}
vrrp_instance VI_1 {
        state BACKUP
        interface ens192   
        virtual_router_id 251
        priority 90
        advert_int 1
        authentication {
                auth_type PASS
                auth_pass 11111111
        }
        track_script {
                chk_nginx
        }
        virtual_ipaddress {
              10.87.200.53
        }
}

6.5. 启动主从的Keepalived

#查询keepalived服务状态
systemctl status keepalived
#手动启动keepalived服务
systemctl start keepalived
#手动停止keepalived服务
systemctl stop keepalived
#将Keepalived设置为开机自启动
systemctl enable keepalive

6.6. 验证keepalived功能

修改nginx(10.87.200.51)启动访问页面

#进入nginx主页面配置文件夹
cd /usr/local/nginx/html/
#备份nginx默认访问页面
mv index.html index.html_bak
#修改index.html文件
vim index.html
#index.html文件内容
I am 10.87.200.51

修改nginx(10.87.200.52)启动访问页面

cd /usr/local/nginx/html/
mv index.html index.html_bak
vim index.html
I am 10.87.200.52

重启nginx服务

/usr/local/nginx/sbin/nginx -s reload

浏览器访问http://10.87.200.53:80

查看返回页面示例如下:

wps9.jpg

在服务器中查看keepalived的绑定状态

查看keepalived的命令:ip a

wps10.jpg

手动停止10.87.200.51上的nginx服务查看是否会正常切换VIP(10.87.200.53)

重新访问http://10.87.200.53:80显示如下,说明正常切换。

wps11.jpg

wps12.jpg

注意:在测试完成后,出于安全考虑,在访问页面不要展示真实IP地址,所以测试完成后要将nginx页面修改回默认页面,并重新niginx服务

7. OS系统优化

7.1. 修改limit参数

优化资源限制
#ulimit -n
1024
#ulimit- u
1024
修改open files和max user processes
1、在/etc/rc.local中增加一行 ulimit -SHn 65535
2、在/etc/profile中增加一行 ulimit -SHn 65535
3、在/etc/security/limits.conf最后增加:
* soft nofile 65535
* hard nofile 65535
* soft nproc  65535
* hard nproc  65535

要使参数生效,方法为:

1、退出当前登入窗口重新登入

2、重启OS系统

7.2. 修改sysctl

net.ipv4.tcp_max_tw_buckets = 6000  #timewait数量,默认180000。
net.ipv4.tcp_tw_recycle = 1 #启用timewait快速回收。
net.ipv4.tcp_tw_reuse = 1 #允许TIME-WAIT sockets重用与新TCP连接。
net.ipv4.tcp_syncookies = 1 #出现SYN等待队列溢出时启动cookies处理。
net.core.somaxconn = 262144 #web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。
net.core.netdev_max_backlog = 262144 #每个网络接口接收数据包的熟虑比内核处理这些把的速率快时,允许送到对垒的数据报的最大数目。
net.ipv4.tcp_max_orphans = 262144 #系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的DoS攻击,不能过分一老它或者人为的减小这个值。更应该增加这个值(增加内存之后)。
net.ipv4.tcp_max_syn_backlog = 262144  #记录的那些尚未收到客户端确认信息的连接请求的最大值。
net.ipv4.tcp_timestamps = 0 #时间戳可以避免序列号的券绕。
net.ipv4.tcp_synack_retries = 1 #为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次我说,这个设置决定了内核放弃连接之前发送SYN+ACK报的数量。
net.ipv4.tcp_syn_retries = 1 #在内核放弃建议俩姐之前发送SYN报的数量。
net.ipv4.tcp——keepalive_time=30 #当keepalive启用的时候,TCP发送keepalive消息的频度。默认是2小时。

修改后使用“sysctl -p”使参数生效。

  • 17
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kevin·zhao &&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值