相关推荐recommended
企业级双活NGINX+图形化GUI管理搭建详细教程 nginx+keepalived+nginxwebui
作者:mmseoamin日期:2024-04-30

文章目录

    • 概要
    • 背景
    • 应用代理架构
    • 整体架构拓扑
    • 安装开始
    • 技术细节

      概要

      在目前互联网发展形势下,有非常多的业务需求要从互联网或者VPN之类的非安全区域来访问企业内部的业务生产系统。这给网络框架和网络安全提出了很大的挑战。这种需求相信每一位运维人员都遇到过,而且也深思过。

      在这种需求下,怎么去构建一种生产环境下的安全有效的访问途径。本人作为有某三甲医院多年运维经验的工作人员,分享自己的一整套改造经验之谈。有需求的同学们可以借鉴,有高工看见了,也提提建议。

      背景

      先交代下背景:目前医院信息化作为互联网信息化的一部分,总感觉太保守,一来也是发展迟,发展快,二来是思想不够解放。导致现在信息孤岛严重,发展受限。

      企业级双活NGINX+图形化GUI管理搭建详细教程 nginx+keepalived+nginxwebui,在这里插入图片描述,第1张

      相信这张图是医院互联网应用下的普遍网络构架吧。对于网闸这种东西,我是深恶痛绝,太死板,业务限制太大。谁用谁知道

      企业级双活NGINX+图形化GUI管理搭建详细教程 nginx+keepalived+nginxwebui,在这里插入图片描述,第2张

      我的思路是这样的,所有非安全域的访问(互联网、VPN)只能访问应用代理服务器(可搭配),而应用代理服务器通过四层、七层代理方式访问真正的内网服务器(涵盖99%的业务访问流程)。 优势是代理配置更灵活、业务应用拓展更灵活。

      应用代理架构

      nginx+keepalived+nginxwebui 这三款软件可以自行百度下,都是主流稳定产品,具体不介绍了,都是神一样的存在。而且不用花钱的。。。

      nginx:反向代理四层、七层应用。

      keepalived:对nginx做双活避免宕机。

      nginxwebui:图形界面管理nginx(更方便、更安全)。

      整体架构拓扑

      企业级双活NGINX+图形化GUI管理搭建详细教程 nginx+keepalived+nginxwebui,在这里插入图片描述,第3张

      准备工作:

      1、准备两台交换机,最好做个堆叠。

      2、准备两台物理服务器(看你预算,生产环境中不建议单台)。安装centos或者openEuler操作系统,,,看你情况。

      3、两台物理服务器网卡可以做个bond0做个。

      思路

      1、基础环境配置

      2、编译安装nginx

      3、安装nginx图形管理页面nginxwebui

      4、配置双活keepalived

      5、测试方法

      6、升级须知

      安装开始

      1、基础环境配置 (两个节点配置相同)

      ① selinux关闭,yum阿里云网络源配置。

      ② 操作系统防火墙配置:

      [root@localhost ~]#firewall-cmd --zone=public --add-port=80/tcp --permanent
      [root@localhost ~]#firewall-cmd --zone=public --add-port=443/tcp --permanent
      [root@localhost ~]#firewall-cmd --zone=public --add-port=10240/tcp --permanent
      [root@localhost ~]#firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
      [root@localhost ~]#firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
      [root@localhost ~]#firewall-cmd --reload
      

      其中80、443端口是常用业务端口,10240是nginxwebui管理页面端口。后两条是因为keepalived使用vrrp协议实现主主,必须得放开。最后重新加载防火墙。。。。

      提示:如果你有硬件防火墙,操作系统的防火墙也可以直接关闭。如下:

      [root@localhost ~]#systemctl stop firewalld
      [root@localhost ~]#systemctl disable firewalld
      

      ③yum安装列表:keepalived java-1.8.0-openjdk net-tools curl wget gcc gcc-c++ autoconf automake make openssl openssl-devel pcre pcre-devel zlib-devel 其中包括了keepalived、nginxwebui的环境java包、还有nginx及编译的包等。

      可以一次性安装,也可以单个安装,例如

      [root@localhost ~]#yum install -y keepalived
      

      2、编译安装nginx(两个节点配置相同)

      提示:这里强烈建议编译安装nginx,对于后期nginx的升级、增加模块等有重要作用

      ①下载nginx(最好选个最新的稳定版本,我这里以“1.22.1”做演示)

      http://nginx.org/download

      [root@localhost ~]#mkdir /usr/local/nginx    #创建一个nginx安装目录
      [root@localhost ~]#cp nginx-1.22.1.tar.gz /usr/local/nginx/  #将下载的tar包拷贝进去
      [root@localhost ~]#cd /usr/local/nginx/
      [root@localhost ~]#tar zxvf nginx-1.22.1.tar.gz   #解压tar包
      [root@localhost ~]#cd nginx-1.22.1
      [root@localhost ~]#./configure  --prefix=/usr/local/nginx --with-http_ssl_module  --with-http_stub_status_module --with-http_realip_module --with-http_secure_link_module --with-http_ssl_module --with-http_sub_module --with-http_v2_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module     #先configure  后面跟着安装路径 --with-是需要的模块。。。。基础的模块都带上了,基本够用。
      [root@localhost ~]#make & make install   #编译及安装
      ------------------这就算装完了,可以在浏览器中输入http://IP 就能验证了。--------------
      [root@localhost ~]#cd /usr/local/nginx/sbin/   #进入nginx安装目录
      [root@localhost ~]#./nginx     #启动nginx
      [root@localhost ~]#./nginx -V   #查看版本及模块及安装情况
      -----------------下边为了便捷操作,将nginx服务安装到系统服务中去-----------------------
      [root@localhost ~]#echo "export PATH=/usr/local/nginx/sbin:$PATH" > /etc/profile.d/nginx.sh  #增加环境变量,随处可使用nginx命令
      [root@localhost ~]#source /etc/profile   #加载环境变量,使之生效
      [root@localhost ~]#vi /etc/init.d/nginx   #这个nginx内容如下黑框,直接copy进去,不用改什么
      [root@localhost ~]#chmod a+x /etc/init.d/nginx
      

      ↓↓↓↓↓↓↓↓↓↓↓↓↓下面的脚本就是上面nginx中的内容。为了展示方便,单独列举↓↓↓↓↓↓↓↓↓

      #!/bin/sh
      #
      # nginx - this script starts and stops the nginx daemon
      #
      # chkconfig:   - 85 15
      # description:  NGINX is an HTTP(S) server, HTTP(S) reverse \
      #               proxy and IMAP/POP3 proxy server
      # processname: nginx
      # config:      /etc/nginx/nginx.conf
      # config:      /etc/sysconfig/nginx
      # pidfile:     /usr/local/nginx/logs/nginx.pid
      # Source function library.
      . /etc/rc.d/init.d/functions
      # Source networking configuration.
      . /etc/sysconfig/network
      # Check that networking is up.
      [ "$NETWORKING" = "no" ] && exit 0
      nginx="/usr/local/nginx/sbin/nginx"
      prog=$(basename $nginx)
      NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
      [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
      lockfile=/var/lock/subsys/nginx
      make_dirs() {
         # make required directories
         user=`$nginx -V 2>&1 | grep "configure arguments:.*--user=" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
         if [ -n "$user" ]; then
            if [ -z "`grep $user /etc/passwd`" ]; then
               useradd -M -s /bin/nologin $user
            fi
            options=`$nginx -V 2>&1 | grep 'configure arguments:'`
            for opt in $options; do
                if [ `echo $opt | grep '.*-temp-path'` ]; then
                    value=`echo $opt | cut -d "=" -f 2`
                    if [ ! -d "$value" ]; then
                        # echo "creating" $value
                        mkdir -p $value && chown -R $user $value
                    fi
                fi
             done
          fi
      }
      start() {
          [ -x $nginx ] || exit 5
          [ -f $NGINX_CONF_FILE ] || exit 6
          make_dirs
          echo -n $"Starting $prog: "
          daemon $nginx -c $NGINX_CONF_FILE
          retval=$?
          echo
          [ $retval -eq 0 ] && touch $lockfile
          return $retval
      }
      stop() {
          echo -n $"Stopping $prog: "
          killproc $prog -QUIT
          retval=$?
          echo
          [ $retval -eq 0 ] && rm -f $lockfile
          return $retval
      }
      restart() {
          configtest || return $?
          stop
          sleep 1
          start
      }
      reload() {
          configtest || return $?
          echo -n $"Reloading $prog: "
          killproc $prog -HUP
          retval=$?
          echo
      }
      force_reload() {
          restart
      }
      configtest() {
        $nginx -t -c $NGINX_CONF_FILE
      }
      rh_status() {
          status $prog
      }
      rh_status_q() {
          rh_status >/dev/null 2>&1
      }
      case "$1" in
          start)
              rh_status_q && exit 0
              $1
              ;;
          stop)
              rh_status_q || exit 0
              $1
              ;;
          restart|configtest)
              $1
              ;;
          reload)
              rh_status_q || exit 7
              $1
              ;;
          force-reload)
              force_reload
              ;;
          status)
              rh_status
              ;;
          condrestart|try-restart)
              rh_status_q || exit 0
                  ;;
          *)
              echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
              exit 2
      esac
      

      提示:nginx的安装就算正式结束了

      测试内容:

      systemctl start nginx.service 启动nginx

      systemctl stop nginx.service 关闭nginx

      systemctl status nginx.service 查看nginx状态

      浏览器中输入http://IP 看能否打开。

      3、安装nginx图形管理页面nginxwebui(两个节点配置相同)

      本项目可以使用WebUI配置nginx的各项功能, 包括http协议转发, tcp协议转发, 反向代理, 负载均衡, ssl证书自动申请、续签、配置等, 最终生成nginx.conf文件并覆盖nginx的默认配置文件, 完成nginx的最终功能配置。

      下载地址:https://www.nginxwebui.cn/ 并上传至服务器

      基本功能可以在官网上查下,,,我觉得这是目前最好用的nginx配置工具。

      nginxWebUI的环境依赖包是java-1.8.0-openjdk、net-tools是运行需要的组件,,,都已经安装了。

      #mkdir /nginxWebUI   #创建nginxwebui安装目录,安装很简单。我这里下载的是3.4.6版本
      #cp nginxWebUI-3.4.6.jar /nginxWebUI/nginxWebUI.jar    #复制并改名jar包
      #cd /nginxWebUI
      #vi start-service.sh  #用于快捷启动nginxwebui
      nohup java -jar -Dfile.encoding=UTF-8 /nginxWebUI/nginxWebUI.jar --server.port=10240 --project.home=/nginxWebUI/ > /dev/null &
      #vi stop-service.sh   #用于快捷关闭nginxwebui
      pkill java
      #vi  /etc/rc.d/rc.local  #编辑启动项,将nginxwebui加入开机启动
      su - root -c '/nginxWebUI/start-service.sh' 
      #chmod a+x /etc/rc.d/rc.local   #增加rc.local执行权限
      

      好了可以登录了http://IP:10240 至于使用方法,其实也不难,看看就会。

      企业级双活NGINX+图形化GUI管理搭建详细教程 nginx+keepalived+nginxwebui,在这里插入图片描述,第4张

      基本使用从左侧反向代理开始,以发布一个https网站为例:

      企业级双活NGINX+图形化GUI管理搭建详细教程 nginx+keepalived+nginxwebui,在这里插入图片描述,第5张

      ①至③略

      ④—如果没有证书就填80。如果有证书,就填443。即使你的网站是http的也没有关系。必填

      ⑤—填写域名。选填

      ⑥—如果没有证书就选否。如果有证书,就选是,并完成第⑦项。

      ⑧—添加代理目标,指的是正式web服务器的访问url。

      ⑨—动态http、代理目标(如果不是80或443,就得填端口号)格式如:http://192.168.0.1:8080

      ⑩—提交

      如上就是添加一个需要nginx反向七层代理的网站,你还可以摸索下添加一个代理四层的站点,涉及“负载均衡(upstream)”、“反向代理(server)”。。。。。

      企业级双活NGINX+图形化GUI管理搭建详细教程 nginx+keepalived+nginxwebui,在这里插入图片描述,第6张

      如上操作完之后还是不能通过VIP的ip去访问的,因为你只是对nginxWebUI这个工具做了预配置,还没有实际应用到nginx中去。

      进入启用配置→目标配置文件(按上文的路径去填)→对比(向你提供更改内容的对比页面,检查用的)→校验文件(检查nignx配置语法等有无错误,如有就得改错,直到显示ok和successful)→替换文件(将正确的配置替换到nginx中去)→重新装载(相当于加载nginx配置使其生效。等同命令nginx -s reload。 但不同于systemctl restart nginx哦)

      这算是通过nginxWebUI完成了nginx的配置。你可以通过访问VIP的形式去访问反向代理的站点了。

      4、配置双活keepalived(分别配置)

      提示:本方案使用双活架构,keepalived正确安装及配置后,每台服务器除了一个本地ip外,还会生成一个虚拟IP地址简称VIP,这两个VIP承担外部访问的任务。使用中可以将不同业务分摊到这两个VIP上去,,,,我的做法是将四层“IP+端口”访问指向第一个VIP上去,将七层“http/https”访问指向第二个VIP上去,,,最终形成两个服务器分别承担一部分应用,达到一定程度的负载作用。在极端情况下,其中一台节点出现问题,它上面的VIP会漂移到正常运行的节点上去,达到nginx及业务可用,处理好故障节点后,VIP会自动回迁。

      最开始安装环境时,keepalived已经安装,配置文件是/etc/keepalived/keepalived.conf 常用命令如下:

      systemctl start keepalived.service #启动keepalived

      systemctl stop keepalived.service #关闭keepalived

      systemctl restart keepalived.service #重启keepalived

      ①首先添加个nginx检测脚本。用于keepalived检测nginx状态,如果nginx服务停了,会自动启动nginx,,如果nginx启动不了,就开始虚拟地址(VIP)漂移了,也就是常说的故障转移了。

      #touch /etc/keepalived/check_nginx.sh         #创建nginx检测脚本文件,键入如下内容,
      #!/bin/bash
      run=`ps -C nginx --no-header | wc -l`
      if [ $run -eq 0 ]
      then
      systemctl stop nginx.service
      systemctl start nginx.service
      sleep 3
      if [ `ps -C nginx --no-header | wc -l` ]
      then
      systemctl stop keepalived.service
      fi
      fi
      #chmod a+x /etc/keepalived/check_nginx.sh    #并更改文件的可执行权限
      

      ②配置keepalived

      配置要素:state virtual_router_id auth_pass virtual_ipaddress track_script

      根据最上面拓扑图中的IP,自行推理一下各个参数的用途,最简单的使用方法就是更改virtual_ipaddress中的IP地址就可以套用了。

      node1配置如下:

      ! Configuration File for keepalived
      global_defs {
         notification_email {
           acassen@firewall.loc
           failover@firewall.loc
           sysadmin@firewall.loc
         }
         notification_email_from Alexandre.Cassen@firewall.loc
         smtp_server 192.168.200.1
         smtp_connect_timeout 30
         router_id LVS_DEVEL
         vrrp_skip_check_adv_addr
        # vrrp_strict
         vrrp_garp_interval 0
         vrrp_gna_interval 0
      }
       vrrp_script chk_nginx {
          script "/etc/keepalived/check_nginx.sh"
          interval 2
          weight 2
       }
      
      vrrp_instance VI_1 {
          state MASTER
          interface ens192
          virtual_router_id 51
          priority 100
          advert_int 1
          authentication {
              auth_type PASS
              auth_pass 1024
          }
          virtual_ipaddress {
              172.16.100.111
          }
      	track_script {
           	chk_nginx
          }
      }
      vrrp_instance VI_2 {
          state BACKUP
          interface ens192
          virtual_router_id 52
          priority 50
          advert_int 1
          authentication {
              auth_type PASS
              auth_pass 4201
          }
          virtual_ipaddress {
              172.16.100.112
          }
             track_script {
              chk_nginx
          }
      }
      

      node2配置如下:

      ! Configuration File for keepalived
      global_defs {
         notification_email {
           acassen@firewall.loc
           failover@firewall.loc
           sysadmin@firewall.loc
         }
         notification_email_from Alexandre.Cassen@firewall.loc
         smtp_server 192.168.200.1
         smtp_connect_timeout 30
         router_id LVS_DEVEL
         vrrp_skip_check_adv_addr
        # vrrp_strict
         vrrp_garp_interval 0
         vrrp_gna_interval 0
      }
       vrrp_script chk_nginx {
          script "/etc/keepalived/check_nginx.sh"
          interval 2
          weight 2
       }
      
      vrrp_instance VI_1 {
          state BACKUP
          interface ens192
          virtual_router_id 51
          priority 50
          advert_int 1
          authentication {
              auth_type PASS
              auth_pass 1024
          }
          virtual_ipaddress {
              172.16.100.111
          }
      	track_script {
           	chk_nginx
          }
      }
      vrrp_instance VI_2 {
          state MASTER
          interface ens192
          virtual_router_id 52
          priority 100
          advert_int 1
          authentication {
              auth_type PASS
              auth_pass 4201
          }
          virtual_ipaddress {
              172.16.100.112
          }
             track_script {
              chk_nginx
          }
      }
      

      最后使用 systemctl start keepalived.service就可以启动了。

      #systemctl start keepalived.service  #启动
      #systemctl enable keepalived.service  #设置开机启动
      

      做完以上部分,,,这个配置过程就算完了。

      5、测试方法

      如果这个搭建过程没有问题,就可以通过停止keepalived服务,去模拟节点故障。

      举例:

      停止节点1上的keepalived服务,那节点2上的IP地址就会有三个,172.16.100.102 172.16.100.112 172.16.100.111

      恢复节点1上的keepalived服务,那节点2上的172.16.100.111就会回到节点1上。

      更深层次的测试,可以自行再做做!

      5、升级须知

      一般需要升级的只有nginx 和 nginxwebui

      nginx升级:

      ①、下载新编译版本nginx包nginx-1.99.99.tar.gz,解压至/usr/local/nginx/nginx-1.99.99并进入

      ②、./configure --prefix=/usr/local/nginx --XXXX (注意添加原有模块)

      ③、make 不要make install

      ④、mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old 备份nginx主文件并删除原nginx

      ⑤、cp /usr/local/nginx/nginx-1.99.99/objs/nginx /usr/local/nginx 将编译好的nginx移动到主目录

      ⑥、可用systemctl restart nginx.service重启加载新文件。或不用管也可以,nginx会自动完成平滑升级

      nginxwebui升级:

      ①、关闭nginxWebUI主进程 pkill java 运行: ./nginxWebUI/stop-service.sh

      ②、下载新的nginxWebUI-3.99.99.jar 覆盖nginxWebUI.jar

      ③、启动nginxWebUI服务。 ./nginxWebUI/start-service.sh

      技术细节

      提示:nginxWebUI的使用自己琢磨,,,头快炸了,不说了

      两台nginxWebUI中添加正向配置后,记得在“启用配置”菜单中-对比文件-校验文件-替换文件-重新装载,,最后在“远程服务器”中同步配置和批量运行,以保持两台nginx配置相同。要不然VIP漂移后有空配置