Web服務(wù)器與應(yīng)用服務(wù)器

Web服務(wù)器與應(yīng)用服務(wù)器

什么是web服務(wù)器?

Web服務(wù)器一般指網(wǎng)站服務(wù)器,是指駐留于因特網(wǎng)上某種類型計(jì)算機(jī)的程序,可以向?yàn)g覽器等Web客戶端提供文檔,也可以放置網(wǎng)站文件,讓全世界瀏覽;可以放置數(shù)據(jù)文件,讓全世界下載。

什么是應(yīng)用服務(wù)器?

嚴(yán)格意義上Web服務(wù)器只負(fù)責(zé)處理HTTP協(xié)議,只能發(fā)送靜態(tài)頁(yè)面的內(nèi)容。而JSP,ASP,PHP等動(dòng)態(tài)內(nèi)容需要通過(guò)CGI、FastCGI、ISAPI等接口交給其他程序去處理。這個(gè)其他程序就是應(yīng)用服務(wù)器

二者之間的聯(lián)系?

在大多數(shù)時(shí)候,Web服務(wù)器和引用服務(wù)器這兩個(gè)術(shù)語(yǔ)是可以互換使用的
Web服務(wù)器的設(shè)計(jì)目的是提供HTTP內(nèi)容,應(yīng)用服務(wù)器也可以提供HTTP內(nèi)容,但不限于HTTP,它還可以提供其他協(xié)議支持,如RMI / RPC。
Web服務(wù)器主要是為提供靜態(tài)內(nèi)容而設(shè)計(jì)的,不過(guò)大多數(shù)Web服務(wù)器都有插件來(lái)支持腳本語(yǔ)言,比如Perl、PHP、ASP、JSP等,通過(guò)這些插件,這些服務(wù)器就可以生成動(dòng)態(tài)的HTTP內(nèi)容
ps:簡(jiǎn)單來(lái)說(shuō)前臺(tái)接待(web服務(wù)器) ,服務(wù)者(應(yīng)用服務(wù)器)。

常見(jiàn)的Web服務(wù)器

Apache

Apache是世界使用排名第一的Web服務(wù)器軟件。它可以運(yùn)行在幾乎所有廣泛使用的計(jì)算機(jī)平臺(tái)上。Apache源于NCSAhttpd服務(wù)器,經(jīng)過(guò)多次修改,成為世界上最流行的Web服務(wù)器軟件之一。Apache取自"a patchy server"的讀音,意思是充滿補(bǔ)丁的服務(wù)器,因?yàn)樗亲杂绍浖圆粩嘤腥藖?lái)為它開(kāi)發(fā)新的功能、新的特性、修改原來(lái)的缺陷。Apache的特點(diǎn)是簡(jiǎn)單、速度快、性能穩(wěn)定,并可做代理服務(wù)器來(lái)使用

Nginx

Nginx 是一個(gè)很強(qiáng)大的高性能Web和反向代理服務(wù),它具有很多非常優(yōu)越的特性:
Nginx 小巧占內(nèi)存少,在連接高并發(fā)的情況下,Nginx是Apache服務(wù)不錯(cuò)的替代品: 能夠支持高達(dá) 50,000 個(gè)并發(fā)連接數(shù)的響應(yīng) ,也就是單個(gè)nginx一瞬間可以同時(shí)處理50,000個(gè)請(qǐng)求。

IIS

IIS本人沒(méi)怎么接觸過(guò),它包括了Web服務(wù)器、FTP服務(wù)器、NNTP服務(wù)器和SMTP服務(wù)器,分別用于網(wǎng)頁(yè)瀏覽、文件傳輸、新聞服務(wù)和郵件發(fā)送等方面,它使得在網(wǎng)絡(luò)(包括互聯(lián)網(wǎng)和局域網(wǎng))上發(fā)布信息成了一件很容易的事。ps:桌面配置真的感覺(jué)超爽,配置錯(cuò)了或者沒(méi)有權(quán)限當(dāng)時(shí)就知道 不用再去翻日志查看 不得不說(shuō)微軟在用戶體驗(yàn)上下足了功夫。

微信截圖_20181130130708.png

以上為今年十月份web服務(wù)器使用排名。Apache依然是霸主地位,但是Nginx即將趕超

常見(jiàn)的應(yīng)用服務(wù)器

Apache tomcat

Tomcat是一個(gè)開(kāi)放源代碼、運(yùn)行Servlet和JSP的容器 Apache:側(cè)重于HTTPServer ,Tomcat:側(cè)重于Servlet引擎,特點(diǎn) 簡(jiǎn)單、速度快、性能穩(wěn)定

Eclipse Jetty

Jetty 一個(gè)比tomcat的架構(gòu)更為簡(jiǎn)單,更加小巧,更加快速的服務(wù)器。但是對(duì)于Servlet的兼容做的沒(méi)有Tomcat好,可以同時(shí)處理大量連接而且可以長(zhǎng)時(shí)間保持連接,適合于web聊天應(yīng)用等等。

Orcale WebLogic (收費(fèi)) (閉源)

Oracle大佬產(chǎn)的,這貨可牛逼,專為java設(shè)計(jì)的一個(gè)基于JAVAEE架構(gòu)的中間件,用于開(kāi)發(fā)、集成、部署和管理大型分布式Web應(yīng)用、網(wǎng)絡(luò)應(yīng)用和數(shù)據(jù)庫(kù)應(yīng)用的Java應(yīng)用服務(wù)器。將Java的動(dòng)態(tài)功能和安全性引入大型網(wǎng)絡(luò)應(yīng)用的開(kāi)發(fā)、集成、部署和管理之中

RedHat Jboss

基于J2EE的應(yīng)用服務(wù)器,JBoss核心服務(wù)不包括支持servlet/JSP的WEB容器,一般與Tomcat綁定使用,JBoss的Web容器使用的是Tomcat

IBM WebSphere(收費(fèi))(閉源)

IBM大佬產(chǎn)的,WebSphere Application Server是用于J2EE企業(yè)應(yīng)用級(jí)運(yùn)行所需的WEB容器。一般用于保險(xiǎn),銀行等等核心交易系統(tǒng)

CAUCHO Resin

是一個(gè)非常流行的支持servlets和jsp的引擎,速度非常快。Resin本身包含了一個(gè)支持HTTP/1.1的WEB服務(wù)器。它不僅可以顯示動(dòng)態(tài)內(nèi)容,而且它顯示靜態(tài)內(nèi)容的能力也非常強(qiáng),速度直逼apache

LiteSpeed

可以替換Apache 使用較小的內(nèi)存處理更多的鏈接,ps:但是有得就有失 CPU的使用率怕是扛不住

Lighttpd

是一個(gè)德國(guó)人領(lǐng)導(dǎo)的開(kāi)源Web服務(wù)器軟件。

我們所使用的服務(wù)器

IIS+nginx+tomcat

IIS作為web服務(wù)器,nginx做代理服務(wù)器負(fù)責(zé)接受http/https請(qǐng)求下發(fā)給tomcat處理請(qǐng)求

為什么要用nginx

1.apache與tomcat的瓶頸,tomcat初始產(chǎn)生1000個(gè)線程,最大2000線程,每一個(gè)請(qǐng)求為一個(gè)線程也就是說(shuō)一個(gè)tomcat最多可以處理2000個(gè)請(qǐng)求,然而這只是靜態(tài)請(qǐng)求 而非動(dòng)態(tài)請(qǐng)求

使用loadrunner設(shè)置1000并發(fā)用戶數(shù)進(jìn)行壓力測(cè)試。
100人-----響應(yīng)時(shí)間0.8秒 完美
150人-----響應(yīng)時(shí)間1秒 完美
200人-----響應(yīng)時(shí)間1.5秒 響應(yīng)時(shí)間有微小波動(dòng) 比較完美
250人-----響應(yīng)時(shí)間1.8秒 比較完美(此時(shí)是理想情況下最大的并發(fā)用戶數(shù)量)
280人-----開(kāi)始出現(xiàn)連接丟失問(wèn)題,連接開(kāi)始不穩(wěn)定
300人-----響應(yīng)時(shí)間3秒 響應(yīng)時(shí)間有較大波動(dòng)峰值為6秒 較差
350人-----響應(yīng)時(shí)間3秒 開(kāi)始大量出現(xiàn)連接丟失問(wèn)題 連接很不穩(wěn)定
400人-----響應(yīng)時(shí)間3.8秒 連接丟失數(shù)量達(dá)到3000次以上
450人-----響應(yīng)時(shí)間4秒 連接丟失數(shù)量達(dá)到6000次以上
500人-----響應(yīng)時(shí)間4秒 連接丟失數(shù)量達(dá)到11000次以上
550人-----響應(yīng)時(shí)間6秒 連接丟失數(shù)量達(dá)到21000次以上
600人-----響應(yīng)時(shí)間6秒 連接丟失數(shù)量達(dá)到25000次以上
600人開(kāi)始系統(tǒng)出現(xiàn)異常情況,因此停止測(cè)試。測(cè)試數(shù)據(jù)到此為止。


微信截圖_20181130130728.png

在用戶超過(guò)350時(shí)性能會(huì)出現(xiàn)斷崖式的下滑 這就是它的瓶頸,所以我們需要用nginx做負(fù)載均衡,用兩個(gè)tomcat分?jǐn)倝毫Γ部梢宰黾悍謹(jǐn)倝毫Α?/p>

2.nginx 動(dòng)靜分離,即正向代理處理靜態(tài)資源,反向代理處理動(dòng)態(tài)資源。
3.nginx 壓縮機(jī)制,可以將過(guò)大的數(shù)據(jù)包或文件壓縮,根據(jù)壓縮級(jí)別壓縮文件的大小,級(jí)別越高壓縮越小,ps:cpu消耗也大
4.內(nèi)置的健康檢查功能:如果有一個(gè)服務(wù)器宕機(jī),會(huì)做一個(gè)健康檢查,再發(fā)送的請(qǐng)求就不會(huì)發(fā)送到宕機(jī)的服務(wù)器了。重新將請(qǐng)求提交到其他的節(jié)點(diǎn)上
5.接收用戶請(qǐng)求是異步的:瀏覽器將請(qǐng)求發(fā)送到nginx服務(wù)器,它先將用戶請(qǐng)求全部接收下來(lái),再一次性發(fā)送給后端web服務(wù)器,極大減輕了web服務(wù)器的壓力 一邊接收web服務(wù)器的返回?cái)?shù)據(jù),一邊發(fā)送給瀏覽器客戶端

Nginx配置

對(duì)于 nginx我們只需要知道配置文件在conf文件夾下就可以,其他不需要我們操心,除非你要增加模塊或自定義模塊

http {
    include       mime.types;#引用默認(rèn)文件
    default_type  application/octet-stream;#默認(rèn)配置
    #日志輸出格式
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  logs/access.log  main;#日志打印地址

    sendfile        on;#on/off 減少拷貝次數(shù),提升文件傳輸性能的方法
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;#線程存活時(shí)間65s
    #gzip 壓縮
    gzip  on;
    gzip_comp_level  4;  #推薦先設(shè)置為中間的值,比如4或者5
    gzip_proxied  any; #off為關(guān)閉,any為壓縮所有后端服務(wù)器返回的數(shù)據(jù)。
    gzip_types       text/plain application/x-javascript text/css application/xml;   #一般情況下如此設(shè)置
    gzip_vary  on;  #默認(rèn)為off用于設(shè)置是否在使用gzip功能時(shí)發(fā)送帶有"vary:Accept-Encoding" 頭域的響應(yīng)頭部,該頭域的主要功能時(shí)要告訴客戶端數(shù)據(jù)已經(jīng)在服務(wù)器進(jìn)行了壓縮

    upstream  netitcast.com {  #服務(wù)器集群名字   
       server 127.0.0.1:8081  weight=1;#服務(wù)器配置 weight是權(quán)重的意思,權(quán)重越大,分配的概率越大。  
       server 127.0.0.1:8080  weight=2;  
    }

    server {
        listen       443;#端口號(hào)
        server_name  api.carbybus.com;#域名
        ssl on;#開(kāi)啟ssl
        ssl_certificate  214950803920621.pem; #證書pem
        ssl_certificate_key 214950803920621.key; #證書key
        ssl_session_timeout 5m;#指定客戶端可以重用會(huì)話參數(shù)的時(shí)間(超時(shí)后不可使用)
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        #重點(diǎn)來(lái)咯
        location / {#所有https的請(qǐng)求都到這里
                charset utf-8;
                # netitcast.com下面的名字要與upsteam后面的名字保持一致
                proxy_pass http://netitcast.com;  # 反向代理的地址
                proxy_redirect default;  #代理默認(rèn)配置 以下是將請(qǐng)求的頭傳給tomcat
                proxy_set_header Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    
    server {#通過(guò)80進(jìn)來(lái)的是http請(qǐng)求
        listen 80;
        server_name api.carbybus.com; # 你的域名
        rewrite ^(.*)$ https://$host$1 permanent;# 把http的域名請(qǐng)求轉(zhuǎn)成https
    }}

Tomcat配置

server.xml Tomcat配置文件

 <?xml version="1.0" encoding="UTF-8"?>
<!-- 原8005端口 用于關(guān)閉tomcat ps:telnet 到8005端口然后執(zhí)行“SHUTDOWN”(區(qū)分大小寫),此時(shí)也可看到tomcat后臺(tái)在解析telnet上來(lái)的命令,然后果然tomcat被關(guān)閉了 -->
<Server port="8007" shutdown="SHUTDOWN">
  
  <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>
<!--連接身份校驗(yàn) 登錄tomcat后臺(tái)時(shí)有用沒(méi)有后臺(tái)就沒(méi)用-->
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>

  <Service name="Catalina">

    <!-- Define an AJP 1.3 Connector on port 8009 -->
            <!--端口8011 原8009 ,負(fù)責(zé)和其他的HTTP服務(wù)器建立連接。-->
    <Connector port="8011" protocol="AJP/1.3" redirectPort="8443" />
    <!--HTTPS端口號(hào)為443 http端口號(hào)為80,負(fù)責(zé)建立HTTP連接。-->
    <Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" URIEncoding="UTF-8" 
  SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS"
               keystoreFile="/usr/service/apache-tomcat-8.5.35/conf/1564131_gps.carbybus.com.pfx"   keystorePass="k7J7UwpP" 
               >

       
    </Connector>
   
    <Engine name="Catalina" defaultHost="localhost">

      
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

      <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>

catalina.sh/catalina.bat 一個(gè)servlet容器
具體內(nèi)容我也看不懂~但是有些問(wèn)題是需要通過(guò)修改catalina來(lái)解決

1.windows 下啟動(dòng)tomcat閃退問(wèn)題: 需要添加JAVA_HOME的地址解決
2.OutOfMemoryError: Java heap space (堆內(nèi)存溢出),
OutOfMemoryError: PermGen space(永久保存區(qū)域溢出),
OutOfMemoryError: unable to create new native thread(無(wú)法創(chuàng)建新的線程),
添加:JAVA_OPTS='-Xms512m -Xmx1024m'
或者 JAVA_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m"
或者 CATALINA_OPTS="-server -Xms256m -Xmx300m"解決

自己如何實(shí)現(xiàn)tomcat

package clc.dispath.netty.common;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @ProjectName: cicada
 * @Package: clc.dispath.netty.common
 * @ClassName: TestSErver
 * @Description: java類作用描述
 * @Author: 孫志成
 * @CreateDate: 2018/11/30 10:20
 * @UpdateUser: 更新者
 * @UpdateDate: 2018/11/30 10:20
 * @UpdateRemark: 更新說(shuō)明
 * @Version: 1.0
 */
public class TestSErver {
    public static void main(String[] args) throws IOException {
        TestSErver testSErver=new TestSErver();
        testSErver.start();
    }
    public void start() throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);
        Socket socket = null;
        System.out.println("啟動(dòng)web服務(wù)");
        while (true) {
            socket = serverSocket.accept();
            Thread thread = new Thread(new HttpServerThread(socket));
            thread.start();
        }
    }
    // 內(nèi)部類
    private class HttpServerThread implements Runnable {
        Socket socket = null;

    HttpServerThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        InputStream is = null;
        OutputStream os = null;
        BufferedReader br = null;
        try {
            is = this.socket.getInputStream();
            os = this.socket.getOutputStream();

            // 頁(yè)面的請(qǐng)求
            br = new BufferedReader(new InputStreamReader(is));
            String line = br.readLine();
            int i = 0;
            while (null != line && br.ready()) {
                line = br.readLine();
                System.out.println("第" + i + "行信息:" + line);
                i++;
            }

            // 頁(yè)面的響應(yīng)
            String reply = "HTTP/1.1\n";             // 必須添加的響應(yīng)頭
            reply += "Content-type:text/html\n\n";        // 必須添加的響應(yīng)頭
            reply += "<h1>!@#!@#</h1>";
            os.write(reply.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                os.close();
                is.close();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,890評(píng)論 18 139
  • 0 系列目錄# WEB請(qǐng)求處理 WEB請(qǐng)求處理一:瀏覽器請(qǐng)求發(fā)起處理 WEB請(qǐng)求處理二:Nginx請(qǐng)求反向代理 本...
    七寸知架構(gòu)閱讀 14,054評(píng)論 22 190
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong閱讀 22,537評(píng)論 1 92
  • 1.人最難控制的是情緒。 2.我們都活在他人的影響中。 3.成功沒(méi)那么簡(jiǎn)單。 4.誰(shuí)還在堅(jiān)持寫日記? 5.生活本來(lái)...
    鄉(xiāng)村咖啡豆閱讀 251評(píng)論 0 2
  • 夢(mèng)想,從晨間日記開(kāi)始起航。未來(lái)的路想太多有什么用?唯有一步一步,用自己的腳步堅(jiān)實(shí)的踏在地上行走,一個(gè)一個(gè)微習(xí)慣的形...
    我是醒來(lái)閱讀 111評(píng)論 0 0