编译安装Nginx+GeoIP2自动更新+防盗链+防爬虫+限制访问速度+限制连接数

news2024/11/18 17:35:59

此文章是Nginx的GeoIP2模块和MaxMind国家IP库相互结合,达到客户端IP访问的一个数据记录以及分析,同时还针对一些业务需求做出对Nginx中间件的控制,如:防盗链、防爬虫、限制访问速度、限制连接数等

该篇文章是从一个热爱搞技术的博主StephenJose_Dai文章中学习并实验后编写的,在此非常感谢这位博主!

环境

名称+版本官方下载链接本地下载链接
CentOS7.9http://isoredirect.centos.org/centos/7/isos/x86_64/
Nginx1.22https://nginx.org/download/nginx-1.22.1.tar.gzhttps://resource.if010.com/geoip/nginx-1.22.1.tar.gz
GeoIP2模块v3.3https://github.com/leev/ngx_http_geoip2_module/releaseshttps://resource.if010.com/geoip/ngx_http_geoip2_module-3.3.tar.gz
MaxMind国家IP库https://www.maxmind.com/en/home
libmaxminddb 1.7.1https://github.com/maxmind/libmaxminddb/releaseshttps://resource.if010.com/geoip/libmaxminddb-1.7.1.tar.gz
geoipupdate 6.0.0https://github.com/maxmind/geoipupdate/releases/download/v6.0.0/geoipupdate_6.0.0_linux_386.tar.gzhttps://resource.if010.com/geoip/geoipupdate_6.0.0_linux_386.tar.gz

注:libmaxminddb工具是用于解析MaxMind国家IP库文件的。

开搞

约定:所有安装包和准备材料都放在了/data目录下。

编译安装libmaxminddb

tar -zxvf libmaxminddb-1.7.1.tar.gz
cd libmaxminddb-1.7.1
./configure
make && make check && make install
ldconfig

如果安装后,您收到一个libmaxminddb.so.0丢失的错误,您可能需要将前缀中的 lib 目录添加到您的库路径中。在使用默认前缀 ( /usr/local) 的大多数 Linux 发行版上,您可以通过运行以下命令来执行此操作:

sudo sh -c "echo /usr/local/lib  >> /etc/ld.so.conf.d/local.conf"
ldconfig

解压GeoIP2

tar -zxvf ngx_http_geoip2_module-3.3.tar.gz
mv ngx_http_geoip2_module-3.3 /usr/local/

注意:因为这里使用的是Nginx1.22的版本,所以GeoIP2只能用3.3版本的,不然会报错!

编译安装Nginx前的一些依赖准备

我们这里编译安装Nginx需要用的有openssl、pcre、zlib、gcc,在此之前我们先解压编译包并放到指定目录,然后使用rpm安装gcc

这里的用到的依赖分享到了CSDN上,有需要的小伙伴可以自取

tar zxf pcre-8.42.tar.gz
mv pcre-8.42 /usr/local/
tar zxf openssl-1.1.0h.tar.gz
mv openssl-1.1.0h /usr/local/
tar zxf zlib-1.2.11.tar.gz 
mv zlib-1.2.11 /usr/local/

# rpm安装gcc
rpm -ivh libstdc++-devel-4.8.5-44.el7.x86_64.rpm 
rpm -ivh gcc-c++-4.8.5-44.el7.x86_64.rpm

编译安装Nginx

tar -zxvf nginx-1.22.1.tar.gz
cd /data/nginx-1.22.1

#配置编译
./configure --prefix=/usr/local/nginx --with-http_realip_module --with-http_sub_module --with-http_gzip_static_module --with-http_stub_status_module --with-http_ssl_module  --with-http_v2_module --with-stream --with-openssl=/usr/local/openssl-1.1.0h/ --with-pcre=/usr/local/pcre-8.42/ --with-zlib=/usr/local/zlib-1.2.11/ --add-module=/usr/local/ngx_http_geoip2_module-3.3

# 编译并安装
make && make install

注册MaxMind帐号并下载国家IP数据库

注册页面

下载地址库入口

下载链接位置

将下载的数据库解压并放到指定位置

这个位置并不一定说是要在哪里,只要到时候你Nginx调用的时候路径是对的就行

mkdir -p /usr/local/nginx/IPData/
tar -zxvf GeoLite2-Country_20231020.tar.gz
cd GeoLite2-Country_20231020
mv GeoLite2-Country.mmdb /usr/local/nginx/IPData/

配置Nginx实现禁止境外IP访问、防盗链、防爬虫、限制访问速度、限制连接数

创建虚拟主机配置文件目录和缓存目录

mkdir -p /usr/local/nginx/conf/v_host/
mkdir -p /usr/local/nginx/cache

编辑Nginx主配置文件vim /usr/local/nginx/conf/nginx.conf

user nobody;

# 配置Nginx线程数,这里设置为自动
worker_processes auto;

error_log logs/error.log;
pid logs/nginx.pid;

events {
    # 定义每个线程可以处理1024个连接请求
    worker_connections  1024;
}


http {
    log_format  main  '$remote_addr - [location: $geoip2_data_country_code $geoip2_country_name $geoip2_data_city_name $geoip2_data_province_name $geoip2_data_province_isocode $geoip2_continent_code] - $remote_user [$time_local] requesthost:"$http_host"; "$request" requesttime:"$request_time"; '
        	      '$status $body_bytes_sent "$http_referer" - $request_body ' 
        	      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;

    # 关闭Nginx版本号显示
    server_tokens       off;

    proxy_buffering off;
    keepalive_timeout   300;
    keepalive_requests  200;
    client_max_body_size 20M;
    types_hash_max_size 2048;

    fastcgi_connect_timeout 300s;
    fastcgi_send_timeout 300s;
    fastcgi_read_timeout 300s;
    fastcgi_buffer_size 512k;
    fastcgi_buffers 10 512k;
    fastcgi_busy_buffers_size 1024k;
    fastcgi_temp_file_write_size 1024k;

    open_file_cache max=65535 inactive=60s;
    open_file_cache_valid 80s;
    server_names_hash_bucket_size 2048;
    client_header_buffer_size 128k;
    client_body_buffer_size 512k;
    large_client_header_buffers 4 128k;

    proxy_hide_header X-Powered-By;
    proxy_hide_header Server;
    proxy_connect_timeout 300;
    proxy_send_timeout 300;
    proxy_read_timeout 300;
    proxy_buffer_size 4k;
    proxy_buffers 4 64k;
    proxy_busy_buffers_size 128k;
    proxy_temp_file_write_size 128k;
    proxy_temp_path cache/mytemp_cache;
    proxy_cache_path cache/mytest_cache levels=1:2 keys_zone=mytest:20m inactive=24h max_size=1000m;
    proxy_intercept_errors on;

    gzip_min_length  1k;
    gzip_buffers     4 16k;
    gzip_comp_level  4;
    gzip_types      text/plain application/javascript image/png text/css text/xml text/vnd.wap.wml text/x-component application/x-javascript image/gif image/jpeg application/atom+xml application/rss+xml application/octet-stream application/x-rar-compressed application/json;
    gzip_http_version 1.1;
    gzip_vary on;
    gzip_disable "msie6";
    gzip  on;

    include             mime.types;
    default_type        application/octet-stream;

    # 配置国家IP库
    geoip2 /usr/local/nginx/IPData/GeoLite2-Country.mmdb{
        auto_reload 5m;
        $geoip2_metadate_country_build metadata build_epoch;
        $geoip2_data_country_code country iso_code;
        $geoip2_country_name country names en;
    }

    # 配置城市IP库
    geoip2 /usr/local/nginx/IPData/GeoLite2-City.mmdb {
        auto_reload 5m;
        $geoip2_data_city_name city names en;
        $geoip2_data_province_name subdivisions 0 names en;
        $geoip2_data_province_isocode subdivisions 0 iso_code;
        $geoip2_continent_code continent code;
    }

    #配置规则,默认不允许所有IP访问,只允许中国IP访问
    map $geoip2_data_country_code $allowed_country {
        default no;
        CN yes;
    }

    #设置白名单,在下列白名单中不限速
    geo $is_whitelist {
        default 0;
        172.17.0.0/16 1;
     }

     map $is_whitelist $limit_key {
         1 "";
         0 $binary_remote_addr;  
     } 

    # 设置连接数
    limit_conn_zone $binary_remote_addr zone=perip:10m;
    # 设置限制连接数,每秒150个连接数
    limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=150r/s;
    # 设置限制连接数,每秒2000个连接数  
    limit_req_zone $binary_remote_addr zone=mywebRateLimit:10m rate=2000r/s;
    # 设置限制连接数,每秒200个连接数
    limit_req_zone $binary_remote_addr zone=my26051RateLimit:10m rate=200r/s;


    # 引用v_host中的指定conf配置文件
    include /usr/local/nginx/conf/v_host/*.conf;
}

创建编辑虚拟主机配置文件vim /usr/local/nginx/conf/v_host/test.if010.com.conf

# HTTP配置
server {
    listen 80;
    charset utf-8;
    server_name test.if010.com;
    client_max_body_size 300m;
    access_log /usr/local/nginx/logs/test.if010.com_access.log main;
    error_log /usr/local/nginx/logs/test.if010.com_error.log debug;

    # 当访问http时,强制跳转到https
    error_page 497 https://test.if010.com$uri?$args;
   
    # 添加客户端的IP头
    add_header client-country $geoip2_data_country_code;

    # 启用压缩,压缩等级为9级,压缩text/css text/plan text/xml application/javascript
    # application/x-javascript application/html application/xml image/png image/jpg
    # image/jpeg image/gif image/webp image/svg+xml 这些格式的文件
    gzip on;
    gzip_comp_level 9;
    gzip_types text/css text/plan text/xml application/javascript application/x-javascript application/html application/xml image/png image/jpg image/jpeg image/gif image/webp image/svg+xml;
 
    # 做判断,如果国家不是中国,就返回451状态码给客户端;
    if ($geoip2_data_country_code != CN ) {
        return 451;
    }

    # 做判断,如果匹配到默认不允许的规则,就返回452状态码给客户端;   
    if ($geoip2_data_country_code = no ) {
        return 452;
    }
  
    location /{
        root /usr/local/nginx/html;
        index index.html;
        try_files $uri $uri/ /index.html?s=$uri&$args;
   
        # 限制连接数为nginx.conf配置的zone=myRateLimit的值(每秒150个请求数),允许突然爆发的连接数10个并且是马上执行没有延迟
        limit_req zone=myRateLimit burst=10 nodelay;

        # 限制每个IP每秒连接数为nginx.conf配置的zone=perip的值(单个IP允许150个请求数)
        limit_conn perip 150;
   
        # 如果超过设定的每秒150个连接数这个阈值,则返回448状态码给客户端
        limit_req_status 448;
   
        # 如果超过设定的每个IP每秒150个连接数这个阈值,则返回449状态码给客户端
        limit_conn_status 449;
   
        # 限制客户端速度只能到150k
        limit_rate        150k;

        # 防盗链,如果请求的头不是test.if010.com就是无效的,则返回449状态码给客户端   
        valid_referers none blocked test.if010.comm;
        if ($invalid_referer) {
            return 449;
        }

        # 做判断,如果国家不是中国,就返回451状态码给客户端;  
        if ($geoip2_data_country_code != CN ) {
            return 451;
        }

        # 做判断,如果匹配到默认不允许的规则,就返回452状态码给客户端  
        if ($geoip2_data_country_code = no ) {
            return 452;
        }

        # 防爬虫,如果UA是底下任意一个值,就判定为蜘蛛爬虫,则返回453给客户端
        if ($http_user_agent ~* "python|curl|java|wget|httpclient|okhttp|qihoobot|Scrubby|YodaoBot|yahoo-blogs/v3.9|Gigabot|yahoo-mmcrawler|Teoma|Robozilla|Bingbot|Slurp|Baiduspider|Googlebot|googlebot-mobile|googlebot-image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo!Slurp|Yahoo!Slurp China|YoudaoBot|Sosospider|MSNBot|ia_archiver|twiceler|psbot") {
            return 453;
        }

    }

    # 错误页配置,如果状态码是下列的值,就显示我配置的页面
    error_page  400 401 402 403 404 500 502 503 504 /error.html;

    location = /error.html {
        root   /usr/local/html;
               
        # 限制连接数为nginx.conf配置的zone=myRateLimit的值(每秒150个请求数),允许突然爆发的连接数10个并且是马上执行没有延迟
        limit_req zone=myRateLimit burst=10 nodelay;

        # 限制每个IP每秒连接数为nginx.conf配置的zone=perip的值(单个IP允许150个请求数)
        limit_conn perip 150;
   
        # 如果超过设定的每秒150个连接数这个阈值,则返回448状态码给客户端
        limit_req_status 448;
   
        # 如果超过设定的每个IP每秒150个连接数这个阈值,则返回449状态码给客户端
        limit_conn_status 449;
   
        # 限制客户端速度只能到150k
        limit_rate        150k;
   
        # 防盗链,如果请求的头不是test.if010.com就是无效的,则返回449状态码给客户端  
        valid_referers none blocked test.if010.com;
        if ($invalid_referer) {
            return 449;
        }

        # 做判断,如果国家不是中国,就返回451状态码给客户端;   
        if ($geoip2_data_country_code != CN ) {
            return 451;
        }

        # 做判断,如果匹配到默认不允许的规则,就返回452状态码给客户端  
        if ($geoip2_data_country_code = no ) {
            return 452;
        }

        # 防爬虫,如果UA是底下任意一个值,就判定为蜘蛛爬虫,则返回453给客户端   
        if ($http_user_agent ~* "python|curl|java|wget|httpclient|okhttp|qihoobot|Scrubby|YodaoBot|yahoo-blogs/v3.9|Gigabot|yahoo-mmcrawler|Teoma|Robozilla|Bingbot|Slurp|Baiduspider|Googlebot|googlebot-mobile|googlebot-image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo!Slurp|Yahoo!Slurp China|YoudaoBot|Sosospider|MSNBot|ia_archiver|twiceler|psbot") {
            return 453;
        }

    }
}
  
# HTTPS配置

server {
    listen 443 ssl;
    charset utf-8;
    server_name test.if010.com;
    client_max_body_size 300m;
    ssl_certificate  /usr/local/nginx/cert/test.if010.com.pem;
    ssl_certificate_key /usr/local/nginx/cert/test.if010.com.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    access_log /usr/local/nginx/logs/test.if010.com_access.log main;
    error_log /usr/local/nginx/logs/test.if010.com_error.log debug;
   
    # 添加客户端的IP头
    add_header client-country $geoip2_data_country_code;
  
    # 启用压缩,压缩等级为9级,压缩text/css text/plan text/xml application/javascript
    # application/x-javascript application/html application/xml image/png image/jpg
    # image/jpeg image/gif image/webp image/svg+xml 这些格式的文件
    gzip on;
    gzip_comp_level 9;
    gzip_types text/css text/plan text/xml application/javascript application/x-javascript application/html application/xml image/png image/jpg image/jpeg image/gif image/webp image/svg+xml;
 
    # 做判断,如果国家不是中国,就返回451状态码给客户端;
    if ($geoip2_data_country_code != CN ) {
        return 451;
    }

    # 做判断,如果匹配到默认不允许的规则,就返回452状态码给客户端;   
    if ($geoip2_data_country_code = no ) {
        return 452;
    }
  
    location /{
        root /usr/local/nginx/html;
        index index.html;
        try_files $uri $uri/ /index.html?s=$uri&$args;
  
        # 限制连接数为nginx.conf配置的zone=myRateLimit的值(每秒150个请求数),允许突然爆发的连接数10个并且是马上执行没有延迟
        limit_req zone=myRateLimit burst=10 nodelay;

        # 限制每个IP每秒连接数为nginx.conf配置的zone=perip的值(单个IP允许150个请求数)
        limit_conn perip 150;
  
        # 如果超过设定的每秒150个连接数这个阈值,则返回448状态码给客户端
        limit_req_status 448;
  
        # 如果超过设定的每个IP每秒150个连接数这个阈值,则返回449状态码给客户端
        limit_conn_status 449;
  
        # 限制客户端速度只能到150k
        limit_rate  150k;
  
        # 防盗链,如果请求的头不是test.if010.com就是无效的,则返回449状态码给客户端
        valid_referers none blocked test.if010.com;
        if ($invalid_referer) {
            return 449;
        }

        # 做判断,如果国家不是中国,就返回451状态码给客户端;  
        if ($geoip2_data_country_code != CN ) {
            return 451;
        }
   
        # 做判断,如果匹配到默认不允许的规则,就返回451状态码给客户端  
        if ($geoip2_data_country_code = no ) {
            return 452;
        }
   
        # 防爬虫,如果UA是底下任意一个值,就判定为蜘蛛爬虫,则返回453给客户端
        if ($http_user_agent ~* "python|curl|java|wget|httpclient|okhttp|qihoobot|Scrubby|YodaoBot|yahoo-blogs/v3.9|Gigabot|yahoo-mmcrawler|Teoma|Robozilla|Bingbot|Slurp|Baiduspider|Googlebot|googlebot-mobile|googlebot-image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo!Slurp|Yahoo!Slurp China|YoudaoBot|Sosospider|MSNBot|ia_archiver|twiceler|psbot") {
            return 453;
        }
    }

    # 错误页配置,如果状态码是下列的值,就显示我配置的页面
    error_page  400 401 402 403 404 500 502 503 504 /error.html;
   
    location = /error.html {
        root   /usr/local/html;
               
        # 限制连接数为nginx.conf配置的zone=myRateLimit的值(每秒150个请求数),允许突然爆发的连接数10个并且是马上执行没有延迟
        limit_req zone=myRateLimit burst=10 nodelay;

        # 限制每个IP每秒连接数为nginx.conf配置的zone=perip的值(单个IP允许150个请求数)
        limit_conn perip 150;
  
        # 如果超过设定的每秒150个连接数这个阈值,则返回448状态码给客户端
        limit_req_status 448;
  
        # 如果超过设定的每个IP每秒150个连接数这个阈值,则返回449状态码给客户端
        limit_conn_status 449;
  
        # 限制客户端速度只能到150k
        limit_rate  150k;
   
        # 防盗链,如果请求的头不是test.if010.com就是无效的,则返回449状态码给客户端  
        valid_referers none blocked test.if010.com;
        if ($invalid_referer) {
            return 449;
        }


        # 做判断,如果国家不是中国,就返回451状态码给客户端;   
        if ($geoip2_data_country_code != CN ) {
            return 451;
        }

        # 做判断,如果匹配到默认不允许的规则,就返回452状态码给客户端  
        if ($geoip2_data_country_code = no ) {
            return 452;
        }

        # 防爬虫,如果UA是底下任意一个值,就判定为蜘蛛爬虫,则返回453给客户端   
        if ($http_user_agent ~* "python|curl|java|wget|httpclient|okhttp|qihoobot|Scrubby|YodaoBot|yahoo-blogs/v3.9|Gigabot|yahoo-mmcrawler|Teoma|Robozilla|Bingbot|Slurp|Baiduspider|Googlebot|googlebot-mobile|googlebot-image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo!Slurp|Yahoo!Slurp China|YoudaoBot|Sosospider|MSNBot|ia_archiver|twiceler|psbot") {
            return 453;
        }

    }
}

验证测试

Nginx访问日志结果

实现自动更新国家IP库

获取geoipupdate官方工具

tar -zxvf geoipupdate_6.0.0_linux_386.tar.gz
cd geoipupdate_6.0.0_linux_386/
mv geoipupdate /usr/local/nginx/IPData/
mv GeoIP.conf /usr/local/nginx/IPData/

创建LicenseKey

申请License入口位置

查看LicenseKey

配置GeoIP.conf

vim /usr/local/nginx/IPData/GeoIP.conf

# Please see https://dev.maxmind.com/geoip/updating-databases?lang=en for
# instructions on setting up geoipupdate, including information on how to
# download a pre-filled GeoIP.conf file.

# Replace YOUR_ACCOUNT_ID_HERE and YOUR_LICENSE_KEY_HERE with an active account
# ID and license key combination associated with your MaxMind account. These
# are available from https://www.maxmind.com/en/my_license_key.
AccountID xxxx  #这里填写刚才记下的ID
LicenseKey xxxx_xxxxxxxxxxxxxxx_xxx   #这里填写刚才记下的key

# Enter the edition IDs of the databases you would like to update.
# Multiple edition IDs are separated by spaces.
EditionIDs GeoLite2-Country GeoLite2-City

# The remaining settings are OPTIONAL.

# The directory to store the database files. Defaults to /usr/local/share/GeoIP
DatabaseDirectory /usr/local/nginx/IPData/ #这里本来是注释掉的,取消注释修改成你数据库存放的位置

# The server to use. Defaults to "updates.maxmind.com".
# Host updates.maxmind.com

# The proxy host name or IP address. You may optionally specify a
# port number, e.g., 127.0.0.1:8888. If no port number is specified, 1080
# will be used.
# Proxy 127.0.0.1:8888

# The user name and password to use with your proxy server.
# ProxyUserPassword username:password

# Whether to preserve modification times of files downloaded from the server.
# Defaults to "0".
# PreserveFileTimes 0

# The lock file to use. This ensures only one geoipupdate process can run at a
# time.
# Note: Once created, this lockfile is not removed from the filesystem.
# Defaults to ".geoipupdate.lock" under the DatabaseDirectory.
LockFile /usr/local/nginx/IPData/.geoipupdate.lock #这里本来是注释掉的,取消注释修改成你数据库存放的位置

# The amount of time to retry for when errors during HTTP transactions are
# encountered. It can be specified as a (possibly fractional) decimal number
# followed by a unit suffix. Valid time units are "ns", "us" (or "µs"), "ms",
# "s", "m", "h".
# Defaults to "5m" (5 minutes).
# RetryFor 5m

# The number of parallel database downloads.
# Defaults to "1".
# Parallelism 1

启动geoipupdate

根据官方提供的参数来看,默认数据库会下到/usr/local/share下,所以我们要加个参数让它存放到/usr/local/nginx/IPData, -d跟–database-directory一样,指定数据库存放位置, -f跟–config-file一样,就是指定配置文件

./geoipupdate -d /usr/local/nginx/IPData -f /usr/local/nginx/IPData/GeoIP.conf

等一会它就更新完了,更新完后用ll命令看下时间,如果时间是当前时间,那就说明更新成功。

创建定时任务

创建一个shell脚本
mkdir -p /usr/local/script/logs/
cd /usr/local/nginx/IPData/
vim autoupdate.sh


#!/bin/bash
########################################################################
# Function  :自动更新IP数据库                                            #
# Platform  :Centso 6.x and 7.x (Base)                                 #
# Version   :2.0                                                       #
# C_Date    :2023-10-20                                                #
# U_Date    :2023-10-20                                                #
# Author    :Kim                                                       #
# Contact   :StephenJose_Dai                                           #
# Tips      :Please don't delete it                                    #
# Used      :确保/usr/local/nginx/IPData下有geoipupdate和GeoIP.conf文件  #
#            再把脚本放入    /usr/local/script/下,然后运行即可            #
# Log       :用于自动更新国家IP数据库和城市IP数据库的程序                    #
########################################################################
current_time=$(date "+%Y-%m-%d %H:%M:%S")
/usr/local/nginx/IPData/geoipupdate -d /usr/local/nginx/IPData/ -f /usr/local/nginx/IPData/GeoIP.conf
echo "[${current_time}] UpdateSuccessfully!"



chmod +x autoupdate.sh

crontab -e
00 02 * * * /usr/local/nginx/IPData/autoupdate.sh >>  /usr/local/script/logs/geoipupdate.log 2>&1


重启crond服务
systemctl restart crond

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

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

相关文章

TSINGSEE智慧加油站可视化监管与风险预警方案

一、方案背景 加油站属于危化品行业,如何在日常加油卸油作业过程中保障人员、财产安全是重中之重。国内加油站日常管理主要依靠人为管控、监控摄像头监督及人工巡检等方式,管控手段存在低效性和滞后性,迫切需要将人工智能、物联网、大数据等…

07-React-redux和redux的使用

07.react-redux和redux的使用 1.redux的使用 1).redux的理解 a.redux是什么 redux是一个专门用于做状态管理的JS库(不是react插件库)。它可以用在react, angular, vue等项目中, 但基本与react配合使用。作用: 集中式管理react应用中多个组件共享的状态。 b.什么情况下需要使…

时间序列预测 | LightTS轻量采样的MLP结构网络用于多变量时间序列预测

首先,假设输入的时序维度为[B, T, N],作者便做了2种采样: 连续采样:侧重于捕获短期局部模式。 间隔采样:侧重于捕获长期依赖性。 如下图所示,很好理解,新的数据维度为[B, C, T/C, N],N代表时序的数量。 注意:论文上IEBlockC是直接出预测结果,但代码上,如上图红色标注…

【练习题】一.线性表

1.将两个递增的有序链表合并为一个递增的有序链表。要求结果链表仍使用原来两个链表《存储空间,不另外占用其他的存储空间。表中不允许有重复的数据。 2.将两个非递减的有序链表合并为一个非递增的有序链表。要求结果链表仍使用原来两个表的存储空间,不另外占用其他的存储空间…

计算机缺失d3dcompiler_47.dll解决方案,如何修复电脑缺失d3d文件

在计算机系统中,DLL文件(动态链接库)是一种重要的共享库,它包含了可被多个程序使用的代码和数据。然而,当某些DLL文件丢失或损坏时,可能会导致程序无法正常运行。本文将介绍四种解决D3DCompiler_47.dll缺失…

Adobe Audition 2024: 音频处理的未来,今天就在您的指尖

随着科技的飞速发展和人们对音频质量要求的不断提高,Adobe Audition 2024 (Au2024) 已经成为音频处理领域的领军者。这款强大的软件将为您的音频带来革命性的改变,让您的创作如虎添翼。 在Adobe Audition 2024中,用户可以体验到全新的界面设…

业内专业人士揭秘:双11即将来临,挑选SSD硬盘避坑指南

再过几天,各大电商的双11狂欢季。同时,随着存储产品涨价潮也在磨刀霍霍,这个双11可能是未来1年最合适买硬盘的窗口期。 小编从购物网站的价格趋势变化来看,已经有厂商按耐不住开始涨价了,NAND原厂的SSD价格相对较平稳。…

伊朗相关的OilRig组织在为期8个月的网络攻击中针对中东政府

导语 伊朗相关的OilRig组织最近在中东政府中展开了一场长达8个月的网络攻击行动。这次攻击导致了文件和密码的被窃取,并且在其中一次攻击中,攻击者还使用了一种名为PowerExchange的PowerShell后门。据Symantec的威胁猎人团队称,他们在一份与T…

Vue中 使用 Scss 实现配置、切换主题

1. 样式文件目录介绍 本项目中的公共样式文件均位于 src/assets/css 目录下,其中 index.scss是总的样式文件的汇总入口 ,common.scss 是供全局使用的一些基本样式(常量), _theme.scss、_handle.scss 两个文件是进行主题颜色配置的…

ArcGIS笔记11_提取栅格中的数据到点要素

本文目录 前言Step 1 准备好点要素和栅格文件Step 2 多值提取到点 前言 很多时候需要将栅格中的数据提取到点要素,让点获取到栅格文件对应坐标所包含的数据,本博文主要介绍这个操作。 Step 1 准备好点要素和栅格文件 如下图所示: Step 2 多…

JAVA基础(JAVA SE)学习笔记(六)面向对象编程(基础)

前言 1. 学习视频: 尚硅谷Java零基础全套视频教程(宋红康2023版,java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 第二阶段:Java面向对象编程 6.面向对象编程(基础) 7.面向对象编程&…

代码随想录算法训练营第五十五天 | 300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

300.最长递增子序列 视频讲解:动态规划之子序列问题,元素不连续!| LeetCode:300.最长递增子序列_哔哩哔哩_bilibili 代码随想录 (1)代码 674. 最长连续递增序列 视频讲解:动态规划之子序列问题…

零基础制作预约小程序,微信小程序预约服务指南

随着互联网的发展,越来越多的服务开始转移到线上。预约服务也是其中之一。通过微信小程序,商家可以提供更加便捷的预约服务,让客户随时随地预约商品或服务。本文将介绍如何零基础制作预约小程序,包括使用第三方制作平台、选择合适…

QT学习day4

作业:做一个闹钟 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//给定时器指针实例化一个对象timer new QTimer(this);//给语音播报者实例化一个…

计算机基础知识36

数据库数据的演变史 ATM:1. 把数据都存在了文件中,文件名不规范 kevin|123 kevin123 kevin*123 2. 存储数据的文件越来越多,放在db文件夹,占用空间,查询存储不方便,速度慢 # 数据库软件能解…

【C语言必知必会 | 子系列第六篇】深入剖析循环结构(2)

引言 C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。它在编程语言中具有举足轻重的地位。 此文为【C语言必知必会】第六篇,基于进行C语言循环结构的编程题专项练习,结合专题优质题目,带领读者从0开始&…

代码随想录算法训练营第五十六天 | 1143.最长公共子序列、1035.不相交的线 、53. 最大子序和 动态规划

1143.最长公共子序列 视频讲解:动态规划子序列问题经典题目 | LeetCode:1143.最长公共子序列_哔哩哔哩_bilibili 代码随想录 (1)代码 1035.不相交的线 视频讲解:动态规划之子序列问题,换汤不换药 | Leet…

OLED显示图片

前言 本文主要介绍了使用单片机如何在Oled12864上显示图片,以及相关的注意事项,若文章有不当之处,欢迎在评论区交流讨论.(又水了一篇文章~) 图像取模 打开Img2Lcd软件,然后载入目标jpg图片 按照图片上面的选项设置 输出数据类型:C语言数组扫描模式: 数据水平,字节垂直(列行…

JavaSE入门---认识类和对象

文章目录 什么是面向对象?认识类类的定义格式类的实例化 理解this引用对象的构造及初始化什么是构造方法?如何进行初始化?默认初始化就地初始化 认识staticstatic修饰成员变量static修饰成员方法 认识代码块普通代码块构造代码块静态代码块同…

Python3----------抽象(多态、封装、继承等)

术语多态(polymorphism)源自希腊语,意思是“有多种形态”。这大致意味着即便你不知道变量指向的是哪种对象,也能够对其执行操作,且操作的行为将随对象所属的类型(类)而异。 封装(en…