当前位置: 首页 > news >正文

检测站营销方案网站项目建设方案

检测站营销方案,网站项目建设方案,湘潭整站优化,wordpress 手机样式Tomcat工作模式 Tomcat作为Servlet容器#xff0c;有以下三种工作模式。 1#xff09;独立的Servlet容器#xff0c;由Java虚拟机进程来运行 Tomcat作为独立的Web服务器来单独运行#xff0c;Servlet容器组件作为Web服务器中的一部分而存在。这是Tomcat的默认工作模式。…Tomcat工作模式 Tomcat作为Servlet容器有以下三种工作模式。 1独立的Servlet容器由Java虚拟机进程来运行 Tomcat作为独立的Web服务器来单独运行Servlet容器组件作为Web服务器中的一部分而存在。这是Tomcat的默认工作模式。 在这种模式下Tomcat是一个独立运行的Java程序。和运行其他Java程序一样运行Tomcat需要启动一个Java虚拟机JVMJava Virtual Machine进程由该进程来运行Tomcat如下图 2其他Web服务器进程内的Servlet容器 Tomcat分为Web服务器插件和Servlet容器组件两部分。 Web服务器插件在其他Web服务器进程的内部地址空间启动一个JVM(Java Virtual Machine)使Servlet容器组件在此虚拟机中运行。若客户机调用Servlet的请求web服务器插件将取得对此请求的控制并将它传递(使用JNI)给Servlet容器组件。 注JNI是Java Native Interface的简写它是Java本地调用接口。通过这个接口Java程序可以和其他语言编写的本地程序进行通信。 进程内的Servlet容器对于单进程、多线程的Web服务器非常合适可以提供较高的运行速度但缺乏伸缩性。 3其他Web服务器进程外的Servlet容器 Tomcat分为Web服务器插件和Servlet容器组件两部分。 Web服务器插件在其他Web服务器的外部地址空间启动一个Java虚拟机进程Servlet容器组件在此Java虚拟机中运行。如有客户端发出调用Servlet的请求Web服务器插件获得对此请求的控制并将它转发采用IPC通信机制给Servlet容器。 注IPCInter-Process Communication进程间通信是两个进程之间进行通信的一种机制。 进程外Servlet容器对客户请求的响应速度不如进程内Servlet容器但进程外容器具有更好的伸缩性和稳定性。 从Tomcat的三种工作模式可以看出当Tomcat作为独立的Servlet容器来运行时此时Tomcat是能运行Java Servlet的独立Web服务器。 此外Tomcat还可作为其他Web服务器进程内或者进程外的Servlet容器从而与其他Web服务器集成如Apache和IIS服务器等。 集成的意义在于对于不支持运行Java Servlet的其他Web服务器可通过集成Tomcat来提供运行Servlet的功能。  Tomcat整体架构 Connector连接器 1EndPoint EndPoint Coyote 通信端点即通信监听的接口是具体Socket接收和发送处理器是对传输层的抽象因此EndPoint用来实现TCP/IP协议的。 Tomcat 并没有EndPoint 接口而是提供了一个抽象类AbstractEndpoint 里面定义了两个内部类Acceptor和SocketProcessor。 Acceptor用于监听Socket连接请求。 SocketProcessor用于处理接收到的Socket请求它实现Runnable接口在Run方法里调用协议处理组件Processor进行处理。为了提高处理能力SocketProcessor被提交到线程池来执行。而这个线程池叫作执行器Executor). 2 Processor Processor Coyote 协议处理接口 如果说EndPoint是用来实现TCP/IP协议的那么Processor用来实现HTTP协议Processor接收来自EndPoint的Socket读取字节流解析成Tomcat Request和Response对象并通过Adapter将其提交到容器处理Processor是对应用层协议的抽象。 3ProtocolHandler ProtocolHandler Coyote 协议接口 通过Endpoint 和 Processor 实现针对具体协议的处理能力。Tomcat 按照协议和I/O 提供了6个实现类 AjpNioProtocol AjpAprProtocol AjpNio2Protocol Http11NioProtocol Http11Nio2Protocol Http11AprProtocol。我们在配置tomcat/conf/server.xml 时 至少要指定具体的ProtocolHandler , 当然也可以指定协议名称 如 HTTP/1.1 如果安装APR那么将使用Http11AprProtocol 否则使用 Http11NioProtocol 。 4Adapter 由于协议不同客户端发过来的请求信息也不尽相同Tomcat定义了自己的Request类来“存放”这些请求信息。ProtocolHandler接口负责解析请求并生成Tomcat Request类。但是这个Request对象不是标准的ServletRequest也就意味着不能用Tomcat Request作为参数来调用容器。Tomcat设计者的解决方案是引入CoyoteAdapter这是适配器模式的经典运用连接器调用CoyoteAdapter的Sevice方法传入的是Tomcat Request对象CoyoteAdapter负责将Tomcat Request转成ServletRequest再调用容器的Service方法。 Container容器 架构 4个子容器的作用分别是 【1】Engine表示整个Catalina的Servlet引擎用来管理多个虚拟站点一个Service最多只能有一个Engine但是一个引擎可包含多个Host。 【2】Host代表一个站点也可以叫虚拟主机可以给Tomcat配置多个虚拟主机地址而一个虚拟主机下可包含多个Context【整个webapps】 【3】Context代表一个应用程序对应着平时开发的一套程序或者一个 WEB-INF目录以及下面的 web.xml文件 【4】Wrapper每一 Wrapper封装着一个 ServletWrapper 作为容器中的最底层不能包含子容器。 处理请求 使用 Pipeline-Valve 管道来处理的Valve是阀门之意Pipeline-Valve 是责任链模式责任链模式是指在一个请求处理的过程中有很多处理者依次对请求进行处理每个处理者负责做自己相应的处理处理完之后将处理后的请求返回再让下一个处理着继续处理。 【1】Connector 在接收到请求后会首先调用最顶层容器的Pipeline来处理这里的最顶层容器的 Pipeline就是EnginePipelineEngine的管道 【2】在 Engine的管道中依次会执行 EngineValve1、EngineValve2 等等最后会执行 StandardEngineValve在StandardEngineValve 中会调用 Host管道然后再依次执行 Host 的 HostValve1、HostValve2 等最后在执行StandardHostValve然后再依次调用 Context的管道和 Wrapper的管道最后执行到 StandardWrapperValve。 【3】当执行到 StandardWrapperValve 的时候会在 StandardWrapperValve中创建 FilterChain并调用其 doFilter方法来处理请求这个 FilterChain包含着我们配置的与请求相匹配的 Filter和Servlet其 doFilter方法会依次调用所有的 Filter的 doFilter方法和 Servlet的 service方法这样请求就得到了处理 【4】当所有的 Pipeline-Valve都执行完之后并且处理完了具体的请求这个时候就可以将返回的结果交给 Connector了Connector 在通过 Socket的方式将结果返回给客户端。 service.xml文件 server.xml 是 Tomcat 中最重要的配置文件server.xml 的每个元素都对应了 Tomcat中的一个组件通过对xml文件中元素的配置可以实现对 Tomcat 中各个组件的控制。 ?xml version1.0 encodingUTF-8? Server port8005 shutdownSHUTDOWNListener classNameorg.apache.catalina.startup.VersionLoggerListener/Listener SSLEngineon classNameorg.apache.catalina.core.AprLifecycleListener/Listener classNameorg.apache.catalina.core.JasperListener/Listener classNameorg.apache.catalina.core.JreMemoryLeakPreventionListener/Listener classNameorg.apache.catalina.mbeans.GlobalResourcesLifecycleListener/Listener classNameorg.apache.catalina.core.ThreadLocalLeakPreventionListener/GlobalNamingResourcesResource authContainer descriptionUser database that can be updated and saved factoryorg.apache.catalina.users.MemoryUserDatabaseFactory nameUserDatabase pathnameconf/tomcat-users.xml typeorg.apache.catalina.UserDatabase//GlobalNamingResourcesService nameCatalinaConnector port8080 protocolHTTP/1.1 connectionTimeOut20000 redirectPort8443/Connector port8009 protocolAJP/1.3 redirectPort8443/Engine defaultHostlocalhost nameCatalinaRealm classNameorg.apache.catalina.realm.LockOutRealmRealm classNameorg.apache.catalina.realm.UserDatabaseRealm resourceNameUserDatabase//RealmHost appBasewebapps autoDeploytrue namelocalhost unpackWARstrueValve classNameorg.apache.catalina.valves.AccessLogValve directorylogs pattern%h %l %u %t quot;%rquot; %s %b prefixlocalhost_access_log. suffix.txt/Context docBasecas-server-webapp path/cas reloadabletrue sourceorg.eclipse.jst.j2ee.server:cas-server-webapp/Context docBaseportal path/portal reloadabletrue sourceorg.eclipse.jst.jee.server:portal//Host/Engine/Service /Server 整体架构简洁版 ServerServiceConnector /Connector /EngineHostValue /Context /!-- 现在常常使用自动部署不推荐配置Context元素--/Host/Engine/Service /Server 核心组件 【1】Server Server元素在最顶层代表整个 Tomcat容器因此他必须是 server.xml中唯一一个最外层的元素。一个 Server元素可以有一个或多个 Service元素。 Server 的主要任务就是提供一个接口让客户端能够访问到这个 Service集合同时维护它所包含的所有的 Service的生命周期包含如何初始化如何结束服务如何找到客户端要访问的 Service。 Server port8005 shutdownSHUTDOWN /Server 说明 shutdown 发往此Server用于实现关闭tomcat实例的命令字符串默认为SHUTDOWNport 属性表示 Server接收 shutdown指令的端口号设置为-1可以禁掉该端口。默认仅允许通过本机访问默认为8005address服务器等待关机命令的TCP / IP地址。如果没有指定地址则使用localhost。className: 用于实现此Server容器的完全限定类的名称默认为org.apache.catalina.core.StandardServer 【2】Service 在 Connector 和 Engine外面包一层把它们组合在一起对外提供服务。一个Service可以包含多个Connector但是只能包含一个Engine其中 Connector 的作用是从客户端接收请求Engine 的作用是处理接收进来的请求。 Server port8005 shutdownSHUTDOWNService nameCatalina/Service /Server 属性说明 className 用于实现service的类名一般都是org.apache.catalina.core.StandardService。name此服务的名称默认为Catalina 如上图Server 中包含一个名称为 “Catalina” 的Service此名字也会在产生相关的日志信息时记录在日志文件当中。 实际上Tomcat 可以提供多个 Service不同的 Service监听不同的端口。 【3】Connector 接收连接请求创建 Request 和 Response对象用于和请求端交换数据然后分配线程让 Engine来处理这个请求并把产生的 Request 和 Response对象传给 Engine。通过配置 Connector可以控制请求 Service的协议及端口号。【连接器类型通常包括1) HTTP连接器2) SSL连接器3)AJP 1.3连接器4) proxy连接器】 Server port8005 shutdownSHUTDOWNService nameCatalinaConnector port8080 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 maxParameterCount1000/Connector port8009 protocolAJP/1.3 redirectPort8443 //Service /Server 常用属性的说明 1) address指定连接器监听的地址默认为所有地址即0.0.0.02) maxThreads支持的最大并发连接数默认为2003) port监听的端口默认为80804) protocol连接器使用的协议默认为HTTP/1.1定义AJP协议时通常为AJP/1.35) redirectPort如果某连接器支持的协议是HTTP当接收客户端发来的HTTPS请求时则转发至此属性定义的端口6) connectionTimeout等待客户端发送请求的超时时间单位为毫秒默认为60000即1分钟7) enableLookups是否通过request.getRemoteHost()进行DNS查询以获取客户端的主机名默认为true8) acceptCount设置等待队列的最大长度通常在tomcat所有处理线程均处于繁忙状态时新发来的请求将被放置于等待队列中 配置说明 通过配置第一个 Connector客户端可以通过 8080端口号协议访问 Tomcat。其中protocol 属性规定了请求的协议port 规定了请求的端口号redirectPort 表示当强制要求 https而请求是 http时重定向至端口号为 8443的ConnectorconnectionTimeout表示连接的超时时间。 在这个例子中Tomcat 监听 Http请求使用的是 8080端口而不是正式的 80端口实际上在正式的生产环境中Tomcat也常常监听8080端口。而不是80端口。这是因为在生产环境中很少讲 Tomcat直接对外开放接收请求而是在 Tomcat和客户端之间加一层代理服务器如Nginx用于请求的转发、负载均衡、处理静态文件等通过代理服务器访问 Tomcat时是在局域网中因为一般仍使用8080端口。第二个配置 Connector客户端可以通过 8009端口使用 AJP协议访问 Tomcat。AJP协议负责和其他的Http服务器如Apache建立连接在把 Tomcat与其他服务器集成时就需要用到这个连接器之所以使用 Tomcat和其他服务器集成是因为 Tomcat可以用作 Servlet/JSP容器但是对静态资源处理速度较慢不如 Apache和 IIS等 HTTP服务器因此常常将 Tomcat和 Apache等集成前者做 Servlet容器后者处理静态资源而 AJP协议便负责 Tomcat与 Apache的连接。Tomcat 和 Apache等集成的原理如下图 【4】Engine Engine 组件在 Service 组件有且只有一个 Engine是Servlet处理器的一个实例即servlet引擎默认为定义在server.xml中的Catalina。Engine组件从一个或多个Connector 中接收并处理并将完成的响应返回给 Connector最终传递给客户端。Engine、Host 和 Context都是容器但是它们不是平行关系而是父子关系Engine 包含 HostHost 包含 Context。 Server port8005 shutdownSHUTDOWNService nameCatalinaConnector port8080 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 /Connector port8009 protocolAJP/1.3 redirectPort8443 /Engine nameCatalina defaultHostlocalhost/Engine/Service /Server 参数说明 nameEngine组件的名称用于日志和错误信息记录时区别不同的引擎defalutHost 指定了默认的 host名称【接收所有发往非明确定义虚拟主机的请求的host组件即当发往本机的请求指定的 host名称不存在时一律使用 defaultHost指定的 host进行处理】因此 defaulthost的值必须与 Engine中的一个Host组件的 name属性值匹配。 Engine 和 Host的关系 Host 是 Engine的子容器。Engine 组件中可以内嵌1个或者多个 Host组件每个 Host组件代表 Engine中的一个虚拟主机。Host组件至少有一个且其中一个的 name必须与 Engine组件中的 defaultHost属性相匹配。 Server port8005 shutdownSHUTDOWNService nameCatalinaConnector port8080 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 /Connector port8009 protocolAJP/1.3 redirectPort8443 /Engine nameCatalina defaultHostlocalhostHost namelocalhost appBasewebapps unpackWARstrue autoDeploytrue/Host/Engine/Service /Server 【5】Host 位于Engine容器中用于接收请求并进行相应处理的主机或虚拟主机。作用是运行多个 Web应用一个 Context 代表一个 Web应用并负责安装、展开、启动、结束每个 Web应用。 Host 组件代表的虚拟主机对应服务器中一个网络名实体如www.test.com或IP地址116.25.25.25为了使用户可以通过网络名连接Tomcat服务器这个名字应该在DNS服务器上注册。客户端通常使用主机名来标识它们希望连接的服务器该主机名也会包含在 HTTP请求头中Tomcat 从 HTTP头中提取出主机名寻找名字匹配的主机。如果没有匹配请求会发送至默认的主机。因此默认主机不需要在 DNS服务器中注册网络名因为任何与所有 Host名称不匹配的请求都会路由至默认主机。 参数说明 1) appBase此Host的webapps目录即存放非归档的web应用程序的目录或归档后的WAR文件的目录路径可以使用基于$CATALINA_HOME的相对路径2) autoDeploy在Tomcat处于运行状态时放置于appBase目录中的应用程序文件是否自动进行deploy默认为true3) unpackWars在启用此webapps时是否对WAR格式的归档文件先进行展开默认为 true通过解压后的文件结构运行该 Web应用如果是false直接使用 WAR文件运行 Web应用。4name 属性指定虚拟主机的主机名一个 Engine有且只有一个 Host组件的 name属性和 Engine组件的 defaultHost属性相匹配一般情况下主机名需要是在 DNS服务器中注册网络名但是 Engine指定的 defaultHost不需要。 Context docBaseD:\Program Files\app1.war reloadabletrue/Context 【6】Context静态部署 Context元素代表在虚拟主机上运行的一个Web应用。 每个 Web应用基于 WAR文件或 WAR文件解压后对应的目录这里称为应用目录。Context 是 Host 的子容器每个 Host 都可以定义任意多的 Context元素。 属性说明 docBase 指定Web应用程序的存放位置也可以使用相对路径起始路径为此Context所属Host中appBase定义的路径切记docBase的路径名不能与相应的Host中appBase中定义的路径名有包含关系比如如果appBase为deploy而docBase绝不能为deploy-bbs类的名字path 指定了访问该Web应用上下文路径当请求到来时Tomcat 根据 Web应用的 path属性与 URL匹配程度来选择 Web应用处理相应请求。reloadable属性指示tomcat是否在运行时监控在 WEB-INF/classes和WEB-INF/lib目录下class文件的改动。默认值为false当值为 true在 class文件改动时会重新 web应用的重新加载。在开发环境下reloadable 设置为 ture便于调试若是自动部署即 autoDeploy“true”那么 server.xml配置文件中没有 Context元素的配置。这是因为 Tomcat开启了自动部署Web应用没有在 server.xml中配置静态部署而是由 Tomcat通过特定的规则自动部署。 注目前往往server.xml配置文件中看不到Context元素的出现因为Tomcat开启了自动部署Web应用没有在server.xml中配置静态部署而是由Tomcat通过特定的规则自动部署。 静态部署与自动部署是可以共存的。在实际应用中并不推荐使用静态部署因为server.xml 是不可动态重加载的资源服务器一旦启动了以后要修改这个文件就得重启服务器才能重新加载。而自动部署可以在Tomcat运行时通过定期的扫描来实现不需要重启服务器。 注意的是在自动部署场景下配置文件位于 xmlBase中 docBase 不在 appBase目录中才需要指定如果 docBase指定的 war包或应用目录就在 appBase中则不需要指定。因为 Tomcat会自动扫描 appBase中的 war包和应用目录制定了反而造成问题。不能指定path属性path属性由配置的文件的文件名WAR文件的文件名或应用目录的名称自动推导出来。 appBase 和 docBase的区别 【1】appBase这个目录下面的子目录将自动被部署为应用且 war文件将被自动解压缩并部署为应用默认为 Tomcat根目录下的 webapps文件夹。 【2】docBase指定需要关联的项目自动解压并部署到 appBase目录下。项目的名称由 path属性决定。 docBase 所在的文件或者 war包必须存在否则项目启动找不到对应的目录。此时文件解压到 appBase目录下根据 path属性决定解压后的文件名。若采用了 配置那么 appBase目录下的应用目录将会再次部署。此时项目是部署两遍。解决办法设置 autoDeploy“false”。 【7】Valve组件 Valve类似于过滤器它可以工作于Engine和Host/Context之间、Host和Context之间以及Context和Web应用程序的某资源之间。 不同的Valve有不同的特性AccessLogValve记录的日志就是访问日志每天的请求会写到一个日志文件里。AccessLogValve可以与Engine、Host或Context关联 注一个容器内可以建立多个Valve而且Valve定义的次序也决定了它们生效的次序。 相关属性定义有: className规定了Valve的类型是最重要的属性本例中通过该属性规定了这是一个AccessLogValve。 directory指定日志存储的位置本例中日志存储在$TOMCAT_HOME/logs目录下。 prefix指定了日志文件的前缀。 suffix指定了日志文件的后缀。通过directory、prefix和suffix的配置在$TOMCAT_HOME/logs目录下可以看到如下所示的日志文件。 pattern指定记录日志的格式。 pattern中一些值: %h远程主机名或IP地址如果有nginx等反向代理服务器进行请求分发该主机名/IP地址代表的是nginx否则代表的是客户端。后面远程的含义与之类似不再解释。%l远程逻辑用户名一律是”-”可以忽略。%u授权的远程用户名如果没有则是”-”。%t访问的时间。%r请求的第一行即请求方法(get/post等)、uri、及协议。%s响应状态200,404等等。%b响应的数据量不包括请求头如果为0则是””-。%D请求处理的时间(单位是毫秒) 【8】Listener Listener(即监听器)定义的组件可以在特定事件发生时执行特定的操作被监听的事件通常是Tomcat的启动和停止。监听器需要配置的最重要的属性是className该属性规定了监听器的具体实现类该类必须实现了org.apache.catalina.LifecycleListener接口。 Listener classNameorg.apache.catalina.startup.VersionLoggerListener /!-- Security listener. Documentation at /docs/config/listeners.htmlListener classNameorg.apache.catalina.security.SecurityListener /--!-- APR library loader. Documentation at /docs/apr.html --Listener classNameorg.apache.catalina.core.AprLifecycleListener SSLEngineon /!-- Prevent memory leaks due to use of particular java/javax APIs--Listener classNameorg.apache.catalina.core.JreMemoryLeakPreventionListener /Listener classNameorg.apache.catalina.mbeans.GlobalResourcesLifecycleListener /Listener classNameorg.apache.catalina.core.ThreadLocalLeakPreventionListener / 例如 VersionLoggerListener当Tomcat启动时该监听器记录Tomcat、Java和操作系统的信息。该监听器必须是配置的第一个监听器。 AprLifecycleListenerTomcat启动时检查APR库如果存在则加载。APR即Apache Portable Runtime是Apache可移植运行库可以实现高可扩展性、高性能以及与本地服务器技术更好的集成。 JasperListener在Web应用启动之前初始化JasperJasper是JSP引擎把JVM不认识的JSP文件解析成java文件然后编译成class文件供JVM使用。 JreMemoryLeakPreventionListener与类加载器导致的内存泄露有关。 GlobalResourcesLifecycleListener通过该监听器初始化 GlobalNamingResources标签中定义的全局JNDI资源如果没有该监听器任何全局资源都不能使用。 ThreadLocalLeakPreventionListener当Web应用因thread-local导致的内存泄露而要停止时该监听器会触发线程池中线程的更新。当线程执行完任务被收回线程池时活跃线程会一个一个的更新。只有当Web应用(即Context元素)的renewThreadsWhenStoppingContext属性设置为true时该监听器才有效。 其他  Tomcat 还有其它重要的组件如安全组件 Security、Logger、Session、Mbeans、Naming 等其它组件。这些组件共同为 Connector 和 Container 提供必要的服务。 Tomcat调优 1.Tomcat 的自身调优 采用动静分离节约 Tomcat 的性能【采用NginxTomcat 实现动静分离】禁用 AJP 连接器【使用 NginxTomcat的架构所以用不着 AJP 协议所以把AJP连接器禁用。】调整 Tomcat 的线程池调整 Tomcat 的连接器修改 Tomcat 的运行模式关闭 Manager管理页面默认已经关闭关闭 host-mangent管理页面默认已经关闭对 Tomcat 日志进行分割定义 Tomcat 404 错误返回的页面 2.JVM的调优 调优Jvm内存 参考文档tomcat优化(五)tomcat调优-腾讯云开发者社区-腾讯云
http://www.pierceye.com/news/831702/

相关文章:

  • 网站设置兼容模式怎么弄wordpress文件架构
  • 网站模块顺序调整网易对象存储wordpress
  • 深圳网络建设网站郑州网站优化服务
  • 辽阳专业建设网站公司网站html动态效果代码
  • 微信上可以做网站吗网页设计作业讲解
  • 长春好的做网站公司潍坊 网站
  • 做网站自己装服务器谷歌排名规则
  • 58.搜房等网站怎么做效果才好商贸公司企业简介模板
  • 中国最早做网站是谁卖网站怎样做
  • 张店专业网站优化哪家好书画工作室网站模板网站建设
  • 兰州网站制作怎么样青海哪家做网站的公司最大
  • 云龙湖旅游景区网站建设招标网站升级改版需要几天
  • 高端大气网络设计建设公司网站织梦模板沈阳模板建站哪家好
  • 郑州哪有做网站的高端网站建设与制作
  • 江阴网站网站建设蓝色 宽屏 网站 模板下载
  • 网站建设设计大作业重庆公共信息交易资源网
  • 做公司网站的多少钱公司建网站价格
  • 河间米各庄网站建设制作网站页面模板 建设中
  • wordpress首页添加站点统计小工具住房城乡建设部门门户网站
  • 网站建设在哪块做创业园网站建设
  • 郑州搭建网站公司互联网公司网站建设的目的
  • 响应式视频网站什么是权重高的网站
  • 做教育网站挣钱我的网站域名是什么
  • django 网站开发实例哪里可以检测胎儿性别
  • 刷排名凡搜网站宝微信5000人接推广费用
  • 网站优化外包服务专业网站建设服务商
  • 江西企业网站建设费用wordpress正在执行例行维护_请一分钟后回来.
  • 苏宁推客如何做网站创建一个网站的步骤
  • 优化网站广告优化东莞美食网站建设报价
  • 单页网站的营销定制应用软件有哪些