精华内容
下载资源
问答
  • PAGE PAGE 2 Windows系统当中Defender服务的关闭方法 Defender服务是由Windows系统自带的杀毒服务甚至多次被第三方机构评为最强杀毒软件而在一些特殊情况是需要关闭Defender服务的那么Windows系统当中Defender服务...
  • Touch /.autorelabel 系统当中默认启用了selinux,去读取一个去止文件,而这个文件里是否由内容他都要去读,读完之后它会给这些系统默认的文件设置安全值 #修改context值,所以如果没有这一步你么系统也跨不出这一步...

    一、基本概念
    SELinux(Security-EnhancedLinux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统。
    SELinux提供了一种灵活的强制访问控制(MAC)系统,且内嵌于Linux Kernel中。SELinux定义了系统中每个【用户】、【进程】、【应用】和【文件】的访问和转变的权限,然后它使用一个安全策略来控制这些实体(用户、进程、应用和文件)之间的交互,安全策略指定如何严格或宽松地进行检查。
    1.对内核对象和服务的访问控制
    2.对进程初始化,继承和程序执行的访问控制
    3.对文件系统,目录,文件和打开文件描述的访问控制
    4.对端口,信息和网络接口的访问控制
    在linux里所有的文件和进程都有一个值,这个值被称为安全值,当我满足或者匹配到这个安全值,那么才能进行访问。(http默认目录是在/var/www/html当我将这个默认的访问目录更改时你默认创建的 目录对应性另一个安全值,而我们默认访问的就是第一种安全值所以如果开启了selinux则不能访问更改后目录的东西)-------安全子系统
    二、SELinux 的作用及权限管理机制
    2.1 SELinux 的作用
    SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源(最小权限原则)。设想一下,如果一个以 root 身份运行的网络服务存在 0day漏洞,黑客就可以利用这个漏洞,以 root 的身份在您的服务器上为所欲为了。是不是很可怕?SELinux 就是来解决这个问题的。
    2.2 DAC
    在没有使用 SELinux 的操作系统中,决定一个资源是否能被访问的因素是:某个资源是否拥有对应用户的权限(读、写、执行)。只要访问这个资源的进程符合以上的条件就可以被访问。而最致命问题是,root 用户不受任何管制,系统上任何资源都可以无限制地访问。这种权限管理机制的主体是用户,也称为自主访问控制(DAC)。
    2.3 MAC
    在使用了 SELinux 的操作系统中,决定一个资源是否能被访问的因素除了上述因素之外,还需要判断每一类进程是否拥有对某一类资源的访问权限。
    这样一来,即使进程是以 root 身份运行的,也需要判断这个进程的类型以及允许访问的资源类型才能决定是否允许访问某个资源。进程的活动空间也可以被压缩到最小。即使是以 root 身份运行的服务进程,一般也只能访问到它所需要的资源。即使程序出了漏洞,影响范围也只有在其允许访问的资源范围内。安全性大大增加。这种权限管理机制的主体是进程,也称为强制访问控制(MAC)。
    而 MAC 又细分为了两种方式,一种叫类别安全(MCS)模式,另一种叫多级安全(MLS)模式。下文中的操作均为 MCS 模式。
    三、SELinux 基本概念
    3.1 主体(Subject)可以完全等同于进程。
    注:为了方便理解,如无特别说明,以下均把进程视为主体。
    3.2 对象(Object)被主体访问的资源。可以是文件、目录、端口、设备等。
    注:为了方便理解,如无特别说明,以下均把文件或者目录视为对象。
    3.3 政策和规则(Policy & Rule)
    系统中通常有大量的文件和进程,为了节省时间和开销,通常我们只是选择性地对某些进程进行管制。
    而哪些进程需要管制、要怎么管制是由政策决定的。
    一套政策里面有多个规则。部分规则可以按照需求启用或禁用(以下把该类型的规则称为布尔型规则)。
    规则是模块化、可扩展的。在安装新的应用程序时,应用程序可通过添加新的模块来添加规则。用户也可以手动地增减规则。
    在 CentOS 7 系统中,有三套政策,分别是:

    1. targeted:对大部分网络服务进程进行管制。这是系统默认使用的政策(下文均使用此政策)。
    2. minimum:以 targeted 为基础,仅对选定的网络服务进程进行管制。一般不用。
    3. mls:多级安全保护。对所有的进程进行管制。这是最严格的政策,配置难度非常大。一般不用,除非对安全性有极高的要求。
      政策可以在 /etc/selinux/config 中设定。
      3.4 安全上下文(Security Context)
      安全上下文是 SELinux 的核心。
      安全上下文我自己把它分为「进程安全上下文」和「文件安全上下文」。
      一个「进程安全上下文」一般对应多个「文件安全上下文」。
      只有两者的安全上下文对应上了,进程才能访问文件。它们的对应关系由政策中的规则决定。
      文件安全上下文由文件创建的位置和创建文件的进程所决定。而且系统有一套默认值,用户也可以对默认值进行设定。
      需要注意的是,单纯的移动文件操作并不会改变文件的安全上下文。
      安全上下文的结构及含义
      安全上下文有四个字段,分别用冒号隔开。形如:system_u:object_r:admin_home_t:s0。
      3.5 SELinux 的工作模式
      SELinux 有三种工作模式,分别是:
    4. enforcing:强制模式。违反 SELinux 规则的行为将被阻止并记录到日志中。
    5. permissive:宽容模式。违反 SELinux 规则的行为只会记录到日志中。一般为调试用。
    6. disabled:关闭 SELinux。
      SELinux 工作模式可以在 /etc/selinux/config 中设定。
      如果想从 disabled 切换到 enforcing 或者 permissive 的话,需要重启系统。反过来也一样。
      enforcing 和 permissive 模式可以通过 setenforce 1|0 命令快速切换。
      需要注意的是,如果系统已经在关闭 SELinux 的状态下运行了一段时间,在打开 SELinux 之后的第一次重启速度可能会比较慢。因为系统必须为磁盘中的文件创建安全上下文(我表示我重启了大约 10 分钟,还以为是死机了……)。
      SELinux 日志的记录需要借助 auditd.service 这个服务,请不要禁用它。

    selinux级别
    enforcing: 强制(一定会生效)违反策略的行动都会被禁止
    permissive: 允许,警告
    disable: 禁用类似于没有selinux功能的系统
    级别切换
    禁用<–>强制:下次启动生效
    禁用<–>警告:下次启动生效
    强制<–>警告:即时生效
    在将selinux的模式改为强制访问模式后重启会特别慢的原因……selinux在操作系统的安全体制结构上进行扩张,增强对进程模块文件打上了一些安全标记
    SELINUX配置文件
    /etc/selinux/config

    #查看级别
    [root@web ~]#getenforce
    #使用命令行切换级别
    setenforce 0
    setenforce 1
    #修改级别
    #直接编辑/etc/selinux/config
    SELINUX=enforcing
    #修改完成后重启才能生效
    #查看selinux状态
    [root@web ~]#sestatus
    #查看selinux值
    [root@web ~]#ll -Z
    #查看context值的变化
    [root@web ~]#touch 1
    [root@web ~]#cp 1 /tmp
    [root@web ~]#ll -Z /tmp
    #该文件的context值会随着目录的作用和环境的不同而发生改变,该值会继承上一级目录的context值
    system_u:object_r:admin_home_t:s0
    这条语句通过:划分成了四段,第一段 system_u 代表的是用户,第二段 object_r 表示的是角色,第三段是SELinux中最重要的信息,admin_home 表示的是类型,最后一段 s0 是跟MLS、MCS相关的东西,暂时不需要管
    ①system_u指的是SElinux用户,root表示root账户身份,user_u表示普通用户无特权用户,system_u表示系统进程,通过用户可以确认身份类型,一般搭配角色使用。身份和不同的角色搭配时有权限不同,虽然可以使用su命令切换用户但对于SElinux的用户并没有发生改变,账户之间切换时此用户身份不变,在targeted策略环境下用户标识没有实质性作用。
    ②object_robject_r一般为文件目录的角色、system_r一般为进程的角色,在targeted策略环境中用户的角色一般为system_r。用户的角色类似用户组的概念,不同的角色具有不同的身份权限,一个用户可以具备多个角色,但是同一时间只能使用一个角色。在targeted策略环境下角色没有实质作用,在targeted策略环境中所有的进程文件的角色都是system_r角色。
    ③admin_home文件和进程都有一个类型,SElinux依据类型的相关组合来限制存取权限
    Touch /.autorelabel 系统当中默认启用了selinux,去读取一个去止文件,而这个文件里是否由内容他都要去读,读完之后它会给这些系统默认的文件设置安全值
    #修改context值,所以如果没有这一步你么系统也跨不出这一步所以系统就不会正常启动
    命令基本用法
    semanage fcontext -a -t “(/.*)?”
    注:目录或文件的默认安全上下文可以通过 semanage fcontext -l 命令配合 grep过滤查看
    chcon -t context值的类型 文件名
    [root@web ~]#chcon -t user_tmp_t 1
    #改变目录的值需要加上-R选项,表示递归
    chcon -tcontext值 directory -R
    #恢复一个文件的context值
    restorecon -v filename

    [@web ~]#restorecon -v 1
    [root@localhost~]# 
    [root@localhost~]# mkdir /test
    [root@localhost~]# touch file
    [root@localhost~]# ll -Z file
    -rw-r--r--.
    root root unconfined_u:object_r:admin_home_t:s0 file
    [root@localhost~]# cp file  /test
    [root@localhost~]# ll -Z /test
    -rw-r--r--.
    root root unconfined_u:object_r:default_t:s0 file
    [root@localhost~]# chcon  -t admin_home_t /test/file
    [root@localhost~]# ll -Z /test/file
    -rw-r--r--.
    root root unconfined_u:object_r:admin_home_t:s0 /test/file
    [root@localhost~]# restorecon -v /test/file 
    restoreconreset /test/file context
    unconfined_u:object_r:admin_home_t:s0->unconfined_u:object_r:default_t:s0
    [root@localhost~]# ll -Z /test/file
    -rw-r--r--.
    root root unconfined_u:object_r:default_t:s0 /test/file
    [root@localhost~]# 
    

    #查看进程的context值

    [root@web ~]#ps -Z
    [root@localhost
    ~]# semanage port -l | grep "\b80\b"
    http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000
    

    四、案例分析
    案例一:
    使用httpd服务演示context值得设定
    如下:
    #确保防火墙开启
    [root@web ~]#systemctl status firewalld
    #确保SELINUX开启
    [root@web ~]#getenforce
    [root@localhost~]# sestatus
    #创建web服务内容目录
    [root@web ~]#mkdir -p /www/80
    [root@web ~]#echo ‘welcome to 80!!!’ > /www/80/index.html
    #修改主服务配置文件以下选项:
    [root@web ~]#vi /etc/httpd/conf/httpd.conf
    ServerName 192.168.40.131:80
    #添加虚拟主机配置文件,并按如下进行配置
    [root@web ~]#vi /etc/httpd/conf.d/vhosts.conf
    <Directory"/www">
    AllowOverride None
    Require all granted
    </Directory>
    <VirtualHost192.168.221.146:80>
    DocumentRoot “/www/80”
    </VirtualHost>
    #如果在重启服务时,日志提示DNS解析失败时,按如下办法解决:
    [root@web ~]#vi /etc/hosts
    192.168.40.131 web
    #如果有布尔值的提示,请输入以下命令进行处理
    [root@web ~]#setsebool -P httpd_can_network_relay 1
    #在防火墙中添加web服务的放行规则
    [root@web ~]#firewall-cmd --permanent --add-service=http
    [root@web ~]#firewall-cmd --reload
    #通过浏览器进行访问,发现只能访问默认页,无法访问我们自定义的页面
    #这时需要修改自定义目录的context值,如下:
    [root@web ~]#chcon -t httpd_sys_content_t /www/ -R
    #chcon --reference /var/www/html/www 或者根据参照目录进行更改
    #无需重启http服务,即可通过浏览器进行正常访问
    案例二:
    使用web服务端口的改变来演示端口的设定如下
    #创建一个8888端口的web服务目录和默认页面

    [root@web ~]#mkdir -p /www/8888
    [root@web ~]#echo 'welcome to 8888!!!' > /www/8888/index.html
    

    #在上个案例的页面中添加如下内容:
    LISTEN 8888
    <VirtualHost192.168.40.131:8888>
    DocumentRoot “/www/8888”
    </VirtualHost>
    #保存退出后,重启服务。
    [root@web ~]#systemctl restart httpd
    #tail -f /var/log/massge
    #查看端口状态
    lsof -i:8080
    netstat -lntp | grep 8080
    #然后通过浏览器查看该web页面是否能正常访问
    #正常情况下,应该无法访问,首先,我们在防火墙添加允许该端口的策略

    [root@web ~]#firewall-cmd --permanent --add-port=8080/tcp
    [root@web ~]#firewall-cmd --reload
    #添加该自定义端口为服务端口
    [root@web ~]#semanage port -a -t http_port_t -p tcp 8888
    

    再通过浏览器进行查看该web服务,即可正常查看
    三、布尔值
    当你配置一个服务现在selinux也是开启的,所以你这个服务的有些功能是用不了的,而bool值相当于是一个开关,你把这个功能开关按上就好了
    #查看布尔值
    [root@web ~]#getsebool -a
    #查看ftp相关的布尔值
    [root@web ~]#getsebool -a | grep ftp
    #设置布尔值
    setsebool -P ftp_home_dir on
    案例:
    使用ftp服务演示布尔值的设定
    开启vsftp服务,配置为本地用户允许读写家目录,不允许遍历其他目录
    配置如下:
    #添加防火墙允许策略
    [root@web ~]#firewall-cmd --permanent --add-service=ftp
    [root@web ~]#firewall-cmd --reload
    [禁止匿名用户]
    anonymous_enable=no
    [禁止遍历]
    #首先开启chroot选项
    allow_writeable_chroot=YES
    #打开chroot选项
    chroot_list_enable=YES
    #指定打开谁的CHROOT
    chroot_list_file=/etc/vsftpd/chroot_list
    #确保以下选项参数无误
    local_enable=YES
    write_enable=YES
    Vim /etc/vsftpd/chroot_list
    redhat
    #修改布尔值打开/home目录的权限

    [root@localhosthaha]# getsebool -a | grep ftp_home_dirftp_home_dir
    --> off
    [root@localhosthaha]# setsebool -P ftp_home_dir on
    

    #使用图形界面切换级别
    安装policycoreutils-gui
    执行system-config-selinux

    展开全文
  • Java当中IO阻塞时调用interrupt的疑问在java当中打断一个线程一般是使用一个变量标记和调用interrupt方法Threads blocked in one of Object's wait() methods or one of Thread's join() or sleep() methods will be...

    Java当中IO阻塞时调用interrupt的疑问

    在java当中打断一个线程一般是使用一个变量标记和调用interrupt方法

    Threads blocked in one of Object's wait() methods or one of Thread's join() or sleep() methods will be woken up, their interrupt status will be cleared, and they receive an InterruptedException.

    Threads blocked in an I/O operation of an InterruptibleChannel will have their interrupt status set and receive an ClosedByInterruptException. Also, the channel will be closed.

    Threads blocked in a Selector will have their interrupt status set and return immediately. They don't receive an exception in this case.

    根据文档里和网上找到的资料看,在io阻塞时调用interrupt其实是无效的

    按照我的理解是在while循环里做标记判断,最后final里关闭流

    问题1 :

    但是有人说在io阻塞时interrupt会抛出io异常?问什么我实验输入输出流的时候,没有出现呢?

    问题2 :

    还有就是InterruptedIOException这个异常是什么意思,会在什么样的情况下出现?

    相关阅读:

    node环境能直接运行es6代码吗

    删除Boot Option Menu中的Ubuntu选项

    网上搜的jquery轮播图代码的疑问?

    touchend 事件在 iPhone 上过于灵敏,如何解决?

    python安装 django_rundirect报错

    关于webpack打包(诸多小项目)?

    小白请教:原生app的开发,样式方面是用什么实现的?还是css吗?

    js有没有什么方法能判断用户使用的是什么格式连接的网络?

    ubuntu最佳分区方案是什么

    视频的"看点"实现有哪些方法?

    需要insert或者update的字段是随机的,如何拼接sql语句

    小白c语言链表问题

    怎么让android的surfaceview中的动画更加平滑流畅

    java imagemagick的小问题,返回的状态是4

    tcpdump抓包提示:tcpdump: eht1: No such device exists

    Calendar的add方法中的DAY_OF_MONTH参数和DAY_OF_YEAR参数有什么区别?

    iOS蓝牙开发,数据发送遇到问题

    页面导航栏的二级菜单占用了主体的空间

    ios如何判断用户停止点击按钮

    如何设置联动的下拉选项菜单的默认值

    展开全文
  • 关闭钩子

    2021-02-09 20:46:35
    例如,在Tomcat的部署应用当中,通过实例化一个Server对象来启动servlet容器,调用其start()方法,然后逐个调用组件的start方法。正常情况下,为了让Server对象能够关闭这些已经启动的组件,应该通过发送关闭命令的...
    
    


    前言

    在很多实际应用环境中,当用户关闭了应用程序时,需要做一些善后清理工作,但问题是,用户有时并不会按照推荐的方法关闭应用程序,很有可能不会做清理工作。例如,在Tomcat的部署应用当中,通过实例化一个Server对象来启动servlet容器,调用其start()方法,然后逐个调用组件的start方法。正常情况下,为了让Server对象能够关闭这些已经启动的组件,应该通过发送关闭命令的方式。如果你只是简单的突然退出,例如在应用程序运行过程中关闭控制台,可能会发生一些意想不到的事情

    幸运的是,Java为程序员提供了一种优雅的方法可以再关闭过程中执行一些代码,这样就能确保那些负责善后处理的代码肯定能够执行。本章将展示如何使用关闭钩子来确保清理代码总是能够执行,无论用户如何终止应用程序。


    一、关闭钩子

    在Java中,虚拟机会对两类事件进行响应,然后执行关闭操作:

    • 当调用System.exit方法或者程序的最后一个非守护线程退出时,应用程序可以正常退出;
    • 用户突然强制虚拟机中断运行,例如用户按CTRL+C快捷键或者在未关闭Java程序的情况下,从系统中退出。

    幸运的是,虚拟机在执行关闭操作时,会经过以下两个阶段:

    1. 虚拟机启动所有已经注册的关闭钩子,如果有的话,关闭钩子是先前已经通过Runtime类注册的线程,所有的关闭钩子会并发执行,直到完成任务。
    2. 虚拟机根据情况调用所有没有被调用过的终结器(finalizer).

    本章重点说明第一个阶段,因为该阶段允许程序员告诉虚拟机在应用程序中执行一些清理代码,关闭钩子很简单,只是一个java.lang.Thread类的一个子类的实例,创建关闭钩子很简单:

    • 创建Thread类的一个子类
    • 实现run方法,当应用程序(正常或突然)关闭时,会调用此方法
    • 在应用程序中,实例化关闭钩子类
    • 使用当前Runtime类的addShutdownHook方法注册关闭钩子.

    也许你已经注意到了,不需要像启动其他线程一样调用关闭钩子的start方法,虚拟机会在它运行其关闭流程时启动并执行关闭钩子。

    二、简单案例

    定义一个简单的ShutdownHookDemo类和一个Thread类(ShutdownHook类)的子类。注意,ShutdownHook类的run方法只是简单地将字符串"Shutting down"输出到控制台上,但是可以插入在应用程序关闭之前执行的任何代码。

    import java.io.IOException;
    
    public class ShutdownHookDemo {
    
        public void start() {
            System.out.println("Demo");
            ShutdownHook shutdownHook = new ShutdownHook();
            Runtime.getRuntime().addShutdownHook(shutdownHook);
        }
    
        public static void main(String[] args) {
            ShutdownHookDemo shutdownHookDemo = new ShutdownHookDemo();
            shutdownHookDemo.start();
            try {
                System.in.read();
            } catch (IOException e) {
            }
        }
    
        class ShutdownHook extends Thread {
            @Override
            public void run() {
                System.out.println("Shutting down");
            }
        }
    }
    

    在实例化ShutdownHookDemo类后,main方法会调用start方法。start方法会创建一个关闭钩子,并通过当前Runtime注册它。然后,应用程序会等待用户输入,当用户按下Enter键之后,应用程序会退出,但是,虚拟机会执行关闭钩子,最后在控制台输出字符串"Shutting down"。
    在这里插入图片描述

    三、Tomcat中的钩子方法案例

    正如你想的一样,Tomcat也是通过关闭钩子来完成退出流程的,在org.apache.catalina.startup.Catalina类中,可以找到这样的代码。Catalina类负责启动管理其他组件的Server对象。一个名为CatalinaShutdownHook的内部类继承自Thread类,提供了run方法的实现,它会调用Server对象的stop方法,完成关闭操作。如下所示

    /**
     * Shutdown hook which will perform a clean shutdown of Catalina if needed.
     */
    protected class CatalinaShutdownHook extends Thread {
    
        @Override
        public void run() {
            try {
                if (getServer() != null) {
                    Catalina.this.stop();
                }
            } catch (Throwable ex) {
                ExceptionUtils.handleThrowable(ex);
                log.error(sm.getString("catalina.shutdownHookFail"), ex);
            } finally {
                // If JULI is used, shut JULI down *after* the server shuts down
                // so log messages aren't lost
                LogManager logManager = LogManager.getLogManager();
                if (logManager instanceof ClassLoaderLogManager) {
                    ((ClassLoaderLogManager) logManager).shutdown();
                }
            }
        }
    }
    

    在Catalina实例启动时,会实例化关闭钩子,并在一个阶段将其添加到Runtime类中。
    在这里插入图片描述
    注册了关闭钩子,但是也要注意如果是正常调用stop方法的情况下需要首先通过java.lang.Runtime#removeShutdownHook方法移除钩子以免触发两次的关闭操作。

    /**
     * Stop an existing server instance.
     */
    public void stop() {
    
        try {
            // Remove the ShutdownHook first so that server.stop()
            // doesn't get invoked twice
            if (useShutdownHook) {
                Runtime.getRuntime().removeShutdownHook(shutdownHook);
    
                // If JULI is being used, re-enable JULI's shutdown to ensure
                // log messages are not lost
                LogManager logManager = LogManager.getLogManager();
                if (logManager instanceof ClassLoaderLogManager) {
                    ((ClassLoaderLogManager) logManager).setUseShutdownHook(
                            true);
                }
            }
        } catch (Throwable t) {
            ExceptionUtils.handleThrowable(t);
            // This will fail on JDK 1.2. Ignoring, as Tomcat can run
            // fine without the shutdown hook.
        }
    
        // Shut down the server
        try {
            Server s = getServer();
            LifecycleState state = s.getState();
            if (LifecycleState.STOPPING_PREP.compareTo(state) <= 0
                    && LifecycleState.DESTROYED.compareTo(state) >= 0) {
                // Nothing to do. stop() was already called
            } else {
                s.stop();
                s.destroy();
            }
        } catch (LifecycleException e) {
            log.error(sm.getString("catalina.stopError"), e);
        }
    
    }
    

    总结

    有时候,应用程序在关闭之前应该执行一些代码清理工作,但是,你不能假设用户总是正常退出。本章介绍的关闭钩子提供了一种解决方案,确保无论用户如何关闭应用程序,清理代码总是能够得到执行。

    展开全文
  • (1)为保证远程可访问,这里的ip尽量使用公网ip,且创建集群时可先关闭防火墙,否则可以出现一直join……的现象。 (2)redis集群至少需要3个主节点,每个主节点有一个从节点总共6个节点 (3)replicas指定为1表示每个主...

    一.搭建redis单机

    本文搭建redis3.0版本,3.0主要增加了redis cluster集群功能。

    1.下载地址:http://download.redis.io/releases/redis-3.0.0.tar.gz,将下载文件拷贝到/usr/local

    2.解压源码:tar -zxvf redis-3.0.0.tar.gz

    3.编译源码:cd /usr/local/redis-3.0.0

    make

    4.安装到指定目录: cd /usr/local/redis-3.0.0

    make PREFIX=/usr/local/redis install

    5.进入源码目录,将redis.conf拷贝到安装路径:cd /usr/local/redis

    mkdir conf

    cp /usr/local/redis-3.0.0/redis.conf /usr/local/redis/bin

    6.修改redis.conf配置文件,以后端模式启动:daemonize yes

    7.启动redis:cd /usr/local/redis ./bin/redis-server ./redis.conf  //在何处启动的server,一些配置文件就默认在该处生成(如果配置的相对路径)

    8.redis.conf配置文件主要配置:

    port 7001 //监听的端口

    # bind 127.0.0.1 //绑定ip,只允许该ip访问,不填默认为*,表示允许所有ip访问

    requirepass "你的密码" //开启密码

    loglevel debug //日志级别,开发模式尽量选用debug

    logfile "redis.log" //日志文件路径,此处使用相对路径,将生成到/usr/local/redis下

    maxmemory 100000000 //允许最大内存占用100m

    appendonly yes //启用aof

    auto-aof-rewrite-percentage 80 //部署在同一机器的多个redis实例,建议把auto-aof-rewrite错开(可分别写80-100不等),防止瞬间fork,所有redis进程做rewrite,占用大量内存

    9.jedis连接redis单机:

    1

    2 redis.clients

    3 jedis

    4 2.7.0

    5

    连接池整合spring:

    1 @RunWith(SpringJUnit4ClassRunner.class) //指定测试用例的运行器 这里是指定了Junit4

    2 @ContextConfiguration("classpath:spring/application*.xml")3 public classRedisTest {4 @Autowired5 privateJedisPool pool;6 @Test7 public voidtestJedisPool() {8 Jedis jedis = null;9 String name = null;10 try{11 jedis =pool.getResource();12 jedis.set("testName", "RCL");13 name = jedis.get("testName");14 } catch(Exception ex) {15 ex.printStackTrace();16 } finally{17 if (jedis != null) {18 //返回给池

    19 jedis.close();20 }21 Assert.assertEquals("RCL", name);22 }23 }

    10.如果连接不上,可查看是否防火墙没有将redis端口开放:/etc/sysconfig/iptables添加:

    -A INPUT -p tcp -m state --state NEW -m tcp --dport 7001 -j ACCEPT //7001即redis端口

    重启防火墙

    二、搭建redis集群

    1.安装ruby环境

    集群管理工具redis-trib.rb依赖ruby环境

    (1)安装ruby:

    yum install ruby yum install rubygems

    (2)安装ruby和redis的接口程序:

    拷贝redis-3.0.0.gem至/usr/local。执行:gem install /usr/local/redis-3.0.0.gem

    2.建立redis实例

    (1)建立存放redis群的文件夹及子文件夹(用于存放每个redis实例):

    cd /usr/local

    mkdir redis-cluster

    mkdir redis-cluster/7001

    mkdir redis-cluster/7002

    ……

    (2)将刚刚安装的单机redis的/usr/local/redis文件夹拷贝到每个700X文件夹下,(这里我们建立六个实例,三主三从)

    (3)修改每个700X目录下的redis.conf配置文件:

    port 700X //各自监听的端口

    #bind 127.0.0.1 //这里不绑定,默认允许所有ip访问,或者bind 0.0.0.0

    cluster-enabled yes //开启集群

    cluster-node-timeout 15000 //15时间内没有收到对方的回复,则单方面认为端节点挂掉

    另外,由于下面我们需要配置集群密码,故之前配置的 requirepass 先删掉,集群成功后再进行配置。

    3.启动各个redis:分别进入7001、7002、...7006目录,执行./redis-server ./redis.conf

    4.创建集群:/usr/local/redis-cluster/redis-trib.rb create --replicas 1 123.123.123.123:7001 123.123.123.123:7002 123.123.123.123:7003 123.123.123.123:7004 123.123.123.123:7005 123.123.123.123:7006

    注意:

    (1)为保证远程可访问,这里的ip尽量使用公网ip,且创建集群时可先关闭防火墙,否则可以出现一直join……的现象。

    (2)redis集群至少需要3个主节点,每个主节点有一个从节点总共6个节点

    (3)replicas指定为1表示每个主节点有一个从节点

    (4)如果出现[ERR] Sorry, can't connect to node错误:

    1.ruby 和rubygem 版本太低,安装新版本。查看gem版本和redis版本(redis-cli -v可查看redis版本)

    2.查看reids配置文件,bind绑定的允许连接的ip是否正确。

    3.是否redis配置文件还是使用了密码,使用了密码也可能导致这个错误。

    (5)如果出现[ERR] Node 127.0.0.1:7005 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0:

    表示集群时,之前的redis已有数据,那么登录到7005的redis中,执行FLUSHALL即可

    (6)如果出现ERR Slot 0 is already busy (Redis::CommandError):

    用redis-cli登录到每个节点执行flushall和cluster reset即可2.6进入集群:./redis-cli -c  -p 7001 -h 123.123.123.123(-c即-cluster 表示进入集群模式,不加表示进入单机redis)

    5.检查集群是否成功:进入集群后,键入cluster info,显示cluster_state:ok,表示成功

    6.设置密码:

    (1)登录到每个节点,执行 config set masterauth 你的密码 config set requirepass 你的密码

    (2)随后登入 7001/bin/redis-cli -c -h 112.74.55.239 -p 7004 -a 你的密码,执行: config rewrite

    (3)防火墙开放7001到7006端口,以及redis总线:17001到17006:

    -A INPUT -p tcp -m state --state NEW -m tcp --dport 7001:7006 -j ACCEPT

    -A INPUT -p tcp -m state --state NEW -m tcp --dport 17001:17006 -j ACCEPT

    7.JedisCluster连接redis集群

    1

    2 redis.clients

    3 jedis

    4 2.9.0//2.9.0才支持cluster密码认证,之前版本的jedisCluster.auth("密码")方法里面什么都没有实现,仅仅抛一个JedisClusterException("No way to dispatch this command to Redis Cluster.")5

    整合spring:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    1 @RunWith(SpringJUnit4ClassRunner.class)2 @ContextConfiguration("classpath:spring/application*.xml")3 public classRedisTest {4 @Autowired5 privateJedisCluster jCluster;6 @Test7 public voidtestJCluster() {8 jCluster.set("name", "RCL");9 String name = jCluster.get("testName");10 Assert.assertEquals("RCL", name);11 }

    原文链接:https://blog.csdn.net/localhost01/article/details/71436801

    展开全文
  • requests关闭重定向

    2020-04-22 22:54:58
    在requests请求当中可以添加参数 allow_redirects=False来关闭重定向 但是在关闭重定向后悔产生一个warning 可以添加以下代码关闭警告 from requests.packages.urllib3.exceptions import InsecureRequestWarning # ...
  • CentOS7开始使得以往老版本系统服务的/etc/init.d的启动脚本的方式就此改变,在CentOS7中所有对服务的管理都集中到了systemctl当中。作者测试ubuntu继承了这一特性,使得以往在运行级别和/etc/init中设置关闭某个服务...
  • java当中的异常

    2017-04-17 15:11:00
    程序在运行当中产生的错误叫做异常 语法上正确运行错误 2.异常的分类 当程序产生异常时,虚拟机会生成一个异常对象 所有的异常类都是Throwble的子类 异常被分为两大类: Error:错误,指虚拟机在运行时...
  • Java Swing的窗体和对话框的关闭事件无非...windowClosing用于窗体关闭时被调用,这个时候窗体还处在运行并显示当中,所以为了方便可以把这个方法称为关闭前调用的方法。值得注意的是当我们按下窗体或对话框的的右...
  • Java Swing的窗体和对话框的关闭事件无非...windowClosing用于窗体关闭时被调用,这个时候窗体还处在运行并显示当中,所以为了方便可以把这个方法称为关闭前调用的方法。值得注意的是当我们按下窗体或对话框的的右...
  • Java Swing的窗体和对话框的关闭事件无非...windowClosing用于窗体关闭时被调用,这个时候窗体还处在运行并显示当中,所以为了方便可以把这个方法称为关闭前调用的方法。值得注意的是当我们按下窗体或对话框的的右...
  • vue关闭严格模式

    2020-10-08 14:31:24
    vue的严格模式非常烦人,为了关闭它百度很久没有结果,但方法其实很简单。...然后进入到想要修改的项目当中 然后点击配置,出现了以下的界面 这个ESLint默认是必须的,改成推荐就可以顺利关闭严格模式。 ...
  • 在项目开发当中,当用户点击一个按钮时如果执行的是一个非常耗时的操作,处理不好很容易导致系统假死,用户体验很差,而Android开发当中则是,如果任意一个Acitivity没有响应5秒钟以上就会被强制关闭,因此我们需要...
  • Java Swing的窗体和对话框的关闭事件无非...windowClosing用于窗体关闭时被调用,这个时候窗体还处在运行并显示当中,所以为了方便可以把这个方法称为关闭前调用的方法。值得注意的是当我们按下窗体或对话框的的右...
  • Java当中的内存泄漏

    2020-11-19 15:26:24
    5.一些连接资源没关闭 6.静态变量容器 7.单例对象引用外部对象 怎么避免内存泄露: 1.作用域尽量保持一致 2.用StringBuffer或者StringBuilder代替String连接字符量 3.不再使用的对象值赋值为null 4.连接资源的对象要...
  • H5当中的web缓存

    2020-12-01 19:41:03
    localStorage 方法存储的数据没有时间限制 保存数据 localStorage.setItem("name",...sessionStorage 方法当用户关闭浏览器窗口后,数据会被删除 保存数据 sessionStorage.setItem("name", “Jack"); 读取...
  • JavaSwing的窗体和对话框的关闭事件无非...windowClosing用于窗体关闭时被调用,这个时候窗体还处在运行并显示当中,所以为了方便可以把这个方法称为关闭前调用的方法。值得注意的是当我们按下窗体或对话框的的右上...
  • 安全关闭 Linux 的方式

    千次阅读 2019-03-24 19:37:44
    安全关闭 Linux 的方式 关机命令 $ sudo sync # 把内存中的数据缓存写入硬盘 $ sudo shutdown now # 立刻关机 在Linux系统中,为了加快数据的读取速度,在默认的情况中, 某些已经加载内存中的数据不会直接...
  • 自动关闭、重启网卡

    千次阅读 2019-07-17 10:48:47
    实际在测试过程当中,需要模拟这种场景,那么可不可以模拟隔一段时间自动断网,一段时间后自动启动网络,当然可以,这个不然,我们定时关闭网卡,重启网卡就可以了。 二、实现步骤 1、编写shell脚本 2、将脚本...
  • 有几点请大家了解(可以不看): 1、relative相对定位会在标准流当中占位置; 2、absolute绝对定位不会在标准流当中占位置; 3、绝对定位一定要有...首先:比如广告横幅右上角“关闭按钮”(我们的本意是要让图标“浮”在...
  • 点击遮罩层的背景关闭遮罩层

    万次阅读 多人点赞 2019-01-16 19:51:36
    在模仿华为官方网页的练习当中我发现华为官网中有一个遮罩层是随便点击遮罩层的背景也能关闭掉遮罩层,但唯独点击内容区域不会关闭掉遮罩层。于是我开始模仿这个写案例,连内容也一模一样(因为这个练习就是要写出和...
  • 登录成功 用户信息保存在 localStorage 当中 此时可以向 sessionStorage 中 保存一个唯一标识 isLogin 入口文件判断 sessionStorage 中 是否有 isLogin 值 如果没值 就表示浏览器关闭过 所以 sessionStorage 里的...
  • HDFS 启动与关闭

    千次阅读 2016-05-04 16:35:14
    一.HDFS 启动与关闭 HDFS 和普通的硬盘上的文件系统不一样,是通过Java 虚拟机运行在整个集群当中的,所以当Hadoop 程序写好之后,需要启动HDFS 文件系统,才能运行。 HDFS 启动过程如下: 1)进入到NameNode ...
  • Java当中的IO二

    2017-04-17 15:41:00
    注意:在关闭read()和write()的时候可能会产生IOException,需要对其进行处理,否则编译将不通过(checked Exception) 2.字符流的使用方法 除了用上面的字节流的方式读取数据,我们还可以通过字符流的方式...
  • PS文件的打开与关闭

    千次阅读 2018-07-26 08:54:10
    一、文件常用打开方法 1.文件菜单--新建(ctrl+O)。 2.双击PS画面区域打开。...3.直接拖动文件到PS当中。(可批量操作) 4.直接双击打开PSD文件。 二、文件的关闭 点击文件窗口的关闭按钮即可 ...
  • 关闭selinux和iptables

    2015-12-18 16:23:00
    在上mysql的课的时候,老师总是提示千万千万一定要关闭selinux和iptables。不然可能会出现什么乱七八糟的权限问题等等。我也找到一篇文章是关于这个的。 链接为...
  • 简单的说就是把要关闭的流,传入到工具类当中,然后调用工具类实现关闭流的效果; 关键在于:做一个关闭流接口的形参,里面的参数代表可变参数,不管传进来多少个参数都会放到数组里面 一、以随机流关闭为...
  • 我们讲解了Eureka当中的自我保护,我们看如何关闭自我保护,这个自我保护是谁来完成的,由我们Eureka Server来完成的, 所以我们需要在Eureka Server的配置文件当中,添加两个配置,这两个配置是什么意思呢,是自我保护的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,457
精华内容 582
关键字:

关闭当中