精华内容
下载资源
问答
  • Tomcat 动态资源服务器部署及应用

    千次阅读 2017-07-06 10:13:53
    Tomcat 动态资源服务器部署及应用 Java 2 EE 计数体系包含如 Serverlet , JSP , JMX 等等。 以OpenJDK为例,当前比较常用的有1.6.0、1.7.0、1.8.0等版本,当一台主机上有多个OpenJDK时,可使用 “alternatives”...

    Tomcat 动态资源服务器部署及应用

    Java 2 EE 计数体系包含如 Serverlet , JSP , JMX 等等。

    以OpenJDK为例,当前比较常用的有1.6.0、1.7.0、1.8.0等版本,当一台主机上有多个OpenJDK时,可使用 “alternatives” 命令设定默认使用的版本。

    Java代码的运行:.java(source code) –> javac –> .class(bytecode)

    JSP :Java Server Page
    JSP Container : JSP + Servlet Container
    基于jasper将静态输出的数据转为java代码进行输出,结果为servlet规范的代码
    .jsp –>jasper–> .java –> javac –> .class –> jvm

    tomcat 是JSP Container的开源实现,tomcat是 Java 2 EE 技术体系的不完整实现,tomcat在使用前需要部署Java环境。
    JSP Container 技术的商业实现包括:WebSphere, WebLogic, Oc4j, Glassfish, Geronimo, JOnAS, JBoss等等
    JSP Container 技术的开源实现包括:Tomcat, Jetty, Resin

    安装tomcat及软件依赖环境

    • 使用rpm包方式安装,在Base仓库中
    yum install -y java-1.8.0-openjdk tomcat tomcat-webapps tomcat-admin-webapps tomcat-docs-webapp
    • 如果使用非yum方式安装完成后,要配置JAVA_HOME环境变量,指向java的安装路径
    vim /etc/profile.d/java.sh
    export JAVA_HOME=/usr
    source /etc/profile.d/java.sh
    echo $JAVA_HOME

    Tomcat默认配置文件及结构框架:html语言嵌入式风格

    tomcat的配置文件:

    • server.xml:主配置文件

    • web.xml:每个webapp只有“部署”后才能被访问,它的部署方式通常由web.xml进行定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认配置

    • context.xml:每个web都可以专用的配置文件,它通常由专用的配置文件context.xml来定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认配置

    • tomcat-users.xml:用户认证的账号和密码文件

    ==tomcat的主配置文件及各组件的框架结构详解==

    tomcat主配置文件的默认配置实例:

    <?xml version='1.0' encoding='utf-8'?> 
    <Server port="8005" shutdown="SHUTDOWN">
        <Service name="Catalina">
            <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
            <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
            <Engine name="Catalina" defaultHost="localhost">
                <Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">
                    <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>

    组件详解:每个组件都由一个Java“类”实现,这些组件大体可分为以下几个类型:

    顶级组件:Server

    一个Server可包含多个Service

    代表tomcat instance,即表现出的一个java进程;监听在8005端口,只接收“SHUTDOWN”。各server监听的端口不能相同,因此,在同一物理主机启动多个实例时,需要修改其监听端口为不同的端口;

    服务类组件:Service

    一个Service中仅能有一个Engine
    一个Engine可对应多个Connector,但一个Connector仅能对应一个Engine

    用于实现将一个或多个connector组件关联至一个engine组件

    连接器组件:http, https, ajp

    负责接收请求,常见的有三类http/https/ajp;

    进入tomcat的请求可分为两类:

    1. standalone : 请求来自于客户端浏览器;
    2. 由其它的web server反代:来自前端的反代服务器;

      • nginx –> http connector –> tomcat
      • httpd(proxy_http_module) –> http connector –> tomcat
      • httpd(proxy_ajp_module) –> ajp connector –> tomcat

    Connector属性

    port=”8080”

    protocol=”HTTP/1.1”

    connectionTimeout=”20000”

    address:监听的IP地址;默认为本机所有可用地址

    maxThreads:最大并发连接数,默认为200

    enableLookups:是否启用DNS查询功能

    acceptCount:等待队列的最大长度

    容器类:Engine, Host, Context

    一个Engine中可包含多个Host,一个Host中可包含多个Context

    Engine组件:Servlet实例,即servlet引擎,其内部可以一个或多个host组件来定义站点,通常需要通过defaultHost来定义默认的虚拟主机

    • Engine属性

    name=” “

    defaultHost=”localhost”

    jvmRoute=” “

    Host组件:位于engine内部用于接收请求并进行相应处理的主机或虚拟主机

    • Host属性

      1. appBase:此Host的webapps的默认存放目录(/var/lib/tomcat/webapps),指存放非归档的web应用程序的目录或归档的WAR文件目录路径;可以使用基于$CATALINA_BASE变量所定义的路径的相对路径
      2. autoDeploy:在Tomcat处于运行状态时,将某webapp放置于appBase所定义的目录中时,是否自动将其部署至tomcat

    主配置文件==配置示例==:

    #提供webapp和测试页面
    mkdir -pv /appdata/webapps/ROOT/{lib,classes,WEB-INF,META-INF}
    vim /appdata/webapps/ROOT/index.jsp
    #增加以下内容
    <%@ page language="java" %>
    <html>
        <head><title>TomcatA</title></head>
        <body>
            <h1><font color="red">TomcatA.achudk.com</font></h1>
            <table align="centre" border="1">
                <tr>
                    <td>Session ID</td>
                <% session.setAttribute("achudk.com","achudk.com"); %>
                    <td><%= session.getId() %></td>
                </tr>
                <tr>
                    <td>Created on</td>
                    <td><%= session.getCreationTime() %></td>
                </tr>
            </table>
        </body>
    </html>
    
    #修改主配置文件
    <?xml version='1.0' encoding='utf-8'?> 
    <Server port="-1" shutdown="SHUTDOWN">
        <Service name="Catalina">
            <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
            <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
            <Engine name="Catalina" defaultHost="localhost">
                <Host name="tomcat.achudk.com" appBase="/appdata/webapps" unpackWARs="true" autoDeploy="true">
                    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="node1_access" suffix=".log" pattern="%h %l %u %t &quot;%r&quot; %s %b" />
                    <Context path="/tc1" docBase="/" reloadable="true">
                        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="node1_test_access_" suffix=".log" pattern="%h %l %u %t &quot;%r&quot; %s %b" />
                    </Context>
                </Host>
            </Engine>
        </Service>
    </Server>
    

    被嵌套类:valve, logger, realm, loader, manager, …

    集群类组件:listener, cluster, …

    tomcat安装完成后可通过本机的8080端口访问tomcat默认页面。

    设置tomcat的manager和host-manager的用户配置文件

    vim /etc/tomcat/tomcat-user.xml
    #增加下面三条
    <role rolename="admin-gui"/>
    <role rolename="manager-gui"/>
    <user username="tomcat" password="tomcat" roles="admin-gui,manager-gui"/>
    #重启tomcat服务
    systemctl restart tomcat

    重启tomcat服务后,测试使用默认页,可以试用tomcat的两个管理工具:”Manager Apps” 和 “Host-Manager”

    JSP Webapp的组织架构

    /: webapps的根目录

    index.jsp:主页

    WEB-INF/:当前webapp的私有资源路径;通常用于存储当前webapp的web.xml和context.xml配置文件

    META-INF/:类似于WEB-INF/

    classes/:类文件,当前webapp所提供的类

    lib/:类文件,当前webapp所提供的类,被打包为jar格式

    部署webapps及部署工具

    热部署:在实际生产环境中如果采用非灰度发布的形式,无论是部署新的webapps或者发布更新原有的webapps,在上述过程中tomcat服务不能中断,所以可能需要专业的部署工具来实现持续发布的效果

    冷部署:在灰度发布的生产环境或在实验环境中,tomcat服务重启后,各webapps加载因需重新加载JRE,整个过程会非常慢,此时也需要部署工具来加速发布过程

    冷部署示例

    mkdir /var/lib/tomcat/webapps/test/{WEB-INF,META-INF,lib,classes}
    vim /test/index.jsp
    
    #增加如下内容
    <%@ page language="java" %>
    <%@ page import="java.util.*" %>
    <html>
        <head>
            <title>Test Page</title>
        </head>
        <body>
            <% out.println("Test : Hello world"); %>
        </body>
    </html>

    重启tomcat服务后,测试访问 URL/test 页面是否显示 Test : Hello world

    使用部署工具进行热部署

    布置新的webapps相关文件,此处为了方便演示,将test复制重命名为test2后演示热部署过程

    cd /var/lib/tomcat/webapps
    cp -a test/ test2/
    
    #修改下index.jsp文件,使其与test的index.jsp文件内容不同,以示区别
    vim /var/lib/tomcat/webapps/test2/index.jsp
    
    <%@ page language="java" %>
    <%@ page import="java.util.*" %>
    <html>
        <head>
            <title>Test Page</title>
        </head>
        <body>
            <% out.println("Test2 : Hello world");
            %>
        </body>
    </html>

    在Tomcat默认页面上,使用”Manager Apps”工具,可在Deploy一段的 “Context Path (required):” 中填写 test2 ,点击deploy即完成部署。

    负载均衡tomcat响应动态资源

    使用nginx实现负载均衡

    角色及IP分配:

    负载均衡器:nginx :172.16.50.2/16(公网) 192.168.50.12/24(内网)

    动态资源服务器1 :tomcat1 :192.168.50.13/24

    动态资源服务器2 :tomcat2 :192.168.50.14/24

    1. 先配置两台动态资源服务器并启动服务
    #准备webapps
    cd /var/lib/tomcat/webapps/
    mkdir test/{WEB-INF,META-INF,lib,classes}
    vim test/index.jsp
    <html>
        <head><title>TomcatA</title></head>
        <body>
            <h1><font color="red">TomcatA.achudk.com</font></h1>
            <table align="centre" border="1">
                    <tr>
                        <td>Session ID</td>
                    <% session.setAttribute("achudk.com","achudk.com"); %>
                        <td><%= session.getId() %></td>
                    </tr>
                    <tr>
                        <td>Created on</td>
                        <td><%= session.getCreationTime() %></td>
                    </tr>
            </table>
        </body>
    </html>
    
    #修改tomcat主配置文件
    vim /etc/tomcat/server.xml
    <?xml version='1.0' encoding='utf-8'?>
    #将8005的连接器的端口改为-1,关闭内置的管理端口8005,能加快tomcat服务启动或停止的速度
    <Server port="-1" shutdown="SHUTDOWN">
    </Server>
    1. 配置负载均衡器并启动服务
    cd /etc/nginx
    vim nginx.conf
    #在http {}中增加以下指令
    upstream tcsrvs {};
    server 192.168.50.13:8080;
    server 192.168.50.14:8080#在server {} 配置段中,增加以下内容
    proxy_pass http://tcsrvs;
    1. 测试负载调度结果

    访问172.16.50.2,两个服务器交替响应。

    使用httpd实现负载均衡

    1. 后端服务器不做任何修改,仅修改前端负载均衡器
    vim /etc/httpd/conf.d/tomcat.conf
    <Proxy balancer://tcsrvs>
        BalancerMember http://192.168.50.13:8080
        BalancerMember http://192.168.50.14:8080
        ProxySet lbmethod=byrequests
    </Proxy>
    <VirtualHost *:80>
        ServerName tc1.achudk.com
        ProxyRequests off
        ProxyVia    on
        ProxyPreserveHost  on
        <Proxy *>
            Require all granted
        </Proxy>
        Proxypass / balancer://tcsrvs/
        ProxyPassReverse / balancer://tcsrvs/
        <Location />
            Require all granted
        </Location>
    </VirtualHost>
    1. 测试结果

    访问172.16.50.2,两个服务器交替响应。

    负载均衡中会话保持的实现

    1. session sticky

      原理:通过标记等方式来识别请求报文,将请求相同资源的请求调度至同一台动态资源服务器
      特性:每台后端服务器保存的会话各不相同,使每个服务器在保存会话方面成为单点

    2. session replication cluster

      原理:每台服务器保存会话后,向同一组播域中的其他主机同步保存的会话信息
      特性:每台后端服务器保存的会话信息相同,单个组播域内仅能存在少数几台主机,否则会话信息同步效率会很低

    3. session server

      原理:在动态资源服务器后端设置一台会话存储服务器,专用于保存会话信息,多个动态资源服务器可同时向该存储中写入数据
      特性:每台后端动态资源服务器不保存会话信息,共享会话存储服务器的内容,会话存储服务器为避免成为单点,要设置多个,多个session server之间为主从关系

    1. session sticky的实现

    1. 方法一 :使用httpd作为负载均衡调度器,配置如下
    vim /etc/httpd/conf.d/tomcat.conf
    
    Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
    <Proxy balancer://tcsrvs>
            BalancerMember http://192.168.50.13:8080 route=TomcatA loadfactor=1
            BalancerMember http://192.168.50.14:8080 route=TomcatB loadfactor=2
            ProxySet lbmethod=byrequests
            ProxySet stickysession=ROUTEID
    </Proxy>
    <VirtualHost *:80>
            ServerName tc1.achudk.com 
            ProxyRequests off
            ProxyVia        on
            ProxyPreserveHost  on
            <Proxy *>
                Require all granted
            </Proxy>
            Proxypass / balancer://tcsrvs/
            ProxyPassReverse / balancer://tcsrvs/
            <Location />
                Require all granted
            </Location>
    </VirtualHost>
    1. 方法二 :使用nginx作为负载均衡器实现会话粘性
    vim /etc/nginx/nginx.conf
    #增加以下内容
    upstream tcsrvs {
        hash $request_uri consistent;  //根据uri来调度
    #    hash $cookie_name consistent;  //根据cookie来调度
        server 192.168.50.13:8080;
        server 192.168.50.14:8080;
    }

    启用httpd的banalancer-manager的管理接口

    vim /etc/httpd/conf.d/tomcat.conf
    #增加一个Location
    <Location /balancer-manager>
        SetHandler balancer-manager
        ProxyPass !
        Require all granted
    </Location>
    • 访问172.16.50.2/balancer-manager

    2. session replication cluster 的实现

    1. 配置启用集群,修改各台服务器tomcat服务的配置文件,将下列配置放置于或中;

    <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.10.10"
                port="45564"
                frequency="500"
                dropTime="3000"/>
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                address="192.168.50.13"
                port="4000"
                autoBind="100"
                selectorTimeout="5000"
                maxThreads="6"/>
    
            <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"/>
    
        <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
            tempDir="/tmp/war-temp/"
            deployDir="/tmp/war-deploy/"
            watchDir="/tmp/war-listen/"
            watchEnabled="false"/>
    
        <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
        <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
    </Cluster>
    1. 配置webapps

      • 编辑WEB-INF/web.xml,添加元素

      • 注意:CentOS 7上的tomcat自带的文档中的配置示例有语法错误

    <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
    <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
    • 绑定的地址为auto时,会自动解析本地主机名,并解析得出的IP地址作为使用的地址

    解决办法1:将auto修改为指定的IP地址

    解决办法2:修改/etc/hosts文件,将localhost修改为指定IP

    展开全文
  • 服务器动态资源请求

    2019-04-28 15:06:01
    1. 浏览器请求动态页面过程 2. WSGI 怎么在你刚建立的Web服务器上运行一个Django应用和Flask应用,如何不做任何改变而适应不同的web架构呢? 在以前,选择 Python web 架构会受制于可用的web服务器,反之亦然。如果...

    1. 浏览器请求动态页面过程

    在这里插入图片描述

    2. WSGI

    怎么在你刚建立的Web服务器上运行一个Django应用和Flask应用,如何不做任何改变而适应不同的web架构呢?

    在以前,选择 Python web 架构会受制于可用的web服务器,反之亦然。如果架构和服务器可以协同工作,那就好了:
    在这里插入图片描述
    但有可能面对(或者曾有过)下面的问题,当要把一个服务器和一个架构结合起来时,却发现他们不是被设计成协同工作的:
    在这里插入图片描述
    Web Server Gateway Interface (或简称 WSGI,读作“wizgy”)。
    在这里插入图片描述
    WSGI允许开发者将选择web框架和web服务器分开。可以混合匹配web服务器和web框架,选择一个适合的配对。比如,可以在Gunicorn 或者 Nginx/uWSGI 或者 Waitress上运行 Django, Flask, 或 Pyramid。真正的混合匹配,得益于WSGI同时支持服务器和架构:
    在这里插入图片描述
    web服务器必须具备WSGI接口,所有的现代Python Web框架都已具备WSGI接口,它让你不对代码作修改就能使服务器和特点的web框架协同工作。

    WSGI由web服务器支持,而web框架允许你选择适合自己的配对,但它同样对于服务器和框架开发者提供便利使他们可以专注于自己偏爱的领域和专长而不至于相互牵制。其他语言也有类似接口:java有Servlet API,Ruby 有 Rack。

    3.定义WSGI接口

    WSGI接口定义非常简单,它只要求Web开发者实现一个函数,就可以响应HTTP请求。我们来看一个最简单的Web版本的“Hello World!”:

    def application(environ, start_response):
        start_response('200 OK', [('Content-Type', 'text/html')])
        return 'Hello World!'
    

    上面的application()函数就是符合WSGI标准的一个HTTP处理函数,它接收两个参数:

    environ:一个包含所有HTTP请求信息的dict对象;
    start_response:一个发送HTTP响应的函数。
    整个application()函数本身没有涉及到任何解析HTTP的部分,也就是说,把底层web服务器解析部分和应用程序逻辑部分进行了分离,这样开发者就可以专心做一个领域了

    不过,等等,这个application()函数怎么调用?如果我们自己调用,两个参数environ和start_response我们没法提供,返回的str也没法发给浏览器。

    所以application()函数必须由WSGI服务器来调用。有很多符合WSGI规范的服务器。而我们此时的web服务器项目的目的就是做一个既能解析静态网页还可以解析动态网页的服务器

    4. web服务器-----WSGI协议---->web框架 传递的字典

    {
        'HTTP_ACCEPT_LANGUAGE': 'zh-cn',
        'wsgi.file_wrapper': <built-infunctionuwsgi_sendfile>,
        'HTTP_UPGRADE_INSECURE_REQUESTS': '1',
        'uwsgi.version': b'2.0.15',
        'REMOTE_ADDR': '172.16.7.1',
        'wsgi.errors': <_io.TextIOWrappername=2mode='w'encoding='UTF-8'>,
        'wsgi.version': (1,0),
        'REMOTE_PORT': '40432',
        'REQUEST_URI': '/',
        'SERVER_PORT': '8000',
        'wsgi.multithread': False,
        'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'HTTP_HOST': '172.16.7.152: 8000',
        'wsgi.run_once': False,
        'wsgi.input': <uwsgi._Inputobjectat0x7f7faecdc9c0>,
        'SERVER_PROTOCOL': 'HTTP/1.1',
        'REQUEST_METHOD': 'GET',
        'HTTP_ACCEPT_ENCODING': 'gzip,deflate',
        'HTTP_CONNECTION': 'keep-alive',
        'uwsgi.node': b'ubuntu',
        'HTTP_DNT': '1',
        'UWSGI_ROUTER': 'http',
        'SCRIPT_NAME': '',
        'wsgi.multiprocess': False,
        'QUERY_STRING': '',
        'PATH_INFO': '/index.html',
        'wsgi.url_scheme': 'http',
        'HTTP_USER_AGENT': 'Mozilla/5.0(Macintosh;IntelMacOSX10_12_5)AppleWebKit/603.2.4(KHTML,likeGecko)Version/10.1.1Safari/603.2.4',
        'SERVER_NAME': 'ubuntu'
    }
    
    展开全文
  • 服务器动态资源请求 1. 浏览器请求动态页面过程 2. WSGI 怎么在你刚建立的Web服务器上运行一个Django应用和Flask应用,如何不做任何改变而适应不同的web架构呢? 在以前,选择 Python web 架构会受制于可用的web...

    服务器动态资源请求

    1. 浏览器请求动态页面过程

    在这里插入图片描述

    2. WSGI

    怎么在你刚建立的Web服务器上运行一个Django应用和Flask应用,如何不做任何改变而适应不同的web架构呢?

    在以前,选择 Python web 架构会受制于可用的web服务器,反之亦然。如果架构和服务器可以协同工作,那就好了:
    在这里插入图片描述
    但有可能面对(或者曾有过)下面的问题,当要把一个服务器和一个架构结合起来时,却发现他们不是被设计成协同工作的:
    在这里插入图片描述
    那么,怎么可以不修改服务器和架构代码而确保可以在多个架构下运行web服务器呢?答案就是 Python Web Server Gateway Interface (或简称 WSGI,读作“wizgy”)。
    在这里插入图片描述
    WSGI允许开发者将选择web框架和web服务器分开。可以混合匹配web服务器和web框架,选择一个适合的配对。比如,可以在Gunicorn 或者 Nginx/uWSGI 或者 Waitress上运行 Django, Flask, 或 Pyramid。真正的混合匹配,得益于WSGI同时支持服务器和架构:
    在这里插入图片描述
    web服务器必须具备WSGI接口,所有的现代Python Web框架都已具备WSGI接口,它让你不对代码作修改就能使服务器和特点的web框架协同工作。

    WSGI由web服务器支持,而web框架允许你选择适合自己的配对,但它同样对于服务器和框架开发者提供便利使他们可以专注于自己偏爱的领域和专长而不至于相互牵制。其他语言也有类似接口:java有Servlet API,Ruby 有 Rack。

    3.定义WSGI接口

    WSGI接口定义非常简单,它只要求Web开发者实现一个函数,就可以响应HTTP请求。我们来看一个最简单的Web版本的“Hello World!”:

    def application(environ, start_response):
        start_response('200 OK', [('Content-Type', 'text/html')])
        return 'Hello World!'
    

    上面的application()函数就是符合WSGI标准的一个HTTP处理函数,它接收两个参数:

    environ:一个包含所有HTTP请求信息的dict对象;
    start_response:一个发送HTTP响应的函数。
    整个application()函数本身没有涉及到任何解析HTTP的部分,也就是说,把底层web服务器解析部分和应用程序逻辑部分进行了分离,这样开发者就可以专心做一个领域了

    不过,等等,这个application()函数怎么调用?如果我们自己调用,两个参数environ和start_response我们没法提供,返回的str也没法发给浏览器。

    所以application()函数必须由WSGI服务器来调用。有很多符合WSGI规范的服务器。而我们此时的web服务器项目的目的就是做一个既能解析静态网页还可以解析动态网页的服务器

    4. web服务器-----WSGI协议---->web框架 传递的字典

    {
        'HTTP_ACCEPT_LANGUAGE': 'zh-cn',
        'wsgi.file_wrapper': <built-infunctionuwsgi_sendfile>,
        'HTTP_UPGRADE_INSECURE_REQUESTS': '1',
        'uwsgi.version': b'2.0.15',
        'REMOTE_ADDR': '172.16.7.1',
        'wsgi.errors': <_io.TextIOWrappername=2mode='w'encoding='UTF-8'>,
        'wsgi.version': (1,0),
        'REMOTE_PORT': '40432',
        'REQUEST_URI': '/',
        'SERVER_PORT': '8000',
        'wsgi.multithread': False,
        'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'HTTP_HOST': '172.16.7.152: 8000',
        'wsgi.run_once': False,
        'wsgi.input': <uwsgi._Inputobjectat0x7f7faecdc9c0>,
        'SERVER_PROTOCOL': 'HTTP/1.1',
        'REQUEST_METHOD': 'GET',
        'HTTP_ACCEPT_ENCODING': 'gzip,deflate',
        'HTTP_CONNECTION': 'keep-alive',
        'uwsgi.node': b'ubuntu',
        'HTTP_DNT': '1',
        'UWSGI_ROUTER': 'http',
        'SCRIPT_NAME': '',
        'wsgi.multiprocess': False,
        'QUERY_STRING': '',
        'PATH_INFO': '/index.html',
        'wsgi.url_scheme': 'http',
        'HTTP_USER_AGENT': 'Mozilla/5.0(Macintosh;IntelMacOSX10_12_5)AppleWebKit/603.2.4(KHTML,likeGecko)Version/10.1.1Safari/603.2.4',
        'SERVER_NAME': 'ubuntu'
    }
    

    应用程序示例

    import time
    
    def application(environ, start_response):
        status = '200 OK'
        response_headers = [('Content-Type', 'text/html')]
        start_response(status, response_headers)
        return str(environ) + '==Hello world from a simple WSGI application!--->%s\n' % time.ctime()
    
    展开全文
  • 1.浏览器请求动态页面过程 2.WSGI WSGI不是服务器,不是API,不是Python模块,更不是什么框架,而是一种服务器和客户端交互的接口规范! 在WSGI规范下,web组件被分成三类:client, server, and middleware...

    1.浏览器请求动态页面过程

    这里写图片描述


    2.WSGI

    WSGI不是服务器,不是API,不是Python模块,更不是什么框架,而是一种服务器和客户端交互的接口规范!
    在WSGI规范下,web组件被分成三类:client, server, and middleware.
    WSGI apps(服从该规范的应用)能够被连接起来处理一个request,这也就引发了中间件这个概念,中间件同时实现c端和s端的接口,c看它是上游s,s看它是下游的c。
    WSGI的s端所做的工作仅仅是接收请求,传给application(做处理),然后将结果response给middleware或client.除此以外的工作都交给中间件或者application来做。
    其他语言也有类似接口:java有Servlet,Ruby 有 Rack。


    3.定义WSGI接口

    WSGI接口定义非常简单,它只要求Web开发者实现一个函数,就可以响应HTTP请求。我们来看一个最简单的Web版本的“Hello World!”:

    def application(environ, start_response):
        start_response('200 OK', [('Content-Type', 'text/html')])
    return 'Hello World!'
    
    class Application:
    def __call__(self, environ, start_response):
         return     ‘xx’
    application = Application()
    socket.send(application(environ, start_response))

    上面的application()函数就是符合WSGI标准的一个HTTP处理函数,它接收两个参数:

    • environ:一个包含所有HTTP请求信息的dict对象;
    • start_response:一个开始响应HTTP的函数(响应行,响应头),
    • application函数返回值是影响内容body。

    整个application()函数本身没有涉及到任何解析HTTP的部分,也就是说,把底层web服务器解析部分和应用程序逻辑部分进行了分离,这样开发者就可以专心做一个领域了
    不过,等等,这个application()函数怎么调用?如果我们自己调用,两个参数environ和start_response我们没法提供,返回的str也没法发给浏览器。
    所以application()函数必须由WSGI服务器来调用。有很多符合WSGI规范的服务器。

    展开全文
  • 应用服务器:一般指像tomcat、jetty、resin这类的服务器,可以解析动态资源,也可以解析静态资源,但解析静态资源的能力没有web服务器好。(关于静态资源和动态资源,在本文的最后有说明) 一般都是只有web服务器...
  • 03Web服务器基础-2. 网络资源分析之静态资源和动态资源*
  • 专门负责处理静态资源文件。很多同学开始学习demo的时候,上来就是tomcat部署项目等等也能跑。tomcat具有处理静态资源的能力,但是术业有专攻,良好的web网站设计,应该让专门的工具做专门的事。而连接apache和tomcat...
  • 1、 Web资源介绍 ... l JSP/Servlet:动态资源,需要先转换成html,再给浏览器看。...2、静态资源和动态资源区别 3、Web服务器 Web服务器的作用是接收客户端的请求,给客户端作出响应。 对于JavaWe
  • 参考代码: # 面对对象的方式 # 多进程实现 # 补充知识点:F5是刷新(不过很多时候都是用的浏览器缓存);用ctrl+r 强制刷新。 import socket, re import multiprocessing ... """ 初始化服务器的各项内容...
  • 1 浏览器请求动态页面过程 2 WSGI 怎么在你刚建立的Web服务器上运行一个Django应用和Flask应用,如何不做任何改变而适应不同的web架构呢? 在以前,选择 Python web 架构会受制于可用的web服务器,反之亦然。如果...
  • 搭建动态静态服务器

    2018-11-07 03:55:00
    Nginx做静态资源服务器优于Tomcat 区分静态资源,动态资源请求 使用域名区分! 如果是动态资源请求 反向代理到 Tomcat 如果 是静态资源请求 直接走本地Nginx 配置: ###静态资源 server { listen 80; server...
  • 1. 浏览器请求动态页面过程 2. WSGI 怎么在你刚建立的Web服务器上运行一个Django应用和Flask应用,如何不做任何改变而适应不同的web架构呢? 在以前,选择 Python web 架构会受制于可用的web服务器,反之亦然。如果...
  • 【总结可以发起请求的阶段:请求动态资源:通过web.xml匹配action然后,自定义Servlet处理该action1)form表单提交请求的时候,用action设定,该页面发起请求的Servlet,(也就是点击form表单的提交发出请求,请求由...
  • 服务器的种类有很多比如Nginx、Apache等等,这涉及到了服务器的性能,故有了服务器自己的技术,那么如何让自己的动态资源框架实现忽略这些不同的web服务器呢,于是就有了WSGI协议。 web服务器+动态资源‘框架’ ...
  • Nginx做静态资源服务器优于Tomcat 区分静态资源,动态资源请求 使用域名区分! 如果是动态资源请求 反向代理到 Tomcat 如果 是静态资源请求 直接走本地Nginx 配置: ###静态资源 server { listen 80; server_...
  • 项目描述 vue项目使用8090端口(提供页面),java项目使用...#java项目服务器使用8080端口 upstream server_java { server 127.0.0.1:8080; } #vue项目服务器使用8090端口 upstream server_vue { server 127.0.0...
  • //动态加载图片的方法 loadImg: function(container,url){ cc.loader.load(url, function (err, texture) { var sprite = new cc.SpriteFrame(texture); container.spriteFrame = sprite; }); } ...
  • Tomcat 服务器 Servlet 的JavaEE 中指定了一套标准,目前主要的用途就是写web 应用(web application)。 Tomcat是一个免费的开源的Servlet容器,由于有了Sun的参与和支持,最新的Servlet和JSP 规范总能在Tomcat中...
  • var url = ...//服务器图片路径var container = this.user_photo.getComponent(cc.Sprite);//图片呈现位置this.loadImg(container,url);//动态加载图片的方法loadImg: function(container,url){cc.load...
  • 利用ssh的重定向功能,我们可以非常方便的发布动态资源,实现对局域网中的非公网IP机器资源的远程访问。 家用宽带,一般是楼栋里好多家的局域网IP共享一个公网IP上网。即使是光纤宽带,也经常工作在局域网段。这种...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,447
精华内容 2,978
关键字:

动态资源服务器