shell 脚本之一键部署安装 Nginx

news2024/12/25 9:29:22

定义一个变量来存放 nginx 版本号

version=1.15.4

nginx 下载地址:http://nginx.org/download/

下列函数功能则是判断当前步骤是否执行成功,并将结果输出出来

function show_result(){
  if [ "$1" -eq 0 ]
    then
      echo -e "\e[32m$2 is Success .   [ OK ] \e[0m"
    else
      echo -e "\e[31m$2 is Fail .   [ FAIL ] \e[0m"
  fi
}

创建 nginx 用户和用户组(建议用大于 1000 的 GID 和 UID 号,表示普通用户)
这段代码里我做了一个条件判断:

如果在 /etc/passwd 和 /etc/group 文件中过滤出 nginx,表示已经创建了 nginx 用户和 nginx 用户组,就不再创建了
 

安装一些扩展包

function nginx_pkg(){
        local item="Packages Install"
        yum -y install gcc openssl-devel pcre-devel zlib-devel > /dev/null 2>&1 
        show_result $? "${item}"
}

 

下载Nginx并解压缩

function nginx_download(){
        local item="Nginx Download"
        cd /usr/local/src && \
        wget http://nginx.org/download/nginx-${version}.tar.gz > /dev/null 2>&1 
        test -e /usr/local/src/nginx-${version} || tar zxf nginx-${version}.tar.gz 
        rm -rf /usr/local/src/nginx-${version}.tar.gz
        show_result $? "${item}"
}

 

编译安装 Nginx

这里也做了一个条件判断:

如果 /usr/local/nginx 目录存在,则说明 nginx 已经成功安装好了

function nginx_compile(){
        local item="Nginx Compile"
        cd /usr/local/src/nginx-${version}
        if [ `ls -l  /usr/local/ | grep 'nginx' | wc -l` -ge 1  ];
        then
                echo -e "\e[31mNginx exist! \e[0m"
        else
                ./configure --prefix=/usr/local/nginx > /dev/null 2>&1 && make > /dev/null 2>&1 && make install > /dev/null 2>&1 
        fi
        show_result $? "${item}"
}

 

建立软连接

function nginx_softlink(){
        local item="Nginx Softlink"
        test -d /etc/nginx/ || ln -s /usr/local/nginx/conf/ /etc/nginx
        test -e /usr/sbin/nginx || ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
        show_result $? "${item}"
}

 注册服务

将 nginx 注册成服务之后就可以使用 systemctl 控制它了

function nginx_service(){
        local item="Nginx Service"
        test -e /usr/lib/systemd/system/nginx.service || \ 
        echo '
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621ExecStartPre=/usr/bin/rm-f /usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
        ' > /usr/lib/systemd/system/nginx.service
        systemctl daemon-reload 
        show_result $? "${item}"
}

内核参数优化

function nginx_kernel(){
        local item="Optimize Kernel Arguments"
        cp /etc/sysctl.conf /etc/sysctl.conf.${current_time} > /dev/null 2>&1
        arch_ratio=$([[ ! -z $(uname -a | grep x86_64) ]] && expr 64 / 32 || expr 32 / 32)
        memory_size=$(free -b| awk 'NR==2{print $2}')
        nf_conntrack_size=$(expr ${memory_size} / 16384 / ${arch_ratio})
        #开启反向路径过滤
        add_config_tofile "net.ipv4.conf.default.rp_filter = 1" /etc/sysctl.conf
        add_config_tofile "net.ipv4.conf.all.rp_filter = 1" /etc/sysctl.conf
        #处理无源路由包
        add_config_tofile "net.ipv4.conf.all.accept_source_route = 0" /etc/sysctl.conf
        add_config_tofile "net.ipv4.conf.default.accept_source_route = 0" /etc/sysctl.conf
        #core文件名中添加pid作为扩展名
        add_config_tofile "kernel.core_uses_pid = 1" /etc/sysctl.conf
        #开启syn洪水攻击保护
        add_config_tofile "net.ipv4.tcp_syncookies = 1" /etc/sysctl.conf
        #修改消息队列长度
        add_config_tofile "kernel.msgmnb = 65536" /etc/sysctl.conf
        add_config_tofile "kernel.msgmax = 65536" /etc/sysctl.conf
        #修改最大内存共享段大小bytes
        add_config_tofile "kernel.shmmax = 68719476736" /etc/sysctl.conf
        add_config_tofile "kernel.shmall = 4294967296" /etc/sysctl.conf
        #timewait数量默认18000
        add_config_tofile "net.ipv4.tcp_max_tw_buckets = 600" /etc/sysctl.conf
        add_config_tofile "net.ipv4.tcp_sack = 1" /etc/sysctl.conf
        add_config_tofile "net.ipv4.tcp_window_scaling = 1" /etc/sysctl.conf
        add_config_tofile "net.ipv4.tcp_rmem = 4096 87380 16777216" /etc/sysctl.conf
        add_config_tofile "net.ipv4.tcp_wmem = 4096 65536 16777216" /etc/sysctl.conf
        add_config_tofile "net.core.rmem_default = 8388608" /etc/sysctl.conf
        add_config_tofile "net.core.wmem_max = 16777216" /etc/sysctl.conf
        #未收到客户端确认信息连接请求的最大值
        add_config_tofile "net.ipv4.tcp_max_syn_backlog = 262144" /etc/sysctl.conf
        #放弃建立连接之前发送的synack包
        add_config_tofile "net.ipv4.tcp_syn_retries = 2" /etc/sysctl.conf
        #开启重用,允许time—wait socket 重新用语新的tcp连接
        add_config_tofile "net.ipv4.tcp_tw_reuse = 1" /etc/sysctl.conf
        add_config_tofile "net.ipv4.tcp_fin_timeout = 1" /etc/sysctl.conf
        #防止简单的ddos攻击
        add_config_tofile "net.ipv4.tcp_max_orphans = 3276800" /etc/sysctl.conf
        #启用timewait快速收回
        add_config_tofile "net.ipv4.tcp_tw_recycle = 0" /etc/sysctl.conf
        #keeptime启用时tcp发送keepalive消息的频度,默认2h
        add_config_tofile "net.ipv4.tcp_keepalive_time = 600" /etc/sysctl.conf
        #允许系统打开的端口范围
        add_config_tofile "net.ipv4.ip_local_port_range = 1024 65535" /etc/sysctl.conf
    #资源回收
    add_config_tofile "net.ipv4.tcp_tw_recycle = 0" /etc/sysctl.conf
    #路由转发
    add_config_tofile "net.ipv4.ip_forward = 1" /etc/sysctl.conf 
        #修改防火墙连接跟踪表大小,默认65535
        add_config_tofile "net.netfilter.nf_conntrack_max = ${nf_conntrack_size}" /etc/sysctl.conf
        add_config_tofile "net.nf_conntrack_max = ${nf_conntrack_size}" /etc/sysctl.conf
        #解禁ping
        add_config_tofile "net.ipv4.icmp_echo_ignore_all = 0" /etc/sysctl.conf
        modprobe bridge
        sysctl -p > /dev/null 2>&1
        show_result $? "${item}"
}

启动nginx并开机自启

function nginx_start(){
        local item="Nginx start"
        systemctl enable nginx --now > /dev/null 2>&1
        show_result $? "${item}"
}

负责配置的写入函数

在上面的内核参数优化函数里面,我并没有使用 echo 将配置直接重定向到 /etc/sysctl.conf 文件里面

而是用了 add_config_tofile 函数,第一个参数是配置项,第二个参数是文件名

function add_config_tofile(){
        local keywords=`echo $1| awk -F "[= ]+" '{print $1}'`
        local SearchResult=`grep "^${keywords}" "$2"`
        if [ -z "${SearchResult}" ]
                then
                echo $1 >> $2
        else
                sed -i "s/^${keywords}.*/$1/" $2
        fi
}

main函数

function main(){
        user_create
        nginx_pkg
        nginx_download
        nginx_compile
        nginx_softlink
        nginx_service
        nginx_kernel
        nginx_start
}

 

 完整代码

执行结果如下:

#! /bin/bash

version=1.15.4

#判断函数是否执行成功
function show_result(){
  if [ "$1" -eq 0 ]
    then
      echo -e "\e[32m$2 is Success .   [ OK ] \e[0m"
    else
      echo -e "\e[31m$2 is Fail .   [ FAIL ] \e[0m"
  fi
}

#创建 nginx 用户和用户组
function user_create(){
        local item="Create User and Group"
        if [ `cat /etc/{passwd,group} | grep nginx | wc -l ` -ge 2  ];
        then
                echo -e "\e[31mUser and Group exist! \e[0m"
    else
        groupadd -g 1004 nginx && \
        useradd -u 1004 -g 1004 -M  -s /sbin/nologin nginx    
        show_result $? "${item}"
    fi
}

#下载一些拓展包
function nginx_pkg(){
        local item="Packages Install"
        yum -y install gcc openssl-devel pcre-devel zlib-devel > /dev/null 2>&1 
        show_result $? "${item}"
}


#下载nginx
function nginx_download(){
        local item="Nginx Download"
        cd /usr/local/src && \
        wget http://nginx.org/download/nginx-${version}.tar.gz > /dev/null 2>&1 
        test -e /usr/local/src/nginx-${version} || tar zxf nginx-${version}.tar.gz 
        rm -rf /usr/local/src/nginx-${version}.tar.gz
        show_result $? "${item}"
}


#编译安装
function nginx_compile(){
        local item="Nginx Compile"
        cd /usr/local/src/nginx-${version}
        if [ `ls -l  /usr/local/ | grep 'nginx' | wc -l` -ge 1  ];
        then
                echo -e "\e[31mNginx exist! \e[0m"
        else
                ./configure --prefix=/usr/local/nginx > /dev/null 2>&1 && make > /dev/null 2>&1 && make install > /dev/null 2>&1 
        fi
        show_result $? "${item}"
}

#软连接建立
function nginx_softlink(){
        local item="Nginx Softlink"
        test -d /etc/nginx/ || ln -s /usr/local/nginx/conf/ /etc/nginx
        test -e /usr/sbin/nginx || ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
        show_result $? "${item}"
}


#注册服务
function nginx_service(){
        local item="Nginx Service"
        test -e /usr/lib/systemd/system/nginx.service || \ 
        echo '
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621ExecStartPre=/usr/bin/rm-f /usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
        ' > /usr/lib/systemd/system/nginx.service
        systemctl daemon-reload 
        show_result $? "${item}"
}


#内核优化
function nginx_kernel(){
        local item="Optimize Kernel Arguments"
        cp /etc/sysctl.conf /etc/sysctl.conf.${current_time} > /dev/null 2>&1
        arch_ratio=$([[ ! -z $(uname -a | grep x86_64) ]] && expr 64 / 32 || expr 32 / 32)
        memory_size=$(free -b| awk 'NR==2{print $2}')
        nf_conntrack_size=$(expr ${memory_size} / 16384 / ${arch_ratio})
        #开启反向路径过滤
        add_config_tofile "net.ipv4.conf.default.rp_filter = 1" /etc/sysctl.conf
        add_config_tofile "net.ipv4.conf.all.rp_filter = 1" /etc/sysctl.conf
        #处理无源路由包
        add_config_tofile "net.ipv4.conf.all.accept_source_route = 0" /etc/sysctl.conf
        add_config_tofile "net.ipv4.conf.default.accept_source_route = 0" /etc/sysctl.conf
        #core文件名中添加pid作为扩展名
        add_config_tofile "kernel.core_uses_pid = 1" /etc/sysctl.conf
        #开启syn洪水攻击保护
        add_config_tofile "net.ipv4.tcp_syncookies = 1" /etc/sysctl.conf
        #修改消息队列长度
        add_config_tofile "kernel.msgmnb = 65536" /etc/sysctl.conf
        add_config_tofile "kernel.msgmax = 65536" /etc/sysctl.conf
        #修改最大内存共享段大小bytes
        add_config_tofile "kernel.shmmax = 68719476736" /etc/sysctl.conf
        add_config_tofile "kernel.shmall = 4294967296" /etc/sysctl.conf
        #timewait数量默认18000
        add_config_tofile "net.ipv4.tcp_max_tw_buckets = 600" /etc/sysctl.conf
        add_config_tofile "net.ipv4.tcp_sack = 1" /etc/sysctl.conf
        add_config_tofile "net.ipv4.tcp_window_scaling = 1" /etc/sysctl.conf
        add_config_tofile "net.ipv4.tcp_rmem = 4096 87380 16777216" /etc/sysctl.conf
        add_config_tofile "net.ipv4.tcp_wmem = 4096 65536 16777216" /etc/sysctl.conf
        add_config_tofile "net.core.rmem_default = 8388608" /etc/sysctl.conf
        add_config_tofile "net.core.wmem_max = 16777216" /etc/sysctl.conf
        #未收到客户端确认信息连接请求的最大值
        add_config_tofile "net.ipv4.tcp_max_syn_backlog = 262144" /etc/sysctl.conf
        #放弃建立连接之前发送的synack包
        add_config_tofile "net.ipv4.tcp_syn_retries = 2" /etc/sysctl.conf
        #开启重用,允许time—wait socket 重新用语新的tcp连接
        add_config_tofile "net.ipv4.tcp_tw_reuse = 1" /etc/sysctl.conf
        add_config_tofile "net.ipv4.tcp_fin_timeout = 1" /etc/sysctl.conf
        #防止简单的ddos攻击
        add_config_tofile "net.ipv4.tcp_max_orphans = 3276800" /etc/sysctl.conf
        #启用timewait快速收回
        add_config_tofile "net.ipv4.tcp_tw_recycle = 0" /etc/sysctl.conf
        #keeptime启用时tcp发送keepalive消息的频度,默认2h
        add_config_tofile "net.ipv4.tcp_keepalive_time = 600" /etc/sysctl.conf
        #允许系统打开的端口范围
        add_config_tofile "net.ipv4.ip_local_port_range = 1024 65535" /etc/sysctl.conf
    #资源回收
    add_config_tofile "net.ipv4.tcp_tw_recycle = 0" /etc/sysctl.conf
    #路由转发
    add_config_tofile "net.ipv4.ip_forward = 1" /etc/sysctl.conf 
        #修改防火墙连接跟踪表大小,默认65535
        add_config_tofile "net.netfilter.nf_conntrack_max = ${nf_conntrack_size}" /etc/sysctl.conf
        add_config_tofile "net.nf_conntrack_max = ${nf_conntrack_size}" /etc/sysctl.conf
        #解禁ping
        add_config_tofile "net.ipv4.icmp_echo_ignore_all = 0" /etc/sysctl.conf
        modprobe bridge
        sysctl -p > /dev/null 2>&1
        show_result $? "${item}"
}



#启动 nginx
function nginx_start(){
        local item="Nginx start"
        systemctl enable nginx --now > /dev/null 2>&1
        show_result $? "${item}"
}


#负责写入配置的函数
function add_config_tofile(){
        local keywords=`echo $1| awk -F "[= ]+" '{print $1}'`
        local SearchResult=`grep "^${keywords}" "$2"`
        if [ -z "${SearchResult}" ]
                then
                echo $1 >> $2
        else
                sed -i "s/^${keywords}.*/$1/" $2
        fi
}
#主函数
function main(){
        user_create
        nginx_pkg
        nginx_download
        nginx_compile
        nginx_softlink
        nginx_service
        nginx_kernel
        nginx_start
}

main

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1381992.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLOv5独家原创改进:多层次特征融合(SDI)结合PConv、DualConv、GSConv,实现二次创新 | UNet v2最新论文

💡💡💡本文独家改进:多层次特征融合(SDI)高效结合DualConv、PConv、GSConv等实现二次创新 1)替代原始的Concat; 收录 YOLOv5原创自研 https://blog.csdn.net/m0_63774211/category_12511931.html 💡💡💡全网独家首发创新(原创),适合paper !!! 💡�…

“黑科技”四川首秀!“全光塑”个性化近视矫正技术在成都发布

眼睛被称为“心灵的窗口”,是我们最重要的器官之一。而近视却让我们心灵的窗口蒙上一层灰尘,为了摘掉眼镜,重获清晰视力,近视手术可谓是不二之选。数十年来,近视手术飞速发展,如今世界上前沿的近视矫正技术…

大众汽车将集成ChatGPT人工智能技术;OpenAI对新闻组织诉讼的回应

🦉 AI新闻 🚀 大众汽车将集成ChatGPT人工智能技术,提升车载语音助手功能 摘要:大众汽车宣布其现有的IDA语音助手将引入ChatGPT人工智能技术,并用于多款新车型。通过添加ChatGPT,大众汽车将支持以更直观、…

Javaweb之SpringBootWeb案例新增部门的详细解析

2.3 删除部门 查询部门的功能我们搞定了,下面我们开始完成删除部门的功能开发。 2.3.1 需求 点击部门列表后面操作栏的 "删除" 按钮,就可以删除该部门信息。 此时,前端只需要给服务端传递一个ID参数就可以了。 我们从接口文档中也…

多维时序 | Matlab实现GRO-CNN-BiLSTM-Attention淘金算法优化卷积神经网络-双向长短期记忆网络结合注意力机制多变量时间序列预测

多维时序 | Matlab实现GRO-CNN-BiLSTM-Attention淘金算法优化卷积神经网络-双向长短期记忆网络结合注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现GRO-CNN-BiLSTM-Attention淘金算法优化卷积神经网络-双向长短期记忆网络结合注意力机制多变量时间序列预测效果一览基…

Java--RSA非对称加密的实现(使用java.security.KeyPair)

文章目录 前言实现步骤测试结果 前言 非对称加密是指使用不同的两个密钥进行加密和解密的一种加密算法,调用方用使用服务方提供的公钥进行加密,服务方使用自己的私钥进行解密。RSA算法是目前使用最广泛的公钥密码算法。Java提供了KeyPairGenerator类要生…

MySQL面试题 | 05.精选MySQL面试题

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

小程序中滚动字幕

需求&#xff1a;在录像时需要在屏幕上提示字幕&#xff0c;整体匀速向上滚动 html部分&#xff1a; <view class"subtitles_main"><view style"font-size:34rpx;color: #fff;line-height: 60rpx;" animation"{{animation}}">人生的…

Spring Boot 整合支付宝实现在线支付方案(沙箱环境)

文章目录 1.理解沙箱环境2.沙箱环境接入准备2.1 访问开发者控制台2.2 获取重要信息2.3 处理秘钥 3.接入支付宝支付的流程4.实现支付4.1 添加 SDK 依赖4.2 创建配置类4.3 支付宝订单管理接口实现流程4.4 支付宝支付接口实现流程 5.支付宝支付功能演示7.总结 TIP&#xff1a;对于…

VMware workstation安装debian-12.1.0虚拟机(最小化安装)并配置网络

VMware workstation安装debian-12.1.0虚拟机&#xff08;最小化安装&#xff09;并配置网络 Debian 是一个完全自由的操作系统&#xff01;Debian 有一个由普罗大众组成的社区&#xff01;该文档适用于在VMware workstation平台安装最小化安装debian-12.1.0虚拟机。 1.安装准…

YOLOv5改进 | 注意力篇 | CGAttention实现级联群体注意力机制 (全网首发改进)

一、本文介绍 本文给大家带来的改进机制是实现级联群体注意力机制CascadedGroupAttention,其主要思想为增强输入到注意力头的特征的多样性。与以前的自注意力不同,它为每个头提供不同的输入分割,并跨头级联输出特征。这种方法不仅减少了多头注意力中的计算冗余,而且通过增…

YOLOv5改进 | 二次创新篇 | 结合iRMB和EMA形成全新的iEMA机制(全网独家创新)

一、本文介绍 本文给大家带来的改进机制是二次创新的机制,二次创新是我们发表论文中关键的一环,为什么这么说,从去年的三月份开始对于图像领域的论文发表其实是变难的了,在那之前大家可能搭搭积木的情况下就可以简单的发表一篇论文,但是从去年开始单纯的搭积木其实发表论…

序章 熟悉战场篇—了解vue的基本操作

了解vue 的基本目录&#xff1a; dist 是打包后存放的目录(后续可以改)node_modules 是依赖包public 是静态index页面src 是存放文件的目录assets 是存放静态资源的目录components 是存放组件的目录views 是存放页面文件的目录&#xff08;没有views 自己新建一个&#xff09;A…

【一】通信协议概述

通信协议概述 简介&#xff1a; 很早之前就思考了要写一下电力系统常用的几种通信协议&#xff0c;一直拖着也没有行动&#xff0c;这次终于下定决心来出一个《通信协议》这样的专栏。电力行业数字化方面资料较少&#xff0c;我理解主要一方面是数字化程度还不高&#xff0c;一…

小程序基础学习(js混编)

在组件中使用外部js代码实现数据改变 先创建js文件 编写一些组件代码 编写外部js代码 在组件的js中引入外部js 在 app.json中添加路径规则 组件代码 <!--components/my-behavior/my-behavior.wxml--> <view><view>当前计数为{{count}}</view> <v…

java自动化将用例和截图一起执行测试放入world中直接生成测试报告【搬代码】

1.首先我们得用例写好之后放入文档中&#xff0c;把不用的案例类型、前置条件去掉之后&#xff0c;如图&#xff1a; 放到桌面后&#xff0c;先看执行结果&#xff1a; 直接上代码 package com.znzdh.qitagongju;import jxl.Sheet; import jxl.Workbook; import org.apache…

SpringBoot读取配置文件中的内容

文章目录 1. 读取配置文件application.yml中内容的方法1.1 Environment1.2 Value注解1.3 ConfigurationProperties 注解1.4 PropertySources 注解&#xff0c;获取自定义配置文件中的内容&#xff0c;yml文件需要自行实现适配器1.5 YamlPropertiesFactoryBean 加载 YAML 文件1.…

Java面试基础|数据结构 -实时更新

1.HashMap和ConcurrentHashMap介绍 核心是一个Node数组&#xff0c;数据结构与hashMap相似 使用CAS操作来实现无锁的更新&#xff0c;提高了并发性。当更新节点时&#xff0c;它会使用CAS来替换节点的值或链接&#xff0c;如果CAS失败&#xff0c;表明有其他线程也在进行修改&a…

C语言--单链表的创建及使用详解

C语言--单链表的创建及使用详解 1. 单链表定义1.1 工作原理1.2 优点 2. 单链表的创建2.1 文件创建2.2 节点创建2.3 链表显示 3. 链表操作3.1 尾插3.2 头插3.3 尾删3.4 头删3.5 指定数据寻找3.6 指定位置前插入3.7 指定位置删除 4. 单链表总内容4.1 test.c文件4.2 SList.h文件4.…

强化学习应用(一):基于Q-learning的物流配送路径规划研究(提供Python代码)

一、Q-learning算法简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于马尔可夫决策过程&#xff08;MDP&#xff09;的问题。它通过学习一个值函数来指导智能体在环境中做出决策&#xff0c;以最大化累积奖励。 Q-learning算法的核心思想是使用一个Q值函数来估计每…