tomcat
tomcat
标签(空格分隔):常用配置
部署Java环境jdk
将所需软件包上传到服务器
# jdk解压安装
[root@wanghongwei ~]# tar xf jdk-8u60-linux-x64.tar.gz -C /usr/local/
[root@wanghongwei ~]# ln -s /usr/local/jdk1.8.0_60/ /usr/local/jdk
#配置Java环境变量(此操作必须操作)
[root@wanghongwei ~]# sed -i.ori '$a export JAVA_HOME=/usr/local/jdk\nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH\nexport CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar' /etc/profile
///关于上面那个sed命令的说明:
///sed -i.ori :-i表示对文件本身操作,.ori表示修改的同时备份源文件
///$a :$表示文件内容的最后一行,a表示在下面进行数据插入
\n :表示插入数据时换行
[root@wanghongwei ~]# tail -3 /etc/profile
#Java的家,jdk的安装目录,必须
export JAVA_HOME=/usr/local/jdk
#添加环境变量
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
#让Java环境变量立即生效
[root@wanghongwei ~]# source /etc/profile
#检查Java环境安装情况
[root@wanghongwei ~]# which java
/usr/local/jdk/bin/java
#查看Java版本,出现版本信息表示部署成功
[root@wanghongwei ~]# java -version
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)
安装tomcat
#解压安装tomcat
[root@wanghongwei ~]# tar xf apache-tomcat-8.0.27.tar.gz -C /usr/local/
[root@wanghongwei ~]# ln -s /usr/local/apache-tomcat-8.0.27/ /usr/local/tomcat
#配置tomcat环境变量
[root@wanghongwei ~]# echo 'export TOMCAT_HOME=/usr/local/tomcat' >> /etc/profile
#查看配置效果
[root@wanghongwei ~]# tail -1 /etc/profile
export TOMCAT_HOME=/usr/local/tomcat
#生效配置
[root@wanghongwei ~]# source /etc/profile
#查看jdk和tomcat安装目录属主属组
[root@localhost ~]# ll -d /usr/local/tomcat/
drwxr-xr-x 9 root root 4096 Dec 7 15:08 /usr/local/tomcat/
[root@localhost ~]# ll -d /usr/local/jdk
lrwxrwxrwx 1 root root 23 Dec 7 14:44 /usr/local/jdk -> /usr/local/jdk1.8.0_60/
///如属主属组不是root需进行修改
[root@localhost tomcat]# chown -R root.root /usr/local/jdk/ /usr/local/tomcat/
#检查环境变量配置情况
[root@localhost tomcat]# tail -4 /etc/profile
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
export TOMCAT_HOME=/usr/local/tomcat
tomcat目录介绍
#挂载光盘
[root@localhost tomcat]# mount /dev/sr0 /media/cdrom/
mount: block device /dev/sr0 is write-protected, mounting read-only
#安装tree软件包
[root@localhost tomcat]# yum -y install tree
#进入tomcat安装目录
[root@localhost tomcat]# pwd
/usr/local/tomcat
#查看所在目录
[root@localhost tomcat]# pwd
/usr/local/tomcat
#查看当前目录的一级目录
[root@localhost tomcat]# tree -L 1
.
├── bin #用于启动,关闭tomcat或者其他功能的脚本(.bat文件和.sh文件)
├── conf #用以配置tomcat的XML及DTD文件
├── lib #存放web应用能访问的Java包
├── LICENSE
├── logs #catalina和其他web程序的日志文件
├── NOTICE
├── RELEASE-NOTES
├── RUNNING.txt
├── temp #临时文件
├── webapps #web应用程序的根目录
└── work #用以产生有JSP编译出的servlet的.java和.class文件
7 directories, 4 files
#进入webapps目录
[root@localhost tomcat]# cd webapps/
#查看所在目录位置
[root@localhost webapps]# pwd
/usr/local/tomcat/webapps
#查看目录下的文件信息
[root@localhost webapps]# ll
total 20
drwxr-xr-x 14 root root 4096 Dec 7 15:08 docs #tomcat帮助文档
drwxr-xr-x 6 root root 4096 Dec 7 15:08 examples #web应用实例
drwxr-xr-x 5 root root 4096 Dec 7 15:08 host-manager #管理
drwxr-xr-x 5 root root 4096 Dec 7 15:08 manager #管理
drwxr-xr-x 3 root root 4096 Dec 7 15:08 ROOT #默认网址根目录
启动tomcat
#启动程序
[root@localhost webapps]# /usr/local/tomcat/bin/startup.sh
#关闭程序
[root@localhost webapps]# /usr/local/tomcat/bin/shutdown.sh
#启动tomcat服务
[root@localhost ~]# /usr/local/tomcat/bin/startup.sh #程序启动
Using CATALINA_BASE: /usr/local/tomcat #检查环境变量CATALINA_BASE
Using CATALINA_HOME: /usr/local/tomcat #检查环境变量CATALINA_HOME
Using CATALINA_TMPDIR: /usr/local/tomcat/temp #检查环境变量CATALINA_TMPDIR
Using JRE_HOME: /usr/local/jdk #检查环境变量JRE_HOME
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
#查看服务启动情况
[root@localhost ~]# ss -antup | grep java
tcp LISTEN 0 100 :::8080 :::* users:(("java",1280,46))
tcp LISTEN 0 1 ::ffff:127.0.0.1:8005 :::* users:(("java",1280,66))
tcp LISTEN 0 100 :::8009 :::* users:(("java",1280,51))
访问网站
网址为IP:8080(访问时注意关闭防火墙iptables)
查看tomcat日志
#进入日志目录
root@wanghongwei webapps]# cd /usr/local/tomcat/logs/
#查看日志文件
[root@wanghongwei logs]# ll
total 24
-rw-r--r-- 1 root root 6066 Dec 7 06:18 catalina.2019-12-07.log
-rw-r--r-- 1 root root 6066 Dec 7 06:18 catalina.out
-rw-r--r-- 1 root root 0 Dec 7 06:18 host-manager.2019-12-07.log
-rw-r--r-- 1 root root 280 Dec 7 06:18 localhost.2019-12-07.log
-rw-r--r-- 1 root root 741 Dec 7 06:20 localhost_access_log.2019-12-07.txt
-rw-r--r-- 1 root root 0 Dec 7 06:18 manager.2019-12-07.log
#打开日志
[root@wanghongwei logs]# cat catalina.out
[root@wanghongwei logs]# cat catalina.out
07-Dec-2019 06:18:38.091 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version: Apache Tomcat/8.0.27
07-Dec-2019 06:18:38.093 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built: Sep 28 2015 08:17:25 UTC
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
tomcat配置文件
tomcat的配置文件
#进入tomcat配置文件存放目录
[root@wanghongwei logs]# cd /usr/local/tomcat/conf/
#查看配置文件
[root@wanghongwei conf]# ll
total 216
drwxr-xr-x 3 root root 4096 Dec 7 06:18 Catalina
-rw------- 1 root root 12374 Sep 28 2015 catalina.policy
-rw------- 1 root root 7106 Sep 28 2015 catalina.properties
-rw------- 1 root root 1577 Sep 28 2015 context.xml
-rw------- 1 root root 3387 Sep 28 2015 logging.properties
-rw------- 1 root root 6458 Sep 28 2015 server.xml #主配置文件
-rw------- 1 root root 1744 Sep 28 2015 tomcat-users.xml #tomcat管理用户配置文件
-rw------- 1 root root 1846 Sep 28 2015 tomcat-users.xsd
-rw------- 1 root root 167302 Sep 28 2015 web.xml
tomcat配置管理
测试功能,生产环境不要用:
Tomcat管理功能用于对Tomcat自身以及部署在Tomcat上的应用进行管理的Web应用。在默认情况下是处于禁用状态的。如果需要开启这个功能,就需要配置管理用户,即配置前面说过的tomcat-users.xml。
#找到配置文件39行
[root@wanghongwei conf]# cat -n /usr/local/tomcat/conf/tomcat-users.xml | sed -n '39p'39 </tomcat-users>
#在39行前添加如下内容
[root@wanghongwei conf]# tail -4 /usr/local/tomcat/conf/tomcat-users.xml
。。。。。。。。。。。。。。。。。。。。。加入内容。。。。
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/>
。。。。。。。。。。。。。。。。。。。。。
</tomcat-users>
#重启tomcat服务#关闭tomact服务
[root@wanghongwei conf]# /usr/local/tomcat/bin/shutdown.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
#启动tomcat服务
[root@wanghongwei conf]# /usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
测试连接
#测试网址为:http://192.168.71.142:8080/manager/status
账户:tomcat
密码:tomcat
tomcat配置文件server.xml详解
server.xml组件类别
顶级组件:位于整个配置的顶层,如server。
容器类组件:可以包含其他组件的组件,如service,engine,host,context
连接器组件:连接用户请求至tomcat,如connector。
被嵌套类组件:位于一个容器当中,不能包含其他组件,如Valve,logger。
<server><service><connector /><engine><host><context></context></host><host><context></context></host></engine></service>
</server>
组件详解
engine:核心容器组件,catalina引擎,负责通过connector接收用户请求,并处理请求,将请求转至对应的虚拟主机host。
host:类似于httpd中的虚拟主机,一般而言支持基于FQDN的虚拟主机。
context:定义一个应用程序,是一个最内层的容器类组件(不能再嵌套)。配置context的主要目的指定对应对的webapp的根目录,类似于httpd的alias,其还能为webapp指定额外的属性,如部署方式等。
connector:接收用户请求,类似于httpd的listen配置监听端口。
service(服务):将connector关联至engine,因此一个service内部可以有多个connector,但只能又一个引擎engine。service内部有两个connector,一个engine。因此,一般情况下一个server内部只有一个service,一个service内部只有一个engine,但一个service内部可以有多个connector。
server:表示一个运行于JVM中的tomcat实例。
Valve:阀门,拦截请求并在将其转至对应的webapp前进行某种处理操作,可以用于任何容器中,比如记录日志(access log valve),基于IP做访问控制(remote address filer valve)。
logger:日志记录器,用于记录组件内部的状态信息,可以用于除context外的任何容器中。
realm:可以用于任意容器类的组件中,关联一个用户认证库,实现认证和授权。可以关联的认证库有两种:UserDatabaseRealm,MemoryRealm和JDBCRealm。
UserDatabaseRealm:使用JNDI自定义的用户认证库。
MemoryRealm:认证信息定义在tomcat-users.xml中。
JDBCRealm:认证信息定义在数据库中,并通过JDBC连接至数据库中查找认证用户。
配置文件注释
<?xml version='1.0' encoding='utf-8'?>
<!--
<Server>元素代表整个容器,是Tomcat实例的顶层元素.由org.apache.catalina.Server接口来定义.它包含一个<Service>元素.并且它不能做为任何元素的子元素.port指定Tomcat监听shutdown命令端口.终止服务器运行时,必须在Tomcat服务器所在的机器上发出shutdown命令.该属性是必须的.shutdown指定终止Tomcat服务器运行时,发给Tomcat服务器的shutdown监听端口的字符串.该属性必须设置
-->
<Server port="8005" shutdown="SHUTDOWN"><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服务组件--><Service name="Catalina"><!--connector:接收用户请求,类似于httpd的listen配置监听端口.port指定服务器端要创建的端口号,并在这个端口监听来自客户端的请求。address:指定连接器监听的地址,默认为所有地址(即0.0.0.0)protocol连接器使用的协议,支持HTTP和AJP。AJP(Apache Jserv Protocol)专用于tomcat与apache建立通信的, 在httpd反向代理用户请求至tomcat时使用(可见Nginx反向代理时不可用AJP协议)。minProcessors服务器启动时创建的处理请求的线程数maxProcessors最大可以创建的处理请求的线程数enableLookups如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址redirectPort指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号acceptCount指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理connectionTimeout指定超时的时间数(以毫秒为单位)--><Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" /><Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /><!--engine,核心容器组件,catalina引擎,负责通过connector接收用户请求,并处理请求,将请求转至对应的虚拟主机hostdefaultHost指定缺省的处理请求的主机名,它至少与其中的一个host元素的name属性值是一样的--><Engine name="Catalina" defaultHost="localhost"><!--Realm表示存放用户名,密码及role的数据库--><Realm className="org.apache.catalina.realm.LockOutRealm"><Realm className="org.apache.catalina.realm.UserDatabaseRealm"resourceName="UserDatabase"/></Realm><!--host表示一个虚拟主机name指定主机名appBase应用程序基本目录,即存放应用程序的目录.一般为appBase="webapps" ,相对于CATALINA_HOME而言的,也可以写绝对路径。unpackWARs如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接从WAR文件中运行应用程序autoDeploy:在tomcat启动时,是否自动部署。xmlValidation:是否启动xml的校验功能,一般xmlValidation="false"。xmlNamespaceAware:检测名称空间,一般xmlNamespaceAware="false"。--><Host name="localhost" appBase="webapps"unpackWARs="true" autoDeploy="true"><!--Context表示一个web应用程序,通常为WAR文件docBase应用程序的路径或者是WAR文件存放的路径,也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径。path表示此web应用程序的url的前缀,这样请求的url为http://localhost:8080/path/****reloadable这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化,自动装载新的应用程序,可以在不重启tomcat的情况下改变应用程序--><Context path="" docBase="" debug=""/><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="localhost_access_log" suffix=".txt"pattern="%h %l %u %t "%r" %s %b" /></Host></Engine></Service>
</Server>
优化
1 可以远程操作tomcat服务,不安全
#安装软件
[root@wanghongwei conf]# yum -y install telnet
#连接指定端头,发送命令
[root@wanghongwei conf]# telnet 127.0.0.1 8005
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
SHUTDOWN
Connection closed by foreign host.
#查看服务是否关闭
[root@wanghongwei conf]# netstat -antup | grep java
#重新启动服务
[root@wanghongwei conf]# /usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
优化:
更改端口
[root@wanghongwei conf]# pwd
/usr/local/tomcat/conf
[root@wanghongwei conf]# vim server.xml
#修改端口
22 <Server port="8011" shutdown="SHUTDOWN">23 <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
2注释配置文件91行
<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
#关闭服务
[root@wanghongwei conf]# /usr/local/tomcat/bin/shutdown.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Dec 07, 2019 7:51:00 AM org.apache.catalina.startup.Catalina stopServer
SEVERE: Could not contact localhost:8011. Tomcat may not be running.
Dec 07, 2019 7:51:00 AM org.apache.catalina.startup.Catalina stopServer
SEVERE: Catalina.stop:
java.net.ConnectException: Connection refusedat java.net.PlainSocketImpl.socketConnect(Native Method)at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)at java.net.Socket.connect(Socket.java:589)at java.net.Socket.connect(Socket.java:538)at java.net.Socket.<init>(Socket.java:434)at java.net.Socket.<init>(Socket.java:211)at org.apache.catalina.startup.Catalina.stopServer(Catalina.java:450)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:497)at org.apache.catalina.startup.Bootstrap.stopServer(Bootstrap.java:400)at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:487)
#启动服务
[root@wanghongwei conf]# /usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
#查看端口,检查优化情况
[root@wanghongwei conf]# netstat -antup | grep java
tcp 0 0 ::ffff:127.0.0.1:8011 :::* LISTEN 1554/java
tcp 0 0 :::8080 :::* LISTEN 1488/java
tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 1488/java
tcp 0 0 :::8009 :::* LISTEN 1488/java
web站点部署
#修改配置文件
#修改默认域名
#查看文件所在位置
[root@wanghongwei conf]# pwd
/usr/local/tomcat/conf
#编辑配置文件
[root@wanghongwei conf]# vim server.xml
103 <Engine name="Catalina" defaultHost="www.yunjisuan.com">
123 <Host name="www.yunjisuan.com" appBase="webapps"
#重启服务
[root@wanghongwei conf]# /usr/local/tomcat/bin/shutdown.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
[root@wanghongwei conf]# /usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
#进入网页文件存放目录
[root@wanghongwei webapps]# pwd
/usr/local/tomcat/webapps
#查看文件信息
[root@wanghongwei webapps]# ll
total 20
drwxr-xr-x 14 root root 4096 Dec 7 05:52 docs
drwxr-xr-x 6 root root 4096 Dec 7 05:52 examples
drwxr-xr-x 5 root root 4096 Dec 7 05:52 host-manager
drwxr-xr-x 5 root root 4096 Dec 7 05:52 manager
drwxr-xr-x 3 root root 4096 Dec 7 05:52 ROOT
#删除除root目录下的所有文件
[root@wanghongwei webapps]# rm -rf docs/ examples/ host-manager/ manager/
#删除root目录下的内容,志保留root目录
[root@wanghongwei webapps]# rm -rf ./ROOT/*
#将上传的war包移动到网页目录
[root@wanghongwei webapps]# mv mv /root/*.war .
#查看文件,发现文件自动解压
[root@wanghongwei webapps]# ll
total 20324
drwxr-xr-x 6 root root 4096 Dec 7 08:24 jpress-web-newest
-rw-r--r-- 1 root root 20797013 Oct 24 2017 jpress-web-newest.war
-rw-r--r-- 1 root root 643 Oct 24 2017 memtest.war
drwxr-xr-x 2 root root 4096 Dec 7 08:23 ROOT
#重启服务
[root@wanghongwei webapps]# /usr/local/tomcat/bin/shutdown.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
[root@wanghongwei webapps]# /usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
#检查重启后文件内容
[root@wanghongwei webapps]# ll
total 20332
drwxr-xr-x 7 root root 4096 Dec 7 08:24 jpress-web-newest
-rw-r--r-- 1 root root 20797013 Oct 24 2017 jpress-web-newest.war
drwxr-xr-x 2 root root 4096 Dec 7 08:27 logs
drwxr-xr-x 3 root root 4096 Dec 7 08:24 memtest
-rw-r--r-- 1 root root 643 Oct 24 2017 memtest.war
drwxr-xr-x 2 root root 4096 Dec 7 08:23 ROOT
测试连接
网址:http://192.168.71.142:8080/memtest/meminfo.jsp
#显示内存信息
自定义默认网站目录
上面访问的网址为:http://192.168.71.142:8080/memtest/meminfo.jsp
现在要实现网址为:http://192.168.71.142:8080/meminfo.jsp
##方法一
将文件复制到ROOT目录下,即可实现
#将文件复制到ROOT目录下
[root@wanghongwei webapps]# cp memtest/meminfo.jsp ./ROOT/
方法二
[root@tomcat ~]# vim /application/tomcat/conf/server.xml<Host name="localhost" appBase="webapps"unpackWARs="true" autoDeploy="true"><Context path="" docBase="/usr/local/tomcat/webapps/memtest" debug="0" reloadable="false" crossContext="true"/> #在虚拟主机这里添加一行代码限定web站点的根目录路径
[root@tomcat ~]# /application/tomcat/bin/shutdown.sh
[root@tomcat ~]# /application/tomcat/bin/startup.sh
tomcat 多实例
复制tomcat多实例
[root@wanghongwei webapps]# cd /usr/local/
[root@wanghongwei local]# ll
total 48
drwxr-xr-x 9 root root 4096 Dec 7 05:52 apache-tomcat-8.0.27
drwxr-xr-x. 2 root root 4096 Sep 23 2011 bin
drwxr-xr-x. 2 root root 4096 Sep 23 2011 etc
drwxr-xr-x. 2 root root 4096 Sep 23 2011 games
drwxr-xr-x. 2 root root 4096 Sep 23 2011 include
lrwxrwxrwx 1 root root 23 Dec 7 05:38 jdk -> /usr/local/jdk1.8.0_60/
drwxr-xr-x 8 uucp 143 4096 Aug 5 2015 jdk1.8.0_60
drwxr-xr-x. 2 root root 4096 Sep 23 2011 lib
drwxr-xr-x. 2 root root 4096 Sep 23 2011 lib64
drwxr-xr-x. 2 root root 4096 Sep 23 2011 libexec
drwxr-xr-x. 2 root root 4096 Sep 23 2011 sbin
drwxr-xr-x. 5 root root 4096 Jun 18 05:47 share
drwxr-xr-x. 2 root root 4096 Sep 23 2011 src
lrwxrwxrwx 1 root root 32 Dec 7 05:53 tomcat -> /usr/local/apache-tomcat-8.0.27/
[root@wanghongwei local]# cp -a apache-tomcat-8.0.27/ tomcat_1
[root@wanghongwei local]# cp -a apache-tomcat-8.0.27/ tomcat_2
修改多实例配置文件
#创建多实例网页存放根目录
[root@wanghongwei local]# mkdir -p /data/www/www/ROOT
#将网页程序拷贝到网页根目录下
[root@wanghongwei local]# cp /usr/local/tomcat/webapps/memtest/meminfo.jsp /data/www/www/ROOT/
#修改多实例配置文件的以下几行
[root@wanghongwei local]# cat -n /usr/local/tomcat/conf/server.xml | sed -n "22p;69p;123p"22 <Server port="8005" shutdown="SHUTDOWN"> #管理端口及停止命令69 <Connector port="8080" protocol="HTTP/1.1" #对外提供服务的端口123 <Host name="www.yunjisuan.com" appBase="webapps" #网站域名及网址的根目录路径
#修改第一个配置文件
[root@wanghongwei local]# sed -i '22s#8005#8011#;69s#8080#8081#;123s#appBase=".*"#appBase="/data/www/www"#' /usr/local/tomcat8_1/conf/server.xml
#查看修改后效果
[root@wanghongwei local]# sed -n '22p;69p;123p' /usr/local/tomcat8_1/conf/server.xml
<Server port="8011" shutdown="SHUTDOWN"><Connector port="8081" protocol="HTTP/1.1"<Host name="www.yunjisuan.com" appBase="/data/www/www"
#修改第二个配置文件
[root@wanghongwei local]# sed -i '22s#8005#8012#;69s#8080#8082#;123s#appBase=".*"#appBase="/data/www/www"#' /usr/local/tomcat8_2/conf/server.xml
#查看修改后效果
[root@wanghongwei local]# sed -n '22p;69p;123p' /usr/local/tomcat8_2/conf/server.xml
<Server port="8012" shutdown="SHUTDOWN"><Connector port="8082" protocol="HTTP/1.1"<Host name="www.yunjisuan.com" appBase="/data/www/www"#启动多实例服务
#启动第一个多实例服务
[root@wanghongwei local]# /usr/local/tomcat8_1/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat8_1
Using CATALINA_HOME: /usr/local/tomcat8_1
Using CATALINA_TMPDIR: /usr/local/tomcat8_1/temp
Using JRE_HOME: /usr/local/jdk
Using CLASSPATH: /usr/local/tomcat8_1/bin/bootstrap.jar:/usr/local/tomcat8_1/bin/tomcat-juli.jar
Tomcat started.
#启动第二个多实例服务
[root@wanghongwei local]# /usr/local/tomcat8_2/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat8_2
Using CATALINA_HOME: /usr/local/tomcat8_2
Using CATALINA_TMPDIR: /usr/local/tomcat8_2/temp
Using JRE_HOME: /usr/local/jdk
Using CLASSPATH: /usr/local/tomcat8_2/bin/bootstrap.jar:/usr/local/tomcat8_2/bin/tomcat-juli.jar
Tomcat started.
#查看实例启动情况
[root@wanghongwei local]# netstat -antup | grep java
tcp 0 0 ::ffff:127.0.0.1:8011 :::* LISTEN 1752/java
tcp 0 0 ::ffff:127.0.0.1:8012 :::* LISTEN 2088/java
tcp 0 0 :::8080 :::* LISTEN 1488/java
tcp 0 0 :::8082 :::* LISTEN 2088/java
tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 1488/java
tcp 0 0 :::8009 :::* LISTEN 1488/java
测试启动效果
网址为:
http://192.168.71.142:8082/meminfo.jsp
http://192.168.71.142:8081/meminfo.jsp
tomcat集群
使用nginx+tomcat反向代理集群
安装nginx
#安装所需源码包
[root@wanghongwei nginx-1.10.2]# yum -y install pcre-devel openssl-devel pcre openssl
#下载网络中的nginx源码包
[root@wanghongwei data]# wget -q http://nginx.org/download/nginx-1.10.2.tar.gz
#创建ngin程序用户
[root@wanghongwei ~]# useradd -s /sbin/nologin -M nginx
#解压nginx源码包
[root@wanghongwei ~]# tar xf nginx-1.10.2.tar.gz -C /usr/src/
#进入解压目录
[root@wanghongwei ~]# cd /usr/src/nginx-1.10.2/
#预配置
[root@wanghongwei nginx-1.10.2]# ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
#编译安装
[root@wanghongwei nginx-1.10.2]# make && make install
修改配置文件
#去掉注释和空格
[root@wanghongwei nginx-1.10.2]# egrep -v "#|^$" /usr/local/nginx/conf/nginx.conf.default > /usr/local/nginx/conf/nginx.conf
#修改配置文件
[root@wanghongwei nginx-1.10.2]# vim /usr/local/nginx/conf/nginx.conf
[root@wanghongwei nginx-1.10.2]# cat /usr/local/nginx/conf/nginx.conf
worker_processes 1;
events {worker_connections 1024;
}
http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;upstream web_pools {server 127.0.0.1:8081;server 127.0.0.1:8082;}server {listen 80;server_name localhost;location / {root html;index index.jsp index.html index.htm;proxy_pass http://web_pools;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}}
}
#创建软链接
[root@wanghongwei nginx-1.10.2]# ln -s /usr/local/nginx/sbin/* /usr/local/sbin/
#检查配置文件语法是否有错误
[root@wanghongwei nginx-1.10.2]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
#启动nginx
[root@wanghongwei nginx-1.10.2]# nginx
#查看nginx启动情况
[root@wanghongwei nginx-1.10.2]# netstat -antup | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 4598/nginx
使用tomcat安装jpress
JPress,一个wordpress的java代替版本,使用JFinal开发。需要maven支持
#解压二进制源码包
[root@wanghongwei ~]# tar xf apache-maven-3.3.9-bin.tar.gz -C /usr/local/
#创建软链接
[root@wanghongwei ~]# ln -s /usr/local/apache-maven-3.3.9/ /usr/local/maven
#修改环境变量
[root@wanghongwei ~]# tail -2 /etc/profile
export MAVEN_HOME=/usr/local/maven
export PATH="$MAVEN_HOME/bin:$PATH"
#启动修改的环境变量
[root@wanghongwei ~]# source /etc/profile
#查看安装版本,出现下面的信息表示成功
[root@wanghongwei ~]# mvn -version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: /usr/local/maven
Java version: 1.8.0_60, vendor: Oracle Corporation
Java home: /usr/local/jdk1.8.0_60/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "2.6.32-431.el6.x86_64", arch: "amd64", family: "unix"
#将 jpress-web-newest.war包放到Tomcat网站根目录下
[root@wanghongwei ~]# mv jpress-web-newest.war /data/www/www/ROOT/
#检查系统是否存在解压war包的命令
[root@wanghongwei ~]# which jar
/usr/local/jdk/bin/jar
#进入网站的根目录
[root@wanghongwei ~]# cd /data/www/www/ROOT/
#解压war包
[root@wanghongwei ROOT]# jar xf jpress-web-newest.war
#查看解压后的文件
[root@wanghongwei ROOT]# ll
total 20336
-rw-r--r-- 1 root root 20797013 Dec 7 12:20 jpress-web-newest.war
-rw-r--r-- 1 root root 407 Dec 7 11:03 meminfo.jsp
drwxr-xr-x 3 root root 4096 Sep 19 2016 META-INF
-rw-r--r-- 1 root root 96 Jul 27 2016 robots.txt
drwxr-xr-x 11 root root 4096 Sep 19 2016 static
drwxr-xr-x 4 root root 4096 Sep 19 2016 templates
drwxr-xr-x 6 root root 4096 Sep 19 2016 WEB-INF
测试安装效果
特别提示:虽然,Tomcat已经打开了自动解压缩war包的功能,但是细心的同学会发现我并没有重启Tomcat服务,因此,war包并没有被自动解压缩。故,我们需要通过jar命令进行解压缩,命令的参数和tar是一样的。
接下来我们就需要为jpress安装数据库了,之后的所有流程和阅读材料LNMP的章节完全一样。因此,我这里就不继续操作了。
tomcat安全及性能优化
安全优化
#最重要的优化有
降权启动
telnet管理端口的保护
ajp连接端口的保护
禁用管理端
不仅仅这四种,还有很多。。。。。
具体操作如下
1 降权启动(同nginx优化部分的监牢模式)
降权的原则就是利用普通用户来启动Tomcat
(1)将Tomcat程序目录拷贝到普通用户家目录下
(2)修改家目录下程序的配置文件(启动端口,检测端口等),并重新指定网页根目录路径。
(3)递归授权拷贝后的Tomcat程序的属主属组为普通用户。
(4)用su命令切换为普通用户,启动Tomcat进程
(5)此时Tomcat进程的权限为普通用户权限
(6)如果利用/etc/rc.local文件配置普通用户程序的开机启动,那么需要利用su -c临时切换身份启动。具体可参考linux基础教案里的用户管理部分
2 tlnet管理端口的保护
[root@wanghongwei mysql]# sed -n '22p' /usr/local/tomcat/conf/server.xml
<Server port="8005" shutdown="SHUTDOWN">
#表示通过8005端口来猎手shutdown命令来终止tomcat进程,默认的方式是非常危险的,需要进行修改
Tomcat默认通过8005端口来接收SHUTDOWN这个字符串来关闭Tomcat进程,但这是非常危险的,因此需要修改端口号来防护。否则,通过telnet命令即可强行关闭Tomcat进程
#关闭步骤
#如无telnet命令需自行安装
[root@wanghongwei ~]# telnet 127.0.0.1 8005
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
SHUTDOWN
3 AJP连接端口保护
[root@wanghongwei ~]# sed -n '91p' /usr/local/tomcat/conf/server.xml<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> #注释后<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
#或
//直接删除
4 禁用管理端口
Tomcat默认在安装完成后的网页目录里有很多多余的目录,删除所有不需要用到的目录,并清空ROOT网页默认根目录下的所有东西,规避可能的代码漏洞
#默认网页根目录位置
[root@wanghongwei webapps]# pwd
/usr/local/tomcat/webapps
#查看文件信息
[root@wanghongwei webapps]# ll
total 20
drwxr-xr-x 14 root root 4096 Dec 7 05:52 docs
drwxr-xr-x 6 root root 4096 Dec 7 05:52 examples
drwxr-xr-x 5 root root 4096 Dec 7 05:52 host-manager
drwxr-xr-x 5 root root 4096 Dec 7 05:52 manager
drwxr-xr-x 3 root root 4096 Dec 7 05:52 ROOT
#删除除root目录下的所有文件
[root@wanghongwei webapps]# rm -rf docs/ examples/ host-manager/ manager/
#删除root目录下的内容,志保留root目录
[root@wanghongwei webapps]# rm -rf ./ROOT/*
性能优化
1 屏蔽DNS查询
enableLookups="false"
#DNS查询非常消耗时间,如果开启会影响Tomcat性能,因此关闭。
#默认没有,需添加配置文件如下代码段,在Connector标签位置。表示禁止DNS查询<Connector port="8081" protocol="HTTP/1.1"connectionTimeout="6000" enableLookups="false" acceptCount="800"redirectPort="8443" />
###2 jvm调优
Tomcat最吃内存,只要内存足够,这只猫就跑的很快。
如果系统资源有限,那就需要进行调优,提高资源使用率。
#优化catalina.sh初始化脚本。在catalina.sh初始化脚本中添加以下代码:
#catalina.sh的路径为:/usr/local/tomcat/bin/catalina.sh
#此行优化代码需要加在脚本的最开始,声明位置。不要放在后边JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m"#代码说明:
server:一定要作为第一个参数,在多个CPU时性能佳
-Xms:初始堆内存Heap大小,使用的最小内存,cpu性能高时此值应设的大一些
-Xmx:初始堆内存heap最大值,使用的最大内存
上面两个值是分配JVM的最小和最大内存,取决于硬件物理内存的大小,建议均设为物理内存的一半。
-XX:PermSize:设定内存的永久保存区域
-XX:MaxPermSize:设定最大内存的永久保存区域
-XX:MaxNewSize:
-Xss 15120 这使得JBoss每增加一个线程(thread)就会立即消耗15M内存,而最佳值应该是128K,默认值好像是512k.
+XX:AggressiveHeap 会使得 Xms没有意义。这个参数让jvm忽略Xmx参数,疯狂地吃完一个G物理内存,再吃尽一个G的swap。
-Xss:每个线程的Stack大小
-verbose:gc 现实垃圾收集信息
-Xloggc:gc.log 指定垃圾收集日志文件
-Xmn:young generation的heap大小,一般设置为Xmx的3、4分之一
-XX:+UseParNewGC :缩短minor收集的时间
-XX:+UseConcMarkSweepGC :缩短major收集的时间
JVM的调优比较复杂,对于初学的同学们来说掌握这些就足够了。如果想要更详细的理解JVM如何调优,那么请参考网友文章:http://www.cnblogs.com/xingzc/p/5756119.html
#附录1:企业案例:Linux下java/http进程高解决案例
生产环境下某台tomcat7服务器,在刚发布的时候一切都很正常,在运行一段时间后就出现CPU占用很高的问题,基本上是负载一天比一天高。诸如此类问题,请排查!
问题分析:
(1)程序属于CPU密集型,和开发沟通过,排除此类情况
(2)程序代码有问题,出现死循环,可能性极大
问题解决:
(1)开发那边无法排查代码某个模块有问题,从日志上也无法分析得出
(2)我们可以尝试通过jstack命令来精确定位出现错误的代码段,从而拿给开发排查。
(1)首先查找进程高的PID号(先找到是哪个PID号的进程导致的)
top -H
(2)查看这个进程所有系统调用(再找到是哪个PID号的线程导致的)
strace -p 进程的PID
(3)如果是Web应用,可以继续打印该线程的堆栈信息(找出有问题的代码块)
printf "%x\n" 线程的PID --->#将有问题的线程的PID号转换成16进制格式
jstack 进程的PID | grep 线程PID号的十六进制格式 -A 30
#过滤出有问题的线程的堆栈信息,找出问题代码块实际操作演示:[root@localhost ROOT]# pgrep -l java
2031 java #java进程及对应PID号
2295 java
2321 java
[root@localhost ROOT]# strace -p 2031 #查看PID号为2031的java进程的所有线程调用情况
Process 2031 attached - interrupt to quit
futex(0x7f4cdd0e79d0, FUTEX_WAIT, 2032, NULL #只有一个线程,线程的PID号为2032
^C <unfinished ...>
Process 2031 detached
[root@localhost ROOT]# printf "%x\n" 2032 #将线程的PID号2032转换成十六进制格式
7f0
[root@localhost ROOT]# jstack 2031 | grep 7f0 -A 30 #追踪进称号为2031的进程的所有线程调用,从里面过滤出16进制为7f0的线程的代码调用情况
"main" #1 prio=5 os_prio=0 tid=0x00007f4cd4008800 nid=0x7f0 runnable [0x00007f4cdd0e5000]java.lang.Thread.State: RUNNABLEat java.net.PlainSocketImpl.socketAccept(Native Method)at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:409) #圆括号里显示的是(代码类名:具体调用的代码行号)at java.net.ServerSocket.implAccept(ServerSocket.java:545)at java.net.ServerSocket.accept(ServerSocket.java:513)at org.apache.catalina.core.StandardServer.await(StandardServer.java:446)at org.apache.catalina.startup.Catalina.await(Catalina.java:713)at org.apache.catalina.startup.Catalina.start(Catalina.java:659)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:497)at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:351)at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:485)"VM Thread" os_prio=0 tid=0x00007f4cd406d000 nid=0x7f1 runnable "VM Periodic Task Thread" os_prio=0 tid=0x00007f4cd40b8800 nid=0x7f8 waiting on condition JNI global references: 244
附录2:jstack命令(Java stack Trace)
(1)介绍
jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使用方式只支持以下的这种方式:
jstack [-l] pid
如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。
(2)命令格式
jstack [ option ] pid
jstack [ option ] executable core
jstack [ option ] [server-id@]remote-hostname-or-IP
(3)常用参数说明
1)、options:
executable Java executable from which the core dump was produced.
(可能是产生core dump的java可执行程序)
core 将被打印信息的core dump文件
remote-hostname-or-IP 远程debug服务的主机名或ip
server-id 唯一id,假如一台主机上多个远程debug服务
2)、基本参数:
-F:当’jstack [-l] pid’没有相应的时候强制打印栈信息
-l:长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.
-m:打印java和native c/c++框架的所有栈信息.
-h | -help:打印帮助信息
pid :需要被打印配置信息的java进程id,可以用jps查询.
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 品优购环境
虚拟机 虚拟机配置虚拟机名称 itheima336(pyg) ip 192.168.17.128 硬件内存:1G 处理器:1 硬盘:15G 网络适配器:NAT -> NAT模式dubbo端口号 2181...
2024/4/19 23:08:10 - Spring boot连接远程服务器中的Redis
Spring boot连接远程服务器中的Redis...
2024/4/18 0:49:05 - jdk1.8线程池 基于源码了解工作流程
构造方法public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) {if (corePoolSize < 0 ||maximumPoolSize <= 0…...
2024/4/16 12:41:51 - 【踩坑】Spring Boot使用spring-boot-legacy带来的问题
本文记录旧项目重构成Spring Boot项目中遇到的一些问题。文章目录Spring Boot使用web.xmlSpring Boot整合jsp打包的文件使用spring-boot-legacy带来的问题问题出现的原因Spring Boot 配置静态资源映射 Spring Boot使用web.xml 虽然Spring官方文档提供了用编程的方式替代web.xml…...
2024/4/16 12:41:46 - 【NewCode-LeetCode】recover-binary-search-tree
传送门 题目 二叉搜索树(BST)中的两个节点被错误地交换了,需要在不改变树的结构的情况下恢复这棵树。 思路 一开始理解错了,以为是两个同一层的节点被交换了,后来发现是我想简单了,题意指的是任意的两个节点;那么如何找到这两个节点呢? 由二叉搜索树的概念,我们知道左…...
2024/4/27 14:23:13 - 2020.5.29
今天如期结束了web第一章的学习,整理了下笔记。晚上八点的时候,李老师带领我们开了个周总结会议,大家都纷纷总结了这周的学习进度,并对下周学习做了个简单的规划。下周我要开始第二章的学习了,准备稍稍放慢进度,用空出来的时间进行python语言的学习。希望下周一切顺利。...
2024/4/24 9:06:02 - 【学习记录】Inception结构的简单介绍及Filter Concatenation的理解
文章目录【学习记录】Inception结构的简单介绍及Filter Concatenation的理解InceptionFilter Concatenation 【学习记录】Inception结构的简单介绍及Filter Concatenation的理解 我们在研读目标检测类论文时,常常会看到Inception Structure以及一张输入为Previous layers到输出…...
2024/4/24 9:06:02 - 牛客练习赛8 E(容斥+二进制枚举)
题目链接解题报告: 直接考虑容斥,在二进制枚举 搞一下就ok。 #define first f #define second s #define ll long long #define pb push_back #define pii pair<int,char> #define sl(p) strlen(p) #define SZ(p) p.size() #include <bits/stdc++.h> #define lb …...
2024/4/24 9:06:07 - NLP BERT数据预处理NLTK punkt无法下载处理方法
已下载过punkt,放到~/nltk_data/tokenizers/punkt...
2024/4/24 9:06:01 - 英特尔挖走AMD 一首席架构师 并任命为业务部门副总裁
文章原创来自洞见网:http://www.localonline.com.cn,转载请注明出处。5月29日消息,据国外媒体报道,芯片巨头英特尔本月挖走了竞争对手AMD的一名首席架构师,并任命为业务部门的副总裁。从外媒的报道来看,英特尔从AMD挖走的,是云游戏和控制台SoC业务首席架构师阿里易卜拉欣…...
2024/4/16 12:43:14 - 永久配置安装源
1、在用户根目录下 ~ 下创建 .pip 隐藏文件夹,如果已经有了可以跳过 – mkdir ~/.pip 2、进入 .pip 隐藏文件夹并创建 pip.conf 配置文件 – cd ~/.pip && touch pip.conf 3、新增 pip.conf 配置文件内容: [global] index-url = http://pypi.douban.com/simple [insta…...
2024/4/16 12:42:18 - Flink 1.10消费kafka topic 设置偏移量的几种方式
标题方式一 : 指定topic, 指定partition的offset位置方式二: 从topic中最初的数据开始消费方式三: 从指定的时间戳开始方式四: 从最新的数据开始消费 默认:从topic中指定的group上次消费的位置开始消费。 所以必须配置group.id参数从消费者组提交的偏移量开始读取分区(kafka…...
2024/4/16 12:42:18 - shell脚本逐行读取文本内容并拆分,根据条件筛选写入不同文件
编写如下shell脚本 创建名为Organizer的shell脚本用以整理学生数据:假设有一名为Students的文本文件存放学生基本信息,每一行的格式为:“姓名;专业;省份”,该脚本能够将学生信息依据省份导入北方和南方个两个不同的文件(华北、东北、西北地区为北方,其余为南方),文件…...
2024/4/18 10:05:09 - 工具使用--tcpreplay--填坑
测试一个网络时,建议不要用-t的参数,保修比较困难,最好速度设置小,避免乱序tcpreplay -I eth3008 -i eth3007 -t -c iec104_00045.pcap.route.cache iec104_00045.pcap.route[root@localhost iec_dual]# tcpreplay -I eth3008 -i eth3007 -p 1 -c iec104_00045.pcap.rout…...
2024/4/16 12:42:43 - 零基础入门CV赛事-Task4 模型训练与验证
文章目录模型训练与验证构造验证集过拟合和欠拟合模型训练与验证模型保存与加载模型调参流程一般的训练逻辑我的代码总结 上次学习构建一个简单的CNN进行训练,并可视化了训练过程中的误差损失和第一个字符预测准确率,但这些还远远不够。一个成熟合格的深度学习训练流程至少具…...
2024/4/16 12:42:18 - 看Spring是怎样整合MyBatis
引言 如果让自己着手开发一个框架整合到Spring当中,你会怎么做? 与其说我们怎么做,不如说Spring提供了哪些可扩展的地方允许你对接? 那我们就从最熟悉的MaBatis入手,看Spring如何整合MyBatis? Let’s do this 如果说自己写一个mybatis整合到Spring当中,怎么做?1. 暴露一…...
2024/4/16 12:42:23 - 面试题56 - I. 数组中数字出现的次数
题目: 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。 示例: 示例 1:输入:nums = [4,1,4,6] 输出:[1,6] 或 [6,1]示例 2:输入:nums = [1,2,10,4,1,4,3,3] 输出:[2,10] 或 …...
2024/4/22 12:43:54 - spring高级之AOP详解
前言 这是之前开始学spring的时候的笔记,现在添加了一些理解,然后把他搬到博客上来。 动态代理模式演示: 这里仅是动态代理的演示,要查看详细的可以查阅相关博文。 动态代理的本质就是增强对象方法,在不修改目标类的情况动态生成一个代理类和代理对象,然后在目标对象的方…...
2024/4/16 12:42:18 - 电脑虚拟化设置
电脑型号联想ideapad300s。 1 查看电脑是否开启虚拟化。 进入任务管理器,在性能中查看虚拟化是否开启 2 重启电脑 3 当屏幕出现Lenovo时同时连续按下Fn和F2,进入BIOS。 其它版本的电脑进入BIOS的热键不同,可以百度查询 4 进入BIOS后,按键盘右键,选择configuration选项,再按…...
2024/4/16 7:55:40 - 6654. 【2020.05.27省选模拟】数据结构
题目 给你若干条线段,可以进行若干次操作,选择两条线段iii和jjj,满足Ri<LjR_i<L_jRi<Lj,将jjj接到iii的后面(此时必须要满足iii必须后面没有接线段,jjj必须前面没有接线段)。 操作一定要进行到不能继续操作为止。 问最终形成的图的方案数。 n≤300n\leq 30…...
2024/4/16 12:43:29
最新文章
- excel一列同乘同一个数
excel一列同乘同一个数 第一种方法(excel本身功能) 在空白区域输入要乘以的数,比如0.5 右键选择复制 选中需要乘以的单元格,选择性粘贴 点击乘,选择确定 删除0.5后也不会改变值 第二种方法(方方格子…...
2024/4/27 14:50:36 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - MySQL 底层数据结构 聚簇索引以及二级索引 Explain的使用
数据结构 我们知道MySQL的存储引擎Innodb默认底层是使用B树的变种来存储数据的 下面我们来复习一下B树存储 B树存储 哈希存储的区别 哈希存储,只能使用等值查询 B树与B树存储 我们知道B树实际上就是B树的变种 那么为啥使用B树而不是使用B树呢? 我们知道效率的高低主要取决于…...
2024/4/23 6:22:51 - 文心一言 vs GPT-4 —— 全面横向比较
对于文心一言和 GPT-4 这两者之间的全面横向比较,我们可以从多个方面来看待它们的区别和优劣势。 文心一言 文心一言是一款基于深度学习的中文文本生成模型,专注于生成优美的古风诗句和语录。以下是它的一些特点: 专注于古风诗句和语录: 文…...
2024/4/24 17:52:27 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/26 18:09:39 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/26 20:12:18 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/26 23:05:52 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/27 4:00:35 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/25 18:39:22 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/27 14:22:49 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/26 21:56:58 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/27 9:01:45 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/26 16:00:35 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/25 18:39:16 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/25 18:39:16 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/26 22:01:59 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/25 18:39:14 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/4/26 23:04:58 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/25 2:10:52 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/25 18:39:00 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/26 19:46:12 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/4/27 11:43:08 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/27 8:32:30 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57