精华内容
下载资源
问答
  • web服务访问出错
    千次阅读
    2020-05-08 02:01:50


    VM虚拟机中,在向windows server 2012 R2平台的证书服务器申请服务器证书的时候,报错:
    在这里插入图片描述
    解决办法:

    虚拟机中,先在控制面板中的用户账户找到系统账号Administrator,给他添加一个密码,
    然后Ctrl+Alt+Delete,选择切换用户登录,切换成系统账号Administrator
    登录进来之后就可以选择了,错误没有了

    在这里插入图片描述

    更多相关内容
  • 由于嵌入式技术的发展,嵌入式Web服务器软件越来越大,对硬件的要求也相应地提高,但在工业现场的底层控制中,一般嵌入式系统的硬件配置都...本文就是对实际应用过程中,偶尔出现的Web页面访问出错问题进行深入的研究。
  • 如果想在远程可以正常调用,需要修改web.config,在system.web节下面加上下面一段话即可 代码如下: <webServices> <protocols> ”HttpSoap”/> ”HttpPost”/> ”HttpGet”/> ”Documentation”/> </protocols> </...
  • 自建服务器部署WEB网站可公网访问

    千次阅读 2021-05-21 11:13:57
    比如路由器的公网ip10.10.10.1,私网ip:192.168.1.1,你的个人电脑ip:192.168.1.2,你web服务部署的端口8080.在路由器做端口映射192.168.1.1:8081<—>192.168.1.2:8080.这样设置好后,通过外网访问10.10.10.1:...

    自建服务器部署WEB网站可公网访问

    一、公网IP端口映射到服务器主机或者内网穿透

    1、公网IP转发服务器端口
    入户电信和联通宽带可以申请桥接模式,请宽带操作员把家中光猫设置成拨号模式,然后通过路由器进行拨号上网,这样在该路由器上转发服务器IP和端口,实现公网访问。
    最直接的方案:端口映射。比如路由器的公网IP:10.10.10.1,私网路由器IP:192.168.1.1,个人电脑IP:192.168.1.12,你web服务部署的端口8080.在路由器做端口映射192.168.1.1:8080<—>192.168.1.12:8080.这样设置好后,通过外网访问10.10.10.1:8080时,就是访问你的web服务了。注意防火墙设置等。
    2、通过代理进行内网穿透
    这个可选方法有很多,有付费的花生壳,免费的小米球和国外Ngrok等,这里介绍下免费的小米球。一般付费的带宽会好一点。
    小米球官网链接:https://www.ngrok.cc/
    在这里插入图片描述
    在这里插入图片描述
    具体操作见官网教程,开通隧道后,可以用Forwarding栏http://xxxx.xxxx.com网址直接访问服务器部署的网站。

    二、Nginx 反向代理和负载均衡

    2.1 windows 10 安装Nginx

    1、使用Nginx作为服务器反向代理中间件。
    Nginx下载地址:http://nginx.org/en/download.html
    在这里插入图片描述
    在这里插入图片描述
    进入nginx.conf文件,主要在http函数中设置upstream和location功能:

    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  6500;
        upstream zhixinai {
        	server 127.0.0.1:8888; 
        }
        }
        server {
            listen       80;
            server_name  localhost;
            location / {
            	add_header Access-Control-Allow-Origin *;
            	add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
    	       	add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-            Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
            	if ($request_method = 'OPTIONS') {
            	return 204;
             	}
            	root   html;
            	index  index.html index.htm;
            	proxy_pass http://zhixinai;
        }
    
            location /predict/ {
                add_header Access-Control-Allow-Origin *;
                add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
                add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-            Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
                if ($request_method = 'OPTIONS') {
                return 204;
                }
                proxy_pass http://127.0.0.1:5000/predict/;
            }
    }         
    

    Nginx常用命令:

    cd /usr/local/nginx/sbin/
    ./nginx # 启动
    ./nginx -s stop # 停止
    ./nginx -s quit # 安全退出
    ./nginx -s reload # 重新加载配置文件
    ps aux|grep nginx # 查看nginx进度
    

    2.2 ubuntu18.04 安装Nginx

    1、安装Nginx-1.20.1
    参考:ubuntu安装nginx
    在执行如下步骤时:

    ./configure
    

    遇到问题:

    ./configure: error: the HTTP rewrite module requires the PCRE library.
    You can either disable the module by using --without-http_rewrite_module
    option, or install the PCRE library into the system, or build the PCRE library
    statically from the source with nginx by using --with-pcre=<path> option.
    

    解决方案:
    先忽略了,执行:

    ./configure --without-http_rewrite_module
    

    出现问题:

    ./configure: error: the HTTP gzip module requires the zlib library.
    You can either disable the module by using --without-http_gzip_module
    option, or install the zlib library into the system, or build the zlib library
    statically from the source with nginx by using --with-zlib=<path> option.
    

    安装zlib:
    参考:Ubuntu Nginx ./configure: error: the HTTP gzip module requires the zlib library. 以及tengine的编译安装
    在执行:

    make
    

    遇到问题:
    在这里插入图片描述
    解决参考:Ubuntu下一步一步安装nginx,make: *** No rule to make target build', needed bydefault’. Stop.
    期间,遇到清华源出错,所以都改成了阿里源,改源步骤参考:
    更换Ubuntu源(sources.list)
    然后,开始安装依赖:

    1、GCC——GNU编译器集合(GCC可以使用默认包管理器的仓库(repositories)来安装,包管理器的选择依赖于你使用的Linux发布版本,包管理器有不同的实现:yum是基于Red
    Hat的发布版本;apt用于Debian和Ubuntu;yast用于SuSE Linux等等。)
    
    RedHat中安装GCC:
    
    yum install gcc
    
    Ubuntu中安装GCC:
    
    apt-get install gcc
    
    2、PCRE库(Nginx编译需要PCRE(Perl Compatible Regular
    Expression),因为Nginx的Rewrite模块和HTTP核心模块会使用到PCRE正则表达式语法。这里需要安装两个安装包pcre和pcre-devel。第一个安装包提供编译版本的库,而第二个提供开发阶段的头文件和编译项目的源代码,这正是我们需要的理由。)
    
    RedHat中安装PCRE:
    
    yum install pcre pcre-devel
    
    Ubuntu中安装PCRE:
    
    apt-get install libpcre3 libpcre3-dev
    
    3、zlib库(zlib库提供了开发人员的压缩算法,在Nginx的各种模块中需要使用gzip压缩。如同安装PCRE一样,同样需要安装库和它的源代码:zlib和zlib-devel。)
    
    RedHat中安装zlib:
    
    yum install zlib zlib-devel
    
    Ubuntu中安装zlib:
    
    apt-get install zlib1g zlib1g-dev
    
    4、OpenSSL库(在Nginx中,如果服务器提供安全网页时则会用到OpenSSL库,我们需要安装库文件和它的开发安装包(openssl和openssl-devel)。)
    
    RedHat中安装OpenSSL:
    
    yum install openssl openssl-devel
    
    Ubuntu中安装OpenSSL:(注:Ubuntu14.04的仓库中没有发现openssl-dev):
    
    apt-get install openssl openssl-dev
    -----------------------
    原文链接:https://blog.csdn.net/qq_40183281/article/details/90085220
    

    之后,重新执行:

    sudo su
    ./configure
    

    显示成功:

    Configuration summary
      + using system PCRE library
      + OpenSSL library is not used
      + using system zlib library
    

    之后,执行:

    make
    make install
    

    三、web部署

    基于web服务端的模型部署,主要是通过REST API的形式来提供接口方便调用。
    1、web服务与技术框架
    2、服务配置
    3、预测接口定义
    4、接口测试

    四、遇到问题

    1、问题:重启几次flask之后,报错:
    requests.exceptions.ConnectionError: HTTPSConnectionPool(host=‘api.github.com’, port=443): Max retries exceeded with url: /repos/ultralytics/yolov5/releases/latest (Caused by NewConnectionError(’<urllib3.connection.HTTPSConnection object at 0x0000015D29A72820>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed’))

    解决:
    在win10的环境中添加miniconda,如下:

    在这里插入图片描述
    在这里插入图片描述
    引用链接:

    1. nginx教程:https://www.bilibili.com/video/BV1F5411J7vK
    2. web部署和C++部署:https://mp.weixin.qq.com/s/LuzH37tIWzSEKBV-XqEkWA
    展开全文
  • 四、将web项目部署在云服务器上 一、购买服务器 第一步我们需要购买一个属于自己的服务器,网上有很多服务器可供我们选择,百度云,阿里云,腾讯云等等,第一次购买都会非常便宜,如果是学生的话还可以用学生证...

    目录

    一、购买服务器

    二、购买域名

    三、服务器环境搭建

    四、将web项目部署在云服务器上


    一、购买服务器

    第一步我们需要购买一个属于自己的服务器,网上有很多服务器可供我们选择,百度云,阿里云,腾讯云等等,第一次购买都会非常便宜,如果是学生的话还可以用学生证进行优惠购买,我是用学生证购买的百度云服务器,链接:启航校园计划

    服务器的系统我选择的是:Windows Server / 2012 R2 x86_64 (64bit) 中文版

    二、购买域名

    我们需要购买一个域名,并备案、解析,注意备案和解析不能同时进行。备案花的时间会长一些,它会有备案步骤的指引,按照指引一步一步来就稳了。解析的时候,记录值填写的是云服务器的公网ip。

    三、服务器环境搭建

    在自己电脑中远程连接云服务器,输入云服务器的公网IP,连接成功后你大概就能猜到接下来怎么做了,我们以前是如何在自己电脑上配置环境的,就如何在这台服务器上配置。

    我们需要在这台服务器上配置的环境有:jdk,mysql,tomcat,过程就不再细讲,网上有很多详细的教程。

    四、将web项目部署在云服务器上

    在Eclipse中将项目打包成war包,并上传到云服务器上tomcat中的webapps文件夹下,此时启动tomcat,即双击tomcat中bin目录下的startup.bat文件,webapps文件夹下会生成一个与项目同名的文件夹。

    打开tomcat中conf文件夹下的server.xml,找到如下位置

     
    
    1. <Connector port="8080" protocol="HTTP/1.1"

    2. connectionTimeout="20000"

    3. redirectPort="8443" />

    这里我们需要将8080改为80

    接着找到下面两个地方,并将它改成你的域名

    <Engine name="Catalina" defaultHost="www.***.top">
     
    
    1. <Host name="www.***.top" appBase="webapps"

    2. unpackWARs="true" autoDeploy="true">

    配置docBase。在<Host></Host>里面添加<Context>。path="" docBase=项目在服务器上的绝对路径。这里项目名称为BlogTest,如图

    下面是我配置好的server.xml

     
    
    1. <?xml version="1.0" encoding="UTF-8"?>

    2. <!--

    3. Licensed to the Apache Software Foundation (ASF) under one or more

    4. contributor license agreements. See the NOTICE file distributed with

    5. this work for additional information regarding copyright ownership.

    6. The ASF licenses this file to You under the Apache License, Version 2.0

    7. (the "License"); you may not use this file except in compliance with

    8. the License. You may obtain a copy of the License at

    9. http://www.apache.org/licenses/LICENSE-2.0

    10. Unless required by applicable law or agreed to in writing, software

    11. distributed under the License is distributed on an "AS IS" BASIS,

    12. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

    13. See the License for the specific language governing permissions and

    14. limitations under the License.

    15. -->

    16. <!-- Note: A "Server" is not itself a "Container", so you may not

    17. define subcomponents such as "Valves" at this level.

    18. Documentation at /docs/config/server.html

    19. -->

    20. <Server port="8005" shutdown="SHUTDOWN">

    21. <Listener className="org.apache.catalina.startup.VersionLoggerListener" />

    22. <!-- Security listener. Documentation at /docs/config/listeners.html

    23. <Listener className="org.apache.catalina.security.SecurityListener" />

    24. -->

    25. <!--APR library loader. Documentation at /docs/apr.html -->

    26. <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />

    27. <!-- Prevent memory leaks due to use of particular java/javax APIs-->

    28. <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />

    29. <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

    30. <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

    31. <!-- Global JNDI resources

    32. Documentation at /docs/jndi-resources-howto.html

    33. -->

    34. <GlobalNamingResources>

    35. <!-- Editable user database that can also be used by

    36. UserDatabaseRealm to authenticate users

    37. -->

    38. <Resource name="UserDatabase" auth="Container"

    39. type="org.apache.catalina.UserDatabase"

    40. description="User database that can be updated and saved"

    41. factory="org.apache.catalina.users.MemoryUserDatabaseFactory"

    42. pathname="conf/tomcat-users.xml" />

    43. </GlobalNamingResources>

    44. <!-- A "Service" is a collection of one or more "Connectors" that share

    45. a single "Container" Note: A "Service" is not itself a "Container",

    46. so you may not define subcomponents such as "Valves" at this level.

    47. Documentation at /docs/config/service.html

    48. -->

    49. <Service name="Catalina">

    50. <!--The connectors can use a shared executor, you can define one or more named thread pools-->

    51. <!--

    52. <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"

    53. maxThreads="150" minSpareThreads="4"/>

    54. -->

    55. <!-- A "Connector" represents an endpoint by which requests are received

    56. and responses are returned. Documentation at :

    57. Java HTTP Connector: /docs/config/http.html

    58. Java AJP Connector: /docs/config/ajp.html

    59. APR (HTTP/AJP) Connector: /docs/apr.html

    60. Define a non-SSL/TLS HTTP/1.1 Connector on port 8080

    61. -->

    62. <Connector port="80" protocol="HTTP/1.1"

    63. connectionTimeout="20000"

    64. redirectPort="8443" />

    65. <!-- A "Connector" using the shared thread pool-->

    66. <!--

    67. <Connector executor="tomcatThreadPool"

    68. port="8080" protocol="HTTP/1.1"

    69. connectionTimeout="20000"

    70. redirectPort="8443" />

    71. -->

    72. <!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443

    73. This connector uses the NIO implementation. The default

    74. SSLImplementation will depend on the presence of the APR/native

    75. library and the useOpenSSL attribute of the

    76. AprLifecycleListener.

    77. Either JSSE or OpenSSL style configuration may be used regardless of

    78. the SSLImplementation selected. JSSE style configuration is used below.

    79. -->

    80. <!--

    81. <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"

    82. maxThreads="150" SSLEnabled="true">

    83. <SSLHostConfig>

    84. <Certificate certificateKeystoreFile="conf/localhost-rsa.jks"

    85. type="RSA" />

    86. </SSLHostConfig>

    87. </Connector>

    88. -->

    89. <!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443 with HTTP/2

    90. This connector uses the APR/native implementation which always uses

    91. OpenSSL for TLS.

    92. Either JSSE or OpenSSL style configuration may be used. OpenSSL style

    93. configuration is used below.

    94. -->

    95. <!--

    96. <Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"

    97. maxThreads="150" SSLEnabled="true" >

    98. <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />

    99. <SSLHostConfig>

    100. <Certificate certificateKeyFile="conf/localhost-rsa-key.pem"

    101. certificateFile="conf/localhost-rsa-cert.pem"

    102. certificateChainFile="conf/localhost-rsa-chain.pem"

    103. type="RSA" />

    104. </SSLHostConfig>

    105. </Connector>

    106. -->

    107. <!-- Define an AJP 1.3 Connector on port 8009 -->

    108. <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

    109. <!-- An Engine represents the entry point (within Catalina) that processes

    110. every request. The Engine implementation for Tomcat stand alone

    111. analyzes the HTTP headers included with the request, and passes them

    112. on to the appropriate Host (virtual host).

    113. Documentation at /docs/config/engine.html -->

    114. <!-- You should set jvmRoute to support load-balancing via AJP ie :

    115. <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">

    116. -->

    117. <Engine name="Catalina" defaultHost="www.xxx.top">

    118. <!--For clustering, please take a look at documentation at:

    119. /docs/cluster-howto.html (simple how to)

    120. /docs/config/cluster.html (reference documentation) -->

    121. <!--

    122. <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

    123. -->

    124. <!-- Use the LockOutRealm to prevent attempts to guess user passwords

    125. via a brute-force attack -->

    126. <Realm className="org.apache.catalina.realm.LockOutRealm">

    127. <!-- This Realm uses the UserDatabase configured in the global JNDI

    128. resources under the key "UserDatabase". Any edits

    129. that are performed against this UserDatabase are immediately

    130. available for use by the Realm. -->

    131. <Realm className="org.apache.catalina.realm.UserDatabaseRealm"

    132. resourceName="UserDatabase"/>

    133. </Realm>

    134. <Host name="www.xxx.top" appBase="webapps"

    135. unpackWARs="true" autoDeploy="true">

    136. <Context docBase="C:\Tomcat\apache-tomcat-8.5.33\webapps\BlogTest" path="" reloadable="true"/>

    137. <!-- SingleSignOn valve, share authentication between web applications

    138. Documentation at: /docs/config/valve.html -->

    139. <!--

    140. <Valve className="org.apache.catalina.authenticator.SingleSignOn" />

    141. -->

    142. <!-- Access log processes all example.

    143. Documentation at: /docs/config/valve.html

    144. Note: The pattern used is equivalent to using pattern="common" -->

    145. <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"

    146. prefix="localhost_access_log" suffix=".txt"

    147. pattern="%h %l %u %t &quot;%r&quot; %s %b" />

    148. </Host>

    149. </Engine>

    150. </Service>

    151. </Server>

    重启Tomcat,在浏览器中输入域名就可以访问部署在服务器上的网站了。

    如果出现“The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.”的错误,请看这里:云服务器上部署web项目,外网访问时出错

    业务搭载离不了云服务器,选择合适的平台最重要!

    从目前国内云计算市场的格局来看,国内云计算前三强分别是阿里云、腾讯云和华为云,阿里云、腾讯云作为背靠互联网平台的企业,更偏向于B端用户;华为与作为传统的通信巨头,更偏向于G端。

    本人从事云计算相关工作至今已有多年,国内主流的云平台都接触过,包括他们的销售及技术团队,对各家的产品也小有了解,并且指导过数百家企业迁移上云,对云平台选择也有一定的发言权!

    网上有很多评测,评测数据也五花八门,说谁好的都有,这个两篇博文分析汇总的非常详细,分享给大家,文档地址:

    博文1:云服务器哪家好!阿里云、腾讯云、华为云的服务器配置及价格对比?​

    博文2:阿里云服务器突发型t6、n4、s6、c5、c6怎么选?和腾讯云服务器标准型s3、sn3ne、s4、s5、sa2相比哪家好?全面解析

    如果是高并发,高IO业务场景,需要确定服务器规格,可让业务应用性能发挥到最佳,参考官方文档:

    阿里云服务器规格:规格实例族 - 云服务器 ECS

    腾讯云服务器规格:规格实例族 - 云服务器CVM

    展开全文
  • WEB服务访问的过程

    千次阅读 2017-09-08 09:55:09
    先说说线程、进程、以及并发连接数,在说Web服务器。 1.进程与线程  进程是具有一定独立功能的程序,关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。从逻辑角度来看,多线程的...
    先说说线程、进程、以及并发连接数,在说Web服务器

    1.进程与线程

            进程是具有一定独立功能的程序,关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。从逻辑角度来看,多线程的意义在于一个应用程序(进程)中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用来实现,而是作为进程来调度和管理以及资源分配。这就是进程和线程的重要区别,进程和线程的主要差别在于,进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。下面我们来说一说并发连接数。

    2.并发连接数

    (1).什么是最大并发连接数呢?

             最大并发连接数是服务器同一时间能处理最大会话数量。

    (2).何为会话?

           我们打开一个网站就是一个客户端浏览器与服务端的一个会话,而我们浏览网页是基于http协议。

    (3).HTTP协议如何工作?

           HTTP支持两种建立连接的方式:非持久连接持久连接(HTTP1.1默认的连接方式为持久连接)。

    (4).浏览器与Web服务器之间将完成下列7个步骤

    • 建立TCP连接

    • Web浏览器向Web服务器发送请求命令

    • Web浏览器发送请求头信息

    • Web服务器应答

    • Web服务器发送应答头信息

    • Web服务器向浏览器发送数据

    • Web服务器关闭TCP连接

           一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,但是浏览器一般其头信息加入了这行代码 Connection:keep-alive,TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接目的,节省了为每 个请求建立新连接所需的时间,还节约了网络带宽。

    3.并发连接数的计算方法

            用户下载服务器上的文件,则为一个连接,用户文件下载完毕后这个连接就消失了。有时候用户用迅雷的多线程方式下载的话,这一个用户开启了5个线程的话,就算是5个连接。

            用户打开你的页面,就算停留在页面没有对服务器发出任何请求,那么在用户打开一面以后的15分钟内也都要算一个在线。

            上面的情况用户继续打开同一个网站的其他页面,那么在线人数按照用户最后一次点击(发出请求)以后的15分钟计算,在这个15分钟内不管用户怎么点击(包括新窗口打开)都还是一人在线。

             当用户打开页面然后正常关闭浏览器,用户的在线人数也会马上清除。

    二、Web服务器提供服务的方式

           Web服务器由于要同时为多个客户提供服务,就必须使用某种方式来支持这种多任务的服务方式。一般情况下可以有以下三种方式来选择,多进程方式多线程方式异步方式。其中,多进程方式中服务器对一个客户要使用一个进程来提供服务,由于在操作系统中,生成一个进程需要进程内存复制等额外的开销,这样在客户较多时的性能就会降低。为了克服这种生成进程的额外开销,可以使用多线程方式或异步方式。在多线程方式中,使用进程中的多个线程提供服务, 由于线程的开销较小,性能就会提高。事实上,不需要任何额外开销的方式还是异步方式,它使用非阻塞的方式与每个客户通信,服务器使用一个进程进行轮询就行了。

           虽然异步方式最为高效,但它也有自己的缺点。因为异步方式下,多个任务之间的调度是由服务器程序自身来完成的,而且一旦一个地方出现问题则整个服务器就会出现问题。因此,向这种服务器增加功能,一方面要遵从该服务器自身特定的任务调度方式,另一方面要确保代码中没有错误存在,这就限制了服务器的功能,使得异步方式的Web服务器的效率最高,但功能简单,如Nginx服务器

           由于多线程方式使用线程进行任务调度,这样服务器的开发由于遵从标准,从而变得简单并有利于多人协作。然而多个线程位于同一个进程内,可以访问同样的内存空间,因此存在线程之间的影响,并且申请的内存必须确保申请和释放。对于服务器系统来讲,由于它要数天、数月甚至数年连续不停的运转,一点点错误就会逐渐积累而最终导致影响服务器的正常运转,因此很难编写一个高稳定性的多线程服务器程序。但是,不是不能做到时。Apache的worker模块就能很好的支持多线程的方式。

           多进程方式的优势就在于稳定性,因为一个进程退出的时候,操作系统会回收其占用的资源,从而使它不会留下任何垃圾。即便程序中出现错误,由于进程是相互隔离的,那么这个错误不会积累起来,而是随着这个进程的退出而得到清除。Apache的prefork模块就是支持多进程的模块。

    三、多进程、多线程、异步模式的对比

         Web服务器总的来说提供服务的方式有三种,多进程方式,多线程的方式,异步方式。其中效率最高的是异步的方式,最稳定的是多进程方式,占用资源较少的是多线程的方式。

    1.多进程

           此种架构方式中,web服务器生成多个进程并行处理多个用户请求,进程可以按需或事先生成。有的web服务器应用程序为每个用户请求生成一个单独的进程来进行响应,不过,一旦并发请求数量达到成千上万时,多个同时运行的进程将会消耗大量的系统资源。(即每个进程只能响应一个请求或多个进程对应多个请求)

    优点:

    • 最大的优势就在于稳定性,一个进程出错不会影响其它进程。如,服务器同时连接100个请求对就的是100个进程,其中一个进程出错,只会杀死一个进程,还有99个进程继续响应用户请求。每个进程响应一个请求

    缺点:

    • 进程量大,进程切换次数过多,导致CPU资源使用效率低,每个进程的地址空间是独立的,很多空间中重复的数据,所以内存使用效率低,进程切换由于内核完成,占用CPU资源。

    2.多线程

           在多线程方式中,每个线程来响应一下请求,由于线程之间共享进程的数据,所以线程的开销较小,性能就会提高。

    优点:

    • 线程间共享进程数据,每个线程响应一个请求,线程切换不可避免(切换量级比较轻量),同一进程的线程可以共享进程的诸多资源,对内存的需求较之进程有很大下降,读可以共享,写不可以共享

    缺点:

    • 线程快速切换时会带来线程抖动,多线程会导致服务器不稳定

    3.异步方式

           一个进程或线程响应多个请求,不需要任何额外开销的,性能最高,占用资源最少。但也有问题一但进程或线程出错就会导致整个服务器的宕机。

    四、Web 服务请求过程

    20130830100310571

           在上面的讲解中我们说明,Web服务器的如何提供服务的,有多进程的方式、多线程的方式还有异步方式我们先简单这么理解,后面我们慢慢说,现在我们不管Web服务器是如何提供服务的,多进程也好、多线程好,异步也罢。下面我们来说一下,一个客户端的具体请求Web服务的具体过程,从上图中我们可以看到有11步,下面我们来具体说一下,

    • 1.首先我们客户端发送一个请求到Web服务器,请求首先是到网卡。2.网卡将请求交由内核空间的内核处理,其实就是拆包了,发现请求的是80端口。3.内核便将请求发给了在用户空间的Web服务器,Web服务器接受到请求发现客户端请求的index.html页面。4.Web服务器便进行系统调用将请求发给内核。5.内核发现在请求的是一页面,便调用磁盘的驱动程序,连接磁盘。6.内核通过驱动调用磁盘取得的页面文件。7.内核将取得的页面文件保存在自己的缓存区域中便通知Web进程或线程来取相应的页面文件。8.Web服务器通过系统调用将内核缓存中的页面文件复制到进程缓存区域中。9.Web服务器取得页面文件来响应用户,再次通过系统调用将页面文件发给内核。10.内核进程页面文件的封装并通过网卡发送出去。11.当报文到达网卡时通过网络响应给客户端

    简单来说就是:用户请求-->送达到用户空间-->系统调用-->内核空间-->内核到磁盘上读取网页资源->返回到用户空间->响应给用户。上述简单的说明了一下,客户端向Web服务请求过程,在这个过程中,有两个I/O过程,一个就是客户端请求的网络I/O,另一个就是Web服务器请求页面的磁盘I/O。 下面我们就来说说Linux的I/O模型。

    五、Linux I/O 模型

    1.I/O模型分类

    说明:我们都知道web服务器的进程响应用户请求,但无法直接操作I/O设备,其必须通过系统调用,请求kernel来协助完成I/O动作,如下图:20130830100310352

          对于数据输入而言,即等待(wait)数据输入至buffer需要时间,而从buffer复制(copy)数据至进程也需要时间  
    根据等待模式不同,I/O动作可分为五种模式。

    • 1.阻塞I/O,2.非阻塞I/O,3.I/O复用(select和poll),4.信号(事件)驱动I/O(SIGIO),5.异步I/O(Posix.1的aio_系列函数)

    2.I/O模型的相关术语

    (1).阻塞和非阻塞:

           阻塞和非阻塞指的是执行一个操作是等操作结束再返回,还是马上返回。比如你去车站接朋友,这是一个操作。可以有两种执行方式。第一种,你这人特实诚,老早就到了车站一直等到车来了接到朋友为止。第二种,你到了车站,问值班的那趟车来了没有,“还没有”,你出去逛一圈,可能过会回来再问。第一种就是阻塞方式,第二种则是非阻塞的。我认为阻塞和非阻塞讲得是做事方法,是针对做事的人而言的。

    (2).同步和异步:

           同步和异步又是另外一个概念,它是事件本身的一个属性。比如老板让你去搬一堆石头,而且只让你一个人干,你只好自己上阵,最后的结果是搬完了,还是你砸到脚了,只有搬完了你才知道。这就是同步的事件。如果老板还给你个小弟,你就可以让小弟去搬,搬完了告你一声。这就变成异步的了。其实异步还可以分为两种:带通知的和不带通知的。前面说的那种属于带通知的。有些小弟干活可能主动性不是很够,不会主动通知你,你就需要时不时的去关注一下状态。这种就是不带通知的异步。 对于同步的事件,你只能以阻塞的方式去做。而对于异步的事件,阻塞和非阻塞都是可以的。非阻塞又有两种方式:主动查询和被动接收消息。被动不意味着一定不好,在这里它恰恰是效率更高的,因为在主动查询里绝大部分的查询是在做无用功。对于带通知的异步事件,两者皆可。而对于不带通知的,则只能用主动查询。

    (3).I/O

           回到I/O,不管是I还是O,对外设(磁盘)的访问都可以分成请求和执行两个阶段。请求就是看外设的状态信息(比如是否准备好了),执行才是真正的I/O操作。在Linux 2.6之前,只有“请求”是异步事件,2.6之后才引入AIO把“执行”异步化。别看Linux/Unix是用来做服务器的,这点上比Windows落后了好多,IOC(Windows上的AIO)在Win2000上就有了。

    (4).总结

          Linux上的前四种I/O模型的“执行”阶段都是同步的,只有最后一种才做到了真正的全异步。第一种阻塞式是最原始的方法,也是最累的办法。当然累与不累要看针对谁。应用程序是和内核打交道的。对应用程序来说,这种方式是最累的,但对内核来说这种方式恰恰是最省事的。还拿接人这事为例,你就是应用程序,值班员就是内核,如果你去了一直等着,值班员就省事了。当然现在计算机的设计,包括操作系统,越来越为终端用户考虑了,为了让用户满意,内核慢慢的承担起越来越多的工作,IO模型的演化也是如此。非阻塞I/O ,I/O复用,信号驱动式I/O其实都是非阻塞的,当然是针对“请求”这个阶段。非阻塞式是主动查询外设状态。I/O复用里的select,poll也是主动查询,不同的是select和poll可以同时查询多个fd(文件句柄)的状态,另外select有fd个数的限制。epoll是基于回调函数的。信号驱动式I/O则是基于信号消息的。这两个应该可以归到“被动接收消息”那一类中。最后就是伟大的AIO的出现,内核把什么事都干了,对上层应用实现了全异步,性能最好,当然复杂度也最高。

    六、Linux I/O 模型具体说明

             首先我们先来看一下,基本 Linux I/O 模型的简单矩阵,从图中我们可以看到的模型有,同步阻塞I/O(阻塞I/O)、同步非阻塞I/O(非阻塞I/O )、异步阻塞I/O(I/O复用),异步非阻塞I/O(有两种,信号驱动I/O和异步I/O)。好了现在就来具体说一说吧。

    20130830100311898

    1.阻塞I/O

    说明:应用程序调用一个IO函数,导致应用程序阻塞,等待数据准备好。 如果数据没有准备好,一直等待数据准备好了,从内核拷贝到用户空间,IO函数返回成功指示。这个不用多解释吧,阻塞套接字。下图是它调用过程的图示:(注,一般网络I/O都是阻塞I/O,客户端发出请求,Web服务器进程响应,在进程没有返回页面之前,这个请求会处于一直等待状态)

    20130830100312494

    2.非阻塞I/O

           我们把一个套接口设置为非阻塞就是告诉内核,当所请求的I/O操作无法完成时,不要将进程睡眠,而是返回一个错误。这样我们的I/O操作函数将不断的测试数据是否已经准备好,如果没有准备好,继续测试,直到数据准备好为止。在这个不断测试的过程中,会大量的占用CPU的时间,所有一般Web服务器都不使用这种I/O模型。具体过程如下图:

    20130830100314195

    3.I/O复用(select和poll)

            I/O复用模型会用到select或poll函数或epoll函数(Linux2.6以后的内核开始支持),这两个函数也会使进程阻塞,但是和阻塞I/O所不同的的,这两个函数可以同时阻塞多个I/O操作。而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操作函数。具体过程如下图:

    20130830100317719

    4.信号驱动I/O(SIGIO)

           首先,我们允许套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。具体过程如下图:

    20130830100320472

    综上可以看出,越往后,阻塞越少,理论上效率也是最优。其五种I/O模型中,前三种属于同步I/O,后两者属于异步I/O。

    同步I/O:

    • 1.阻塞I/O,2.非阻塞I/O,3.I/O复用(select和poll)     

    异步I/O:

    • 1.信号驱动I/O(SIGIO) (半异步),2.异步I/O(Posix.1的aio_系列函数) (真正的异步)

    异步 I/O 和 信号驱动I/O的区别:

    • 信号驱动 I/O 模式下,内核可以复制的时候通知给我们的应用程序发送SIGIO 消息。异步 I/O 模式下,内核在所有的操作都已经被内核操作结束之后才会通知我们的应用程序。

    七、Linux I/O模型的具体实现

    1.主要实现方式有以下几种:

    • select,poll,epoll,kqueue,/dev/poll,iocp

           其中iocp是Windows实现的,select、poll、epoll是Linux实现的,kqueue是FreeBSD实现的,/dev/poll是SUN的Solaris实现的。select、poll对应第3种(I/O复用)模型,iocp对应第5种(异步I/O)模型,那么epoll、kqueue、/dev/poll呢?其实也同select属于同一种模型,只是更高级一些,可以看作有了第4种(信号驱动I/O)模型的某些特性,如callback机制。

    2.为什么epoll、kqueue、/dev/poll比select高级?

           答案是,他们无轮询。因为他们用callback取代了。想想看,当套接字比较多的时候,每次select()都要通过遍历FD_SETSIZE个Socket来完成调度,不管哪个Socket是活跃的,都遍历一遍。这会浪费很多CPU时间。如果能给套接字注册某个回调函数,当他们活跃时,自动完成相关操作,那就避免了轮询,这正是epoll、kqueue、/dev/poll做的。这样子说可能不好理解,那么我说一个现实中的例子,假设你在大学读书,住的宿舍楼有很多间房间,你的朋友要来找你。select版宿管大妈就会带着你的朋友挨个房间去找,直到找到你为止。而epoll版宿管大妈会先记下每位同学的房间号,你的朋友来时,只需告诉你的朋友你住在哪个房间即可,不用亲自带着你的朋友满大楼找人。如果来了10000个人,都要找自己住这栋楼的同学时,select版和epoll版宿管大妈,谁的效率更高,不言自明。同理,在高并发服务器中,轮询I/O是最耗时间的操作之一,select、epoll、/dev/poll的性能谁的性能更高,同样十分明了。

    3.Windows or *nix (IOCP or kqueue、epoll、/dev/poll)?

           诚然,Windows的IOCP非常出色,目前很少有支持asynchronous I/O的系统,但是由于其系统本身的局限性,大型服务器还是在UNIX下。而且正如上面所述,kqueue、epoll、/dev/poll 与 IOCP相比,就是多了一层从内核copy数据到应用层的阻塞,从而不能算作asynchronous I/O类。但是,这层小小的阻塞无足轻重,kqueue、epoll、/dev/poll 已经做得很优秀了。

    4.总结一些重点

           只有IOCP(windows实现)是asynchronous I/O,其他机制或多或少都会有一点阻塞。select(Linux实现)低效是因为每次它都需要轮询。但低效也是相对的,视情况而定,也可通过良好的设计改善epoll(Linux实现)、kqueue(FreeBSD实现)、/dev/poll(Solaris实现)是Reacor模式,IOCP是Proactor模式。Apache 2.2.9之前只支持select模型,2.2.9之后支持epoll模型,Nginx 支持epoll模型,Java nio包是select模型

    展开全文
  • Web Servlet配置出错访问不到

    千次阅读 2017-12-02 11:55:27
    Web Servlet配置出错访问不到在servlet, web.xml配置servlet出错, servlet配置出错
  • IIS部署Web服务器,用公网IP访问

    千次阅读 2020-05-26 18:20:31
    1、部署在云服务器上,需要将网站绑定IP地址设置为"全部未分配",否则会出错。设置如图1,设置IP之后外网访问错误为图2(云服务器已经默认进行了端口的重映射,不用在路由器手动添加端口映射) 图1 图2 ...
  • 云服务器部署 Web 项目

    万次阅读 多人点赞 2022-06-24 15:51:14
    (由于背景图有点大,可能加载有点慢,这是正常现象) 我们在遇到问题的时候不要害怕一是我们可以通过抓包来查看问题原因,还有就是要习惯于看 logs 日志文件寻找问题,出错了就找最新的文件日期,最好全都看…
  • 1. 了解web服务器的基本概念、端口号等; 2. 了解静态网站和动态网站的区别、看懂简单标签; 3. 熟悉web服务器的部署和网站的发布、熟悉一台服务器配置多个网站的三...4. 本节内容主要是为实战中搭配靶机环境服务。...
  • 直接配置到nginx配置文件处加入以下配置即可,我这里用的nginx版本为1.20。 server { listen 80; ... location /{ ... proxy_set_header X-Real-IP $remote_addr;... proxy_set_header REMOTE-HOST $remote_addr;...
  • 访问aspx 页面时候出现 加载配置文件时出错: 对路径“C:\NET_Dome\webtest\web.config”的访问被拒绝。 我在2003服务器 上浏览 aspx 页面的时候 出现错误 我用的是 vs2.0开发的 ![图片说明]...
  • web项目默认首页index.html无法访问问题问题描述:可以访问以.jsp为后缀的页面,不能访问.html为后缀的页面问题原因解决方案 问题描述:可以访问以.jsp为后缀的页面,不能访问.html为后缀的页面 我们用idea创建的web...
  • 如何搭建自己的本地服务器,Web服务器

    万次阅读 多人点赞 2020-08-21 16:53:11
    搭建本地服务器,Web服务器——保姆级教程! 本文首发于https://chens.life/How-to-build-your-own-server.html。 先上图!大致思路就是如此。 前言 暑假因为疫情在家无事可做,便白嫖了阿里云大半年的虚拟主机。...
  • 4、使用curl命令查看本地能否解析需要访问服务,如果解析不到可到要访问服务目录下创建类似index.php的文件,index相当于一个入口,可以让网络查询到。 5、添加windows端的域名对应,一台服务器可以对应多个...
  • 在Eclipse里面配置了tomcat,启动tomcat,浏览器访问localhost:8080/xxxx,结果,页面显示无法正常打开,localhost 将您重定向的次数过多。...如果,直接用startup.bat就不会出错了,这又是什么情况呢?
  • 当客户端将项目发布以后,浏览器通过“http://ip地址:端口号/项目...如果认真核对完项目名,url和服务地址,还是出错,这时候你应该核对一下你的端口名称有没有出错,如果没有改过tomcat端口号,试试将“:8080”...
  • 简单web服务器的实现(C++)

    万次阅读 多人点赞 2018-09-20 20:41:25
    if(m_myworkqueue.size()> max_job)//如果请求队列大于了最大请求队列,则出错 { m_queuelocker.unlock(); return false; } m_myworkqueue.push_back(request);//将请求加入到请求队列中 m_queuelocker....
  • hadoop的9870端口不能访问WEB界面的解决办法汇总
  • web服务器运行原理

    千次阅读 2019-03-04 09:45:41
    这几天的工作,就是把程序解耦,将功能分离,服务器只用来提供WEB服务WEB应用用来实现数据处理。 大家可以了解一下开发中比较常用的WEB框架,比如 Apache ,Nigix,Tomcat等。 没有一个服务器框架安装完成后,就...
  • 简单的嵌入式web服务器设计

    千次阅读 2019-06-01 17:54:18
    实验原理 WEB浏览器 ...个人电脑上常见的网页浏览器包括Internet Explorer、Firefox、... Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等Web客户端提供文档,也可以放置网站...
  • tomcat 运行web项目出错

    2017-05-17 07:21:00
    Eclipse,tomcat,web项目,启动后,访问,页面显示重定向...还有,问题出现就在一个项目上,用Eclipse,tomcat跑另外一个web,发现是可行的,访问不会出错,请问有人知道这是个什么情况吗?知道该怎么解决这个问题?
  • 1.防火墙没有关 可能你的防火墙阻止了他的访问 可以自行百度查看一下是否关闭 (我刚开始是以为我的防火墙没有关 所以我就新建了一个入栈规则 允许了801端口 这个启动默认用的是801端口) 具体步骤如下: 1.找到...
  • 良心推荐 openwrt luci web分析 https://www.jianshu.com/p/596485f95cf2
  • 前提条件:我的项目是从别人的地方拷贝过来的。 问题产生:写完项目,运行程序时,显示如上错误。(生成解决方案的时候,全部生成成功) 尝试解决方法1:关闭防火墙 结果:根本没有解决我的问题。...
  • 本人最近做的一个个人主页项目,本地tomcat服务器测试完全没有什么问题,可以正常访问,但是部署到我的云服务器上之后总是报404错误,各种纠结,最后发现是JAR包冲突的原因,解决办法为:将本地服务器下的LIB包下的...
  • 在一些servlet教程中,给出的servlet的URL映射配置方式是,在web.xml中添加servlet元素和servlet-mapping元素: &lt;servlet&gt; &lt;servlet-name&gt;ServletDemo01&lt;/servlet-name&gt...
  • 解决打开qBittorrent的Web UI时不能正常访问而是弹出下载框
  • 基于Nginx以及web服务器搭建在线视频播放
  • 浏览器访问hdfs web遇到的问题

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 167,872
精华内容 67,148
热门标签
关键字:

web服务访问出错